diff --git a/node_modules/grunt-contrib-copy/node_modules/file-sync-cmp/.npmignore b/.gitignore similarity index 82% rename from node_modules/grunt-contrib-copy/node_modules/file-sync-cmp/.npmignore rename to .gitignore index 50a0c39..c2658d7 100644 --- a/node_modules/grunt-contrib-copy/node_modules/file-sync-cmp/.npmignore +++ b/.gitignore @@ -1,2 +1 @@ -*~ node_modules/ diff --git a/node_modules/.bin/grunt b/node_modules/.bin/grunt deleted file mode 100644 index e78c5db..0000000 --- a/node_modules/.bin/grunt +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*) basedir=`cygpath -w "$basedir"`;; -esac - -if [ -x "$basedir/node" ]; then - "$basedir/node" "$basedir/../grunt/bin/grunt" "$@" - ret=$? -else - node "$basedir/../grunt/bin/grunt" "$@" - ret=$? -fi -exit $ret diff --git a/node_modules/.bin/grunt.cmd b/node_modules/.bin/grunt.cmd deleted file mode 100644 index edd95d5..0000000 --- a/node_modules/.bin/grunt.cmd +++ /dev/null @@ -1,7 +0,0 @@ -@IF EXIST "%~dp0\node.exe" ( - "%~dp0\node.exe" "%~dp0\..\grunt\bin\grunt" %* -) ELSE ( - @SETLOCAL - @SET PATHEXT=%PATHEXT:;.JS;=;% - node "%~dp0\..\grunt\bin\grunt" %* -) \ No newline at end of file diff --git a/node_modules/.bin/semver b/node_modules/.bin/semver deleted file mode 100644 index d592e69..0000000 --- a/node_modules/.bin/semver +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*) basedir=`cygpath -w "$basedir"`;; -esac - -if [ -x "$basedir/node" ]; then - "$basedir/node" "$basedir/../semver/bin/semver" "$@" - ret=$? -else - node "$basedir/../semver/bin/semver" "$@" - ret=$? -fi -exit $ret diff --git a/node_modules/.bin/semver.cmd b/node_modules/.bin/semver.cmd deleted file mode 100644 index 37c00a4..0000000 --- a/node_modules/.bin/semver.cmd +++ /dev/null @@ -1,7 +0,0 @@ -@IF EXIST "%~dp0\node.exe" ( - "%~dp0\node.exe" "%~dp0\..\semver\bin\semver" %* -) ELSE ( - @SETLOCAL - @SET PATHEXT=%PATHEXT:;.JS;=;% - node "%~dp0\..\semver\bin\semver" %* -) \ No newline at end of file diff --git a/node_modules/.bin/shjs b/node_modules/.bin/shjs deleted file mode 100644 index 1d45691..0000000 --- a/node_modules/.bin/shjs +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*) basedir=`cygpath -w "$basedir"`;; -esac - -if [ -x "$basedir/node" ]; then - "$basedir/node" "$basedir/../shelljs/bin/shjs" "$@" - ret=$? -else - node "$basedir/../shelljs/bin/shjs" "$@" - ret=$? -fi -exit $ret diff --git a/node_modules/.bin/shjs.cmd b/node_modules/.bin/shjs.cmd deleted file mode 100644 index 3d98b0b..0000000 --- a/node_modules/.bin/shjs.cmd +++ /dev/null @@ -1,7 +0,0 @@ -@IF EXIST "%~dp0\node.exe" ( - "%~dp0\node.exe" "%~dp0\..\shelljs\bin\shjs" %* -) ELSE ( - @SETLOCAL - @SET PATHEXT=%PATHEXT:;.JS;=;% - node "%~dp0\..\shelljs\bin\shjs" %* -) \ No newline at end of file diff --git a/node_modules/grunt-contrib-clean/CHANGELOG b/node_modules/grunt-contrib-clean/CHANGELOG deleted file mode 100644 index 0f55e54..0000000 --- a/node_modules/grunt-contrib-clean/CHANGELOG +++ /dev/null @@ -1,52 +0,0 @@ -v1.0.0: - date: 2016-02-15 - changes: - - Drop support for Node.js v0.8 - - Grunt peer dependency tagged `>= 0.4.5` - - Dependency updates -v0.7.0: - date: 2015-11-13 - changes: - - Dependency updates -v0.6.0: - date: 2014-07-27 - changes: - - Less verbose output. - - README updates. -v0.5.0: - date: 2013-07-15 - changes: - - Use rimraf directly, version 2.2.1 to fix issue on Windows. - - Add no-write option to mimic grunt.file.delete behavior. -v0.4.1: - date: 2013-04-16 - changes: - - Check if file exists to avoid trying to delete a non-existent file. -v0.4.0: - date: 2013-02-15 - changes: - - First official release for Grunt 0.4.0. -v0.4.0rc6: - date: 2013-01-18 - changes: - - Updating grunt/gruntplugin dependencies to rc6. - - Changing in-development grunt/gruntplugin dependency versions from tilde version ranges to specific versions. -v0.4.0rc5: - date: 2013-01-09 - changes: - - Updating to work with grunt v0.4.0rc5. - - Switching to this.filesSrc api. -v0.4.0a: - date: 2012-12-07 - changes: - - Conversion to grunt v0.4 conventions. - - Remove node v0.6 and grunt v0.3 support. - - Add force option to bypass CWD check. -v0.3.0: - date: 2012-09-23 - changes: - - Options no longer accepted from global config key. -v0.2.0: - date: 2012-09-10 - changes: - - Refactored from grunt-contrib into individual repo. diff --git a/node_modules/grunt-contrib-clean/README.md b/node_modules/grunt-contrib-clean/README.md deleted file mode 100644 index f93ec03..0000000 --- a/node_modules/grunt-contrib-clean/README.md +++ /dev/null @@ -1,163 +0,0 @@ -# grunt-contrib-clean v0.7.0 [![Build Status: Linux](https://travis-ci.org/gruntjs/grunt-contrib-clean.svg?branch=master)](https://travis-ci.org/gruntjs/grunt-contrib-clean) [![Build Status: Windows](https://ci.appveyor.com/api/projects/status/li28411ceq3n833d/branch/master?svg=true)](https://ci.appveyor.com/project/gruntjs/grunt-contrib-clean/branch/master) - -> Clean files and folders - - - -## Getting Started - -If you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command: - -```shell -npm install grunt-contrib-clean --save-dev -``` - -Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript: - -```js -grunt.loadNpmTasks('grunt-contrib-clean'); -``` - -*This plugin was designed to work with Grunt 0.4.x. If you're still using grunt v0.3.x it's strongly recommended that [you upgrade](http://gruntjs.com/upgrading-from-0.3-to-0.4), but in case you can't please use [v0.3.2](https://github.com/gruntjs/grunt-contrib-clean/tree/grunt-0.3-stable).* - - - -## Clean task -_Run this task with the `grunt clean` command._ - -Task targets, files and options may be specified according to the grunt [Configuring tasks](http://gruntjs.com/configuring-tasks) guide. - -*Due to the destructive nature of this task, always be cautious of the paths you clean.* -### Options - -#### force -Type: `Boolean` -Default: `false` - -This overrides this task from blocking deletion of folders outside current working dir (CWD). Use with caution. - -#### no-write -Type: `Boolean` -Default: `false` - -Will not actually delete any files or directories. -If the task is run with the `--verbose` flag, the task will log messages of what files would have be deleted. - -_Note: As this task property contains a hyphen, you will need to surround it with quotes._ - -### Usage Examples - -There are three formats you can use to run this task. - -#### Short - -```js -clean: ["path/to/dir/one", "path/to/dir/two"] -``` - -#### Medium (specific targets with global options) - -```js -clean: { - build: ["path/to/dir/one", "path/to/dir/two"], - release: ["path/to/another/dir/one", "path/to/another/dir/two"] -}, -``` - -#### Long (specific targets with per target options) - -```js -clean: { - build: { - src: ["path/to/dir/one", "path/to/dir/two"] - } -} -``` - -"Compact" and "Files Array" formats support a few [additional properties](http://gruntjs.com/configuring-tasks#files) -which help you deal with hidden files, process dynamic mappings and so on. - -#### Globbing Patterns - -Although documented [in the Grunt Docs](http://gruntjs.com/configuring-tasks#globbing-patterns), here are some globbing pattern examples to achieve some common tasks: - -```js -clean: { - folder: ['path/to/dir/'], - folder_v2: ['path/to/dir/**'], - contents: ['path/to/dir/*'], - subfolders: ['path/to/dir/*/'], - css: ['path/to/dir/*.css'], - all_css: ['path/to/dir/**/*.css'] -} -``` - -* __`folder`:__ Deletes the `dir/` folder -* __`folder_v2`:__ Deletes the `dir/` folder -* __`contents`:__ Keeps the `dir/` folder, but deletes the contents -* __`subfolders`:__ Keeps the files inside the `dir/` folder, but deletes all subfolders -* __`css`:__ Deletes all `*.css` files inside the `dir/` folder, excluding subfolders -* __`all_css`:__ Deletes all `*.css` files inside the `dir/` folder and its subfolders - -##### Skipping Files - -```js -// Deletes all .js files, but skips min.js files -clean: { - js: ["path/to/dir/*.js", "!path/to/dir/*.min.js"] -} -``` - -###### Options - -Options can be specified for all `clean` tasks and for each `clean:target`. - -####### All tasks - -```js -// Prevents all targets from deleting any files -clean: { - options: { - 'no-write': true - }, - build: ['dev/build'], - release: ['dist'] -} -``` - -####### Per-target - -```js -// Will delete files for `build` target -// Will NOT delete files for `release` target -clean: { - build: ['dev/build'], - release: { - options: { - 'no-write': true - }, - src: ['dist'] - } -} -``` - - -## Release History - - * 2016-02-15   v1.0.0   Drop support for Node.js v0.8 Grunt peer dependency tagged `>= 0.4.5` Dependency updates - * 2015-11-13   v0.7.0   Dependency updates - * 2014-07-27   v0.6.0   Less verbose output. README updates. - * 2013-07-15   v0.5.0   Use rimraf directly, version 2.2.1 to fix issue on Windows. Add no-write option to mimic grunt.file.delete behavior. - * 2013-04-16   v0.4.1   Check if file exists to avoid trying to delete a non-existent file. - * 2013-02-15   v0.4.0   First official release for Grunt 0.4.0. - * 2013-01-18   v0.4.0rc6   Updating grunt/gruntplugin dependencies to rc6. Changing in-development grunt/gruntplugin dependency versions from tilde version ranges to specific versions. - * 2013-01-09   v0.4.0rc5   Updating to work with grunt v0.4.0rc5. Switching to this.filesSrc api. - * 2012-12-07   v0.4.0a   Conversion to grunt v0.4 conventions. Remove node v0.6 and grunt v0.3 support. Add force option to bypass CWD check. - * 2012-09-23   v0.3.0   Options no longer accepted from global config key. - * 2012-09-10   v0.2.0   Refactored from grunt-contrib into individual repo. - ---- - -Task submitted by [Tim Branyen](http://tbranyen.com/) - -*This file was generated on Mon Feb 15 2016 13:42:25.* diff --git a/node_modules/grunt-contrib-clean/node_modules/.bin/rimraf b/node_modules/grunt-contrib-clean/node_modules/.bin/rimraf deleted file mode 100644 index 3cebd6e..0000000 --- a/node_modules/grunt-contrib-clean/node_modules/.bin/rimraf +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*) basedir=`cygpath -w "$basedir"`;; -esac - -if [ -x "$basedir/node" ]; then - "$basedir/node" "$basedir/../rimraf/bin.js" "$@" - ret=$? -else - node "$basedir/../rimraf/bin.js" "$@" - ret=$? -fi -exit $ret diff --git a/node_modules/grunt-contrib-clean/node_modules/.bin/rimraf.cmd b/node_modules/grunt-contrib-clean/node_modules/.bin/rimraf.cmd deleted file mode 100644 index 9333ec6..0000000 --- a/node_modules/grunt-contrib-clean/node_modules/.bin/rimraf.cmd +++ /dev/null @@ -1,7 +0,0 @@ -@IF EXIST "%~dp0\node.exe" ( - "%~dp0\node.exe" "%~dp0\..\rimraf\bin.js" %* -) ELSE ( - @SETLOCAL - @SET PATHEXT=%PATHEXT:;.JS;=;% - node "%~dp0\..\rimraf\bin.js" %* -) \ No newline at end of file diff --git a/node_modules/grunt-contrib-clean/node_modules/async/CHANGELOG.md b/node_modules/grunt-contrib-clean/node_modules/async/CHANGELOG.md deleted file mode 100644 index f15e081..0000000 --- a/node_modules/grunt-contrib-clean/node_modules/async/CHANGELOG.md +++ /dev/null @@ -1,125 +0,0 @@ -# v1.5.2 -- Allow using `"consructor"` as an argument in `memoize` (#998) -- Give a better error messsage when `auto` dependency checking fails (#994) -- Various doc updates (#936, #956, #979, #1002) - -# v1.5.1 -- Fix issue with `pause` in `queue` with concurrency enabled (#946) -- `while` and `until` now pass the final result to callback (#963) -- `auto` will properly handle concurrency when there is no callback (#966) -- `auto` will now properly stop execution when an error occurs (#988, #993) -- Various doc fixes (#971, #980) - -# v1.5.0 - -- Added `transform`, analogous to [`_.transform`](http://lodash.com/docs#transform) (#892) -- `map` now returns an object when an object is passed in, rather than array with non-numeric keys. `map` will begin always returning an array with numeric indexes in the next major release. (#873) -- `auto` now accepts an optional `concurrency` argument to limit the number of running tasks (#637) -- Added `queue#workersList()`, to retrieve the list of currently running tasks. (#891) -- Various code simplifications (#896, #904) -- Various doc fixes :scroll: (#890, #894, #903, #905, #912) - -# v1.4.2 - -- Ensure coverage files don't get published on npm (#879) - -# v1.4.1 - -- Add in overlooked `detectLimit` method (#866) -- Removed unnecessary files from npm releases (#861) -- Removed usage of a reserved word to prevent :boom: in older environments (#870) - -# v1.4.0 - -- `asyncify` now supports promises (#840) -- Added `Limit` versions of `filter` and `reject` (#836) -- Add `Limit` versions of `detect`, `some` and `every` (#828, #829) -- `some`, `every` and `detect` now short circuit early (#828, #829) -- Improve detection of the global object (#804), enabling use in WebWorkers -- `whilst` now called with arguments from iterator (#823) -- `during` now gets called with arguments from iterator (#824) -- Code simplifications and optimizations aplenty ([diff](https://github.com/caolan/async/compare/v1.3.0...v1.4.0)) - - -# v1.3.0 - -New Features: -- Added `constant` -- Added `asyncify`/`wrapSync` for making sync functions work with callbacks. (#671, #806) -- Added `during` and `doDuring`, which are like `whilst` with an async truth test. (#800) -- `retry` now accepts an `interval` parameter to specify a delay between retries. (#793) -- `async` should work better in Web Workers due to better `root` detection (#804) -- Callbacks are now optional in `whilst`, `doWhilst`, `until`, and `doUntil` (#642) -- Various internal updates (#786, #801, #802, #803) -- Various doc fixes (#790, #794) - -Bug Fixes: -- `cargo` now exposes the `payload` size, and `cargo.payload` can be changed on the fly after the `cargo` is created. (#740, #744, #783) - - -# v1.2.1 - -Bug Fix: - -- Small regression with synchronous iterator behavior in `eachSeries` with a 1-element array. Before 1.1.0, `eachSeries`'s callback was called on the same tick, which this patch restores. In 2.0.0, it will be called on the next tick. (#782) - - -# v1.2.0 - -New Features: - -- Added `timesLimit` (#743) -- `concurrency` can be changed after initialization in `queue` by setting `q.concurrency`. The new concurrency will be reflected the next time a task is processed. (#747, #772) - -Bug Fixes: - -- Fixed a regression in `each` and family with empty arrays that have additional properties. (#775, #777) - - -# v1.1.1 - -Bug Fix: - -- Small regression with synchronous iterator behavior in `eachSeries` with a 1-element array. Before 1.1.0, `eachSeries`'s callback was called on the same tick, which this patch restores. In 2.0.0, it will be called on the next tick. (#782) - - -# v1.1.0 - -New Features: - -- `cargo` now supports all of the same methods and event callbacks as `queue`. -- Added `ensureAsync` - A wrapper that ensures an async function calls its callback on a later tick. (#769) -- Optimized `map`, `eachOf`, and `waterfall` families of functions -- Passing a `null` or `undefined` array to `map`, `each`, `parallel` and families will be treated as an empty array (#667). -- The callback is now optional for the composed results of `compose` and `seq`. (#618) -- Reduced file size by 4kb, (minified version by 1kb) -- Added code coverage through `nyc` and `coveralls` (#768) - -Bug Fixes: - -- `forever` will no longer stack overflow with a synchronous iterator (#622) -- `eachLimit` and other limit functions will stop iterating once an error occurs (#754) -- Always pass `null` in callbacks when there is no error (#439) -- Ensure proper conditions when calling `drain()` after pushing an empty data set to a queue (#668) -- `each` and family will properly handle an empty array (#578) -- `eachSeries` and family will finish if the underlying array is modified during execution (#557) -- `queue` will throw if a non-function is passed to `q.push()` (#593) -- Doc fixes (#629, #766) - - -# v1.0.0 - -No known breaking changes, we are simply complying with semver from here on out. - -Changes: - -- Start using a changelog! -- Add `forEachOf` for iterating over Objects (or to iterate Arrays with indexes available) (#168 #704 #321) -- Detect deadlocks in `auto` (#663) -- Better support for require.js (#527) -- Throw if queue created with concurrency `0` (#714) -- Fix unneeded iteration in `queue.resume()` (#758) -- Guard against timer mocking overriding `setImmediate` (#609 #611) -- Miscellaneous doc fixes (#542 #596 #615 #628 #631 #690 #729) -- Use single noop function internally (#546) -- Optimize internal `_each`, `_map` and `_keys` functions. diff --git a/node_modules/grunt-contrib-clean/node_modules/async/LICENSE b/node_modules/grunt-contrib-clean/node_modules/async/LICENSE deleted file mode 100644 index 8f29698..0000000 --- a/node_modules/grunt-contrib-clean/node_modules/async/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010-2014 Caolan McMahon - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/grunt-contrib-clean/node_modules/async/README.md b/node_modules/grunt-contrib-clean/node_modules/async/README.md deleted file mode 100644 index 316c405..0000000 --- a/node_modules/grunt-contrib-clean/node_modules/async/README.md +++ /dev/null @@ -1,1877 +0,0 @@ -# Async.js - -[![Build Status via Travis CI](https://travis-ci.org/caolan/async.svg?branch=master)](https://travis-ci.org/caolan/async) -[![NPM version](http://img.shields.io/npm/v/async.svg)](https://www.npmjs.org/package/async) -[![Coverage Status](https://coveralls.io/repos/caolan/async/badge.svg?branch=master)](https://coveralls.io/r/caolan/async?branch=master) -[![Join the chat at https://gitter.im/caolan/async](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/caolan/async?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) - - -Async is a utility module which provides straight-forward, powerful functions -for working with asynchronous JavaScript. Although originally designed for -use with [Node.js](http://nodejs.org) and installable via `npm install async`, -it can also be used directly in the browser. - -Async is also installable via: - -- [bower](http://bower.io/): `bower install async` -- [component](https://github.com/component/component): `component install - caolan/async` -- [jam](http://jamjs.org/): `jam install async` -- [spm](http://spmjs.io/): `spm install async` - -Async provides around 20 functions that include the usual 'functional' -suspects (`map`, `reduce`, `filter`, `each`…) as well as some common patterns -for asynchronous control flow (`parallel`, `series`, `waterfall`…). All these -functions assume you follow the Node.js convention of providing a single -callback as the last argument of your `async` function. - - -## Quick Examples - -```javascript -async.map(['file1','file2','file3'], fs.stat, function(err, results){ - // results is now an array of stats for each file -}); - -async.filter(['file1','file2','file3'], fs.exists, function(results){ - // results now equals an array of the existing files -}); - -async.parallel([ - function(){ ... }, - function(){ ... } -], callback); - -async.series([ - function(){ ... }, - function(){ ... } -]); -``` - -There are many more functions available so take a look at the docs below for a -full list. This module aims to be comprehensive, so if you feel anything is -missing please create a GitHub issue for it. - -## Common Pitfalls [(StackOverflow)](http://stackoverflow.com/questions/tagged/async.js) -### Synchronous iteration functions - -If you get an error like `RangeError: Maximum call stack size exceeded.` or other stack overflow issues when using async, you are likely using a synchronous iterator. By *synchronous* we mean a function that calls its callback on the same tick in the javascript event loop, without doing any I/O or using any timers. Calling many callbacks iteratively will quickly overflow the stack. If you run into this issue, just defer your callback with `async.setImmediate` to start a new call stack on the next tick of the event loop. - -This can also arise by accident if you callback early in certain cases: - -```js -async.eachSeries(hugeArray, function iterator(item, callback) { - if (inCache(item)) { - callback(null, cache[item]); // if many items are cached, you'll overflow - } else { - doSomeIO(item, callback); - } -}, function done() { - //... -}); -``` - -Just change it to: - -```js -async.eachSeries(hugeArray, function iterator(item, callback) { - if (inCache(item)) { - async.setImmediate(function () { - callback(null, cache[item]); - }); - } else { - doSomeIO(item, callback); - //... -``` - -Async guards against synchronous functions in some, but not all, cases. If you are still running into stack overflows, you can defer as suggested above, or wrap functions with [`async.ensureAsync`](#ensureAsync) Functions that are asynchronous by their nature do not have this problem and don't need the extra callback deferral. - -If JavaScript's event loop is still a bit nebulous, check out [this article](http://blog.carbonfive.com/2013/10/27/the-javascript-event-loop-explained/) or [this talk](http://2014.jsconf.eu/speakers/philip-roberts-what-the-heck-is-the-event-loop-anyway.html) for more detailed information about how it works. - - -### Multiple callbacks - -Make sure to always `return` when calling a callback early, otherwise you will cause multiple callbacks and unpredictable behavior in many cases. - -```js -async.waterfall([ - function (callback) { - getSomething(options, function (err, result) { - if (err) { - callback(new Error("failed getting something:" + err.message)); - // we should return here - } - // since we did not return, this callback still will be called and - // `processData` will be called twice - callback(null, result); - }); - }, - processData -], done) -``` - -It is always good practice to `return callback(err, result)` whenever a callback call is not the last statement of a function. - - -### Binding a context to an iterator - -This section is really about `bind`, not about `async`. If you are wondering how to -make `async` execute your iterators in a given context, or are confused as to why -a method of another library isn't working as an iterator, study this example: - -```js -// Here is a simple object with an (unnecessarily roundabout) squaring method -var AsyncSquaringLibrary = { - squareExponent: 2, - square: function(number, callback){ - var result = Math.pow(number, this.squareExponent); - setTimeout(function(){ - callback(null, result); - }, 200); - } -}; - -async.map([1, 2, 3], AsyncSquaringLibrary.square, function(err, result){ - // result is [NaN, NaN, NaN] - // This fails because the `this.squareExponent` expression in the square - // function is not evaluated in the context of AsyncSquaringLibrary, and is - // therefore undefined. -}); - -async.map([1, 2, 3], AsyncSquaringLibrary.square.bind(AsyncSquaringLibrary), function(err, result){ - // result is [1, 4, 9] - // With the help of bind we can attach a context to the iterator before - // passing it to async. Now the square function will be executed in its - // 'home' AsyncSquaringLibrary context and the value of `this.squareExponent` - // will be as expected. -}); -``` - -## Download - -The source is available for download from -[GitHub](https://github.com/caolan/async/blob/master/lib/async.js). -Alternatively, you can install using Node Package Manager (`npm`): - - npm install async - -As well as using Bower: - - bower install async - -__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 29.6kb Uncompressed - -## In the Browser - -So far it's been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. - -Usage: - -```html - - -``` - -## Documentation - -Some functions are also available in the following forms: -* `Series` - the same as `` but runs only a single async operation at a time -* `Limit` - the same as `` but runs a maximum of `limit` async operations at a time - -### Collections - -* [`each`](#each), `eachSeries`, `eachLimit` -* [`forEachOf`](#forEachOf), `forEachOfSeries`, `forEachOfLimit` -* [`map`](#map), `mapSeries`, `mapLimit` -* [`filter`](#filter), `filterSeries`, `filterLimit` -* [`reject`](#reject), `rejectSeries`, `rejectLimit` -* [`reduce`](#reduce), [`reduceRight`](#reduceRight) -* [`detect`](#detect), `detectSeries`, `detectLimit` -* [`sortBy`](#sortBy) -* [`some`](#some), `someLimit` -* [`every`](#every), `everyLimit` -* [`concat`](#concat), `concatSeries` - -### Control Flow - -* [`series`](#seriestasks-callback) -* [`parallel`](#parallel), `parallelLimit` -* [`whilst`](#whilst), [`doWhilst`](#doWhilst) -* [`until`](#until), [`doUntil`](#doUntil) -* [`during`](#during), [`doDuring`](#doDuring) -* [`forever`](#forever) -* [`waterfall`](#waterfall) -* [`compose`](#compose) -* [`seq`](#seq) -* [`applyEach`](#applyEach), `applyEachSeries` -* [`queue`](#queue), [`priorityQueue`](#priorityQueue) -* [`cargo`](#cargo) -* [`auto`](#auto) -* [`retry`](#retry) -* [`iterator`](#iterator) -* [`times`](#times), `timesSeries`, `timesLimit` - -### Utils - -* [`apply`](#apply) -* [`nextTick`](#nextTick) -* [`memoize`](#memoize) -* [`unmemoize`](#unmemoize) -* [`ensureAsync`](#ensureAsync) -* [`constant`](#constant) -* [`asyncify`](#asyncify) -* [`wrapSync`](#wrapSync) -* [`log`](#log) -* [`dir`](#dir) -* [`noConflict`](#noConflict) - -## Collections - - - -### each(arr, iterator, [callback]) - -Applies the function `iterator` to each item in `arr`, in parallel. -The `iterator` is called with an item from the list, and a callback for when it -has finished. If the `iterator` passes an error to its `callback`, the main -`callback` (for the `each` function) is immediately called with the error. - -Note, that since this function applies `iterator` to each item in parallel, -there is no guarantee that the iterator functions will complete in order. - -__Arguments__ - -* `arr` - An array to iterate over. -* `iterator(item, callback)` - A function to apply to each item in `arr`. - The iterator is passed a `callback(err)` which must be called once it has - completed. If no error has occurred, the `callback` should be run without - arguments or with an explicit `null` argument. The array index is not passed - to the iterator. If you need the index, use [`forEachOf`](#forEachOf). -* `callback(err)` - *Optional* A callback which is called when all `iterator` functions - have finished, or an error occurs. - -__Examples__ - - -```js -// assuming openFiles is an array of file names and saveFile is a function -// to save the modified contents of that file: - -async.each(openFiles, saveFile, function(err){ - // if any of the saves produced an error, err would equal that error -}); -``` - -```js -// assuming openFiles is an array of file names - -async.each(openFiles, function(file, callback) { - - // Perform operation on file here. - console.log('Processing file ' + file); - - if( file.length > 32 ) { - console.log('This file name is too long'); - callback('File name too long'); - } else { - // Do work to process file here - console.log('File processed'); - callback(); - } -}, function(err){ - // if any of the file processing produced an error, err would equal that error - if( err ) { - // One of the iterations produced an error. - // All processing will now stop. - console.log('A file failed to process'); - } else { - console.log('All files have been processed successfully'); - } -}); -``` - -__Related__ - -* eachSeries(arr, iterator, [callback]) -* eachLimit(arr, limit, iterator, [callback]) - ---------------------------------------- - - - - -### forEachOf(obj, iterator, [callback]) - -Like `each`, except that it iterates over objects, and passes the key as the second argument to the iterator. - -__Arguments__ - -* `obj` - An object or array to iterate over. -* `iterator(item, key, callback)` - A function to apply to each item in `obj`. -The `key` is the item's key, or index in the case of an array. The iterator is -passed a `callback(err)` which must be called once it has completed. If no -error has occurred, the callback should be run without arguments or with an -explicit `null` argument. -* `callback(err)` - *Optional* A callback which is called when all `iterator` functions have finished, or an error occurs. - -__Example__ - -```js -var obj = {dev: "/dev.json", test: "/test.json", prod: "/prod.json"}; -var configs = {}; - -async.forEachOf(obj, function (value, key, callback) { - fs.readFile(__dirname + value, "utf8", function (err, data) { - if (err) return callback(err); - try { - configs[key] = JSON.parse(data); - } catch (e) { - return callback(e); - } - callback(); - }) -}, function (err) { - if (err) console.error(err.message); - // configs is now a map of JSON data - doSomethingWith(configs); -}) -``` - -__Related__ - -* forEachOfSeries(obj, iterator, [callback]) -* forEachOfLimit(obj, limit, iterator, [callback]) - ---------------------------------------- - - -### map(arr, iterator, [callback]) - -Produces a new array of values by mapping each value in `arr` through -the `iterator` function. The `iterator` is called with an item from `arr` and a -callback for when it has finished processing. Each of these callback takes 2 arguments: -an `error`, and the transformed item from `arr`. If `iterator` passes an error to its -callback, the main `callback` (for the `map` function) is immediately called with the error. - -Note, that since this function applies the `iterator` to each item in parallel, -there is no guarantee that the `iterator` functions will complete in order. -However, the results array will be in the same order as the original `arr`. - -__Arguments__ - -* `arr` - An array to iterate over. -* `iterator(item, callback)` - A function to apply to each item in `arr`. - The iterator is passed a `callback(err, transformed)` which must be called once - it has completed with an error (which can be `null`) and a transformed item. -* `callback(err, results)` - *Optional* A callback which is called when all `iterator` - functions have finished, or an error occurs. Results is an array of the - transformed items from the `arr`. - -__Example__ - -```js -async.map(['file1','file2','file3'], fs.stat, function(err, results){ - // results is now an array of stats for each file -}); -``` - -__Related__ -* mapSeries(arr, iterator, [callback]) -* mapLimit(arr, limit, iterator, [callback]) - ---------------------------------------- - - - -### filter(arr, iterator, [callback]) - -__Alias:__ `select` - -Returns a new array of all the values in `arr` which pass an async truth test. -_The callback for each `iterator` call only accepts a single argument of `true` or -`false`; it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like `fs.exists`. This operation is -performed in parallel, but the results array will be in the same order as the -original. - -__Arguments__ - -* `arr` - An array to iterate over. -* `iterator(item, callback)` - A truth test to apply to each item in `arr`. - The `iterator` is passed a `callback(truthValue)`, which must be called with a - boolean argument once it has completed. -* `callback(results)` - *Optional* A callback which is called after all the `iterator` - functions have finished. - -__Example__ - -```js -async.filter(['file1','file2','file3'], fs.exists, function(results){ - // results now equals an array of the existing files -}); -``` - -__Related__ - -* filterSeries(arr, iterator, [callback]) -* filterLimit(arr, limit, iterator, [callback]) - ---------------------------------------- - - -### reject(arr, iterator, [callback]) - -The opposite of [`filter`](#filter). Removes values that pass an `async` truth test. - -__Related__ - -* rejectSeries(arr, iterator, [callback]) -* rejectLimit(arr, limit, iterator, [callback]) - ---------------------------------------- - - -### reduce(arr, memo, iterator, [callback]) - -__Aliases:__ `inject`, `foldl` - -Reduces `arr` into a single value using an async `iterator` to return -each successive step. `memo` is the initial state of the reduction. -This function only operates in series. - -For performance reasons, it may make sense to split a call to this function into -a parallel map, and then use the normal `Array.prototype.reduce` on the results. -This function is for situations where each step in the reduction needs to be async; -if you can get the data before reducing it, then it's probably a good idea to do so. - -__Arguments__ - -* `arr` - An array to iterate over. -* `memo` - The initial state of the reduction. -* `iterator(memo, item, callback)` - A function applied to each item in the - array to produce the next step in the reduction. The `iterator` is passed a - `callback(err, reduction)` which accepts an optional error as its first - argument, and the state of the reduction as the second. If an error is - passed to the callback, the reduction is stopped and the main `callback` is - immediately called with the error. -* `callback(err, result)` - *Optional* A callback which is called after all the `iterator` - functions have finished. Result is the reduced value. - -__Example__ - -```js -async.reduce([1,2,3], 0, function(memo, item, callback){ - // pointless async: - process.nextTick(function(){ - callback(null, memo + item) - }); -}, function(err, result){ - // result is now equal to the last value of memo, which is 6 -}); -``` - ---------------------------------------- - - -### reduceRight(arr, memo, iterator, [callback]) - -__Alias:__ `foldr` - -Same as [`reduce`](#reduce), only operates on `arr` in reverse order. - - ---------------------------------------- - - -### detect(arr, iterator, [callback]) - -Returns the first value in `arr` that passes an async truth test. The -`iterator` is applied in parallel, meaning the first iterator to return `true` will -fire the detect `callback` with that result. That means the result might not be -the first item in the original `arr` (in terms of order) that passes the test. - -If order within the original `arr` is important, then look at [`detectSeries`](#detectSeries). - -__Arguments__ - -* `arr` - An array to iterate over. -* `iterator(item, callback)` - A truth test to apply to each item in `arr`. - The iterator is passed a `callback(truthValue)` which must be called with a - boolean argument once it has completed. **Note: this callback does not take an error as its first argument.** -* `callback(result)` - *Optional* A callback which is called as soon as any iterator returns - `true`, or after all the `iterator` functions have finished. Result will be - the first item in the array that passes the truth test (iterator) or the - value `undefined` if none passed. **Note: this callback does not take an error as its first argument.** - -__Example__ - -```js -async.detect(['file1','file2','file3'], fs.exists, function(result){ - // result now equals the first file in the list that exists -}); -``` - -__Related__ - -* detectSeries(arr, iterator, [callback]) -* detectLimit(arr, limit, iterator, [callback]) - ---------------------------------------- - - -### sortBy(arr, iterator, [callback]) - -Sorts a list by the results of running each `arr` value through an async `iterator`. - -__Arguments__ - -* `arr` - An array to iterate over. -* `iterator(item, callback)` - A function to apply to each item in `arr`. - The iterator is passed a `callback(err, sortValue)` which must be called once it - has completed with an error (which can be `null`) and a value to use as the sort - criteria. -* `callback(err, results)` - *Optional* A callback which is called after all the `iterator` - functions have finished, or an error occurs. Results is the items from - the original `arr` sorted by the values returned by the `iterator` calls. - -__Example__ - -```js -async.sortBy(['file1','file2','file3'], function(file, callback){ - fs.stat(file, function(err, stats){ - callback(err, stats.mtime); - }); -}, function(err, results){ - // results is now the original array of files sorted by - // modified date -}); -``` - -__Sort Order__ - -By modifying the callback parameter the sorting order can be influenced: - -```js -//ascending order -async.sortBy([1,9,3,5], function(x, callback){ - callback(null, x); -}, function(err,result){ - //result callback -} ); - -//descending order -async.sortBy([1,9,3,5], function(x, callback){ - callback(null, x*-1); //<- x*-1 instead of x, turns the order around -}, function(err,result){ - //result callback -} ); -``` - ---------------------------------------- - - -### some(arr, iterator, [callback]) - -__Alias:__ `any` - -Returns `true` if at least one element in the `arr` satisfies an async test. -_The callback for each iterator call only accepts a single argument of `true` or -`false`; it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like `fs.exists`. Once any iterator -call returns `true`, the main `callback` is immediately called. - -__Arguments__ - -* `arr` - An array to iterate over. -* `iterator(item, callback)` - A truth test to apply to each item in the array - in parallel. The iterator is passed a `callback(truthValue)`` which must be - called with a boolean argument once it has completed. -* `callback(result)` - *Optional* A callback which is called as soon as any iterator returns - `true`, or after all the iterator functions have finished. Result will be - either `true` or `false` depending on the values of the async tests. - - **Note: the callbacks do not take an error as their first argument.** -__Example__ - -```js -async.some(['file1','file2','file3'], fs.exists, function(result){ - // if result is true then at least one of the files exists -}); -``` - -__Related__ - -* someLimit(arr, limit, iterator, callback) - ---------------------------------------- - - -### every(arr, iterator, [callback]) - -__Alias:__ `all` - -Returns `true` if every element in `arr` satisfies an async test. -_The callback for each `iterator` call only accepts a single argument of `true` or -`false`; it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like `fs.exists`. - -__Arguments__ - -* `arr` - An array to iterate over. -* `iterator(item, callback)` - A truth test to apply to each item in the array - in parallel. The iterator is passed a `callback(truthValue)` which must be - called with a boolean argument once it has completed. -* `callback(result)` - *Optional* A callback which is called as soon as any iterator returns - `false`, or after all the iterator functions have finished. Result will be - either `true` or `false` depending on the values of the async tests. - - **Note: the callbacks do not take an error as their first argument.** - -__Example__ - -```js -async.every(['file1','file2','file3'], fs.exists, function(result){ - // if result is true then every file exists -}); -``` - -__Related__ - -* everyLimit(arr, limit, iterator, callback) - ---------------------------------------- - - -### concat(arr, iterator, [callback]) - -Applies `iterator` to each item in `arr`, concatenating the results. Returns the -concatenated list. The `iterator`s are called in parallel, and the results are -concatenated as they return. There is no guarantee that the results array will -be returned in the original order of `arr` passed to the `iterator` function. - -__Arguments__ - -* `arr` - An array to iterate over. -* `iterator(item, callback)` - A function to apply to each item in `arr`. - The iterator is passed a `callback(err, results)` which must be called once it - has completed with an error (which can be `null`) and an array of results. -* `callback(err, results)` - *Optional* A callback which is called after all the `iterator` - functions have finished, or an error occurs. Results is an array containing - the concatenated results of the `iterator` function. - -__Example__ - -```js -async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){ - // files is now a list of filenames that exist in the 3 directories -}); -``` - -__Related__ - -* concatSeries(arr, iterator, [callback]) - - -## Control Flow - - -### series(tasks, [callback]) - -Run the functions in the `tasks` array in series, each one running once the previous -function has completed. If any functions in the series pass an error to its -callback, no more functions are run, and `callback` is immediately called with the value of the error. -Otherwise, `callback` receives an array of results when `tasks` have completed. - -It is also possible to use an object instead of an array. Each property will be -run as a function, and the results will be passed to the final `callback` as an object -instead of an array. This can be a more readable way of handling results from -[`series`](#series). - -**Note** that while many implementations preserve the order of object properties, the -[ECMAScript Language Specification](http://www.ecma-international.org/ecma-262/5.1/#sec-8.6) -explicitly states that - -> The mechanics and order of enumerating the properties is not specified. - -So if you rely on the order in which your series of functions are executed, and want -this to work on all platforms, consider using an array. - -__Arguments__ - -* `tasks` - An array or object containing functions to run, each function is passed - a `callback(err, result)` it must call on completion with an error `err` (which can - be `null`) and an optional `result` value. -* `callback(err, results)` - An optional callback to run once all the functions - have completed. This function gets a results array (or object) containing all - the result arguments passed to the `task` callbacks. - -__Example__ - -```js -async.series([ - function(callback){ - // do some stuff ... - callback(null, 'one'); - }, - function(callback){ - // do some more stuff ... - callback(null, 'two'); - } -], -// optional callback -function(err, results){ - // results is now equal to ['one', 'two'] -}); - - -// an example using an object instead of an array -async.series({ - one: function(callback){ - setTimeout(function(){ - callback(null, 1); - }, 200); - }, - two: function(callback){ - setTimeout(function(){ - callback(null, 2); - }, 100); - } -}, -function(err, results) { - // results is now equal to: {one: 1, two: 2} -}); -``` - ---------------------------------------- - - -### parallel(tasks, [callback]) - -Run the `tasks` array of functions in parallel, without waiting until the previous -function has completed. If any of the functions pass an error to its -callback, the main `callback` is immediately called with the value of the error. -Once the `tasks` have completed, the results are passed to the final `callback` as an -array. - -**Note:** `parallel` is about kicking-off I/O tasks in parallel, not about parallel execution of code. If your tasks do not use any timers or perform any I/O, they will actually be executed in series. Any synchronous setup sections for each task will happen one after the other. JavaScript remains single-threaded. - -It is also possible to use an object instead of an array. Each property will be -run as a function and the results will be passed to the final `callback` as an object -instead of an array. This can be a more readable way of handling results from -[`parallel`](#parallel). - - -__Arguments__ - -* `tasks` - An array or object containing functions to run. Each function is passed - a `callback(err, result)` which it must call on completion with an error `err` - (which can be `null`) and an optional `result` value. -* `callback(err, results)` - An optional callback to run once all the functions - have completed successfully. This function gets a results array (or object) containing all - the result arguments passed to the task callbacks. - -__Example__ - -```js -async.parallel([ - function(callback){ - setTimeout(function(){ - callback(null, 'one'); - }, 200); - }, - function(callback){ - setTimeout(function(){ - callback(null, 'two'); - }, 100); - } -], -// optional callback -function(err, results){ - // the results array will equal ['one','two'] even though - // the second function had a shorter timeout. -}); - - -// an example using an object instead of an array -async.parallel({ - one: function(callback){ - setTimeout(function(){ - callback(null, 1); - }, 200); - }, - two: function(callback){ - setTimeout(function(){ - callback(null, 2); - }, 100); - } -}, -function(err, results) { - // results is now equals to: {one: 1, two: 2} -}); -``` - -__Related__ - -* parallelLimit(tasks, limit, [callback]) - ---------------------------------------- - - -### whilst(test, fn, callback) - -Repeatedly call `fn`, while `test` returns `true`. Calls `callback` when stopped, -or an error occurs. - -__Arguments__ - -* `test()` - synchronous truth test to perform before each execution of `fn`. -* `fn(callback)` - A function which is called each time `test` passes. The function is - passed a `callback(err)`, which must be called once it has completed with an - optional `err` argument. -* `callback(err, [results])` - A callback which is called after the test - function has failed and repeated execution of `fn` has stopped. `callback` - will be passed an error and any arguments passed to the final `fn`'s callback. - -__Example__ - -```js -var count = 0; - -async.whilst( - function () { return count < 5; }, - function (callback) { - count++; - setTimeout(function () { - callback(null, count); - }, 1000); - }, - function (err, n) { - // 5 seconds have passed, n = 5 - } -); -``` - ---------------------------------------- - - -### doWhilst(fn, test, callback) - -The post-check version of [`whilst`](#whilst). To reflect the difference in -the order of operations, the arguments `test` and `fn` are switched. - -`doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript. - ---------------------------------------- - - -### until(test, fn, callback) - -Repeatedly call `fn` until `test` returns `true`. Calls `callback` when stopped, -or an error occurs. `callback` will be passed an error and any arguments passed -to the final `fn`'s callback. - -The inverse of [`whilst`](#whilst). - ---------------------------------------- - - -### doUntil(fn, test, callback) - -Like [`doWhilst`](#doWhilst), except the `test` is inverted. Note the argument ordering differs from `until`. - ---------------------------------------- - - -### during(test, fn, callback) - -Like [`whilst`](#whilst), except the `test` is an asynchronous function that is passed a callback in the form of `function (err, truth)`. If error is passed to `test` or `fn`, the main callback is immediately called with the value of the error. - -__Example__ - -```js -var count = 0; - -async.during( - function (callback) { - return callback(null, count < 5); - }, - function (callback) { - count++; - setTimeout(callback, 1000); - }, - function (err) { - // 5 seconds have passed - } -); -``` - ---------------------------------------- - - -### doDuring(fn, test, callback) - -The post-check version of [`during`](#during). To reflect the difference in -the order of operations, the arguments `test` and `fn` are switched. - -Also a version of [`doWhilst`](#doWhilst) with asynchronous `test` function. - ---------------------------------------- - - -### forever(fn, [errback]) - -Calls the asynchronous function `fn` with a callback parameter that allows it to -call itself again, in series, indefinitely. - -If an error is passed to the callback then `errback` is called with the -error, and execution stops, otherwise it will never be called. - -```js -async.forever( - function(next) { - // next is suitable for passing to things that need a callback(err [, whatever]); - // it will result in this function being called again. - }, - function(err) { - // if next is called with a value in its first parameter, it will appear - // in here as 'err', and execution will stop. - } -); -``` - ---------------------------------------- - - -### waterfall(tasks, [callback]) - -Runs the `tasks` array of functions in series, each passing their results to the next in -the array. However, if any of the `tasks` pass an error to their own callback, the -next function is not executed, and the main `callback` is immediately called with -the error. - -__Arguments__ - -* `tasks` - An array of functions to run, each function is passed a - `callback(err, result1, result2, ...)` it must call on completion. The first - argument is an error (which can be `null`) and any further arguments will be - passed as arguments in order to the next task. -* `callback(err, [results])` - An optional callback to run once all the functions - have completed. This will be passed the results of the last task's callback. - - - -__Example__ - -```js -async.waterfall([ - function(callback) { - callback(null, 'one', 'two'); - }, - function(arg1, arg2, callback) { - // arg1 now equals 'one' and arg2 now equals 'two' - callback(null, 'three'); - }, - function(arg1, callback) { - // arg1 now equals 'three' - callback(null, 'done'); - } -], function (err, result) { - // result now equals 'done' -}); -``` -Or, with named functions: - -```js -async.waterfall([ - myFirstFunction, - mySecondFunction, - myLastFunction, -], function (err, result) { - // result now equals 'done' -}); -function myFirstFunction(callback) { - callback(null, 'one', 'two'); -} -function mySecondFunction(arg1, arg2, callback) { - // arg1 now equals 'one' and arg2 now equals 'two' - callback(null, 'three'); -} -function myLastFunction(arg1, callback) { - // arg1 now equals 'three' - callback(null, 'done'); -} -``` - -Or, if you need to pass any argument to the first function: - -```js -async.waterfall([ - async.apply(myFirstFunction, 'zero'), - mySecondFunction, - myLastFunction, -], function (err, result) { - // result now equals 'done' -}); -function myFirstFunction(arg1, callback) { - // arg1 now equals 'zero' - callback(null, 'one', 'two'); -} -function mySecondFunction(arg1, arg2, callback) { - // arg1 now equals 'one' and arg2 now equals 'two' - callback(null, 'three'); -} -function myLastFunction(arg1, callback) { - // arg1 now equals 'three' - callback(null, 'done'); -} -``` - ---------------------------------------- - -### compose(fn1, fn2...) - -Creates a function which is a composition of the passed asynchronous -functions. Each function consumes the return value of the function that -follows. Composing functions `f()`, `g()`, and `h()` would produce the result of -`f(g(h()))`, only this version uses callbacks to obtain the return values. - -Each function is executed with the `this` binding of the composed function. - -__Arguments__ - -* `functions...` - the asynchronous functions to compose - - -__Example__ - -```js -function add1(n, callback) { - setTimeout(function () { - callback(null, n + 1); - }, 10); -} - -function mul3(n, callback) { - setTimeout(function () { - callback(null, n * 3); - }, 10); -} - -var add1mul3 = async.compose(mul3, add1); - -add1mul3(4, function (err, result) { - // result now equals 15 -}); -``` - ---------------------------------------- - -### seq(fn1, fn2...) - -Version of the compose function that is more natural to read. -Each function consumes the return value of the previous function. -It is the equivalent of [`compose`](#compose) with the arguments reversed. - -Each function is executed with the `this` binding of the composed function. - -__Arguments__ - -* `functions...` - the asynchronous functions to compose - - -__Example__ - -```js -// Requires lodash (or underscore), express3 and dresende's orm2. -// Part of an app, that fetches cats of the logged user. -// This example uses `seq` function to avoid overnesting and error -// handling clutter. -app.get('/cats', function(request, response) { - var User = request.models.User; - async.seq( - _.bind(User.get, User), // 'User.get' has signature (id, callback(err, data)) - function(user, fn) { - user.getCats(fn); // 'getCats' has signature (callback(err, data)) - } - )(req.session.user_id, function (err, cats) { - if (err) { - console.error(err); - response.json({ status: 'error', message: err.message }); - } else { - response.json({ status: 'ok', message: 'Cats found', data: cats }); - } - }); -}); -``` - ---------------------------------------- - -### applyEach(fns, args..., callback) - -Applies the provided arguments to each function in the array, calling -`callback` after all functions have completed. If you only provide the first -argument, then it will return a function which lets you pass in the -arguments as if it were a single function call. - -__Arguments__ - -* `fns` - the asynchronous functions to all call with the same arguments -* `args...` - any number of separate arguments to pass to the function -* `callback` - the final argument should be the callback, called when all - functions have completed processing - - -__Example__ - -```js -async.applyEach([enableSearch, updateSchema], 'bucket', callback); - -// partial application example: -async.each( - buckets, - async.applyEach([enableSearch, updateSchema]), - callback -); -``` - -__Related__ - -* applyEachSeries(tasks, args..., [callback]) - ---------------------------------------- - - -### queue(worker, [concurrency]) - -Creates a `queue` object with the specified `concurrency`. Tasks added to the -`queue` are processed in parallel (up to the `concurrency` limit). If all -`worker`s are in progress, the task is queued until one becomes available. -Once a `worker` completes a `task`, that `task`'s callback is called. - -__Arguments__ - -* `worker(task, callback)` - An asynchronous function for processing a queued - task, which must call its `callback(err)` argument when finished, with an - optional `error` as an argument. If you want to handle errors from an individual task, pass a callback to `q.push()`. -* `concurrency` - An `integer` for determining how many `worker` functions should be - run in parallel. If omitted, the concurrency defaults to `1`. If the concurrency is `0`, an error is thrown. - -__Queue objects__ - -The `queue` object returned by this function has the following properties and -methods: - -* `length()` - a function returning the number of items waiting to be processed. -* `started` - a function returning whether or not any items have been pushed and processed by the queue -* `running()` - a function returning the number of items currently being processed. -* `workersList()` - a function returning the array of items currently being processed. -* `idle()` - a function returning false if there are items waiting or being processed, or true if not. -* `concurrency` - an integer for determining how many `worker` functions should be - run in parallel. This property can be changed after a `queue` is created to - alter the concurrency on-the-fly. -* `push(task, [callback])` - add a new task to the `queue`. Calls `callback` once - the `worker` has finished processing the task. Instead of a single task, a `tasks` array - can be submitted. The respective callback is used for every task in the list. -* `unshift(task, [callback])` - add a new task to the front of the `queue`. -* `saturated` - a callback that is called when the `queue` length hits the `concurrency` limit, - and further tasks will be queued. -* `empty` - a callback that is called when the last item from the `queue` is given to a `worker`. -* `drain` - a callback that is called when the last item from the `queue` has returned from the `worker`. -* `paused` - a boolean for determining whether the queue is in a paused state -* `pause()` - a function that pauses the processing of tasks until `resume()` is called. -* `resume()` - a function that resumes the processing of queued tasks when the queue is paused. -* `kill()` - a function that removes the `drain` callback and empties remaining tasks from the queue forcing it to go idle. - -__Example__ - -```js -// create a queue object with concurrency 2 - -var q = async.queue(function (task, callback) { - console.log('hello ' + task.name); - callback(); -}, 2); - - -// assign a callback -q.drain = function() { - console.log('all items have been processed'); -} - -// add some items to the queue - -q.push({name: 'foo'}, function (err) { - console.log('finished processing foo'); -}); -q.push({name: 'bar'}, function (err) { - console.log('finished processing bar'); -}); - -// add some items to the queue (batch-wise) - -q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) { - console.log('finished processing item'); -}); - -// add some items to the front of the queue - -q.unshift({name: 'bar'}, function (err) { - console.log('finished processing bar'); -}); -``` - - ---------------------------------------- - - -### priorityQueue(worker, concurrency) - -The same as [`queue`](#queue) only tasks are assigned a priority and completed in ascending priority order. There are two differences between `queue` and `priorityQueue` objects: - -* `push(task, priority, [callback])` - `priority` should be a number. If an array of - `tasks` is given, all tasks will be assigned the same priority. -* The `unshift` method was removed. - ---------------------------------------- - - -### cargo(worker, [payload]) - -Creates a `cargo` object with the specified payload. Tasks added to the -cargo will be processed altogether (up to the `payload` limit). If the -`worker` is in progress, the task is queued until it becomes available. Once -the `worker` has completed some tasks, each callback of those tasks is called. -Check out [these](https://camo.githubusercontent.com/6bbd36f4cf5b35a0f11a96dcd2e97711ffc2fb37/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130382f62626330636662302d356632392d313165322d393734662d3333393763363464633835382e676966) [animations](https://camo.githubusercontent.com/f4810e00e1c5f5f8addbe3e9f49064fd5d102699/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130312f38346339323036362d356632392d313165322d383134662d3964336430323431336266642e676966) for how `cargo` and `queue` work. - -While [queue](#queue) passes only one task to one of a group of workers -at a time, cargo passes an array of tasks to a single worker, repeating -when the worker is finished. - -__Arguments__ - -* `worker(tasks, callback)` - An asynchronous function for processing an array of - queued tasks, which must call its `callback(err)` argument when finished, with - an optional `err` argument. -* `payload` - An optional `integer` for determining how many tasks should be - processed per round; if omitted, the default is unlimited. - -__Cargo objects__ - -The `cargo` object returned by this function has the following properties and -methods: - -* `length()` - A function returning the number of items waiting to be processed. -* `payload` - An `integer` for determining how many tasks should be - process per round. This property can be changed after a `cargo` is created to - alter the payload on-the-fly. -* `push(task, [callback])` - Adds `task` to the `queue`. The callback is called - once the `worker` has finished processing the task. Instead of a single task, an array of `tasks` - can be submitted. The respective callback is used for every task in the list. -* `saturated` - A callback that is called when the `queue.length()` hits the concurrency and further tasks will be queued. -* `empty` - A callback that is called when the last item from the `queue` is given to a `worker`. -* `drain` - A callback that is called when the last item from the `queue` has returned from the `worker`. -* `idle()`, `pause()`, `resume()`, `kill()` - cargo inherits all of the same methods and event calbacks as [`queue`](#queue) - -__Example__ - -```js -// create a cargo object with payload 2 - -var cargo = async.cargo(function (tasks, callback) { - for(var i=0; i -### auto(tasks, [concurrency], [callback]) - -Determines the best order for running the functions in `tasks`, based on their requirements. Each function can optionally depend on other functions being completed first, and each function is run as soon as its requirements are satisfied. - -If any of the functions pass an error to their callback, the `auto` sequence will stop. Further tasks will not execute (so any other functions depending on it will not run), and the main `callback` is immediately called with the error. Functions also receive an object containing the results of functions which have completed so far. - -Note, all functions are called with a `results` object as a second argument, -so it is unsafe to pass functions in the `tasks` object which cannot handle the -extra argument. - -For example, this snippet of code: - -```js -async.auto({ - readData: async.apply(fs.readFile, 'data.txt', 'utf-8') -}, callback); -``` - -will have the effect of calling `readFile` with the results object as the last -argument, which will fail: - -```js -fs.readFile('data.txt', 'utf-8', cb, {}); -``` - -Instead, wrap the call to `readFile` in a function which does not forward the -`results` object: - -```js -async.auto({ - readData: function(cb, results){ - fs.readFile('data.txt', 'utf-8', cb); - } -}, callback); -``` - -__Arguments__ - -* `tasks` - An object. Each of its properties is either a function or an array of - requirements, with the function itself the last item in the array. The object's key - of a property serves as the name of the task defined by that property, - i.e. can be used when specifying requirements for other tasks. - The function receives two arguments: (1) a `callback(err, result)` which must be - called when finished, passing an `error` (which can be `null`) and the result of - the function's execution, and (2) a `results` object, containing the results of - the previously executed functions. -* `concurrency` - An optional `integer` for determining the maximum number of tasks that can be run in parallel. By default, as many as possible. -* `callback(err, results)` - An optional callback which is called when all the - tasks have been completed. It receives the `err` argument if any `tasks` - pass an error to their callback. Results are always returned; however, if - an error occurs, no further `tasks` will be performed, and the results - object will only contain partial results. - - -__Example__ - -```js -async.auto({ - get_data: function(callback){ - console.log('in get_data'); - // async code to get some data - callback(null, 'data', 'converted to array'); - }, - make_folder: function(callback){ - console.log('in make_folder'); - // async code to create a directory to store a file in - // this is run at the same time as getting the data - callback(null, 'folder'); - }, - write_file: ['get_data', 'make_folder', function(callback, results){ - console.log('in write_file', JSON.stringify(results)); - // once there is some data and the directory exists, - // write the data to a file in the directory - callback(null, 'filename'); - }], - email_link: ['write_file', function(callback, results){ - console.log('in email_link', JSON.stringify(results)); - // once the file is written let's email a link to it... - // results.write_file contains the filename returned by write_file. - callback(null, {'file':results.write_file, 'email':'user@example.com'}); - }] -}, function(err, results) { - console.log('err = ', err); - console.log('results = ', results); -}); -``` - -This is a fairly trivial example, but to do this using the basic parallel and -series functions would look like this: - -```js -async.parallel([ - function(callback){ - console.log('in get_data'); - // async code to get some data - callback(null, 'data', 'converted to array'); - }, - function(callback){ - console.log('in make_folder'); - // async code to create a directory to store a file in - // this is run at the same time as getting the data - callback(null, 'folder'); - } -], -function(err, results){ - async.series([ - function(callback){ - console.log('in write_file', JSON.stringify(results)); - // once there is some data and the directory exists, - // write the data to a file in the directory - results.push('filename'); - callback(null); - }, - function(callback){ - console.log('in email_link', JSON.stringify(results)); - // once the file is written let's email a link to it... - callback(null, {'file':results.pop(), 'email':'user@example.com'}); - } - ]); -}); -``` - -For a complicated series of `async` tasks, using the [`auto`](#auto) function makes adding -new tasks much easier (and the code more readable). - - ---------------------------------------- - - -### retry([opts = {times: 5, interval: 0}| 5], task, [callback]) - -Attempts to get a successful response from `task` no more than `times` times before -returning an error. If the task is successful, the `callback` will be passed the result -of the successful task. If all attempts fail, the callback will be passed the error and -result (if any) of the final attempt. - -__Arguments__ - -* `opts` - Can be either an object with `times` and `interval` or a number. - * `times` - The number of attempts to make before giving up. The default is `5`. - * `interval` - The time to wait between retries, in milliseconds. The default is `0`. - * If `opts` is a number, the number specifies the number of times to retry, with the default interval of `0`. -* `task(callback, results)` - A function which receives two arguments: (1) a `callback(err, result)` - which must be called when finished, passing `err` (which can be `null`) and the `result` of - the function's execution, and (2) a `results` object, containing the results of - the previously executed functions (if nested inside another control flow). -* `callback(err, results)` - An optional callback which is called when the - task has succeeded, or after the final failed attempt. It receives the `err` and `result` arguments of the last attempt at completing the `task`. - -The [`retry`](#retry) function can be used as a stand-alone control flow by passing a callback, as shown below: - -```js -// try calling apiMethod 3 times -async.retry(3, apiMethod, function(err, result) { - // do something with the result -}); -``` - -```js -// try calling apiMethod 3 times, waiting 200 ms between each retry -async.retry({times: 3, interval: 200}, apiMethod, function(err, result) { - // do something with the result -}); -``` - -```js -// try calling apiMethod the default 5 times no delay between each retry -async.retry(apiMethod, function(err, result) { - // do something with the result -}); -``` - -It can also be embedded within other control flow functions to retry individual methods -that are not as reliable, like this: - -```js -async.auto({ - users: api.getUsers.bind(api), - payments: async.retry(3, api.getPayments.bind(api)) -}, function(err, results) { - // do something with the results -}); -``` - - ---------------------------------------- - - -### iterator(tasks) - -Creates an iterator function which calls the next function in the `tasks` array, -returning a continuation to call the next one after that. It's also possible to -“peek” at the next iterator with `iterator.next()`. - -This function is used internally by the `async` module, but can be useful when -you want to manually control the flow of functions in series. - -__Arguments__ - -* `tasks` - An array of functions to run. - -__Example__ - -```js -var iterator = async.iterator([ - function(){ sys.p('one'); }, - function(){ sys.p('two'); }, - function(){ sys.p('three'); } -]); - -node> var iterator2 = iterator(); -'one' -node> var iterator3 = iterator2(); -'two' -node> iterator3(); -'three' -node> var nextfn = iterator2.next(); -node> nextfn(); -'three' -``` - ---------------------------------------- - - -### apply(function, arguments..) - -Creates a continuation function with some arguments already applied. - -Useful as a shorthand when combined with other control flow functions. Any arguments -passed to the returned function are added to the arguments originally passed -to apply. - -__Arguments__ - -* `function` - The function you want to eventually apply all arguments to. -* `arguments...` - Any number of arguments to automatically apply when the - continuation is called. - -__Example__ - -```js -// using apply - -async.parallel([ - async.apply(fs.writeFile, 'testfile1', 'test1'), - async.apply(fs.writeFile, 'testfile2', 'test2'), -]); - - -// the same process without using apply - -async.parallel([ - function(callback){ - fs.writeFile('testfile1', 'test1', callback); - }, - function(callback){ - fs.writeFile('testfile2', 'test2', callback); - } -]); -``` - -It's possible to pass any number of additional arguments when calling the -continuation: - -```js -node> var fn = async.apply(sys.puts, 'one'); -node> fn('two', 'three'); -one -two -three -``` - ---------------------------------------- - - -### nextTick(callback), setImmediate(callback) - -Calls `callback` on a later loop around the event loop. In Node.js this just -calls `process.nextTick`; in the browser it falls back to `setImmediate(callback)` -if available, otherwise `setTimeout(callback, 0)`, which means other higher priority -events may precede the execution of `callback`. - -This is used internally for browser-compatibility purposes. - -__Arguments__ - -* `callback` - The function to call on a later loop around the event loop. - -__Example__ - -```js -var call_order = []; -async.nextTick(function(){ - call_order.push('two'); - // call_order now equals ['one','two'] -}); -call_order.push('one') -``` - - -### times(n, iterator, [callback]) - -Calls the `iterator` function `n` times, and accumulates results in the same manner -you would use with [`map`](#map). - -__Arguments__ - -* `n` - The number of times to run the function. -* `iterator` - The function to call `n` times. -* `callback` - see [`map`](#map) - -__Example__ - -```js -// Pretend this is some complicated async factory -var createUser = function(id, callback) { - callback(null, { - id: 'user' + id - }) -} -// generate 5 users -async.times(5, function(n, next){ - createUser(n, function(err, user) { - next(err, user) - }) -}, function(err, users) { - // we should now have 5 users -}); -``` - -__Related__ - -* timesSeries(n, iterator, [callback]) -* timesLimit(n, limit, iterator, [callback]) - - -## Utils - - -### memoize(fn, [hasher]) - -Caches the results of an `async` function. When creating a hash to store function -results against, the callback is omitted from the hash and an optional hash -function can be used. - -If no hash function is specified, the first argument is used as a hash key, which may work reasonably if it is a string or a data type that converts to a distinct string. Note that objects and arrays will not behave reasonably. Neither will cases where the other arguments are significant. In such cases, specify your own hash function. - -The cache of results is exposed as the `memo` property of the function returned -by `memoize`. - -__Arguments__ - -* `fn` - The function to proxy and cache results from. -* `hasher` - An optional function for generating a custom hash for storing - results. It has all the arguments applied to it apart from the callback, and - must be synchronous. - -__Example__ - -```js -var slow_fn = function (name, callback) { - // do something - callback(null, result); -}; -var fn = async.memoize(slow_fn); - -// fn can now be used as if it were slow_fn -fn('some name', function () { - // callback -}); -``` - - -### unmemoize(fn) - -Undoes a [`memoize`](#memoize)d function, reverting it to the original, unmemoized -form. Handy for testing. - -__Arguments__ - -* `fn` - the memoized function - ---------------------------------------- - - -### ensureAsync(fn) - -Wrap an async function and ensure it calls its callback on a later tick of the event loop. If the function already calls its callback on a next tick, no extra deferral is added. This is useful for preventing stack overflows (`RangeError: Maximum call stack size exceeded`) and generally keeping [Zalgo](http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony) contained. - -__Arguments__ - -* `fn` - an async function, one that expects a node-style callback as its last argument - -Returns a wrapped function with the exact same call signature as the function passed in. - -__Example__ - -```js -function sometimesAsync(arg, callback) { - if (cache[arg]) { - return callback(null, cache[arg]); // this would be synchronous!! - } else { - doSomeIO(arg, callback); // this IO would be asynchronous - } -} - -// this has a risk of stack overflows if many results are cached in a row -async.mapSeries(args, sometimesAsync, done); - -// this will defer sometimesAsync's callback if necessary, -// preventing stack overflows -async.mapSeries(args, async.ensureAsync(sometimesAsync), done); - -``` - ---------------------------------------- - - -### constant(values...) - -Returns a function that when called, calls-back with the values provided. Useful as the first function in a `waterfall`, or for plugging values in to `auto`. - -__Example__ - -```js -async.waterfall([ - async.constant(42), - function (value, next) { - // value === 42 - }, - //... -], callback); - -async.waterfall([ - async.constant(filename, "utf8"), - fs.readFile, - function (fileData, next) { - //... - } - //... -], callback); - -async.auto({ - hostname: async.constant("https://server.net/"), - port: findFreePort, - launchServer: ["hostname", "port", function (cb, options) { - startServer(options, cb); - }], - //... -}, callback); - -``` - ---------------------------------------- - - - -### asyncify(func) - -__Alias:__ `wrapSync` - -Take a sync function and make it async, passing its return value to a callback. This is useful for plugging sync functions into a waterfall, series, or other async functions. Any arguments passed to the generated function will be passed to the wrapped function (except for the final callback argument). Errors thrown will be passed to the callback. - -__Example__ - -```js -async.waterfall([ - async.apply(fs.readFile, filename, "utf8"), - async.asyncify(JSON.parse), - function (data, next) { - // data is the result of parsing the text. - // If there was a parsing error, it would have been caught. - } -], callback) -``` - -If the function passed to `asyncify` returns a Promise, that promises's resolved/rejected state will be used to call the callback, rather than simply the synchronous return value. Example: - -```js -async.waterfall([ - async.apply(fs.readFile, filename, "utf8"), - async.asyncify(function (contents) { - return db.model.create(contents); - }), - function (model, next) { - // `model` is the instantiated model object. - // If there was an error, this function would be skipped. - } -], callback) -``` - -This also means you can asyncify ES2016 `async` functions. - -```js -var q = async.queue(async.asyncify(async function (file) { - var intermediateStep = await processFile(file); - return await somePromise(intermediateStep) -})); - -q.push(files); -``` - ---------------------------------------- - - -### log(function, arguments) - -Logs the result of an `async` function to the `console`. Only works in Node.js or -in browsers that support `console.log` and `console.error` (such as FF and Chrome). -If multiple arguments are returned from the async function, `console.log` is -called on each argument in order. - -__Arguments__ - -* `function` - The function you want to eventually apply all arguments to. -* `arguments...` - Any number of arguments to apply to the function. - -__Example__ - -```js -var hello = function(name, callback){ - setTimeout(function(){ - callback(null, 'hello ' + name); - }, 1000); -}; -``` -```js -node> async.log(hello, 'world'); -'hello world' -``` - ---------------------------------------- - - -### dir(function, arguments) - -Logs the result of an `async` function to the `console` using `console.dir` to -display the properties of the resulting object. Only works in Node.js or -in browsers that support `console.dir` and `console.error` (such as FF and Chrome). -If multiple arguments are returned from the async function, `console.dir` is -called on each argument in order. - -__Arguments__ - -* `function` - The function you want to eventually apply all arguments to. -* `arguments...` - Any number of arguments to apply to the function. - -__Example__ - -```js -var hello = function(name, callback){ - setTimeout(function(){ - callback(null, {hello: name}); - }, 1000); -}; -``` -```js -node> async.dir(hello, 'world'); -{hello: 'world'} -``` - ---------------------------------------- - - -### noConflict() - -Changes the value of `async` back to its original value, returning a reference to the -`async` object. diff --git a/node_modules/grunt-contrib-clean/node_modules/async/dist/async.js b/node_modules/grunt-contrib-clean/node_modules/async/dist/async.js deleted file mode 100644 index 31e7620..0000000 --- a/node_modules/grunt-contrib-clean/node_modules/async/dist/async.js +++ /dev/null @@ -1,1265 +0,0 @@ -/*! - * async - * https://github.com/caolan/async - * - * Copyright 2010-2014 Caolan McMahon - * Released under the MIT license - */ -(function () { - - var async = {}; - function noop() {} - function identity(v) { - return v; - } - function toBool(v) { - return !!v; - } - function notId(v) { - return !v; - } - - // global on the server, window in the browser - var previous_async; - - // Establish the root object, `window` (`self`) in the browser, `global` - // on the server, or `this` in some virtual machines. We use `self` - // instead of `window` for `WebWorker` support. - var root = typeof self === 'object' && self.self === self && self || - typeof global === 'object' && global.global === global && global || - this; - - if (root != null) { - previous_async = root.async; - } - - async.noConflict = function () { - root.async = previous_async; - return async; - }; - - function only_once(fn) { - return function() { - if (fn === null) throw new Error("Callback was already called."); - fn.apply(this, arguments); - fn = null; - }; - } - - function _once(fn) { - return function() { - if (fn === null) return; - fn.apply(this, arguments); - fn = null; - }; - } - - //// cross-browser compatiblity functions //// - - var _toString = Object.prototype.toString; - - var _isArray = Array.isArray || function (obj) { - return _toString.call(obj) === '[object Array]'; - }; - - // Ported from underscore.js isObject - var _isObject = function(obj) { - var type = typeof obj; - return type === 'function' || type === 'object' && !!obj; - }; - - function _isArrayLike(arr) { - return _isArray(arr) || ( - // has a positive integer length property - typeof arr.length === "number" && - arr.length >= 0 && - arr.length % 1 === 0 - ); - } - - function _arrayEach(arr, iterator) { - var index = -1, - length = arr.length; - - while (++index < length) { - iterator(arr[index], index, arr); - } - } - - function _map(arr, iterator) { - var index = -1, - length = arr.length, - result = Array(length); - - while (++index < length) { - result[index] = iterator(arr[index], index, arr); - } - return result; - } - - function _range(count) { - return _map(Array(count), function (v, i) { return i; }); - } - - function _reduce(arr, iterator, memo) { - _arrayEach(arr, function (x, i, a) { - memo = iterator(memo, x, i, a); - }); - return memo; - } - - function _forEachOf(object, iterator) { - _arrayEach(_keys(object), function (key) { - iterator(object[key], key); - }); - } - - function _indexOf(arr, item) { - for (var i = 0; i < arr.length; i++) { - if (arr[i] === item) return i; - } - return -1; - } - - var _keys = Object.keys || function (obj) { - var keys = []; - for (var k in obj) { - if (obj.hasOwnProperty(k)) { - keys.push(k); - } - } - return keys; - }; - - function _keyIterator(coll) { - var i = -1; - var len; - var keys; - if (_isArrayLike(coll)) { - len = coll.length; - return function next() { - i++; - return i < len ? i : null; - }; - } else { - keys = _keys(coll); - len = keys.length; - return function next() { - i++; - return i < len ? keys[i] : null; - }; - } - } - - // Similar to ES6's rest param (http://ariya.ofilabs.com/2013/03/es6-and-rest-parameter.html) - // This accumulates the arguments passed into an array, after a given index. - // From underscore.js (https://github.com/jashkenas/underscore/pull/2140). - function _restParam(func, startIndex) { - startIndex = startIndex == null ? func.length - 1 : +startIndex; - return function() { - var length = Math.max(arguments.length - startIndex, 0); - var rest = Array(length); - for (var index = 0; index < length; index++) { - rest[index] = arguments[index + startIndex]; - } - switch (startIndex) { - case 0: return func.call(this, rest); - case 1: return func.call(this, arguments[0], rest); - } - // Currently unused but handle cases outside of the switch statement: - // var args = Array(startIndex + 1); - // for (index = 0; index < startIndex; index++) { - // args[index] = arguments[index]; - // } - // args[startIndex] = rest; - // return func.apply(this, args); - }; - } - - function _withoutIndex(iterator) { - return function (value, index, callback) { - return iterator(value, callback); - }; - } - - //// exported async module functions //// - - //// nextTick implementation with browser-compatible fallback //// - - // capture the global reference to guard against fakeTimer mocks - var _setImmediate = typeof setImmediate === 'function' && setImmediate; - - var _delay = _setImmediate ? function(fn) { - // not a direct alias for IE10 compatibility - _setImmediate(fn); - } : function(fn) { - setTimeout(fn, 0); - }; - - if (typeof process === 'object' && typeof process.nextTick === 'function') { - async.nextTick = process.nextTick; - } else { - async.nextTick = _delay; - } - async.setImmediate = _setImmediate ? _delay : async.nextTick; - - - async.forEach = - async.each = function (arr, iterator, callback) { - return async.eachOf(arr, _withoutIndex(iterator), callback); - }; - - async.forEachSeries = - async.eachSeries = function (arr, iterator, callback) { - return async.eachOfSeries(arr, _withoutIndex(iterator), callback); - }; - - - async.forEachLimit = - async.eachLimit = function (arr, limit, iterator, callback) { - return _eachOfLimit(limit)(arr, _withoutIndex(iterator), callback); - }; - - async.forEachOf = - async.eachOf = function (object, iterator, callback) { - callback = _once(callback || noop); - object = object || []; - - var iter = _keyIterator(object); - var key, completed = 0; - - while ((key = iter()) != null) { - completed += 1; - iterator(object[key], key, only_once(done)); - } - - if (completed === 0) callback(null); - - function done(err) { - completed--; - if (err) { - callback(err); - } - // Check key is null in case iterator isn't exhausted - // and done resolved synchronously. - else if (key === null && completed <= 0) { - callback(null); - } - } - }; - - async.forEachOfSeries = - async.eachOfSeries = function (obj, iterator, callback) { - callback = _once(callback || noop); - obj = obj || []; - var nextKey = _keyIterator(obj); - var key = nextKey(); - function iterate() { - var sync = true; - if (key === null) { - return callback(null); - } - iterator(obj[key], key, only_once(function (err) { - if (err) { - callback(err); - } - else { - key = nextKey(); - if (key === null) { - return callback(null); - } else { - if (sync) { - async.setImmediate(iterate); - } else { - iterate(); - } - } - } - })); - sync = false; - } - iterate(); - }; - - - - async.forEachOfLimit = - async.eachOfLimit = function (obj, limit, iterator, callback) { - _eachOfLimit(limit)(obj, iterator, callback); - }; - - function _eachOfLimit(limit) { - - return function (obj, iterator, callback) { - callback = _once(callback || noop); - obj = obj || []; - var nextKey = _keyIterator(obj); - if (limit <= 0) { - return callback(null); - } - var done = false; - var running = 0; - var errored = false; - - (function replenish () { - if (done && running <= 0) { - return callback(null); - } - - while (running < limit && !errored) { - var key = nextKey(); - if (key === null) { - done = true; - if (running <= 0) { - callback(null); - } - return; - } - running += 1; - iterator(obj[key], key, only_once(function (err) { - running -= 1; - if (err) { - callback(err); - errored = true; - } - else { - replenish(); - } - })); - } - })(); - }; - } - - - function doParallel(fn) { - return function (obj, iterator, callback) { - return fn(async.eachOf, obj, iterator, callback); - }; - } - function doParallelLimit(fn) { - return function (obj, limit, iterator, callback) { - return fn(_eachOfLimit(limit), obj, iterator, callback); - }; - } - function doSeries(fn) { - return function (obj, iterator, callback) { - return fn(async.eachOfSeries, obj, iterator, callback); - }; - } - - function _asyncMap(eachfn, arr, iterator, callback) { - callback = _once(callback || noop); - arr = arr || []; - var results = _isArrayLike(arr) ? [] : {}; - eachfn(arr, function (value, index, callback) { - iterator(value, function (err, v) { - results[index] = v; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - - async.map = doParallel(_asyncMap); - async.mapSeries = doSeries(_asyncMap); - async.mapLimit = doParallelLimit(_asyncMap); - - // reduce only has a series version, as doing reduce in parallel won't - // work in many situations. - async.inject = - async.foldl = - async.reduce = function (arr, memo, iterator, callback) { - async.eachOfSeries(arr, function (x, i, callback) { - iterator(memo, x, function (err, v) { - memo = v; - callback(err); - }); - }, function (err) { - callback(err, memo); - }); - }; - - async.foldr = - async.reduceRight = function (arr, memo, iterator, callback) { - var reversed = _map(arr, identity).reverse(); - async.reduce(reversed, memo, iterator, callback); - }; - - async.transform = function (arr, memo, iterator, callback) { - if (arguments.length === 3) { - callback = iterator; - iterator = memo; - memo = _isArray(arr) ? [] : {}; - } - - async.eachOf(arr, function(v, k, cb) { - iterator(memo, v, k, cb); - }, function(err) { - callback(err, memo); - }); - }; - - function _filter(eachfn, arr, iterator, callback) { - var results = []; - eachfn(arr, function (x, index, callback) { - iterator(x, function (v) { - if (v) { - results.push({index: index, value: x}); - } - callback(); - }); - }, function () { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - } - - async.select = - async.filter = doParallel(_filter); - - async.selectLimit = - async.filterLimit = doParallelLimit(_filter); - - async.selectSeries = - async.filterSeries = doSeries(_filter); - - function _reject(eachfn, arr, iterator, callback) { - _filter(eachfn, arr, function(value, cb) { - iterator(value, function(v) { - cb(!v); - }); - }, callback); - } - async.reject = doParallel(_reject); - async.rejectLimit = doParallelLimit(_reject); - async.rejectSeries = doSeries(_reject); - - function _createTester(eachfn, check, getResult) { - return function(arr, limit, iterator, cb) { - function done() { - if (cb) cb(getResult(false, void 0)); - } - function iteratee(x, _, callback) { - if (!cb) return callback(); - iterator(x, function (v) { - if (cb && check(v)) { - cb(getResult(true, x)); - cb = iterator = false; - } - callback(); - }); - } - if (arguments.length > 3) { - eachfn(arr, limit, iteratee, done); - } else { - cb = iterator; - iterator = limit; - eachfn(arr, iteratee, done); - } - }; - } - - async.any = - async.some = _createTester(async.eachOf, toBool, identity); - - async.someLimit = _createTester(async.eachOfLimit, toBool, identity); - - async.all = - async.every = _createTester(async.eachOf, notId, notId); - - async.everyLimit = _createTester(async.eachOfLimit, notId, notId); - - function _findGetResult(v, x) { - return x; - } - async.detect = _createTester(async.eachOf, identity, _findGetResult); - async.detectSeries = _createTester(async.eachOfSeries, identity, _findGetResult); - async.detectLimit = _createTester(async.eachOfLimit, identity, _findGetResult); - - async.sortBy = function (arr, iterator, callback) { - async.map(arr, function (x, callback) { - iterator(x, function (err, criteria) { - if (err) { - callback(err); - } - else { - callback(null, {value: x, criteria: criteria}); - } - }); - }, function (err, results) { - if (err) { - return callback(err); - } - else { - callback(null, _map(results.sort(comparator), function (x) { - return x.value; - })); - } - - }); - - function comparator(left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - } - }; - - async.auto = function (tasks, concurrency, callback) { - if (typeof arguments[1] === 'function') { - // concurrency is optional, shift the args. - callback = concurrency; - concurrency = null; - } - callback = _once(callback || noop); - var keys = _keys(tasks); - var remainingTasks = keys.length; - if (!remainingTasks) { - return callback(null); - } - if (!concurrency) { - concurrency = remainingTasks; - } - - var results = {}; - var runningTasks = 0; - - var hasError = false; - - var listeners = []; - function addListener(fn) { - listeners.unshift(fn); - } - function removeListener(fn) { - var idx = _indexOf(listeners, fn); - if (idx >= 0) listeners.splice(idx, 1); - } - function taskComplete() { - remainingTasks--; - _arrayEach(listeners.slice(0), function (fn) { - fn(); - }); - } - - addListener(function () { - if (!remainingTasks) { - callback(null, results); - } - }); - - _arrayEach(keys, function (k) { - if (hasError) return; - var task = _isArray(tasks[k]) ? tasks[k]: [tasks[k]]; - var taskCallback = _restParam(function(err, args) { - runningTasks--; - if (args.length <= 1) { - args = args[0]; - } - if (err) { - var safeResults = {}; - _forEachOf(results, function(val, rkey) { - safeResults[rkey] = val; - }); - safeResults[k] = args; - hasError = true; - - callback(err, safeResults); - } - else { - results[k] = args; - async.setImmediate(taskComplete); - } - }); - var requires = task.slice(0, task.length - 1); - // prevent dead-locks - var len = requires.length; - var dep; - while (len--) { - if (!(dep = tasks[requires[len]])) { - throw new Error('Has nonexistent dependency in ' + requires.join(', ')); - } - if (_isArray(dep) && _indexOf(dep, k) >= 0) { - throw new Error('Has cyclic dependencies'); - } - } - function ready() { - return runningTasks < concurrency && _reduce(requires, function (a, x) { - return (a && results.hasOwnProperty(x)); - }, true) && !results.hasOwnProperty(k); - } - if (ready()) { - runningTasks++; - task[task.length - 1](taskCallback, results); - } - else { - addListener(listener); - } - function listener() { - if (ready()) { - runningTasks++; - removeListener(listener); - task[task.length - 1](taskCallback, results); - } - } - }); - }; - - - - async.retry = function(times, task, callback) { - var DEFAULT_TIMES = 5; - var DEFAULT_INTERVAL = 0; - - var attempts = []; - - var opts = { - times: DEFAULT_TIMES, - interval: DEFAULT_INTERVAL - }; - - function parseTimes(acc, t){ - if(typeof t === 'number'){ - acc.times = parseInt(t, 10) || DEFAULT_TIMES; - } else if(typeof t === 'object'){ - acc.times = parseInt(t.times, 10) || DEFAULT_TIMES; - acc.interval = parseInt(t.interval, 10) || DEFAULT_INTERVAL; - } else { - throw new Error('Unsupported argument type for \'times\': ' + typeof t); - } - } - - var length = arguments.length; - if (length < 1 || length > 3) { - throw new Error('Invalid arguments - must be either (task), (task, callback), (times, task) or (times, task, callback)'); - } else if (length <= 2 && typeof times === 'function') { - callback = task; - task = times; - } - if (typeof times !== 'function') { - parseTimes(opts, times); - } - opts.callback = callback; - opts.task = task; - - function wrappedTask(wrappedCallback, wrappedResults) { - function retryAttempt(task, finalAttempt) { - return function(seriesCallback) { - task(function(err, result){ - seriesCallback(!err || finalAttempt, {err: err, result: result}); - }, wrappedResults); - }; - } - - function retryInterval(interval){ - return function(seriesCallback){ - setTimeout(function(){ - seriesCallback(null); - }, interval); - }; - } - - while (opts.times) { - - var finalAttempt = !(opts.times-=1); - attempts.push(retryAttempt(opts.task, finalAttempt)); - if(!finalAttempt && opts.interval > 0){ - attempts.push(retryInterval(opts.interval)); - } - } - - async.series(attempts, function(done, data){ - data = data[data.length - 1]; - (wrappedCallback || opts.callback)(data.err, data.result); - }); - } - - // If a callback is passed, run this as a controll flow - return opts.callback ? wrappedTask() : wrappedTask; - }; - - async.waterfall = function (tasks, callback) { - callback = _once(callback || noop); - if (!_isArray(tasks)) { - var err = new Error('First argument to waterfall must be an array of functions'); - return callback(err); - } - if (!tasks.length) { - return callback(); - } - function wrapIterator(iterator) { - return _restParam(function (err, args) { - if (err) { - callback.apply(null, [err].concat(args)); - } - else { - var next = iterator.next(); - if (next) { - args.push(wrapIterator(next)); - } - else { - args.push(callback); - } - ensureAsync(iterator).apply(null, args); - } - }); - } - wrapIterator(async.iterator(tasks))(); - }; - - function _parallel(eachfn, tasks, callback) { - callback = callback || noop; - var results = _isArrayLike(tasks) ? [] : {}; - - eachfn(tasks, function (task, key, callback) { - task(_restParam(function (err, args) { - if (args.length <= 1) { - args = args[0]; - } - results[key] = args; - callback(err); - })); - }, function (err) { - callback(err, results); - }); - } - - async.parallel = function (tasks, callback) { - _parallel(async.eachOf, tasks, callback); - }; - - async.parallelLimit = function(tasks, limit, callback) { - _parallel(_eachOfLimit(limit), tasks, callback); - }; - - async.series = function(tasks, callback) { - _parallel(async.eachOfSeries, tasks, callback); - }; - - async.iterator = function (tasks) { - function makeCallback(index) { - function fn() { - if (tasks.length) { - tasks[index].apply(null, arguments); - } - return fn.next(); - } - fn.next = function () { - return (index < tasks.length - 1) ? makeCallback(index + 1): null; - }; - return fn; - } - return makeCallback(0); - }; - - async.apply = _restParam(function (fn, args) { - return _restParam(function (callArgs) { - return fn.apply( - null, args.concat(callArgs) - ); - }); - }); - - function _concat(eachfn, arr, fn, callback) { - var result = []; - eachfn(arr, function (x, index, cb) { - fn(x, function (err, y) { - result = result.concat(y || []); - cb(err); - }); - }, function (err) { - callback(err, result); - }); - } - async.concat = doParallel(_concat); - async.concatSeries = doSeries(_concat); - - async.whilst = function (test, iterator, callback) { - callback = callback || noop; - if (test()) { - var next = _restParam(function(err, args) { - if (err) { - callback(err); - } else if (test.apply(this, args)) { - iterator(next); - } else { - callback.apply(null, [null].concat(args)); - } - }); - iterator(next); - } else { - callback(null); - } - }; - - async.doWhilst = function (iterator, test, callback) { - var calls = 0; - return async.whilst(function() { - return ++calls <= 1 || test.apply(this, arguments); - }, iterator, callback); - }; - - async.until = function (test, iterator, callback) { - return async.whilst(function() { - return !test.apply(this, arguments); - }, iterator, callback); - }; - - async.doUntil = function (iterator, test, callback) { - return async.doWhilst(iterator, function() { - return !test.apply(this, arguments); - }, callback); - }; - - async.during = function (test, iterator, callback) { - callback = callback || noop; - - var next = _restParam(function(err, args) { - if (err) { - callback(err); - } else { - args.push(check); - test.apply(this, args); - } - }); - - var check = function(err, truth) { - if (err) { - callback(err); - } else if (truth) { - iterator(next); - } else { - callback(null); - } - }; - - test(check); - }; - - async.doDuring = function (iterator, test, callback) { - var calls = 0; - async.during(function(next) { - if (calls++ < 1) { - next(null, true); - } else { - test.apply(this, arguments); - } - }, iterator, callback); - }; - - function _queue(worker, concurrency, payload) { - if (concurrency == null) { - concurrency = 1; - } - else if(concurrency === 0) { - throw new Error('Concurrency must not be zero'); - } - function _insert(q, data, pos, callback) { - if (callback != null && typeof callback !== "function") { - throw new Error("task callback must be a function"); - } - q.started = true; - if (!_isArray(data)) { - data = [data]; - } - if(data.length === 0 && q.idle()) { - // call drain immediately if there are no tasks - return async.setImmediate(function() { - q.drain(); - }); - } - _arrayEach(data, function(task) { - var item = { - data: task, - callback: callback || noop - }; - - if (pos) { - q.tasks.unshift(item); - } else { - q.tasks.push(item); - } - - if (q.tasks.length === q.concurrency) { - q.saturated(); - } - }); - async.setImmediate(q.process); - } - function _next(q, tasks) { - return function(){ - workers -= 1; - - var removed = false; - var args = arguments; - _arrayEach(tasks, function (task) { - _arrayEach(workersList, function (worker, index) { - if (worker === task && !removed) { - workersList.splice(index, 1); - removed = true; - } - }); - - task.callback.apply(task, args); - }); - if (q.tasks.length + workers === 0) { - q.drain(); - } - q.process(); - }; - } - - var workers = 0; - var workersList = []; - var q = { - tasks: [], - concurrency: concurrency, - payload: payload, - saturated: noop, - empty: noop, - drain: noop, - started: false, - paused: false, - push: function (data, callback) { - _insert(q, data, false, callback); - }, - kill: function () { - q.drain = noop; - q.tasks = []; - }, - unshift: function (data, callback) { - _insert(q, data, true, callback); - }, - process: function () { - while(!q.paused && workers < q.concurrency && q.tasks.length){ - - var tasks = q.payload ? - q.tasks.splice(0, q.payload) : - q.tasks.splice(0, q.tasks.length); - - var data = _map(tasks, function (task) { - return task.data; - }); - - if (q.tasks.length === 0) { - q.empty(); - } - workers += 1; - workersList.push(tasks[0]); - var cb = only_once(_next(q, tasks)); - worker(data, cb); - } - }, - length: function () { - return q.tasks.length; - }, - running: function () { - return workers; - }, - workersList: function () { - return workersList; - }, - idle: function() { - return q.tasks.length + workers === 0; - }, - pause: function () { - q.paused = true; - }, - resume: function () { - if (q.paused === false) { return; } - q.paused = false; - var resumeCount = Math.min(q.concurrency, q.tasks.length); - // Need to call q.process once per concurrent - // worker to preserve full concurrency after pause - for (var w = 1; w <= resumeCount; w++) { - async.setImmediate(q.process); - } - } - }; - return q; - } - - async.queue = function (worker, concurrency) { - var q = _queue(function (items, cb) { - worker(items[0], cb); - }, concurrency, 1); - - return q; - }; - - async.priorityQueue = function (worker, concurrency) { - - function _compareTasks(a, b){ - return a.priority - b.priority; - } - - function _binarySearch(sequence, item, compare) { - var beg = -1, - end = sequence.length - 1; - while (beg < end) { - var mid = beg + ((end - beg + 1) >>> 1); - if (compare(item, sequence[mid]) >= 0) { - beg = mid; - } else { - end = mid - 1; - } - } - return beg; - } - - function _insert(q, data, priority, callback) { - if (callback != null && typeof callback !== "function") { - throw new Error("task callback must be a function"); - } - q.started = true; - if (!_isArray(data)) { - data = [data]; - } - if(data.length === 0) { - // call drain immediately if there are no tasks - return async.setImmediate(function() { - q.drain(); - }); - } - _arrayEach(data, function(task) { - var item = { - data: task, - priority: priority, - callback: typeof callback === 'function' ? callback : noop - }; - - q.tasks.splice(_binarySearch(q.tasks, item, _compareTasks) + 1, 0, item); - - if (q.tasks.length === q.concurrency) { - q.saturated(); - } - async.setImmediate(q.process); - }); - } - - // Start with a normal queue - var q = async.queue(worker, concurrency); - - // Override push to accept second parameter representing priority - q.push = function (data, priority, callback) { - _insert(q, data, priority, callback); - }; - - // Remove unshift function - delete q.unshift; - - return q; - }; - - async.cargo = function (worker, payload) { - return _queue(worker, 1, payload); - }; - - function _console_fn(name) { - return _restParam(function (fn, args) { - fn.apply(null, args.concat([_restParam(function (err, args) { - if (typeof console === 'object') { - if (err) { - if (console.error) { - console.error(err); - } - } - else if (console[name]) { - _arrayEach(args, function (x) { - console[name](x); - }); - } - } - })])); - }); - } - async.log = _console_fn('log'); - async.dir = _console_fn('dir'); - /*async.info = _console_fn('info'); - async.warn = _console_fn('warn'); - async.error = _console_fn('error');*/ - - async.memoize = function (fn, hasher) { - var memo = {}; - var queues = {}; - var has = Object.prototype.hasOwnProperty; - hasher = hasher || identity; - var memoized = _restParam(function memoized(args) { - var callback = args.pop(); - var key = hasher.apply(null, args); - if (has.call(memo, key)) { - async.setImmediate(function () { - callback.apply(null, memo[key]); - }); - } - else if (has.call(queues, key)) { - queues[key].push(callback); - } - else { - queues[key] = [callback]; - fn.apply(null, args.concat([_restParam(function (args) { - memo[key] = args; - var q = queues[key]; - delete queues[key]; - for (var i = 0, l = q.length; i < l; i++) { - q[i].apply(null, args); - } - })])); - } - }); - memoized.memo = memo; - memoized.unmemoized = fn; - return memoized; - }; - - async.unmemoize = function (fn) { - return function () { - return (fn.unmemoized || fn).apply(null, arguments); - }; - }; - - function _times(mapper) { - return function (count, iterator, callback) { - mapper(_range(count), iterator, callback); - }; - } - - async.times = _times(async.map); - async.timesSeries = _times(async.mapSeries); - async.timesLimit = function (count, limit, iterator, callback) { - return async.mapLimit(_range(count), limit, iterator, callback); - }; - - async.seq = function (/* functions... */) { - var fns = arguments; - return _restParam(function (args) { - var that = this; - - var callback = args[args.length - 1]; - if (typeof callback == 'function') { - args.pop(); - } else { - callback = noop; - } - - async.reduce(fns, args, function (newargs, fn, cb) { - fn.apply(that, newargs.concat([_restParam(function (err, nextargs) { - cb(err, nextargs); - })])); - }, - function (err, results) { - callback.apply(that, [err].concat(results)); - }); - }); - }; - - async.compose = function (/* functions... */) { - return async.seq.apply(null, Array.prototype.reverse.call(arguments)); - }; - - - function _applyEach(eachfn) { - return _restParam(function(fns, args) { - var go = _restParam(function(args) { - var that = this; - var callback = args.pop(); - return eachfn(fns, function (fn, _, cb) { - fn.apply(that, args.concat([cb])); - }, - callback); - }); - if (args.length) { - return go.apply(this, args); - } - else { - return go; - } - }); - } - - async.applyEach = _applyEach(async.eachOf); - async.applyEachSeries = _applyEach(async.eachOfSeries); - - - async.forever = function (fn, callback) { - var done = only_once(callback || noop); - var task = ensureAsync(fn); - function next(err) { - if (err) { - return done(err); - } - task(next); - } - next(); - }; - - function ensureAsync(fn) { - return _restParam(function (args) { - var callback = args.pop(); - args.push(function () { - var innerArgs = arguments; - if (sync) { - async.setImmediate(function () { - callback.apply(null, innerArgs); - }); - } else { - callback.apply(null, innerArgs); - } - }); - var sync = true; - fn.apply(this, args); - sync = false; - }); - } - - async.ensureAsync = ensureAsync; - - async.constant = _restParam(function(values) { - var args = [null].concat(values); - return function (callback) { - return callback.apply(this, args); - }; - }); - - async.wrapSync = - async.asyncify = function asyncify(func) { - return _restParam(function (args) { - var callback = args.pop(); - var result; - try { - result = func.apply(this, args); - } catch (e) { - return callback(e); - } - // if result is Promise object - if (_isObject(result) && typeof result.then === "function") { - result.then(function(value) { - callback(null, value); - })["catch"](function(err) { - callback(err.message ? err : new Error(err)); - }); - } else { - callback(null, result); - } - }); - }; - - // Node.js - if (typeof module === 'object' && module.exports) { - module.exports = async; - } - // AMD / RequireJS - else if (typeof define === 'function' && define.amd) { - define([], function () { - return async; - }); - } - // included directly via - - - - diff --git a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/lib/constants.js.html b/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/lib/constants.js.html deleted file mode 100644 index 559fa88..0000000 --- a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/lib/constants.js.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - Code coverage report for lib/constants.js - - - - - - - -
-

-
-
1 -2 -3 -4 -5 -6 -71 -  -  -  -  -  - 
module.exports = {
-	DEFAULT_INITIAL_SIZE: (8 * 1024),
-	DEFAULT_INCREMENT_AMOUNT: (8 * 1024),
-	DEFAULT_FREQUENCY: 1,
-	DEFAULT_CHUNK_SIZE: 1024
-};
- 
- -
- - - - - - diff --git a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/lib/index.html b/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/lib/index.html deleted file mode 100644 index 0f51940..0000000 --- a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/lib/index.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - Code coverage report for lib/ - - - - - - -
-

Code coverage report for lib/

-

- Statements: 98.01% (148 / 151)      - Branches: 92.94% (79 / 85)      - Functions: 100% (20 / 20)      - Lines: 99.31% (143 / 144)      - Ignored: none      -

-
All files » lib/
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
constants.js100%(1 / 1)100%(0 / 0)100%(0 / 0)100%(1 / 1)
readable_streambuffer.js98.82%(84 / 85)94.34%(50 / 53)100%(11 / 11)100%(83 / 83)
streambuffer.js100%(3 / 3)100%(0 / 0)100%(0 / 0)100%(3 / 3)
writable_streambuffer.js96.77%(60 / 62)90.63%(29 / 32)100%(9 / 9)98.25%(56 / 57)
-
-
- - - - - - diff --git a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/lib/readable_streambuffer.js.html b/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/lib/readable_streambuffer.js.html deleted file mode 100644 index 0de6ff1..0000000 --- a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/lib/readable_streambuffer.js.html +++ /dev/null @@ -1,453 +0,0 @@ - - - - Code coverage report for lib/readable_streambuffer.js - - - - - - -
-

Code coverage report for lib/readable_streambuffer.js

-

- Statements: 98.82% (84 / 85)      - Branches: 94.34% (50 / 53)      - Functions: 100% (11 / 11)      - Lines: 100% (83 / 83)      - Ignored: none      -

-
All files » lib/ » readable_streambuffer.js
-
-
-

-
-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -1371 -  -  -  -1 -12 -  -12 -  -12 -12 -12 -12 -12 -  -12 -12 -12 -  -12 -12 -  -12 -268 -  -268 -44 -44 -9 -  -  -35 -35 -  -  -44 -  -44 -44 -44 -  -  -268 -7 -7 -7 -6 -6 -  -  -  -  -12 -3 -  -  -12 -5 -  -  -12 -13 -2 -  -2 -2 -2 -  -  -  -12 -13 -  -13 -13 -4 -4 -4 -  -  -9 -9 -9 -9 -9 -  -  -13 -12 -  -  -13 -2 -3 -  -  -  -  -12 -4 -4 -4 -4 -  -  -  -12 -15 -15 -14 -  -  -  -12 -6 -6 -6 -6 -6 -  -  -12 -7 -7 -1 -1 -  -  -  -12 -5 -  -  -12 -  -1 - 
var stream = require("stream"),
-	constants = require("./constants"),
-	util = require("util");
- 
-var ReadableStreamBuffer = module.exports = function(opts) {
-	var that = this;
- 
-	stream.Stream.call(this);
- 
-	opts = opts || {};
-	var frequency = opts.hasOwnProperty("frequency") ? opts.frequency : constants.DEFAULT_FREQUENCY;
-	var chunkSize = opts.chunkSize || constants.DEFAULT_CHUNK_SIZE;
-	var initialSize = opts.initialSize || constants.DEFAULT_INITIAL_SIZE;
-	var incrementAmount = opts.incrementAmount || constants.DEFAULT_INCREMENT_AMOUNT;
- 
-	var size = 0;
-	var buffer = new Buffer(initialSize);
-	var encoding = null;
- 
-	this.readable = true;
-	this.writable = false;
- 
-	var sendData = function() {
-		var amount = Math.min(chunkSize, size);
- 
-		if (amount > 0) {
-			var chunk = null;
-			if(encoding) {
-				chunk = buffer.toString(encoding, 0, amount);
-			}
-			else {
-				chunk = new Buffer(amount);
-				buffer.copy(chunk, 0, 0, amount);
-			}
- 
-			that.emit("data", chunk);
- 
-			Eif(amount < buffer.length)
-				buffer.copy(buffer, 0, amount, size);
-			size -= amount;
-		}
- 
-		if(size === 0 && !that.readable) {
-			that.emit("end");
-			that.emit("close");
-			if (sendData && sendData.interval) {
-				clearInterval(sendData.interval);
-				sendData.interval = null;
-			}
-		}
-	};
- 
-	this.size = function() {
-		return size;
-	};
- 
-	this.maxSize = function() {
-		return buffer.length;
-	};
- 
-	var increaseBufferIfNecessary = function(incomingDataSize) {
-		if((buffer.length - size) < incomingDataSize) {
-			var factor = Math.ceil((incomingDataSize - (buffer.length - size)) / incrementAmount);
- 
-			var newBuffer = new Buffer(buffer.length + (incrementAmount * factor));
-			buffer.copy(newBuffer, 0, 0, size);
-			buffer = newBuffer;
-		}
-	};
- 
-	this.put = function(data, encoding) {
-		Iif(!that.readable) return;
- 
-		var wasEmpty = size === 0;
-		if(Buffer.isBuffer(data)) {
-			increaseBufferIfNecessary(data.length);
-			data.copy(buffer, size, 0);
-			size += data.length;
-		}
-		else {
-			data = data + "";
-			var dataSizeInBytes = Buffer.byteLength(data);
-			increaseBufferIfNecessary(dataSizeInBytes);
-			buffer.write(data, size, encoding || "utf8");
-			size += dataSizeInBytes;
-		}
- 
-		if (wasEmpty && size > 0) {
-			this.emit('readable')
-		}
- 
-		if (!this.isPaused && !frequency) {
-			while (size > 0) {
-				sendData();
-			}
-		}
-	};
- 
-	this.pause = function() {
-		this.isPaused = true;
-		Eif(sendData && sendData.interval) {
-			clearInterval(sendData.interval);
-			delete sendData.interval;
-		}
-	};
- 
-	this.resume = function() {
-		this.isPaused = false;
-		if(sendData && !sendData.interval && frequency > 0) {
-			sendData.interval = setInterval(sendData, frequency);
-		}
-	};
- 
-	this.destroy = function() {
-		that.emit("end");
-		if(sendData.interval) clearInterval(sendData.interval);
-		sendData = null;
-		that.readable = false;
-		that.emit("close");
-	};
- 
-	this.destroySoon = function() {
-		that.readable = false;
-		if (!sendData.interval) {
-			that.emit("end");
-			that.emit("close");
-		}
-	};
- 
-	this.setEncoding = function(_encoding) {
-		encoding = _encoding;
-	};
- 
-	this.resume();
-};
-util.inherits(ReadableStreamBuffer, stream.Stream);
- 
- -
- - - - - - diff --git a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/lib/streambuffer.js.html b/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/lib/streambuffer.js.html deleted file mode 100644 index 76be060..0000000 --- a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/lib/streambuffer.js.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - Code coverage report for lib/streambuffer.js - - - - - - -
-

Code coverage report for lib/streambuffer.js

-

- Statements: 100% (3 / 3)      - Branches: 100% (0 / 0)      - Functions: 100% (0 / 0)      - Lines: 100% (3 / 3)      - Ignored: none      -

-
All files » lib/ » streambuffer.js
-
-
-

-
-
1 -2 -3 -41 -1 -1 - 
module.exports = require("./constants");
-module.exports.ReadableStreamBuffer = require("./readable_streambuffer");
-module.exports.WritableStreamBuffer = require("./writable_streambuffer");
- 
- -
- - - - - - diff --git a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/lib/writable_streambuffer.js.html b/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/lib/writable_streambuffer.js.html deleted file mode 100644 index 996f34b..0000000 --- a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/lib/writable_streambuffer.js.html +++ /dev/null @@ -1,336 +0,0 @@ - - - - Code coverage report for lib/writable_streambuffer.js - - - - - - -
-

Code coverage report for lib/writable_streambuffer.js

-

- Statements: 96.77% (60 / 62)      - Branches: 90.63% (29 / 32)      - Functions: 100% (9 / 9)      - Lines: 98.25% (56 / 57)      - Ignored: none      -

-
All files » lib/ » writable_streambuffer.js
-
-
-

-
-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -981 -  -  -  -  -  -1 -10 -  -10 -  -10 -10 -10 -  -10 -10 -  -10 -10 -  -10 -5 -  -  -10 -5 -  -  -10 -2 -  -1 -1 -  -1 -  -  -1 -  -1 -  -  -10 -8 -  -7 -7 -  -7 -1 -  -7 -7 -  -  -10 -10 -2 -  -2 -2 -2 -  -  -  -10 -11 -  -10 -2 -2 -2 -  -  -8 -8 -8 -8 -  -  -10 -  -  -10 -1 -1 -1 -1 -  -  -10 -4 -4 -  -  -1 - 
var util = require("util"),
-	stream = require("stream"),
-	constants = require("./constants");
- 
-// TODO: clear up specs on returning false from a write and emitting a drain event.
-// Does this mean if I return false from a write, I should ignore any write requests between that false return and the drain event?
-var WritableStreamBuffer = module.exports = function(opts) {
-	var that = this;
- 
-	stream.Stream.call(this);
- 
-	opts = opts || {};
-	var initialSize = opts.initialSize || constants.DEFAULT_INITIAL_SIZE;
-	var incrementAmount = opts.incrementAmount || constants.DEFAULT_INCREMENT_AMOUNT;
- 
-	var buffer = new Buffer(initialSize);
-	var size = 0;
- 
-	this.writable = true;
-	this.readable = false;
- 
-	this.size = function() {
-		return size;
-	};
- 
-	this.maxSize = function() {
-		return buffer.length;
-	};
- 
-	this.getContents = function(length) {
-		if(!size) return false;
- 
-		var data = new Buffer(Math.min(length || size, size));
-		buffer.copy(data, 0, 0, data.length);
- 
-		Iif(data.length < size)
-			buffer.copy(buffer, 0, data.length);
- 
-		size -= data.length;
- 
-		return data;
-	};
- 
-	this.getContentsAsString = function(encoding, length) {
-		if(!size) return false;
- 
-		var data = buffer.toString(encoding || "utf8", 0, Math.min(length || size, size));
-		var dataLength = Buffer.byteLength(data);
- 
-		if(dataLength < size)
-			buffer.copy(buffer, 0, dataLength);
- 
-		size -= dataLength;
-		return data;
-	};
- 
-	var increaseBufferIfNecessary = function(incomingDataSize) {
-		if((buffer.length - size) < incomingDataSize) {
-			var factor = Math.ceil((incomingDataSize - (buffer.length - size)) / incrementAmount);
- 
-			var newBuffer = new Buffer(buffer.length + (incrementAmount * factor));
-			buffer.copy(newBuffer, 0, 0, size);
-			buffer = newBuffer;
-		}
-	};
- 
-	this.write = function(data, encoding, callback) {
-		if(!that.writable) return;
- 
-		if(Buffer.isBuffer(data)) {
-			increaseBufferIfNecessary(data.length);
-			data.copy(buffer, size, 0);
-			size += data.length;
-		}
-		else {
-			data = data + "";
-			increaseBufferIfNecessary(Buffer.byteLength(data));
-			buffer.write(data, size, encoding || "utf8");
-			size += Buffer.byteLength(data);
-		}
-		
-		Iif(typeof callback === "function") { callback() ;}
-	};
- 
-	this.end = function() {
-		var args = Array.prototype.slice.apply(arguments);
-		Eif(args.length) that.write.apply(that, args);
-		that.emit('finish');
-		that.destroy();
-	};
- 
-	this.destroySoon = this.destroy = function() {
-		that.writable = false;
-		that.emit("close");
-	};
-};
-util.inherits(WritableStreamBuffer, stream.Stream);
- 
- -
- - - - - - diff --git a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/prettify.css b/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/prettify.css deleted file mode 100644 index b317a7c..0000000 --- a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/prettify.js b/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/prettify.js deleted file mode 100644 index ef51e03..0000000 --- a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/prettify.js +++ /dev/null @@ -1 +0,0 @@ -window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/sort-arrow-sprite.png b/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/sort-arrow-sprite.png deleted file mode 100644 index 03f704a..0000000 Binary files a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/sort-arrow-sprite.png and /dev/null differ diff --git a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/sorter.js b/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/sorter.js deleted file mode 100644 index 6afb736..0000000 --- a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov-report/sorter.js +++ /dev/null @@ -1,156 +0,0 @@ -var addSorting = (function () { - "use strict"; - var cols, - currentSort = { - index: 0, - desc: false - }; - - // returns the summary table element - function getTable() { return document.querySelector('.coverage-summary table'); } - // returns the thead element of the summary table - function getTableHeader() { return getTable().querySelector('thead tr'); } - // returns the tbody element of the summary table - function getTableBody() { return getTable().querySelector('tbody'); } - // returns the th element for nth column - function getNthColumn(n) { return getTableHeader().querySelectorAll('th')[n]; } - - // loads all columns - function loadColumns() { - var colNodes = getTableHeader().querySelectorAll('th'), - colNode, - cols = [], - col, - i; - - for (i = 0; i < colNodes.length; i += 1) { - colNode = colNodes[i]; - col = { - key: colNode.getAttribute('data-col'), - sortable: !colNode.getAttribute('data-nosort'), - type: colNode.getAttribute('data-type') || 'string' - }; - cols.push(col); - if (col.sortable) { - col.defaultDescSort = col.type === 'number'; - colNode.innerHTML = colNode.innerHTML + ''; - } - } - return cols; - } - // attaches a data attribute to every tr element with an object - // of data values keyed by column name - function loadRowData(tableRow) { - var tableCols = tableRow.querySelectorAll('td'), - colNode, - col, - data = {}, - i, - val; - for (i = 0; i < tableCols.length; i += 1) { - colNode = tableCols[i]; - col = cols[i]; - val = colNode.getAttribute('data-value'); - if (col.type === 'number') { - val = Number(val); - } - data[col.key] = val; - } - return data; - } - // loads all row data - function loadData() { - var rows = getTableBody().querySelectorAll('tr'), - i; - - for (i = 0; i < rows.length; i += 1) { - rows[i].data = loadRowData(rows[i]); - } - } - // sorts the table using the data for the ith column - function sortByIndex(index, desc) { - var key = cols[index].key, - sorter = function (a, b) { - a = a.data[key]; - b = b.data[key]; - return a < b ? -1 : a > b ? 1 : 0; - }, - finalSorter = sorter, - tableBody = document.querySelector('.coverage-summary tbody'), - rowNodes = tableBody.querySelectorAll('tr'), - rows = [], - i; - - if (desc) { - finalSorter = function (a, b) { - return -1 * sorter(a, b); - }; - } - - for (i = 0; i < rowNodes.length; i += 1) { - rows.push(rowNodes[i]); - tableBody.removeChild(rowNodes[i]); - } - - rows.sort(finalSorter); - - for (i = 0; i < rows.length; i += 1) { - tableBody.appendChild(rows[i]); - } - } - // removes sort indicators for current column being sorted - function removeSortIndicators() { - var col = getNthColumn(currentSort.index), - cls = col.className; - - cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); - col.className = cls; - } - // adds sort indicators for current column being sorted - function addSortIndicators() { - getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted'; - } - // adds event listeners for all sorter widgets - function enableUI() { - var i, - el, - ithSorter = function ithSorter(i) { - var col = cols[i]; - - return function () { - var desc = col.defaultDescSort; - - if (currentSort.index === i) { - desc = !currentSort.desc; - } - sortByIndex(i, desc); - removeSortIndicators(); - currentSort.index = i; - currentSort.desc = desc; - addSortIndicators(); - }; - }; - for (i =0 ; i < cols.length; i += 1) { - if (cols[i].sortable) { - el = getNthColumn(i).querySelector('.sorter'); - if (el.addEventListener) { - el.addEventListener('click', ithSorter(i)); - } else { - el.attachEvent('onclick', ithSorter(i)); - } - } - } - } - // adds sorting functionality to the UI - return function () { - if (!getTable()) { - return; - } - cols = loadColumns(); - loadData(cols); - addSortIndicators(); - enableUI(); - }; -})(); - -window.addEventListener('load', addSorting); diff --git a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov.info b/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov.info deleted file mode 100644 index 3cd13c9..0000000 --- a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/coverage/lcov.info +++ /dev/null @@ -1,305 +0,0 @@ -TN: -SF:/home/travis/build/samcday/node-stream-buffer/lib/streambuffer.js -FNF:0 -FNH:0 -DA:1,1 -DA:2,1 -DA:3,1 -LF:3 -LH:3 -BRF:0 -BRH:0 -end_of_record -TN: -SF:/home/travis/build/samcday/node-stream-buffer/lib/constants.js -FNF:0 -FNH:0 -DA:1,1 -LF:1 -LH:1 -BRF:0 -BRH:0 -end_of_record -TN: -SF:/home/travis/build/samcday/node-stream-buffer/lib/readable_streambuffer.js -FN:5,(anonymous_1) -FN:23,(anonymous_2) -FN:53,(anonymous_3) -FN:57,(anonymous_4) -FN:61,(anonymous_5) -FN:71,(anonymous_6) -FN:99,(anonymous_7) -FN:107,(anonymous_8) -FN:114,(anonymous_9) -FN:122,(anonymous_10) -FN:130,(anonymous_11) -FNF:11 -FNH:11 -FNDA:12,(anonymous_1) -FNDA:268,(anonymous_2) -FNDA:3,(anonymous_3) -FNDA:5,(anonymous_4) -FNDA:13,(anonymous_5) -FNDA:13,(anonymous_6) -FNDA:4,(anonymous_7) -FNDA:15,(anonymous_8) -FNDA:6,(anonymous_9) -FNDA:7,(anonymous_10) -FNDA:5,(anonymous_11) -DA:1,1 -DA:5,1 -DA:6,12 -DA:8,12 -DA:10,12 -DA:11,12 -DA:12,12 -DA:13,12 -DA:14,12 -DA:16,12 -DA:17,12 -DA:18,12 -DA:20,12 -DA:21,12 -DA:23,12 -DA:24,268 -DA:26,268 -DA:27,44 -DA:28,44 -DA:29,9 -DA:32,35 -DA:33,35 -DA:36,44 -DA:38,44 -DA:39,44 -DA:40,44 -DA:43,268 -DA:44,7 -DA:45,7 -DA:46,7 -DA:47,6 -DA:48,6 -DA:53,12 -DA:54,3 -DA:57,12 -DA:58,5 -DA:61,12 -DA:62,13 -DA:63,2 -DA:65,2 -DA:66,2 -DA:67,2 -DA:71,12 -DA:72,13 -DA:74,13 -DA:75,13 -DA:76,4 -DA:77,4 -DA:78,4 -DA:81,9 -DA:82,9 -DA:83,9 -DA:84,9 -DA:85,9 -DA:88,13 -DA:89,12 -DA:92,13 -DA:93,2 -DA:94,3 -DA:99,12 -DA:100,4 -DA:101,4 -DA:102,4 -DA:103,4 -DA:107,12 -DA:108,15 -DA:109,15 -DA:110,14 -DA:114,12 -DA:115,6 -DA:116,6 -DA:117,6 -DA:118,6 -DA:119,6 -DA:122,12 -DA:123,7 -DA:124,7 -DA:125,1 -DA:126,1 -DA:130,12 -DA:131,5 -DA:134,12 -DA:136,1 -LF:83 -LH:83 -BRDA:10,1,0,12 -BRDA:10,1,1,6 -BRDA:11,2,0,2 -BRDA:11,2,1,10 -BRDA:12,3,0,12 -BRDA:12,3,1,8 -BRDA:13,4,0,12 -BRDA:13,4,1,10 -BRDA:14,5,0,12 -BRDA:14,5,1,11 -BRDA:26,6,0,44 -BRDA:26,6,1,224 -BRDA:28,7,0,9 -BRDA:28,7,1,35 -BRDA:38,8,0,44 -BRDA:38,8,1,0 -BRDA:43,9,0,7 -BRDA:43,9,1,261 -BRDA:43,10,0,268 -BRDA:43,10,1,234 -BRDA:46,11,0,6 -BRDA:46,11,1,1 -BRDA:46,12,0,7 -BRDA:46,12,1,6 -BRDA:62,13,0,2 -BRDA:62,13,1,11 -BRDA:72,14,0,0 -BRDA:72,14,1,13 -BRDA:75,15,0,4 -BRDA:75,15,1,9 -BRDA:84,16,0,9 -BRDA:84,16,1,9 -BRDA:88,17,0,12 -BRDA:88,17,1,1 -BRDA:88,18,0,13 -BRDA:88,18,1,12 -BRDA:92,19,0,2 -BRDA:92,19,1,11 -BRDA:92,20,0,13 -BRDA:92,20,1,8 -BRDA:101,21,0,4 -BRDA:101,21,1,0 -BRDA:101,22,0,4 -BRDA:101,22,1,4 -BRDA:109,23,0,14 -BRDA:109,23,1,1 -BRDA:109,24,0,15 -BRDA:109,24,1,15 -BRDA:109,24,2,15 -BRDA:116,25,0,4 -BRDA:116,25,1,2 -BRDA:124,26,0,1 -BRDA:124,26,1,6 -BRF:53 -BRH:50 -end_of_record -TN: -SF:/home/travis/build/samcday/node-stream-buffer/lib/writable_streambuffer.js -FN:7,(anonymous_1) -FN:22,(anonymous_2) -FN:26,(anonymous_3) -FN:30,(anonymous_4) -FN:44,(anonymous_5) -FN:57,(anonymous_6) -FN:67,(anonymous_7) -FN:85,(anonymous_8) -FN:92,(anonymous_9) -FNF:9 -FNH:9 -FNDA:10,(anonymous_1) -FNDA:5,(anonymous_2) -FNDA:5,(anonymous_3) -FNDA:2,(anonymous_4) -FNDA:8,(anonymous_5) -FNDA:10,(anonymous_6) -FNDA:11,(anonymous_7) -FNDA:1,(anonymous_8) -FNDA:4,(anonymous_9) -DA:1,1 -DA:7,1 -DA:8,10 -DA:10,10 -DA:12,10 -DA:13,10 -DA:14,10 -DA:16,10 -DA:17,10 -DA:19,10 -DA:20,10 -DA:22,10 -DA:23,5 -DA:26,10 -DA:27,5 -DA:30,10 -DA:31,2 -DA:33,1 -DA:34,1 -DA:36,1 -DA:37,0 -DA:39,1 -DA:41,1 -DA:44,10 -DA:45,8 -DA:47,7 -DA:48,7 -DA:50,7 -DA:51,1 -DA:53,7 -DA:54,7 -DA:57,10 -DA:58,10 -DA:59,2 -DA:61,2 -DA:62,2 -DA:63,2 -DA:67,10 -DA:68,11 -DA:70,10 -DA:71,2 -DA:72,2 -DA:73,2 -DA:76,8 -DA:77,8 -DA:78,8 -DA:79,8 -DA:82,10 -DA:85,10 -DA:86,1 -DA:87,1 -DA:88,1 -DA:89,1 -DA:92,10 -DA:93,4 -DA:94,4 -DA:97,1 -LF:57 -LH:56 -BRDA:12,1,0,10 -BRDA:12,1,1,9 -BRDA:13,2,0,10 -BRDA:13,2,1,9 -BRDA:14,3,0,10 -BRDA:14,3,1,9 -BRDA:31,4,0,1 -BRDA:31,4,1,1 -BRDA:33,5,0,1 -BRDA:33,5,1,1 -BRDA:36,6,0,0 -BRDA:36,6,1,1 -BRDA:45,7,0,1 -BRDA:45,7,1,7 -BRDA:47,8,0,7 -BRDA:47,8,1,5 -BRDA:47,9,0,7 -BRDA:47,9,1,5 -BRDA:50,10,0,1 -BRDA:50,10,1,6 -BRDA:58,11,0,2 -BRDA:58,11,1,8 -BRDA:68,12,0,1 -BRDA:68,12,1,10 -BRDA:70,13,0,2 -BRDA:70,13,1,8 -BRDA:78,14,0,8 -BRDA:78,14,1,8 -BRDA:82,15,0,0 -BRDA:82,15,1,10 -BRDA:87,16,0,1 -BRDA:87,16,1,0 -BRF:32 -BRH:29 -end_of_record diff --git a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/lib/constants.js b/node_modules/grunt-contrib-compress/node_modules/stream-buffers/lib/constants.js deleted file mode 100644 index 6bf81a4..0000000 --- a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/lib/constants.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - DEFAULT_INITIAL_SIZE: (8 * 1024), - DEFAULT_INCREMENT_AMOUNT: (8 * 1024), - DEFAULT_FREQUENCY: 1, - DEFAULT_CHUNK_SIZE: 1024 -}; diff --git a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/lib/readable_streambuffer.js b/node_modules/grunt-contrib-compress/node_modules/stream-buffers/lib/readable_streambuffer.js deleted file mode 100644 index 5d5669a..0000000 --- a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/lib/readable_streambuffer.js +++ /dev/null @@ -1,136 +0,0 @@ -var stream = require("stream"), - constants = require("./constants"), - util = require("util"); - -var ReadableStreamBuffer = module.exports = function(opts) { - var that = this; - - stream.Stream.call(this); - - opts = opts || {}; - var frequency = opts.hasOwnProperty("frequency") ? opts.frequency : constants.DEFAULT_FREQUENCY; - var chunkSize = opts.chunkSize || constants.DEFAULT_CHUNK_SIZE; - var initialSize = opts.initialSize || constants.DEFAULT_INITIAL_SIZE; - var incrementAmount = opts.incrementAmount || constants.DEFAULT_INCREMENT_AMOUNT; - - var size = 0; - var buffer = new Buffer(initialSize); - var encoding = null; - - this.readable = true; - this.writable = false; - - var sendData = function() { - var amount = Math.min(chunkSize, size); - - if (amount > 0) { - var chunk = null; - if(encoding) { - chunk = buffer.toString(encoding, 0, amount); - } - else { - chunk = new Buffer(amount); - buffer.copy(chunk, 0, 0, amount); - } - - that.emit("data", chunk); - - if(amount < buffer.length) - buffer.copy(buffer, 0, amount, size); - size -= amount; - } - - if(size === 0 && !that.readable) { - that.emit("end"); - that.emit("close"); - if (sendData && sendData.interval) { - clearInterval(sendData.interval); - sendData.interval = null; - } - } - }; - - this.size = function() { - return size; - }; - - this.maxSize = function() { - return buffer.length; - }; - - var increaseBufferIfNecessary = function(incomingDataSize) { - if((buffer.length - size) < incomingDataSize) { - var factor = Math.ceil((incomingDataSize - (buffer.length - size)) / incrementAmount); - - var newBuffer = new Buffer(buffer.length + (incrementAmount * factor)); - buffer.copy(newBuffer, 0, 0, size); - buffer = newBuffer; - } - }; - - this.put = function(data, encoding) { - if(!that.readable) return; - - var wasEmpty = size === 0; - if(Buffer.isBuffer(data)) { - increaseBufferIfNecessary(data.length); - data.copy(buffer, size, 0); - size += data.length; - } - else { - data = data + ""; - var dataSizeInBytes = Buffer.byteLength(data); - increaseBufferIfNecessary(dataSizeInBytes); - buffer.write(data, size, encoding || "utf8"); - size += dataSizeInBytes; - } - - if (wasEmpty && size > 0) { - this.emit('readable') - } - - if (!this.isPaused && !frequency) { - while (size > 0) { - sendData(); - } - } - }; - - this.pause = function() { - this.isPaused = true; - if(sendData && sendData.interval) { - clearInterval(sendData.interval); - delete sendData.interval; - } - }; - - this.resume = function() { - this.isPaused = false; - if(sendData && !sendData.interval && frequency > 0) { - sendData.interval = setInterval(sendData, frequency); - } - }; - - this.destroy = function() { - that.emit("end"); - if(sendData.interval) clearInterval(sendData.interval); - sendData = null; - that.readable = false; - that.emit("close"); - }; - - this.destroySoon = function() { - that.readable = false; - if (!sendData.interval) { - that.emit("end"); - that.emit("close"); - } - }; - - this.setEncoding = function(_encoding) { - encoding = _encoding; - }; - - this.resume(); -}; -util.inherits(ReadableStreamBuffer, stream.Stream); diff --git a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/lib/streambuffer.js b/node_modules/grunt-contrib-compress/node_modules/stream-buffers/lib/streambuffer.js deleted file mode 100644 index d5a3ebb..0000000 --- a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/lib/streambuffer.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = require("./constants"); -module.exports.ReadableStreamBuffer = require("./readable_streambuffer"); -module.exports.WritableStreamBuffer = require("./writable_streambuffer"); diff --git a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/lib/writable_streambuffer.js b/node_modules/grunt-contrib-compress/node_modules/stream-buffers/lib/writable_streambuffer.js deleted file mode 100644 index de1e997..0000000 --- a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/lib/writable_streambuffer.js +++ /dev/null @@ -1,97 +0,0 @@ -var util = require("util"), - stream = require("stream"), - constants = require("./constants"); - -// TODO: clear up specs on returning false from a write and emitting a drain event. -// Does this mean if I return false from a write, I should ignore any write requests between that false return and the drain event? -var WritableStreamBuffer = module.exports = function(opts) { - var that = this; - - stream.Stream.call(this); - - opts = opts || {}; - var initialSize = opts.initialSize || constants.DEFAULT_INITIAL_SIZE; - var incrementAmount = opts.incrementAmount || constants.DEFAULT_INCREMENT_AMOUNT; - - var buffer = new Buffer(initialSize); - var size = 0; - - this.writable = true; - this.readable = false; - - this.size = function() { - return size; - }; - - this.maxSize = function() { - return buffer.length; - }; - - this.getContents = function(length) { - if(!size) return false; - - var data = new Buffer(Math.min(length || size, size)); - buffer.copy(data, 0, 0, data.length); - - if(data.length < size) - buffer.copy(buffer, 0, data.length); - - size -= data.length; - - return data; - }; - - this.getContentsAsString = function(encoding, length) { - if(!size) return false; - - var data = buffer.toString(encoding || "utf8", 0, Math.min(length || size, size)); - var dataLength = Buffer.byteLength(data); - - if(dataLength < size) - buffer.copy(buffer, 0, dataLength); - - size -= dataLength; - return data; - }; - - var increaseBufferIfNecessary = function(incomingDataSize) { - if((buffer.length - size) < incomingDataSize) { - var factor = Math.ceil((incomingDataSize - (buffer.length - size)) / incrementAmount); - - var newBuffer = new Buffer(buffer.length + (incrementAmount * factor)); - buffer.copy(newBuffer, 0, 0, size); - buffer = newBuffer; - } - }; - - this.write = function(data, encoding, callback) { - if(!that.writable) return; - - if(Buffer.isBuffer(data)) { - increaseBufferIfNecessary(data.length); - data.copy(buffer, size, 0); - size += data.length; - } - else { - data = data + ""; - increaseBufferIfNecessary(Buffer.byteLength(data)); - buffer.write(data, size, encoding || "utf8"); - size += Buffer.byteLength(data); - } - - if(typeof callback === "function") { callback() ;} - }; - - this.end = function() { - var args = Array.prototype.slice.apply(arguments); - if(args.length) that.write.apply(that, args); - that.emit('finish'); - that.destroy(); - }; - - this.destroySoon = this.destroy = function() { - that.writable = false; - that.emit("close"); - }; -}; -util.inherits(WritableStreamBuffer, stream.Stream); diff --git a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/package.json b/node_modules/grunt-contrib-compress/node_modules/stream-buffers/package.json deleted file mode 100644 index 300a47b..0000000 --- a/node_modules/grunt-contrib-compress/node_modules/stream-buffers/package.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "name": "stream-buffers", - "version": "2.2.0", - "description": "Buffer-backed Streams for reading and writing.", - "keywords": [ - "memory streams", - "streams", - "buffer streams" - ], - "author": { - "name": "Sam Day", - "email": "me@samcday.com.au" - }, - "main": "./lib/streambuffer.js", - "engines": { - "node": ">= 0.10.0" - }, - "dependencies": {}, - "devDependencies": { - "istanbul": "~0.3.2", - "vows": ">= 0.5.6" - }, - "license": "Unlicense", - "repository": { - "type": "git", - "url": "git+https://github.com/samcday/node-stream-buffer.git" - }, - "scripts": { - "test": "[ -n \"$NO_COVERAGE\" ] && vows --spec || istanbul cover vows -- --spec" - }, - "gitHead": "17024f70e0107175ede0ebcfbe9de7102d8be25f", - "bugs": { - "url": "https://github.com/samcday/node-stream-buffer/issues" - }, - "homepage": "https://github.com/samcday/node-stream-buffer#readme", - "_id": "stream-buffers@2.2.0", - "_shasum": "91d5f5130d1cef96dcfa7f726945188741d09ee4", - "_from": "stream-buffers@>=2.1.0 <3.0.0", - "_npmVersion": "2.11.2", - "_nodeVersion": "0.12.5", - "_npmUser": { - "name": "samcday", - "email": "me@samcday.com.au" - }, - "maintainers": [ - { - "name": "samcday", - "email": "sam.c.day@gmail.com" - } - ], - "dist": { - "shasum": "91d5f5130d1cef96dcfa7f726945188741d09ee4", - "tarball": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/grunt-contrib-compress/package.json b/node_modules/grunt-contrib-compress/package.json deleted file mode 100644 index 33506c2..0000000 --- a/node_modules/grunt-contrib-compress/package.json +++ /dev/null @@ -1,117 +0,0 @@ -{ - "name": "grunt-contrib-compress", - "description": "Compress files and folders", - "version": "1.3.0", - "author": { - "name": "Grunt Team", - "url": "http://gruntjs.com/" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/gruntjs/grunt-contrib-compress.git" - }, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - }, - "main": "tasks/compress.js", - "scripts": { - "test": "grunt test" - }, - "dependencies": { - "archiver": "^1.0.0", - "chalk": "^1.1.1", - "lodash": "^4.7.0", - "pretty-bytes": "^3.0.1", - "stream-buffers": "^2.1.0" - }, - "devDependencies": { - "grunt": "^1.0.0", - "grunt-contrib-clean": "^1.0.0", - "grunt-contrib-copy": "^1.0.0", - "grunt-contrib-internal": "^1.1.0", - "grunt-contrib-jshint": "^1.0.0", - "grunt-contrib-nodeunit": "^1.0.0", - "tar": "^2.2.1", - "unzip": "^0.1.5" - }, - "keywords": [ - "gruntplugin", - "compress", - "zip", - "tar" - ], - "files": [ - "tasks" - ], - "appveyor_id": "tiwbi1smm1j8aa5j", - "contributors": [ - { - "name": "Chris Talkington", - "url": "http://christalkington.com/" - }, - { - "name": "Tyler Kellen", - "url": "http://goingslowly.com/" - }, - { - "name": "Kyle Robinson Young", - "url": "http://twitter.com/shamakry" - }, - { - "name": "Dav Glass", - "url": "http://blog.davglass.com/" - } - ], - "gitHead": "b0488b44b36a07e22698b25bf2a7190319ecf0eb", - "bugs": { - "url": "https://github.com/gruntjs/grunt-contrib-compress/issues" - }, - "homepage": "https://github.com/gruntjs/grunt-contrib-compress#readme", - "_id": "grunt-contrib-compress@1.3.0", - "_shasum": "5e5c26a200490823c7f77288afd2d7350d95c63d", - "_from": "grunt-contrib-compress@>=1.2.0 <2.0.0", - "_npmVersion": "2.15.3", - "_nodeVersion": "4.2.3", - "_npmUser": { - "name": "vladikoff", - "email": "vlad@vladikoff.com" - }, - "dist": { - "shasum": "5e5c26a200490823c7f77288afd2d7350d95c63d", - "tarball": "https://registry.npmjs.org/grunt-contrib-compress/-/grunt-contrib-compress-1.3.0.tgz" - }, - "maintainers": [ - { - "name": "tkellen", - "email": "tyler@sleekcode.net" - }, - { - "name": "cowboy", - "email": "cowboy@rj3.net" - }, - { - "name": "shama", - "email": "kyle@dontkry.com" - }, - { - "name": "vladikoff", - "email": "vlad@vladikoff.com" - }, - { - "name": "sindresorhus", - "email": "sindresorhus@gmail.com" - }, - { - "name": "jmeas", - "email": "jellyes2@gmail.com" - } - ], - "_npmOperationalInternal": { - "host": "packages-12-west.internal.npmjs.com", - "tmp": "tmp/grunt-contrib-compress-1.3.0.tgz_1464112166841_0.6356244964990765" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/grunt-contrib-compress/-/grunt-contrib-compress-1.3.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/grunt-contrib-compress/tasks/compress.js b/node_modules/grunt-contrib-compress/tasks/compress.js deleted file mode 100644 index 2c3689c..0000000 --- a/node_modules/grunt-contrib-compress/tasks/compress.js +++ /dev/null @@ -1,38 +0,0 @@ -/* - * grunt-contrib-compress - * http://gruntjs.com/ - * - * Copyright (c) 2016 Chris Talkington, contributors - * Licensed under the MIT license. - */ - -'use strict'; - -module.exports = function(grunt) { - var _ = require('lodash'); - var compress = require('./lib/compress')(grunt); - - grunt.registerMultiTask('compress', 'Compress files.', function() { - compress.options = this.options({ - archive: null, - mode: null, - level: 1 - }); - - if (typeof compress.options.archive === 'function') { - compress.options.archive = compress.options.archive(); - } - - compress.options.mode = compress.options.mode || compress.autoDetectMode(compress.options.archive); - - if (_.includes(['zip', 'tar', 'tgz', 'gzip', 'deflate', 'deflateRaw'], compress.options.mode) === false) { - grunt.fail.warn('Mode ' + String(compress.options.mode).cyan + ' not supported.'); - } - - if (compress.options.mode === 'gzip' || compress.options.mode.slice(0, 7) === 'deflate') { - compress[compress.options.mode](this.files, this.async()); - } else { - compress.tar(this.files, this.async()); - } - }); -}; diff --git a/node_modules/grunt-contrib-compress/tasks/lib/compress.js b/node_modules/grunt-contrib-compress/tasks/lib/compress.js deleted file mode 100644 index e7689e6..0000000 --- a/node_modules/grunt-contrib-compress/tasks/lib/compress.js +++ /dev/null @@ -1,259 +0,0 @@ -/* - * grunt-contrib-compress - * http://gruntjs.com/ - * - * Copyright (c) 2016 Chris Talkington, contributors - * Licensed under the MIT license. - */ - -'use strict'; - -var fs = require('fs'); -var path = require('path'); -var prettyBytes = require('pretty-bytes'); -var chalk = require('chalk'); -var zlib = require('zlib'); -var archiver = require('archiver'); -var streamBuffers = require('stream-buffers'); -var _ = require('lodash'); - -module.exports = function(grunt) { - - var exports = { - options: {} - }; - - var fileStatSync = function() { - var filepath = path.join.apply(path, arguments); - - if (grunt.file.exists(filepath)) { - return fs.statSync(filepath); - } - - return false; - }; - - // 1 to 1 gziping of files - exports.gzip = function(files, done) { - exports.singleFile(files, zlib.createGzip, 'gz', done); - grunt.log.ok('Compressed ' + chalk.cyan(files.length) + ' ' - + grunt.util.pluralize(files.length, 'file/files.')); - }; - - // 1 to 1 deflate of files - exports.deflate = function(files, done) { - exports.singleFile(files, zlib.createDeflate, 'deflate', done); - grunt.log.ok('Compressed ' + chalk.cyan(files.length) + ' ' - + grunt.util.pluralize(files.length, 'file/files.')); - }; - - // 1 to 1 deflateRaw of files - exports.deflateRaw = function(files, done) { - exports.singleFile(files, zlib.createDeflateRaw, 'deflate', done); - grunt.log.ok('Compressed ' + chalk.cyan(files.length) + ' ' - + grunt.util.pluralize(files.length, 'file/files.')); - }; - - // 1 to 1 compression of files, expects a compatible zlib method to be passed in, see above - exports.singleFile = function(files, algorithm, extension, done) { - grunt.util.async.forEachSeries(files, function(filePair, nextPair) { - grunt.util.async.forEachSeries(filePair.src, function(src, nextFile) { - // Must be a file - if (grunt.file.isDir(src)) { - return nextFile(); - } - - // Ensure the dest folder exists - grunt.file.mkdir(path.dirname(filePair.dest)); - - var srcStream = fs.createReadStream(src); - var originalSize = exports.getSize(src); - - var destStream; - function initDestStream() { - destStream = fs.createWriteStream(filePair.dest); - - destStream.on('close', function() { - var compressedSize = exports.getSize(filePair.dest); - var ratio = Math.round(parseInt(compressedSize, 10) / parseInt(originalSize, 10) * 100) + '%'; - - grunt.verbose.writeln('Created ' + chalk.cyan(filePair.dest) + ' (' + compressedSize + ') - ' + chalk.cyan(ratio) + ' of the original size'); - nextFile(); - }); - } - - // write to memory stream if source and destination are the same - var tmpStream; - if (src === filePair.dest) { - tmpStream = new streamBuffers.WritableStreamBuffer(); - tmpStream.on('close', function() { - initDestStream(); - - destStream.write(this.getContents()); - destStream.end(); - }); - } else { - initDestStream(); - } - - var compressor = algorithm.call(zlib, exports.options); - - compressor.on('error', function(err) { - grunt.log.error(err); - grunt.fail.warn(algorithm + ' failed.'); - nextFile(); - }); - - srcStream.pipe(compressor).pipe(tmpStream || destStream); - }, nextPair); - }, done); - }; - - // Compress with tar, tgz and zip - exports.tar = function(files, done) { - if (typeof exports.options.archive !== 'string' || exports.options.archive.length === 0) { - grunt.fail.warn('Unable to compress; no valid archive file was specified.'); - return; - } - - var mode = exports.options.mode; - if (mode === 'tgz') { - mode = 'tar'; - exports.options.gzip = true; - } - - var archive = archiver.create(mode, exports.options); - var dest = exports.options.archive; - - var dataWhitelist = ['comment', 'date', 'mode', 'store', 'gid', 'uid']; - var sourcePaths = {}; - - // Ensure dest folder exists - grunt.file.mkdir(path.dirname(dest)); - - // Where to write the file - var destStream = fs.createWriteStream(dest); - - archive.on('error', function(err) { - grunt.log.error(err); - grunt.fail.warn('Archiving failed.'); - }); - - archive.on('entry', function(file) { - var sp = sourcePaths[file.name] || 'unknown'; - grunt.verbose.writeln('Archived ' + chalk.cyan(sp) + ' -> ' + chalk.cyan(dest + '/' + file.name)); - }); - - destStream.on('error', function(err) { - grunt.log.error(err); - grunt.fail.warn('WriteStream failed.'); - }); - - destStream.on('close', function() { - var size = archive.pointer(); - grunt.verbose.writeln('Created ' + chalk.cyan(dest) + ' (' + exports.getSize(size) + ')'); - done(); - }); - - archive.pipe(destStream); - - files.forEach(function(file) { - var isExpandedPair = file.orig.expand || false; - - file.src.forEach(function(srcFile) { - var fstat = fileStatSync(srcFile); - - if (!fstat) { - grunt.fail.warn('unable to stat srcFile (' + srcFile + ')'); - return; - } - - var internalFileName = isExpandedPair ? file.dest : exports.unixifyPath(path.join(file.dest || '', srcFile)); - - // check if internal file name is not a dot, should not be present in an archive - if (internalFileName === '.' || internalFileName === './') { - return; - } - - if (fstat.isDirectory() && internalFileName.slice(-1) !== '/') { - srcFile += '/'; - internalFileName += '/'; - } - - var fileData = { - name: internalFileName, - stats: fstat - }; - - for (var i = 0; i < dataWhitelist.length; i++) { - if (typeof file[dataWhitelist[i]] === 'undefined') { - continue; - } - - if (typeof file[dataWhitelist[i]] === 'function') { - fileData[dataWhitelist[i]] = file[dataWhitelist[i]](srcFile); - } else { - fileData[dataWhitelist[i]] = file[dataWhitelist[i]]; - } - } - - if (fstat.isFile()) { - archive.file(srcFile, fileData); - } else if (fstat.isDirectory()) { - archive.append(null, fileData); - } else { - grunt.fail.warn('srcFile (' + srcFile + ') should be a valid file or directory'); - return; - } - - sourcePaths[internalFileName] = srcFile; - }); - }); - - grunt.log.ok('Compressed ' + chalk.cyan(files.length) + ' ' - + grunt.util.pluralize(files.length, 'file/files.')); - archive.finalize(); - }; - - exports.getSize = function(filename, pretty) { - var size = 0; - if (typeof filename === 'string') { - try { - size = fs.statSync(filename).size; - } catch (e) {} - } else { - size = filename; - } - if (pretty !== false) { - if (!exports.options.pretty) { - return size + ' bytes'; - } - return prettyBytes(size); - } - return Number(size); - }; - - exports.autoDetectMode = function(dest) { - if (exports.options.mode) { - return exports.options.mode; - } - if (!dest) { - return 'gzip'; - } - if (_.endsWith(dest, '.tar.gz')) { - return 'tgz'; - } - var ext = path.extname(dest).replace('.', ''); - if (ext === 'gz') { - return 'gzip'; - } - return ext; - - }; - - exports.unixifyPath = function(filepath) { - return process.platform === 'win32' ? filepath.replace(/\\/g, '/') : filepath; - }; - - return exports; -}; diff --git a/node_modules/grunt-contrib-copy/CHANGELOG b/node_modules/grunt-contrib-copy/CHANGELOG deleted file mode 100644 index 5961d01..0000000 --- a/node_modules/grunt-contrib-copy/CHANGELOG +++ /dev/null @@ -1,85 +0,0 @@ -v1.0.0: - date: 2016-03-04 - changes: - - Bump devDependencies. - - Add example of using relative path. - - Point main to task and remove peerDeps. -v0.8.2: - date: 2015-10-19 - changes: - - Fix expand-less copies with multiple files. -v0.8.1: - date: 2015-08-20 - changes: - - Update `chalk` dependency. -v0.8.0: - date: 2015-02-20 - changes: - - Performance improvements. - - The `mode` option now also applies to directories. - - Fix path issue on Windows. -v0.7.0: - date: 2014-10-15 - changes: - - Add timestamp option to disable preserving timestamp when copying. -v0.6.0: - date: 2014-09-17 - changes: - - Update chalk dependency and other devDependencies. - - Preserve file timestamp when copying. -v0.5.0: - date: 2013-12-23 - changes: - - If an encoding is specified, overwrite grunt.file.defaultEncoding. - - Rename processContent/processContentExclude to process/noProcess to match Grunt API. - - mode option to copy existing or set file permissions. -v0.4.1: - date: 2013-03-26 - changes: - - Output summary by default ("Copied N files, created M folders"). Individual transaction output available via `--verbose`. -v0.4.0: - date: 2013-02-15 - changes: - - First official release for Grunt 0.4.0. -v0.4.0rc7: - date: 2013-01-23 - changes: - - Updating grunt/gruntplugin dependencies to rc7. - - Changing in-development grunt/gruntplugin dependency versions from tilde version ranges to specific versions. -v0.4.0rc5: - date: 2013-01-14 - changes: - - Updating to work with grunt v0.4.0rc5. - - Conversion to grunt v0.4 conventions. - - Replace basePath with cwd. - - Empty directory support. -v0.3.2: - date: 2012-10-18 - changes: - - Pass copyOptions on single file copy. -v0.3.1: - date: 2012-10-12 - changes: - - Rename grunt-contrib-lib dep to grunt-lib-contrib. -v0.3.0: - date: 2012-09-24 - changes: - - General cleanup and consolidation. - - Global options depreciated. -v0.2.4: - date: 2012-09-18 - changes: - - No valid source check. -v0.2.3: - date: 2012-09-17 - changes: - - Path.sep fallback for node <= 0.7.9. -v0.2.2: - date: 2012-09-17 - changes: - - Single file copy support. - - Test refactoring. -v0.2.0: - date: 2012-09-07 - changes: - - Refactored from grunt-contrib into individual repo. diff --git a/node_modules/grunt-contrib-copy/README.md b/node_modules/grunt-contrib-copy/README.md deleted file mode 100644 index ac7972f..0000000 --- a/node_modules/grunt-contrib-copy/README.md +++ /dev/null @@ -1,279 +0,0 @@ -# grunt-contrib-copy v1.0.0 [![Build Status: Linux](https://travis-ci.org/gruntjs/grunt-contrib-copy.svg?branch=master)](https://travis-ci.org/gruntjs/grunt-contrib-copy) [![Build Status: Windows](https://ci.appveyor.com/api/projects/status/fe6l517l01ys2y86/branch/master?svg=true)](https://ci.appveyor.com/project/gruntjs/grunt-contrib-copy/branch/master) - -> Copy files and folders - - - -## Getting Started - -If you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command: - -```shell -npm install grunt-contrib-copy --save-dev -``` - -Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript: - -```js -grunt.loadNpmTasks('grunt-contrib-copy'); -``` - -*This plugin was designed to work with Grunt 0.4.x. If you're still using grunt v0.3.x it's strongly recommended that [you upgrade](http://gruntjs.com/upgrading-from-0.3-to-0.4), but in case you can't please use [v0.3.2](https://github.com/gruntjs/grunt-contrib-copy/tree/grunt-0.3-stable).* - - - -## Copy task -_Run this task with the `grunt copy` command._ - -Task targets, files and options may be specified according to the grunt [Configuring tasks](http://gruntjs.com/configuring-tasks) guide. -### Options - -#### process -Type: `Function(content, srcpath)` - -This option is passed to `grunt.file.copy` as an advanced way to control the file contents that are copied. - -*`processContent` has been renamed to `process` and the option name will be removed in the future.* - -#### noProcess -Type: `String` - -This option is passed to `grunt.file.copy` as an advanced way to control which file contents are processed. - -*`processContentExclude` has been renamed to `noProcess` and the option name will be removed in the future.* - -#### encoding -Type: `String` -Default: `grunt.file.defaultEncoding` - -The file encoding to copy files with. - -#### mode -Type: `Boolean` or `String` -Default: `false` - -Whether to copy or set the destination file and directory permissions. -Set to `true` to copy the existing file and directories permissions. -Or set to the mode, i.e.: `0644`, that copied files will be set to. - -#### timestamp -Type: `Boolean` -Default: `false` - -Whether to preserve the timestamp attributes(`atime` and `mtime`) when copying files. Set to `true` to preserve files timestamp. But timestamp will *not* be preserved when the file contents or name are changed during copying. - -### Usage Examples - -```js -copy: { - main: { - files: [ - // includes files within path - {expand: true, src: ['path/*'], dest: 'dest/', filter: 'isFile'}, - - // includes files within path and its sub-directories - {expand: true, src: ['path/**'], dest: 'dest/'}, - - // makes all src relative to cwd - {expand: true, cwd: 'path/', src: ['**'], dest: 'dest/'}, - - // flattens results to a single level - {expand: true, flatten: true, src: ['path/**'], dest: 'dest/', filter: 'isFile'}, - ], - }, -}, -``` - -This task supports all the file mapping format Grunt supports. Please read [Globbing patterns](http://gruntjs.com/configuring-tasks#globbing-patterns) and [Building the files object dynamically](http://gruntjs.com/configuring-tasks#building-the-files-object-dynamically) for additional details. - -Here are some additional examples, given the following file tree: -```shell -$ tree -I node_modules -. -├── Gruntfile.js -└── src - ├── a - └── subdir - └── b - -2 directories, 3 files -``` - -**Copy a single file tree:** -```js -copy: { - main: { - expand: true, - src: 'src/*', - dest: 'dest/', - }, -}, -``` - -```shell -$ grunt copy -Running "copy:main" (copy) task -Created 1 directories, copied 1 files - -Done, without errors. -$ tree -I node_modules -. -├── Gruntfile.js -├── dest -│   └── src -│   ├── a -│   └── subdir -└── src - ├── a - └── subdir - └── b - -5 directories, 4 files -``` - -**Copying without full path:** -```js -copy: { - main: { - expand: true, - cwd: 'src', - src: '**', - dest: 'dest/', - }, -}, -``` - -```shell -$ grunt copy -Running "copy:main" (copy) task -Created 2 directories, copied 2 files - -Done, without errors. -$ tree -I node_modules -. -├── Gruntfile.js -├── dest -│ ├── a -│ └── subdir -│ └── b -└── src - ├── a - └── subdir - └── b - -5 directories, 5 files -``` - -**Flattening the filepath output:** - -```js -copy: { - main: { - expand: true, - cwd: 'src/', - src: '**', - dest: 'dest/', - flatten: true, - filter: 'isFile', - }, -}, -``` - -```shell -$ grunt copy -Running "copy:main" (copy) task -Copied 2 files - -Done, without errors. -$ tree -I node_modules -. -├── Gruntfile.js -├── dest -│   ├── a -│   └── b -└── src - ├── a - └── subdir - └── b - -3 directories, 5 files -``` - - -**Copy and modify a file:** - -To change the contents of a file as it is copied, set an `options.process` function as follows: - -```js -copy: { - main: { - src: 'src/a', - dest: 'src/a.bak', - options: { - process: function (content, srcpath) { - return content.replace(/[sad ]/g,"_"); - }, - }, - }, -}, -``` - -Here all occurrences of the letters "s", "a" and "d", as well as all spaces, will be changed to underlines in "a.bak". Of course, you are not limited to just using regex replacements. - -To process all files in a directory, the `process` function is used in exactly the same way. - -NOTE: If `process` is not working, be aware it was called `processContent` in v0.4.1 and earlier. - - -##### Troubleshooting - -By default, if a file or directory is not found it is quietly ignored. If the file should exist, and non-existence generate an error, then add `nonull:true`. For instance, this Gruntfile.js entry: - -```js -copy: { - main: { - nonull: true, - src: 'not-there', - dest: 'create-me', - }, -}, -``` - -gives this output: - -```shell -$ grunt copy -Running "copy:main" (copy) task -Warning: Unable to read "not-there" file (Error code: ENOENT). Use --force to continue. - -Aborted due to warnings. -``` - - - -## Release History - - * 2016-03-04   v1.0.0   Bump devDependencies. Add example of using relative path. Point main to task and remove peerDeps. - * 2015-10-19   v0.8.2   Fix expand-less copies with multiple files. - * 2015-08-20   v0.8.1   Update `chalk` dependency. - * 2015-02-20   v0.8.0   Performance improvements. The `mode` option now also applies to directories. Fix path issue on Windows. - * 2014-10-15   v0.7.0   Add timestamp option to disable preserving timestamp when copying. - * 2014-09-17   v0.6.0   Update chalk dependency and other devDependencies. Preserve file timestamp when copying. - * 2013-12-23   v0.5.0   If an encoding is specified, overwrite grunt.file.defaultEncoding. Rename processContent/processContentExclude to process/noProcess to match Grunt API. mode option to copy existing or set file permissions. - * 2013-03-26   v0.4.1   Output summary by default ("Copied N files, created M folders"). Individual transaction output available via `--verbose`. - * 2013-02-15   v0.4.0   First official release for Grunt 0.4.0. - * 2013-01-23   v0.4.0rc7   Updating grunt/gruntplugin dependencies to rc7. Changing in-development grunt/gruntplugin dependency versions from tilde version ranges to specific versions. - * 2013-01-14   v0.4.0rc5   Updating to work with grunt v0.4.0rc5. Conversion to grunt v0.4 conventions. Replace basePath with cwd. Empty directory support. - * 2012-10-18   v0.3.2   Pass copyOptions on single file copy. - * 2012-10-12   v0.3.1   Rename grunt-contrib-lib dep to grunt-lib-contrib. - * 2012-09-24   v0.3.0   General cleanup and consolidation. Global options depreciated. - * 2012-09-18   v0.2.4   No valid source check. - * 2012-09-17   v0.2.3   Path.sep fallback for node <= 0.7.9. - * 2012-09-17   v0.2.2   Single file copy support. Test refactoring. - * 2012-09-07   v0.2.0   Refactored from grunt-contrib into individual repo. - ---- - -Task submitted by [Chris Talkington](http://christalkington.com/) - -*This file was generated on Fri Mar 04 2016 15:50:24.* diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/index.js b/node_modules/grunt-contrib-copy/node_modules/chalk/index.js deleted file mode 100644 index 2d85a91..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/index.js +++ /dev/null @@ -1,116 +0,0 @@ -'use strict'; -var escapeStringRegexp = require('escape-string-regexp'); -var ansiStyles = require('ansi-styles'); -var stripAnsi = require('strip-ansi'); -var hasAnsi = require('has-ansi'); -var supportsColor = require('supports-color'); -var defineProps = Object.defineProperties; -var isSimpleWindowsTerm = process.platform === 'win32' && !/^xterm/i.test(process.env.TERM); - -function Chalk(options) { - // detect mode if not set manually - this.enabled = !options || options.enabled === undefined ? supportsColor : options.enabled; -} - -// use bright blue on Windows as the normal blue color is illegible -if (isSimpleWindowsTerm) { - ansiStyles.blue.open = '\u001b[94m'; -} - -var styles = (function () { - var ret = {}; - - Object.keys(ansiStyles).forEach(function (key) { - ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); - - ret[key] = { - get: function () { - return build.call(this, this._styles.concat(key)); - } - }; - }); - - return ret; -})(); - -var proto = defineProps(function chalk() {}, styles); - -function build(_styles) { - var builder = function () { - return applyStyle.apply(builder, arguments); - }; - - builder._styles = _styles; - builder.enabled = this.enabled; - // __proto__ is used because we must return a function, but there is - // no way to create a function with a different prototype. - /* eslint-disable no-proto */ - builder.__proto__ = proto; - - return builder; -} - -function applyStyle() { - // support varags, but simply cast to string in case there's only one arg - var args = arguments; - var argsLen = args.length; - var str = argsLen !== 0 && String(arguments[0]); - - if (argsLen > 1) { - // don't slice `arguments`, it prevents v8 optimizations - for (var a = 1; a < argsLen; a++) { - str += ' ' + args[a]; - } - } - - if (!this.enabled || !str) { - return str; - } - - var nestedStyles = this._styles; - var i = nestedStyles.length; - - // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, - // see https://github.com/chalk/chalk/issues/58 - // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. - var originalDim = ansiStyles.dim.open; - if (isSimpleWindowsTerm && (nestedStyles.indexOf('gray') !== -1 || nestedStyles.indexOf('grey') !== -1)) { - ansiStyles.dim.open = ''; - } - - while (i--) { - var code = ansiStyles[nestedStyles[i]]; - - // Replace any instances already present with a re-opening code - // otherwise only the part of the string until said closing code - // will be colored, and the rest will simply be 'plain'. - str = code.open + str.replace(code.closeRe, code.open) + code.close; - } - - // Reset the original 'dim' if we changed it to work around the Windows dimmed gray issue. - ansiStyles.dim.open = originalDim; - - return str; -} - -function init() { - var ret = {}; - - Object.keys(styles).forEach(function (name) { - ret[name] = { - get: function () { - return build.call(this, [name]); - } - }; - }); - - return ret; -} - -defineProps(Chalk.prototype, init()); - -module.exports = new Chalk(); -module.exports.styles = ansiStyles; -module.exports.hasColor = hasAnsi; -module.exports.stripColor = stripAnsi; -module.exports.supportsColor = supportsColor; diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/license b/node_modules/grunt-contrib-copy/node_modules/chalk/license deleted file mode 100644 index 654d0bf..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.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. diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/ansi-styles/index.js b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/ansi-styles/index.js deleted file mode 100644 index 7894527..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/ansi-styles/index.js +++ /dev/null @@ -1,65 +0,0 @@ -'use strict'; - -function assembleStyles () { - var styles = { - modifiers: { - reset: [0, 0], - bold: [1, 22], // 21 isn't widely supported and 22 does the same thing - dim: [2, 22], - italic: [3, 23], - underline: [4, 24], - inverse: [7, 27], - hidden: [8, 28], - strikethrough: [9, 29] - }, - colors: { - black: [30, 39], - red: [31, 39], - green: [32, 39], - yellow: [33, 39], - blue: [34, 39], - magenta: [35, 39], - cyan: [36, 39], - white: [37, 39], - gray: [90, 39] - }, - bgColors: { - bgBlack: [40, 49], - bgRed: [41, 49], - bgGreen: [42, 49], - bgYellow: [43, 49], - bgBlue: [44, 49], - bgMagenta: [45, 49], - bgCyan: [46, 49], - bgWhite: [47, 49] - } - }; - - // fix humans - styles.colors.grey = styles.colors.gray; - - Object.keys(styles).forEach(function (groupName) { - var group = styles[groupName]; - - Object.keys(group).forEach(function (styleName) { - var style = group[styleName]; - - styles[styleName] = group[styleName] = { - open: '\u001b[' + style[0] + 'm', - close: '\u001b[' + style[1] + 'm' - }; - }); - - Object.defineProperty(styles, groupName, { - value: group, - enumerable: false - }); - }); - - return styles; -} - -Object.defineProperty(module, 'exports', { - enumerable: true, - get: assembleStyles -}); diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/ansi-styles/license b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/ansi-styles/license deleted file mode 100644 index 654d0bf..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/ansi-styles/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.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. diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/ansi-styles/package.json b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/ansi-styles/package.json deleted file mode 100644 index de25e5c..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/ansi-styles/package.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "name": "ansi-styles", - "version": "2.2.1", - "description": "ANSI escape codes for styling strings in the terminal", - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/chalk/ansi-styles.git" - }, - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "maintainers": [ - { - "name": "sindresorhus", - "email": "sindresorhus@gmail.com" - } - ], - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "mocha" - }, - "files": [ - "index.js" - ], - "keywords": [ - "ansi", - "styles", - "color", - "colour", - "colors", - "terminal", - "console", - "cli", - "string", - "tty", - "escape", - "formatting", - "rgb", - "256", - "shell", - "xterm", - "log", - "logging", - "command-line", - "text" - ], - "devDependencies": { - "mocha": "*" - }, - "gitHead": "95c59b23be760108b6530ca1c89477c21b258032", - "bugs": { - "url": "https://github.com/chalk/ansi-styles/issues" - }, - "homepage": "https://github.com/chalk/ansi-styles#readme", - "_id": "ansi-styles@2.2.1", - "_shasum": "b432dd3358b634cf75e1e4664368240533c1ddbe", - "_from": "ansi-styles@>=2.2.1 <3.0.0", - "_npmVersion": "3.8.3", - "_nodeVersion": "4.3.0", - "_npmUser": { - "name": "sindresorhus", - "email": "sindresorhus@gmail.com" - }, - "dist": { - "shasum": "b432dd3358b634cf75e1e4664368240533c1ddbe", - "tarball": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" - }, - "_npmOperationalInternal": { - "host": "packages-12-west.internal.npmjs.com", - "tmp": "tmp/ansi-styles-2.2.1.tgz_1459197317833_0.9694824463222176" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/ansi-styles/readme.md b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/ansi-styles/readme.md deleted file mode 100644 index 3f933f6..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/ansi-styles/readme.md +++ /dev/null @@ -1,86 +0,0 @@ -# ansi-styles [![Build Status](https://travis-ci.org/chalk/ansi-styles.svg?branch=master)](https://travis-ci.org/chalk/ansi-styles) - -> [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal - -You probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings. - -![](screenshot.png) - - -## Install - -``` -$ npm install --save ansi-styles -``` - - -## Usage - -```js -var ansi = require('ansi-styles'); - -console.log(ansi.green.open + 'Hello world!' + ansi.green.close); -``` - - -## API - -Each style has an `open` and `close` property. - - -## Styles - -### Modifiers - -- `reset` -- `bold` -- `dim` -- `italic` *(not widely supported)* -- `underline` -- `inverse` -- `hidden` -- `strikethrough` *(not widely supported)* - -### Colors - -- `black` -- `red` -- `green` -- `yellow` -- `blue` -- `magenta` -- `cyan` -- `white` -- `gray` - -### Background colors - -- `bgBlack` -- `bgRed` -- `bgGreen` -- `bgYellow` -- `bgBlue` -- `bgMagenta` -- `bgCyan` -- `bgWhite` - - -## Advanced usage - -By default you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module. - -- `ansi.modifiers` -- `ansi.colors` -- `ansi.bgColors` - - -###### Example - -```js -console.log(ansi.colors.green.open); -``` - - -## License - -MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/escape-string-regexp/index.js b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/escape-string-regexp/index.js deleted file mode 100644 index 7834bf9..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/escape-string-regexp/index.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; - -var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; - -module.exports = function (str) { - if (typeof str !== 'string') { - throw new TypeError('Expected a string'); - } - - return str.replace(matchOperatorsRe, '\\$&'); -}; diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/escape-string-regexp/license b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/escape-string-regexp/license deleted file mode 100644 index 654d0bf..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/escape-string-regexp/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.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. diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/escape-string-regexp/package.json b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/escape-string-regexp/package.json deleted file mode 100644 index 7714d5d..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/escape-string-regexp/package.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "name": "escape-string-regexp", - "version": "1.0.5", - "description": "Escape RegExp special characters", - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/sindresorhus/escape-string-regexp.git" - }, - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "maintainers": [ - { - "name": "sindresorhus", - "email": "sindresorhus@gmail.com" - }, - { - "name": "jbnicolai", - "email": "jappelman@xebia.com" - } - ], - "engines": { - "node": ">=0.8.0" - }, - "scripts": { - "test": "xo && ava" - }, - "files": [ - "index.js" - ], - "keywords": [ - "escape", - "regex", - "regexp", - "re", - "regular", - "expression", - "string", - "str", - "special", - "characters" - ], - "devDependencies": { - "ava": "*", - "xo": "*" - }, - "gitHead": "db124a3e1aae9d692c4899e42a5c6c3e329eaa20", - "bugs": { - "url": "https://github.com/sindresorhus/escape-string-regexp/issues" - }, - "homepage": "https://github.com/sindresorhus/escape-string-regexp", - "_id": "escape-string-regexp@1.0.5", - "_shasum": "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4", - "_from": "escape-string-regexp@>=1.0.2 <2.0.0", - "_npmVersion": "2.14.12", - "_nodeVersion": "4.2.6", - "_npmUser": { - "name": "jbnicolai", - "email": "jappelman@xebia.com" - }, - "dist": { - "shasum": "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4", - "tarball": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - }, - "_npmOperationalInternal": { - "host": "packages-9-west.internal.npmjs.com", - "tmp": "tmp/escape-string-regexp-1.0.5.tgz_1456059312074_0.7245344955008477" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/escape-string-regexp/readme.md b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/escape-string-regexp/readme.md deleted file mode 100644 index 87ac82d..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/escape-string-regexp/readme.md +++ /dev/null @@ -1,27 +0,0 @@ -# escape-string-regexp [![Build Status](https://travis-ci.org/sindresorhus/escape-string-regexp.svg?branch=master)](https://travis-ci.org/sindresorhus/escape-string-regexp) - -> Escape RegExp special characters - - -## Install - -``` -$ npm install --save escape-string-regexp -``` - - -## Usage - -```js -const escapeStringRegexp = require('escape-string-regexp'); - -const escapedString = escapeStringRegexp('how much $ for a unicorn?'); -//=> 'how much \$ for a unicorn\?' - -new RegExp(escapedString); -``` - - -## License - -MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/index.js b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/index.js deleted file mode 100644 index 98fae06..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/index.js +++ /dev/null @@ -1,4 +0,0 @@ -'use strict'; -var ansiRegex = require('ansi-regex'); -var re = new RegExp(ansiRegex().source); // remove the `g` flag -module.exports = re.test.bind(re); diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/license b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/license deleted file mode 100644 index 654d0bf..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.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. diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/index.js b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/index.js deleted file mode 100644 index 4906755..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/index.js +++ /dev/null @@ -1,4 +0,0 @@ -'use strict'; -module.exports = function () { - return /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g; -}; diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/license b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/license deleted file mode 100644 index 654d0bf..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.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. diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/package.json b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/package.json deleted file mode 100644 index 80bf90b..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/package.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "name": "ansi-regex", - "version": "2.0.0", - "description": "Regular expression for matching ANSI escape codes", - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/sindresorhus/ansi-regex.git" - }, - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "maintainers": [ - { - "name": "sindresorhus", - "email": "sindresorhus@gmail.com" - }, - { - "name": "jbnicolai", - "email": "jappelman@xebia.com" - } - ], - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "mocha test/test.js", - "view-supported": "node test/viewCodes.js" - }, - "files": [ - "index.js" - ], - "keywords": [ - "ansi", - "styles", - "color", - "colour", - "colors", - "terminal", - "console", - "cli", - "string", - "tty", - "escape", - "formatting", - "rgb", - "256", - "shell", - "xterm", - "command-line", - "text", - "regex", - "regexp", - "re", - "match", - "test", - "find", - "pattern" - ], - "devDependencies": { - "mocha": "*" - }, - "gitHead": "57c3f2941a73079fa8b081e02a522e3d29913e2f", - "bugs": { - "url": "https://github.com/sindresorhus/ansi-regex/issues" - }, - "homepage": "https://github.com/sindresorhus/ansi-regex", - "_id": "ansi-regex@2.0.0", - "_shasum": "c5061b6e0ef8a81775e50f5d66151bf6bf371107", - "_from": "ansi-regex@>=2.0.0 <3.0.0", - "_npmVersion": "2.11.2", - "_nodeVersion": "0.12.5", - "_npmUser": { - "name": "sindresorhus", - "email": "sindresorhus@gmail.com" - }, - "dist": { - "shasum": "c5061b6e0ef8a81775e50f5d66151bf6bf371107", - "tarball": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/readme.md b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/readme.md deleted file mode 100644 index 1a4894e..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/readme.md +++ /dev/null @@ -1,31 +0,0 @@ -# ansi-regex [![Build Status](https://travis-ci.org/sindresorhus/ansi-regex.svg?branch=master)](https://travis-ci.org/sindresorhus/ansi-regex) - -> Regular expression for matching [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code) - - -## Install - -``` -$ npm install --save ansi-regex -``` - - -## Usage - -```js -var ansiRegex = require('ansi-regex'); - -ansiRegex().test('\u001b[4mcake\u001b[0m'); -//=> true - -ansiRegex().test('cake'); -//=> false - -'\u001b[4mcake\u001b[0m'.match(ansiRegex()); -//=> ['\u001b[4m', '\u001b[0m'] -``` - - -## License - -MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/package.json b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/package.json deleted file mode 100644 index 443129d..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/package.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "name": "has-ansi", - "version": "2.0.0", - "description": "Check if a string has ANSI escape codes", - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/sindresorhus/has-ansi.git" - }, - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "maintainers": [ - { - "name": "sindresorhus", - "email": "sindresorhus@gmail.com" - }, - { - "name": "jbnicolai", - "email": "jappelman@xebia.com" - } - ], - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "node test.js" - }, - "files": [ - "index.js" - ], - "keywords": [ - "ansi", - "styles", - "color", - "colour", - "colors", - "terminal", - "console", - "string", - "tty", - "escape", - "shell", - "xterm", - "command-line", - "text", - "regex", - "regexp", - "re", - "match", - "test", - "find", - "pattern", - "has" - ], - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "devDependencies": { - "ava": "0.0.4" - }, - "gitHead": "0722275e1bef139fcd09137da6e5550c3cd368b9", - "bugs": { - "url": "https://github.com/sindresorhus/has-ansi/issues" - }, - "homepage": "https://github.com/sindresorhus/has-ansi", - "_id": "has-ansi@2.0.0", - "_shasum": "34f5049ce1ecdf2b0649af3ef24e45ed35416d91", - "_from": "has-ansi@>=2.0.0 <3.0.0", - "_npmVersion": "2.11.2", - "_nodeVersion": "0.12.5", - "_npmUser": { - "name": "sindresorhus", - "email": "sindresorhus@gmail.com" - }, - "dist": { - "shasum": "34f5049ce1ecdf2b0649af3ef24e45ed35416d91", - "tarball": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/readme.md b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/readme.md deleted file mode 100644 index 02bc7c2..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/has-ansi/readme.md +++ /dev/null @@ -1,36 +0,0 @@ -# has-ansi [![Build Status](https://travis-ci.org/sindresorhus/has-ansi.svg?branch=master)](https://travis-ci.org/sindresorhus/has-ansi) - -> Check if a string has [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code) - - -## Install - -``` -$ npm install --save has-ansi -``` - - -## Usage - -```js -var hasAnsi = require('has-ansi'); - -hasAnsi('\u001b[4mcake\u001b[0m'); -//=> true - -hasAnsi('cake'); -//=> false -``` - - -## Related - -- [has-ansi-cli](https://github.com/sindresorhus/has-ansi-cli) - CLI for this module -- [strip-ansi](https://github.com/sindresorhus/strip-ansi) - Strip ANSI escape codes -- [ansi-regex](https://github.com/sindresorhus/ansi-regex) - Regular expression for matching ANSI escape codes -- [chalk](https://github.com/sindresorhus/chalk) - Terminal string styling done right - - -## License - -MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/index.js b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/index.js deleted file mode 100644 index 099480f..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/index.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict'; -var ansiRegex = require('ansi-regex')(); - -module.exports = function (str) { - return typeof str === 'string' ? str.replace(ansiRegex, '') : str; -}; diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/license b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/license deleted file mode 100644 index 654d0bf..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.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. diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/index.js b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/index.js deleted file mode 100644 index 4906755..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/index.js +++ /dev/null @@ -1,4 +0,0 @@ -'use strict'; -module.exports = function () { - return /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g; -}; diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/license b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/license deleted file mode 100644 index 654d0bf..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.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. diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/package.json b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/package.json deleted file mode 100644 index 80bf90b..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/package.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "name": "ansi-regex", - "version": "2.0.0", - "description": "Regular expression for matching ANSI escape codes", - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/sindresorhus/ansi-regex.git" - }, - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "maintainers": [ - { - "name": "sindresorhus", - "email": "sindresorhus@gmail.com" - }, - { - "name": "jbnicolai", - "email": "jappelman@xebia.com" - } - ], - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "mocha test/test.js", - "view-supported": "node test/viewCodes.js" - }, - "files": [ - "index.js" - ], - "keywords": [ - "ansi", - "styles", - "color", - "colour", - "colors", - "terminal", - "console", - "cli", - "string", - "tty", - "escape", - "formatting", - "rgb", - "256", - "shell", - "xterm", - "command-line", - "text", - "regex", - "regexp", - "re", - "match", - "test", - "find", - "pattern" - ], - "devDependencies": { - "mocha": "*" - }, - "gitHead": "57c3f2941a73079fa8b081e02a522e3d29913e2f", - "bugs": { - "url": "https://github.com/sindresorhus/ansi-regex/issues" - }, - "homepage": "https://github.com/sindresorhus/ansi-regex", - "_id": "ansi-regex@2.0.0", - "_shasum": "c5061b6e0ef8a81775e50f5d66151bf6bf371107", - "_from": "ansi-regex@>=2.0.0 <3.0.0", - "_npmVersion": "2.11.2", - "_nodeVersion": "0.12.5", - "_npmUser": { - "name": "sindresorhus", - "email": "sindresorhus@gmail.com" - }, - "dist": { - "shasum": "c5061b6e0ef8a81775e50f5d66151bf6bf371107", - "tarball": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/readme.md b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/readme.md deleted file mode 100644 index 1a4894e..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/readme.md +++ /dev/null @@ -1,31 +0,0 @@ -# ansi-regex [![Build Status](https://travis-ci.org/sindresorhus/ansi-regex.svg?branch=master)](https://travis-ci.org/sindresorhus/ansi-regex) - -> Regular expression for matching [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code) - - -## Install - -``` -$ npm install --save ansi-regex -``` - - -## Usage - -```js -var ansiRegex = require('ansi-regex'); - -ansiRegex().test('\u001b[4mcake\u001b[0m'); -//=> true - -ansiRegex().test('cake'); -//=> false - -'\u001b[4mcake\u001b[0m'.match(ansiRegex()); -//=> ['\u001b[4m', '\u001b[0m'] -``` - - -## License - -MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/package.json b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/package.json deleted file mode 100644 index 576fc6f..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/package.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "name": "strip-ansi", - "version": "3.0.1", - "description": "Strip ANSI escape codes", - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/chalk/strip-ansi.git" - }, - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "maintainers": [ - { - "name": "sindresorhus", - "email": "sindresorhus@gmail.com" - }, - { - "name": "jbnicolai", - "email": "jappelman@xebia.com" - } - ], - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "xo && ava" - }, - "files": [ - "index.js" - ], - "keywords": [ - "strip", - "trim", - "remove", - "ansi", - "styles", - "color", - "colour", - "colors", - "terminal", - "console", - "string", - "tty", - "escape", - "formatting", - "rgb", - "256", - "shell", - "xterm", - "log", - "logging", - "command-line", - "text" - ], - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "devDependencies": { - "ava": "*", - "xo": "*" - }, - "gitHead": "8270705c704956da865623e564eba4875c3ea17f", - "bugs": { - "url": "https://github.com/chalk/strip-ansi/issues" - }, - "homepage": "https://github.com/chalk/strip-ansi", - "_id": "strip-ansi@3.0.1", - "_shasum": "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf", - "_from": "strip-ansi@>=3.0.0 <4.0.0", - "_npmVersion": "2.11.3", - "_nodeVersion": "0.12.7", - "_npmUser": { - "name": "jbnicolai", - "email": "jappelman@xebia.com" - }, - "dist": { - "shasum": "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf", - "tarball": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - }, - "_npmOperationalInternal": { - "host": "packages-9-west.internal.npmjs.com", - "tmp": "tmp/strip-ansi-3.0.1.tgz_1456057278183_0.28958667791448534" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/readme.md b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/readme.md deleted file mode 100644 index cb7d9ff..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/strip-ansi/readme.md +++ /dev/null @@ -1,33 +0,0 @@ -# strip-ansi [![Build Status](https://travis-ci.org/chalk/strip-ansi.svg?branch=master)](https://travis-ci.org/chalk/strip-ansi) - -> Strip [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code) - - -## Install - -``` -$ npm install --save strip-ansi -``` - - -## Usage - -```js -var stripAnsi = require('strip-ansi'); - -stripAnsi('\u001b[4mcake\u001b[0m'); -//=> 'cake' -``` - - -## Related - -- [strip-ansi-cli](https://github.com/chalk/strip-ansi-cli) - CLI for this module -- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes -- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes -- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right - - -## License - -MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/supports-color/index.js b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/supports-color/index.js deleted file mode 100644 index 4346e27..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/supports-color/index.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict'; -var argv = process.argv; - -var terminator = argv.indexOf('--'); -var hasFlag = function (flag) { - flag = '--' + flag; - var pos = argv.indexOf(flag); - return pos !== -1 && (terminator !== -1 ? pos < terminator : true); -}; - -module.exports = (function () { - if ('FORCE_COLOR' in process.env) { - return true; - } - - if (hasFlag('no-color') || - hasFlag('no-colors') || - hasFlag('color=false')) { - return false; - } - - if (hasFlag('color') || - hasFlag('colors') || - hasFlag('color=true') || - hasFlag('color=always')) { - return true; - } - - if (process.stdout && !process.stdout.isTTY) { - return false; - } - - if (process.platform === 'win32') { - return true; - } - - if ('COLORTERM' in process.env) { - return true; - } - - if (process.env.TERM === 'dumb') { - return false; - } - - if (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(process.env.TERM)) { - return true; - } - - return false; -})(); diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/supports-color/license b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/supports-color/license deleted file mode 100644 index 654d0bf..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/supports-color/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.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. diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/supports-color/package.json b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/supports-color/package.json deleted file mode 100644 index cf1119f..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/supports-color/package.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "name": "supports-color", - "version": "2.0.0", - "description": "Detect whether a terminal supports color", - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/chalk/supports-color.git" - }, - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "maintainers": [ - { - "name": "sindresorhus", - "email": "sindresorhus@gmail.com" - }, - { - "name": "jbnicolai", - "email": "jappelman@xebia.com" - } - ], - "engines": { - "node": ">=0.8.0" - }, - "scripts": { - "test": "mocha" - }, - "files": [ - "index.js" - ], - "keywords": [ - "color", - "colour", - "colors", - "terminal", - "console", - "cli", - "ansi", - "styles", - "tty", - "rgb", - "256", - "shell", - "xterm", - "command-line", - "support", - "supports", - "capability", - "detect" - ], - "devDependencies": { - "mocha": "*", - "require-uncached": "^1.0.2" - }, - "gitHead": "8400d98ade32b2adffd50902c06d9e725a5c6588", - "bugs": { - "url": "https://github.com/chalk/supports-color/issues" - }, - "homepage": "https://github.com/chalk/supports-color", - "_id": "supports-color@2.0.0", - "_shasum": "535d045ce6b6363fa40117084629995e9df324c7", - "_from": "supports-color@>=2.0.0 <3.0.0", - "_npmVersion": "2.11.2", - "_nodeVersion": "0.12.5", - "_npmUser": { - "name": "sindresorhus", - "email": "sindresorhus@gmail.com" - }, - "dist": { - "shasum": "535d045ce6b6363fa40117084629995e9df324c7", - "tarball": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/supports-color/readme.md b/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/supports-color/readme.md deleted file mode 100644 index b4761f1..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/node_modules/supports-color/readme.md +++ /dev/null @@ -1,36 +0,0 @@ -# supports-color [![Build Status](https://travis-ci.org/chalk/supports-color.svg?branch=master)](https://travis-ci.org/chalk/supports-color) - -> Detect whether a terminal supports color - - -## Install - -``` -$ npm install --save supports-color -``` - - -## Usage - -```js -var supportsColor = require('supports-color'); - -if (supportsColor) { - console.log('Terminal supports color'); -} -``` - -It obeys the `--color` and `--no-color` CLI flags. - -For situations where using `--color` is not possible, add an environment variable `FORCE_COLOR` with any value to force color. Trumps `--no-color`. - - -## Related - -- [supports-color-cli](https://github.com/chalk/supports-color-cli) - CLI for this module -- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right - - -## License - -MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/package.json b/node_modules/grunt-contrib-copy/node_modules/chalk/package.json deleted file mode 100644 index d96edab..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/package.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "name": "chalk", - "version": "1.1.3", - "description": "Terminal string styling done right. Much color.", - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/chalk/chalk.git" - }, - "maintainers": [ - { - "name": "qix", - "email": "i.am.qix@gmail.com" - }, - { - "name": "sindresorhus", - "email": "sindresorhus@gmail.com" - }, - { - "name": "unicorn", - "email": "sindresorhus+unicorn@gmail.com" - } - ], - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "xo && mocha", - "bench": "matcha benchmark.js", - "coverage": "nyc npm test && nyc report", - "coveralls": "nyc npm test && nyc report --reporter=text-lcov | coveralls" - }, - "files": [ - "index.js" - ], - "keywords": [ - "color", - "colour", - "colors", - "terminal", - "console", - "cli", - "string", - "str", - "ansi", - "style", - "styles", - "tty", - "formatting", - "rgb", - "256", - "shell", - "xterm", - "log", - "logging", - "command-line", - "text" - ], - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "devDependencies": { - "coveralls": "^2.11.2", - "matcha": "^0.6.0", - "mocha": "*", - "nyc": "^3.0.0", - "require-uncached": "^1.0.2", - "resolve-from": "^1.0.0", - "semver": "^4.3.3", - "xo": "*" - }, - "xo": { - "envs": [ - "node", - "mocha" - ] - }, - "gitHead": "0d8d8c204eb87a4038219131ad4d8369c9f59d24", - "bugs": { - "url": "https://github.com/chalk/chalk/issues" - }, - "homepage": "https://github.com/chalk/chalk#readme", - "_id": "chalk@1.1.3", - "_shasum": "a8115c55e4a702fe4d150abd3872822a7e09fc98", - "_from": "chalk@>=1.1.1 <2.0.0", - "_npmVersion": "2.14.2", - "_nodeVersion": "0.10.32", - "_npmUser": { - "name": "qix", - "email": "i.am.qix@gmail.com" - }, - "dist": { - "shasum": "a8115c55e4a702fe4d150abd3872822a7e09fc98", - "tarball": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" - }, - "_npmOperationalInternal": { - "host": "packages-12-west.internal.npmjs.com", - "tmp": "tmp/chalk-1.1.3.tgz_1459210604109_0.3892582862172276" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/grunt-contrib-copy/node_modules/chalk/readme.md b/node_modules/grunt-contrib-copy/node_modules/chalk/readme.md deleted file mode 100644 index 5cf111e..0000000 --- a/node_modules/grunt-contrib-copy/node_modules/chalk/readme.md +++ /dev/null @@ -1,213 +0,0 @@ -

-
-
- chalk -
-
-
-

- -> Terminal string styling done right - -[![Build Status](https://travis-ci.org/chalk/chalk.svg?branch=master)](https://travis-ci.org/chalk/chalk) -[![Coverage Status](https://coveralls.io/repos/chalk/chalk/badge.svg?branch=master)](https://coveralls.io/r/chalk/chalk?branch=master) -[![](http://img.shields.io/badge/unicorn-approved-ff69b4.svg)](https://www.youtube.com/watch?v=9auOCbH5Ns4) - - -[colors.js](https://github.com/Marak/colors.js) used to be the most popular string styling module, but it has serious deficiencies like extending `String.prototype` which causes all kinds of [problems](https://github.com/yeoman/yo/issues/68). Although there are other ones, they either do too much or not enough. - -**Chalk is a clean and focused alternative.** - -![](https://github.com/chalk/ansi-styles/raw/master/screenshot.png) - - -## Why - -- Highly performant -- Doesn't extend `String.prototype` -- Expressive API -- Ability to nest styles -- Clean and focused -- Auto-detects color support -- Actively maintained -- [Used by ~4500 modules](https://www.npmjs.com/browse/depended/chalk) as of July 15, 2015 - - -## Install - -``` -$ npm install --save chalk -``` - - -## Usage - -Chalk comes with an easy to use composable API where you just chain and nest the styles you want. - -```js -var chalk = require('chalk'); - -// style a string -chalk.blue('Hello world!'); - -// combine styled and normal strings -chalk.blue('Hello') + 'World' + chalk.red('!'); - -// compose multiple styles using the chainable API -chalk.blue.bgRed.bold('Hello world!'); - -// pass in multiple arguments -chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz'); - -// nest styles -chalk.red('Hello', chalk.underline.bgBlue('world') + '!'); - -// nest styles of the same type even (color, underline, background) -chalk.green( - 'I am a green line ' + - chalk.blue.underline.bold('with a blue substring') + - ' that becomes green again!' -); -``` - -Easily define your own themes. - -```js -var chalk = require('chalk'); -var error = chalk.bold.red; -console.log(error('Error!')); -``` - -Take advantage of console.log [string substitution](http://nodejs.org/docs/latest/api/console.html#console_console_log_data). - -```js -var name = 'Sindre'; -console.log(chalk.green('Hello %s'), name); -//=> Hello Sindre -``` - - -## API - -### chalk.` - - - - - - diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/node-uuid/test/test.js b/node_modules/node-base64-image/node_modules/request/node_modules/node-uuid/test/test.js deleted file mode 100644 index 5f1113d..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/node-uuid/test/test.js +++ /dev/null @@ -1,231 +0,0 @@ -if (!this.uuid) { - // node.js - uuid = require('../uuid'); - if (!/_rb/.test(uuid._rng.toString())) { - throw new Error("should use crypto for node.js"); - } -} - -// -// x-platform log/assert shims -// - -function _log(msg, type) { - type = type || 'log'; - - if (typeof(document) != 'undefined') { - document.write('
' + msg.replace(/\n/g, '
') + '
'); - } - if (typeof(console) != 'undefined') { - var color = { - log: '\033[39m', - warn: '\033[33m', - error: '\033[31m' - }; - console[type](color[type] + msg + color.log); - } -} - -function log(msg) {_log(msg, 'log');} -function warn(msg) {_log(msg, 'warn');} -function error(msg) {_log(msg, 'error');} - -function assert(res, msg) { - if (!res) { - error('FAIL: ' + msg); - } else { - log('Pass: ' + msg); - } -} - -// -// Unit tests -// - -// Verify ordering of v1 ids created with explicit times -var TIME = 1321644961388; // 2011-11-18 11:36:01.388-08:00 - -function compare(name, ids) { - ids = ids.map(function(id) { - return id.split('-').reverse().join('-'); - }).sort(); - var sorted = ([].concat(ids)).sort(); - - assert(sorted.toString() == ids.toString(), name + ' have expected order'); -} - -// Verify ordering of v1 ids created using default behavior -compare('uuids with current time', [ - uuid.v1(), - uuid.v1(), - uuid.v1(), - uuid.v1(), - uuid.v1() -]); - -// Verify ordering of v1 ids created with explicit times -compare('uuids with time option', [ - uuid.v1({msecs: TIME - 10*3600*1000}), - uuid.v1({msecs: TIME - 1}), - uuid.v1({msecs: TIME}), - uuid.v1({msecs: TIME + 1}), - uuid.v1({msecs: TIME + 28*24*3600*1000}) -]); - -assert( - uuid.v1({msecs: TIME}) != uuid.v1({msecs: TIME}), - 'IDs created at same msec are different' -); - -// Verify throw if too many ids created -var thrown = false; -try { - uuid.v1({msecs: TIME, nsecs: 10000}); -} catch (e) { - thrown = true; -} -assert(thrown, 'Exception thrown when > 10K ids created in 1 ms'); - -// Verify clock regression bumps clockseq -var uidt = uuid.v1({msecs: TIME}); -var uidtb = uuid.v1({msecs: TIME - 1}); -assert( - parseInt(uidtb.split('-')[3], 16) - parseInt(uidt.split('-')[3], 16) === 1, - 'Clock regression by msec increments the clockseq' -); - -// Verify clock regression bumps clockseq -var uidtn = uuid.v1({msecs: TIME, nsecs: 10}); -var uidtnb = uuid.v1({msecs: TIME, nsecs: 9}); -assert( - parseInt(uidtnb.split('-')[3], 16) - parseInt(uidtn.split('-')[3], 16) === 1, - 'Clock regression by nsec increments the clockseq' -); - -// Verify explicit options produce expected id -var id = uuid.v1({ - msecs: 1321651533573, - nsecs: 5432, - clockseq: 0x385c, - node: [ 0x61, 0xcd, 0x3c, 0xbb, 0x32, 0x10 ] -}); -assert(id == 'd9428888-122b-11e1-b85c-61cd3cbb3210', 'Explicit options produce expected id'); - -// Verify adjacent ids across a msec boundary are 1 time unit apart -var u0 = uuid.v1({msecs: TIME, nsecs: 9999}); -var u1 = uuid.v1({msecs: TIME + 1, nsecs: 0}); - -var before = u0.split('-')[0], after = u1.split('-')[0]; -var dt = parseInt(after, 16) - parseInt(before, 16); -assert(dt === 1, 'Ids spanning 1ms boundary are 100ns apart'); - -// -// Test parse/unparse -// - -id = '00112233445566778899aabbccddeeff'; -assert(uuid.unparse(uuid.parse(id.substr(0,10))) == - '00112233-4400-0000-0000-000000000000', 'Short parse'); -assert(uuid.unparse(uuid.parse('(this is the uuid -> ' + id + id)) == - '00112233-4455-6677-8899-aabbccddeeff', 'Dirty parse'); - -// -// Perf tests -// - -var generators = { - v1: uuid.v1, - v4: uuid.v4 -}; - -var UUID_FORMAT = { - v1: /[0-9a-f]{8}-[0-9a-f]{4}-1[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i, - v4: /[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i -}; - -var N = 1e4; - -// Get %'age an actual value differs from the ideal value -function divergence(actual, ideal) { - return Math.round(100*100*(actual - ideal)/ideal)/100; -} - -function rate(msg, t) { - log(msg + ': ' + (N / (Date.now() - t) * 1e3 | 0) + ' uuids\/second'); -} - -for (var version in generators) { - var counts = {}, max = 0; - var generator = generators[version]; - var format = UUID_FORMAT[version]; - - log('\nSanity check ' + N + ' ' + version + ' uuids'); - for (var i = 0, ok = 0; i < N; i++) { - id = generator(); - if (!format.test(id)) { - throw Error(id + ' is not a valid UUID string'); - } - - if (id != uuid.unparse(uuid.parse(id))) { - assert(fail, id + ' is not a valid id'); - } - - // Count digits for our randomness check - if (version == 'v4') { - var digits = id.replace(/-/g, '').split(''); - for (var j = digits.length-1; j >= 0; j--) { - var c = digits[j]; - max = Math.max(max, counts[c] = (counts[c] || 0) + 1); - } - } - } - - // Check randomness for v4 UUIDs - if (version == 'v4') { - // Limit that we get worried about randomness. (Purely empirical choice, this!) - var limit = 2*100*Math.sqrt(1/N); - - log('\nChecking v4 randomness. Distribution of Hex Digits (% deviation from ideal)'); - - for (var i = 0; i < 16; i++) { - var c = i.toString(16); - var bar = '', n = counts[c], p = Math.round(n/max*100|0); - - // 1-3,5-8, and D-F: 1:16 odds over 30 digits - var ideal = N*30/16; - if (i == 4) { - // 4: 1:1 odds on 1 digit, plus 1:16 odds on 30 digits - ideal = N*(1 + 30/16); - } else if (i >= 8 && i <= 11) { - // 8-B: 1:4 odds on 1 digit, plus 1:16 odds on 30 digits - ideal = N*(1/4 + 30/16); - } else { - // Otherwise: 1:16 odds on 30 digits - ideal = N*30/16; - } - var d = divergence(n, ideal); - - // Draw bar using UTF squares (just for grins) - var s = n/max*50 | 0; - while (s--) bar += '='; - - assert(Math.abs(d) < limit, c + ' |' + bar + '| ' + counts[c] + ' (' + d + '% < ' + limit + '%)'); - } - } -} - -// Perf tests -for (var version in generators) { - log('\nPerformance testing ' + version + ' UUIDs'); - var generator = generators[version]; - var buf = new uuid.BufferClass(16); - - for (var i = 0, t = Date.now(); i < N; i++) generator(); - rate('uuid.' + version + '()', t); - - for (var i = 0, t = Date.now(); i < N; i++) generator('binary'); - rate('uuid.' + version + '(\'binary\')', t); - - for (var i = 0, t = Date.now(); i < N; i++) generator('binary', buf); - rate('uuid.' + version + '(\'binary\', buffer)', t); -} diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/node-uuid/uuid.js b/node_modules/node-base64-image/node_modules/request/node_modules/node-uuid/uuid.js deleted file mode 100644 index 89c5b8f..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/node-uuid/uuid.js +++ /dev/null @@ -1,272 +0,0 @@ -// uuid.js -// -// Copyright (c) 2010-2012 Robert Kieffer -// MIT License - http://opensource.org/licenses/mit-license.php - -/*global window, require, define */ -(function(_window) { - 'use strict'; - - // Unique ID creation requires a high quality random # generator. We feature - // detect to determine the best RNG source, normalizing to a function that - // returns 128-bits of randomness, since that's what's usually required - var _rng, _mathRNG, _nodeRNG, _whatwgRNG, _previousRoot; - - function setupBrowser() { - // Allow for MSIE11 msCrypto - var _crypto = _window.crypto || _window.msCrypto; - - if (!_rng && _crypto && _crypto.getRandomValues) { - // WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto - // - // Moderately fast, high quality - try { - var _rnds8 = new Uint8Array(16); - _whatwgRNG = _rng = function whatwgRNG() { - _crypto.getRandomValues(_rnds8); - return _rnds8; - }; - _rng(); - } catch(e) {} - } - - if (!_rng) { - // Math.random()-based (RNG) - // - // If all else fails, use Math.random(). It's fast, but is of unspecified - // quality. - var _rnds = new Array(16); - _mathRNG = _rng = function() { - for (var i = 0, r; i < 16; i++) { - if ((i & 0x03) === 0) { r = Math.random() * 0x100000000; } - _rnds[i] = r >>> ((i & 0x03) << 3) & 0xff; - } - - return _rnds; - }; - if ('undefined' !== typeof console && console.warn) { - console.warn("[SECURITY] node-uuid: crypto not usable, falling back to insecure Math.random()"); - } - } - } - - function setupNode() { - // Node.js crypto-based RNG - http://nodejs.org/docs/v0.6.2/api/crypto.html - // - // Moderately fast, high quality - if ('function' === typeof require) { - try { - var _rb = require('crypto').randomBytes; - _nodeRNG = _rng = _rb && function() {return _rb(16);}; - _rng(); - } catch(e) {} - } - } - - if (_window) { - setupBrowser(); - } else { - setupNode(); - } - - // Buffer class to use - var BufferClass = ('function' === typeof Buffer) ? Buffer : Array; - - // Maps for number <-> hex string conversion - var _byteToHex = []; - var _hexToByte = {}; - for (var i = 0; i < 256; i++) { - _byteToHex[i] = (i + 0x100).toString(16).substr(1); - _hexToByte[_byteToHex[i]] = i; - } - - // **`parse()` - Parse a UUID into it's component bytes** - function parse(s, buf, offset) { - var i = (buf && offset) || 0, ii = 0; - - buf = buf || []; - s.toLowerCase().replace(/[0-9a-f]{2}/g, function(oct) { - if (ii < 16) { // Don't overflow! - buf[i + ii++] = _hexToByte[oct]; - } - }); - - // Zero out remaining bytes if string was short - while (ii < 16) { - buf[i + ii++] = 0; - } - - return buf; - } - - // **`unparse()` - Convert UUID byte array (ala parse()) into a string** - function unparse(buf, offset) { - var i = offset || 0, bth = _byteToHex; - return bth[buf[i++]] + bth[buf[i++]] + - bth[buf[i++]] + bth[buf[i++]] + '-' + - bth[buf[i++]] + bth[buf[i++]] + '-' + - bth[buf[i++]] + bth[buf[i++]] + '-' + - bth[buf[i++]] + bth[buf[i++]] + '-' + - bth[buf[i++]] + bth[buf[i++]] + - bth[buf[i++]] + bth[buf[i++]] + - bth[buf[i++]] + bth[buf[i++]]; - } - - // **`v1()` - Generate time-based UUID** - // - // Inspired by https://github.com/LiosK/UUID.js - // and http://docs.python.org/library/uuid.html - - // random #'s we need to init node and clockseq - var _seedBytes = _rng(); - - // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) - var _nodeId = [ - _seedBytes[0] | 0x01, - _seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5] - ]; - - // Per 4.2.2, randomize (14 bit) clockseq - var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 0x3fff; - - // Previous uuid creation time - var _lastMSecs = 0, _lastNSecs = 0; - - // See https://github.com/broofa/node-uuid for API details - function v1(options, buf, offset) { - var i = buf && offset || 0; - var b = buf || []; - - options = options || {}; - - var clockseq = (options.clockseq != null) ? options.clockseq : _clockseq; - - // UUID timestamps are 100 nano-second units since the Gregorian epoch, - // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so - // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' - // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. - var msecs = (options.msecs != null) ? options.msecs : new Date().getTime(); - - // Per 4.2.1.2, use count of uuid's generated during the current clock - // cycle to simulate higher resolution clock - var nsecs = (options.nsecs != null) ? options.nsecs : _lastNSecs + 1; - - // Time since last uuid creation (in msecs) - var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000; - - // Per 4.2.1.2, Bump clockseq on clock regression - if (dt < 0 && options.clockseq == null) { - clockseq = clockseq + 1 & 0x3fff; - } - - // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new - // time interval - if ((dt < 0 || msecs > _lastMSecs) && options.nsecs == null) { - nsecs = 0; - } - - // Per 4.2.1.2 Throw error if too many uuids are requested - if (nsecs >= 10000) { - throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec'); - } - - _lastMSecs = msecs; - _lastNSecs = nsecs; - _clockseq = clockseq; - - // Per 4.1.4 - Convert from unix epoch to Gregorian epoch - msecs += 12219292800000; - - // `time_low` - var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; - b[i++] = tl >>> 24 & 0xff; - b[i++] = tl >>> 16 & 0xff; - b[i++] = tl >>> 8 & 0xff; - b[i++] = tl & 0xff; - - // `time_mid` - var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff; - b[i++] = tmh >>> 8 & 0xff; - b[i++] = tmh & 0xff; - - // `time_high_and_version` - b[i++] = tmh >>> 24 & 0xf | 0x10; // include version - b[i++] = tmh >>> 16 & 0xff; - - // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) - b[i++] = clockseq >>> 8 | 0x80; - - // `clock_seq_low` - b[i++] = clockseq & 0xff; - - // `node` - var node = options.node || _nodeId; - for (var n = 0; n < 6; n++) { - b[i + n] = node[n]; - } - - return buf ? buf : unparse(b); - } - - // **`v4()` - Generate random UUID** - - // See https://github.com/broofa/node-uuid for API details - function v4(options, buf, offset) { - // Deprecated - 'format' argument, as supported in v1.2 - var i = buf && offset || 0; - - if (typeof(options) === 'string') { - buf = (options === 'binary') ? new BufferClass(16) : null; - options = null; - } - options = options || {}; - - var rnds = options.random || (options.rng || _rng)(); - - // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` - rnds[6] = (rnds[6] & 0x0f) | 0x40; - rnds[8] = (rnds[8] & 0x3f) | 0x80; - - // Copy bytes to buffer, if provided - if (buf) { - for (var ii = 0; ii < 16; ii++) { - buf[i + ii] = rnds[ii]; - } - } - - return buf || unparse(rnds); - } - - // Export public API - var uuid = v4; - uuid.v1 = v1; - uuid.v4 = v4; - uuid.parse = parse; - uuid.unparse = unparse; - uuid.BufferClass = BufferClass; - uuid._rng = _rng; - uuid._mathRNG = _mathRNG; - uuid._nodeRNG = _nodeRNG; - uuid._whatwgRNG = _whatwgRNG; - - if (('undefined' !== typeof module) && module.exports) { - // Publish as node.js module - module.exports = uuid; - } else if (typeof define === 'function' && define.amd) { - // Publish as AMD module - define(function() {return uuid;}); - - - } else { - // Publish as global (in browsers) - _previousRoot = _window.uuid; - - // **`noConflict()` - (browser only) to reset global 'uuid' var** - uuid.noConflict = function() { - _window.uuid = _previousRoot; - return uuid; - }; - - _window.uuid = uuid; - } -})('undefined' !== typeof window ? window : null); diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/oauth-sign/LICENSE b/node_modules/node-base64-image/node_modules/request/node_modules/oauth-sign/LICENSE deleted file mode 100644 index a4a9aee..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/oauth-sign/LICENSE +++ /dev/null @@ -1,55 +0,0 @@ -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - -If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/oauth-sign/README.md b/node_modules/node-base64-image/node_modules/request/node_modules/oauth-sign/README.md deleted file mode 100644 index 34c4a85..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/oauth-sign/README.md +++ /dev/null @@ -1,4 +0,0 @@ -oauth-sign -========== - -OAuth 1 signing. Formerly a vendor lib in mikeal/request, now a standalone module. diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/oauth-sign/index.js b/node_modules/node-base64-image/node_modules/request/node_modules/oauth-sign/index.js deleted file mode 100644 index dadcba9..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/oauth-sign/index.js +++ /dev/null @@ -1,136 +0,0 @@ -var crypto = require('crypto') - , qs = require('querystring') - ; - -function sha1 (key, body) { - return crypto.createHmac('sha1', key).update(body).digest('base64') -} - -function rsa (key, body) { - return crypto.createSign("RSA-SHA1").update(body).sign(key, 'base64'); -} - -function rfc3986 (str) { - return encodeURIComponent(str) - .replace(/!/g,'%21') - .replace(/\*/g,'%2A') - .replace(/\(/g,'%28') - .replace(/\)/g,'%29') - .replace(/'/g,'%27') - ; -} - -// Maps object to bi-dimensional array -// Converts { foo: 'A', bar: [ 'b', 'B' ]} to -// [ ['foo', 'A'], ['bar', 'b'], ['bar', 'B'] ] -function map (obj) { - var key, val, arr = [] - for (key in obj) { - val = obj[key] - if (Array.isArray(val)) - for (var i = 0; i < val.length; i++) - arr.push([key, val[i]]) - else if (typeof val === "object") - for (var prop in val) - arr.push([key + '[' + prop + ']', val[prop]]); - else - arr.push([key, val]) - } - return arr -} - -// Compare function for sort -function compare (a, b) { - return a > b ? 1 : a < b ? -1 : 0 -} - -function generateBase (httpMethod, base_uri, params) { - // adapted from https://dev.twitter.com/docs/auth/oauth and - // https://dev.twitter.com/docs/auth/creating-signature - - // Parameter normalization - // http://tools.ietf.org/html/rfc5849#section-3.4.1.3.2 - var normalized = map(params) - // 1. First, the name and value of each parameter are encoded - .map(function (p) { - return [ rfc3986(p[0]), rfc3986(p[1] || '') ] - }) - // 2. The parameters are sorted by name, using ascending byte value - // ordering. If two or more parameters share the same name, they - // are sorted by their value. - .sort(function (a, b) { - return compare(a[0], b[0]) || compare(a[1], b[1]) - }) - // 3. The name of each parameter is concatenated to its corresponding - // value using an "=" character (ASCII code 61) as a separator, even - // if the value is empty. - .map(function (p) { return p.join('=') }) - // 4. The sorted name/value pairs are concatenated together into a - // single string by using an "&" character (ASCII code 38) as - // separator. - .join('&') - - var base = [ - rfc3986(httpMethod ? httpMethod.toUpperCase() : 'GET'), - rfc3986(base_uri), - rfc3986(normalized) - ].join('&') - - return base -} - -function hmacsign (httpMethod, base_uri, params, consumer_secret, token_secret) { - var base = generateBase(httpMethod, base_uri, params) - var key = [ - consumer_secret || '', - token_secret || '' - ].map(rfc3986).join('&') - - return sha1(key, base) -} - -function rsasign (httpMethod, base_uri, params, private_key, token_secret) { - var base = generateBase(httpMethod, base_uri, params) - var key = private_key || '' - - return rsa(key, base) -} - -function plaintext (consumer_secret, token_secret) { - var key = [ - consumer_secret || '', - token_secret || '' - ].map(rfc3986).join('&') - - return key -} - -function sign (signMethod, httpMethod, base_uri, params, consumer_secret, token_secret) { - var method - var skipArgs = 1 - - switch (signMethod) { - case 'RSA-SHA1': - method = rsasign - break - case 'HMAC-SHA1': - method = hmacsign - break - case 'PLAINTEXT': - method = plaintext - skipArgs = 4 - break - default: - throw new Error("Signature method not supported: " + signMethod) - } - - return method.apply(null, [].slice.call(arguments, skipArgs)) -} - -exports.hmacsign = hmacsign -exports.rsasign = rsasign -exports.plaintext = plaintext -exports.sign = sign -exports.rfc3986 = rfc3986 -exports.generateBase = generateBase - diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/oauth-sign/package.json b/node_modules/node-base64-image/node_modules/request/node_modules/oauth-sign/package.json deleted file mode 100644 index cf1eeb7..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/oauth-sign/package.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "author": { - "name": "Mikeal Rogers", - "email": "mikeal.rogers@gmail.com", - "url": "http://www.futurealoof.com" - }, - "name": "oauth-sign", - "description": "OAuth 1 signing. Formerly a vendor lib in mikeal/request, now a standalone module.", - "version": "0.8.2", - "license": "Apache-2.0", - "repository": { - "url": "git+https://github.com/mikeal/oauth-sign.git" - }, - "main": "index.js", - "files": [ - "index.js" - ], - "dependencies": {}, - "devDependencies": {}, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "scripts": { - "test": "node test.js" - }, - "gitHead": "0b034206316132f57e26970152c2fb18e71bddd5", - "bugs": { - "url": "https://github.com/mikeal/oauth-sign/issues" - }, - "homepage": "https://github.com/mikeal/oauth-sign#readme", - "_id": "oauth-sign@0.8.2", - "_shasum": "46a6ab7f0aead8deae9ec0565780b7d4efeb9d43", - "_from": "oauth-sign@>=0.8.1 <0.9.0", - "_npmVersion": "2.15.3", - "_nodeVersion": "5.9.0", - "_npmUser": { - "name": "simov", - "email": "simeonvelichkov@gmail.com" - }, - "dist": { - "shasum": "46a6ab7f0aead8deae9ec0565780b7d4efeb9d43", - "tarball": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz" - }, - "maintainers": [ - { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - { - "name": "nylen", - "email": "jnylen@gmail.com" - }, - { - "name": "simov", - "email": "simeonvelichkov@gmail.com" - } - ], - "_npmOperationalInternal": { - "host": "packages-12-west.internal.npmjs.com", - "tmp": "tmp/oauth-sign-0.8.2.tgz_1462396399020_0.8175400267355144" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/qs/.eslintignore b/node_modules/node-base64-image/node_modules/request/node_modules/qs/.eslintignore deleted file mode 100644 index 1521c8b..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/qs/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -dist diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/qs/.eslintrc b/node_modules/node-base64-image/node_modules/request/node_modules/qs/.eslintrc deleted file mode 100644 index e5c4f80..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/qs/.eslintrc +++ /dev/null @@ -1,19 +0,0 @@ -{ - "root": true, - - "extends": "@ljharb", - - "rules": { - "complexity": [2, 25], - "consistent-return": [1], - "id-length": [2, { "min": 1, "max": 25, "properties": "never" }], - "indent": [2, 4], - "max-params": [2, 11], - "max-statements": [2, 42], - "no-extra-parens": [1], - "no-continue": [1], - "no-magic-numbers": 0, - "no-restricted-syntax": [2, "BreakStatement", "DebuggerStatement", "ForInStatement", "LabeledStatement", "WithStatement"], - "operator-linebreak": 1 - } -} diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/qs/CHANGELOG.md b/node_modules/node-base64-image/node_modules/request/node_modules/qs/CHANGELOG.md deleted file mode 100644 index 351edd4..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/qs/CHANGELOG.md +++ /dev/null @@ -1,144 +0,0 @@ -## **6.3.0** -- [New] Add support for RFC 1738 (#174, #173) -- [New] `stringify`: Add `serializeDate` option to customize Date serialization (#159) -- [Fix] ensure `utils.merge` handles merging two arrays -- [Refactor] only constructors should be capitalized -- [Refactor] capitalized var names are for constructors only -- [Refactor] avoid using a sparse array -- [Robustness] `formats`: cache `String#replace` -- [Dev Deps] update `browserify`, `eslint`, `@ljharb/eslint-config`; add `safe-publish-latest` -- [Tests] up to `node` `v6.8`, `v4.6`; improve test matrix -- [Tests] flesh out arrayLimit/arrayFormat tests (#107) -- [Tests] skip Object.create tests when null objects are not available -- [Tests] Turn on eslint for test files (#175) - -## **6.2.1** -- [Fix] ensure `key[]=x&key[]&key[]=y` results in 3, not 2, values -- [Refactor] Be explicit and use `Object.prototype.hasOwnProperty.call` -- [Tests] remove `parallelshell` since it does not reliably report failures -- [Tests] up to `node` `v6.3`, `v5.12` -- [Dev Deps] update `tape`, `eslint`, `@ljharb/eslint-config`, `qs-iconv` - -## [**6.2.0**](https://github.com/ljharb/qs/issues?milestone=36&state=closed) -- [New] pass Buffers to the encoder/decoder directly (#161) -- [New] add "encoder" and "decoder" options, for custom param encoding/decoding (#160) -- [Fix] fix compacting of nested sparse arrays (#150) - -## [**6.1.0**](https://github.com/ljharb/qs/issues?milestone=35&state=closed) -- [New] allowDots option for `stringify` (#151) -- [Fix] "sort" option should work at a depth of 3 or more (#151) -- [Fix] Restore `dist` directory; will be removed in v7 (#148) - -## [**6.0.2**](https://github.com/ljharb/qs/issues?milestone=33&state=closed) -- Revert ES6 requirement and restore support for node down to v0.8. - -## [**6.0.1**](https://github.com/ljharb/qs/issues?milestone=32&state=closed) -- [**#127**](https://github.com/ljharb/qs/pull/127) Fix engines definition in package.json - -## [**6.0.0**](https://github.com/ljharb/qs/issues?milestone=31&state=closed) -- [**#124**](https://github.com/ljharb/qs/issues/124) Use ES6 and drop support for node < v4 - -## **5.2.1** -- [Fix] ensure `key[]=x&key[]&key[]=y` results in 3, not 2, values - -## [**5.2.0**](https://github.com/ljharb/qs/issues?milestone=30&state=closed) -- [**#64**](https://github.com/ljharb/qs/issues/64) Add option to sort object keys in the query string - -## [**5.1.0**](https://github.com/ljharb/qs/issues?milestone=29&state=closed) -- [**#117**](https://github.com/ljharb/qs/issues/117) make URI encoding stringified results optional -- [**#106**](https://github.com/ljharb/qs/issues/106) Add flag `skipNulls` to optionally skip null values in stringify - -## [**5.0.0**](https://github.com/ljharb/qs/issues?milestone=28&state=closed) -- [**#114**](https://github.com/ljharb/qs/issues/114) default allowDots to false -- [**#100**](https://github.com/ljharb/qs/issues/100) include dist to npm - -## [**4.0.0**](https://github.com/ljharb/qs/issues?milestone=26&state=closed) -- [**#98**](https://github.com/ljharb/qs/issues/98) make returning plain objects and allowing prototype overwriting properties optional - -## [**3.1.0**](https://github.com/ljharb/qs/issues?milestone=24&state=closed) -- [**#89**](https://github.com/ljharb/qs/issues/89) Add option to disable "Transform dot notation to bracket notation" - -## [**3.0.0**](https://github.com/ljharb/qs/issues?milestone=23&state=closed) -- [**#80**](https://github.com/ljharb/qs/issues/80) qs.parse silently drops properties -- [**#77**](https://github.com/ljharb/qs/issues/77) Perf boost -- [**#60**](https://github.com/ljharb/qs/issues/60) Add explicit option to disable array parsing -- [**#74**](https://github.com/ljharb/qs/issues/74) Bad parse when turning array into object -- [**#81**](https://github.com/ljharb/qs/issues/81) Add a `filter` option -- [**#68**](https://github.com/ljharb/qs/issues/68) Fixed issue with recursion and passing strings into objects. -- [**#66**](https://github.com/ljharb/qs/issues/66) Add mixed array and object dot notation support Closes: #47 -- [**#76**](https://github.com/ljharb/qs/issues/76) RFC 3986 -- [**#85**](https://github.com/ljharb/qs/issues/85) No equal sign -- [**#84**](https://github.com/ljharb/qs/issues/84) update license attribute - -## [**2.4.1**](https://github.com/ljharb/qs/issues?milestone=20&state=closed) -- [**#73**](https://github.com/ljharb/qs/issues/73) Property 'hasOwnProperty' of object # is not a function - -## [**2.4.0**](https://github.com/ljharb/qs/issues?milestone=19&state=closed) -- [**#70**](https://github.com/ljharb/qs/issues/70) Add arrayFormat option - -## [**2.3.3**](https://github.com/ljharb/qs/issues?milestone=18&state=closed) -- [**#59**](https://github.com/ljharb/qs/issues/59) make sure array indexes are >= 0, closes #57 -- [**#58**](https://github.com/ljharb/qs/issues/58) make qs usable for browser loader - -## [**2.3.2**](https://github.com/ljharb/qs/issues?milestone=17&state=closed) -- [**#55**](https://github.com/ljharb/qs/issues/55) allow merging a string into an object - -## [**2.3.1**](https://github.com/ljharb/qs/issues?milestone=16&state=closed) -- [**#52**](https://github.com/ljharb/qs/issues/52) Return "undefined" and "false" instead of throwing "TypeError". - -## [**2.3.0**](https://github.com/ljharb/qs/issues?milestone=15&state=closed) -- [**#50**](https://github.com/ljharb/qs/issues/50) add option to omit array indices, closes #46 - -## [**2.2.5**](https://github.com/ljharb/qs/issues?milestone=14&state=closed) -- [**#39**](https://github.com/ljharb/qs/issues/39) Is there an alternative to Buffer.isBuffer? -- [**#49**](https://github.com/ljharb/qs/issues/49) refactor utils.merge, fixes #45 -- [**#41**](https://github.com/ljharb/qs/issues/41) avoid browserifying Buffer, for #39 - -## [**2.2.4**](https://github.com/ljharb/qs/issues?milestone=13&state=closed) -- [**#38**](https://github.com/ljharb/qs/issues/38) how to handle object keys beginning with a number - -## [**2.2.3**](https://github.com/ljharb/qs/issues?milestone=12&state=closed) -- [**#37**](https://github.com/ljharb/qs/issues/37) parser discards first empty value in array -- [**#36**](https://github.com/ljharb/qs/issues/36) Update to lab 4.x - -## [**2.2.2**](https://github.com/ljharb/qs/issues?milestone=11&state=closed) -- [**#33**](https://github.com/ljharb/qs/issues/33) Error when plain object in a value -- [**#34**](https://github.com/ljharb/qs/issues/34) use Object.prototype.hasOwnProperty.call instead of obj.hasOwnProperty -- [**#24**](https://github.com/ljharb/qs/issues/24) Changelog? Semver? - -## [**2.2.1**](https://github.com/ljharb/qs/issues?milestone=10&state=closed) -- [**#32**](https://github.com/ljharb/qs/issues/32) account for circular references properly, closes #31 -- [**#31**](https://github.com/ljharb/qs/issues/31) qs.parse stackoverflow on circular objects - -## [**2.2.0**](https://github.com/ljharb/qs/issues?milestone=9&state=closed) -- [**#26**](https://github.com/ljharb/qs/issues/26) Don't use Buffer global if it's not present -- [**#30**](https://github.com/ljharb/qs/issues/30) Bug when merging non-object values into arrays -- [**#29**](https://github.com/ljharb/qs/issues/29) Don't call Utils.clone at the top of Utils.merge -- [**#23**](https://github.com/ljharb/qs/issues/23) Ability to not limit parameters? - -## [**2.1.0**](https://github.com/ljharb/qs/issues?milestone=8&state=closed) -- [**#22**](https://github.com/ljharb/qs/issues/22) Enable using a RegExp as delimiter - -## [**2.0.0**](https://github.com/ljharb/qs/issues?milestone=7&state=closed) -- [**#18**](https://github.com/ljharb/qs/issues/18) Why is there arrayLimit? -- [**#20**](https://github.com/ljharb/qs/issues/20) Configurable parametersLimit -- [**#21**](https://github.com/ljharb/qs/issues/21) make all limits optional, for #18, for #20 - -## [**1.2.2**](https://github.com/ljharb/qs/issues?milestone=6&state=closed) -- [**#19**](https://github.com/ljharb/qs/issues/19) Don't overwrite null values - -## [**1.2.1**](https://github.com/ljharb/qs/issues?milestone=5&state=closed) -- [**#16**](https://github.com/ljharb/qs/issues/16) ignore non-string delimiters -- [**#15**](https://github.com/ljharb/qs/issues/15) Close code block - -## [**1.2.0**](https://github.com/ljharb/qs/issues?milestone=4&state=closed) -- [**#12**](https://github.com/ljharb/qs/issues/12) Add optional delim argument -- [**#13**](https://github.com/ljharb/qs/issues/13) fix #11: flattened keys in array are now correctly parsed - -## [**1.1.0**](https://github.com/ljharb/qs/issues?milestone=3&state=closed) -- [**#7**](https://github.com/ljharb/qs/issues/7) Empty values of a POST array disappear after being submitted -- [**#9**](https://github.com/ljharb/qs/issues/9) Should not omit equals signs (=) when value is null -- [**#6**](https://github.com/ljharb/qs/issues/6) Minor grammar fix in README - -## [**1.0.2**](https://github.com/ljharb/qs/issues?milestone=2&state=closed) -- [**#5**](https://github.com/ljharb/qs/issues/5) array holes incorrectly copied into object on large index diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/qs/CONTRIBUTING.md b/node_modules/node-base64-image/node_modules/request/node_modules/qs/CONTRIBUTING.md deleted file mode 100644 index 8928361..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/qs/CONTRIBUTING.md +++ /dev/null @@ -1 +0,0 @@ -Please view our [hapijs contributing guide](https://github.com/hapijs/hapi/blob/master/CONTRIBUTING.md). diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/qs/LICENSE b/node_modules/node-base64-image/node_modules/request/node_modules/qs/LICENSE deleted file mode 100644 index d456948..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/qs/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2014 Nathan LaFreniere and other contributors. -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. - * The names of any contributors may not 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 HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - * * * - -The complete list of contributors can be found at: https://github.com/hapijs/qs/graphs/contributors diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/qs/README.md b/node_modules/node-base64-image/node_modules/request/node_modules/qs/README.md deleted file mode 100644 index ac1e7f1..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/qs/README.md +++ /dev/null @@ -1,398 +0,0 @@ -# qs - -A querystring parsing and stringifying library with some added security. - -[![Build Status](https://api.travis-ci.org/ljharb/qs.svg)](http://travis-ci.org/ljharb/qs) - -Lead Maintainer: [Jordan Harband](https://github.com/ljharb) - -The **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring). - -## Usage - -```javascript -var qs = require('qs'); -var assert = require('assert'); - -var obj = qs.parse('a=c'); -assert.deepEqual(obj, { a: 'c' }); - -var str = qs.stringify(obj); -assert.equal(str, 'a=c'); -``` - -### Parsing Objects - -[](#preventEval) -```javascript -qs.parse(string, [options]); -``` - -**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`. -For example, the string `'foo[bar]=baz'` converts to: - -```javascript -assert.deepEqual(qs.parse('foo[bar]=baz'), { - foo: { - bar: 'baz' - } -}); -``` - -When using the `plainObjects` option the parsed value is returned as a null object, created via `Object.create(null)` and as such you should be aware that prototype methods will not exist on it and a user may set those names to whatever value they like: - -```javascript -var nullObject = qs.parse('a[hasOwnProperty]=b', { plainObjects: true }); -assert.deepEqual(nullObject, { a: { hasOwnProperty: 'b' } }); -``` - -By default parameters that would overwrite properties on the object prototype are ignored, if you wish to keep the data from those fields either use `plainObjects` as mentioned above, or set `allowPrototypes` to `true` which will allow user input to overwrite those properties. *WARNING* It is generally a bad idea to enable this option as it can cause problems when attempting to use the properties that have been overwritten. Always be careful with this option. - -```javascript -var protoObject = qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true }); -assert.deepEqual(protoObject, { a: { hasOwnProperty: 'b' } }); -``` - -URI encoded strings work too: - -```javascript -assert.deepEqual(qs.parse('a%5Bb%5D=c'), { - a: { b: 'c' } -}); -``` - -You can also nest your objects, like `'foo[bar][baz]=foobarbaz'`: - -```javascript -assert.deepEqual(qs.parse('foo[bar][baz]=foobarbaz'), { - foo: { - bar: { - baz: 'foobarbaz' - } - } -}); -``` - -By default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like -`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be: - -```javascript -var expected = { - a: { - b: { - c: { - d: { - e: { - f: { - '[g][h][i]': 'j' - } - } - } - } - } - } -}; -var string = 'a[b][c][d][e][f][g][h][i]=j'; -assert.deepEqual(qs.parse(string), expected); -``` - -This depth can be overridden by passing a `depth` option to `qs.parse(string, [options])`: - -```javascript -var deep = qs.parse('a[b][c][d][e][f][g][h][i]=j', { depth: 1 }); -assert.deepEqual(deep, { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } }); -``` - -The depth limit helps mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number. - -For similar reasons, by default **qs** will only parse up to 1000 parameters. This can be overridden by passing a `parameterLimit` option: - -```javascript -var limited = qs.parse('a=b&c=d', { parameterLimit: 1 }); -assert.deepEqual(limited, { a: 'b' }); -``` - -An optional delimiter can also be passed: - -```javascript -var delimited = qs.parse('a=b;c=d', { delimiter: ';' }); -assert.deepEqual(delimited, { a: 'b', c: 'd' }); -``` - -Delimiters can be a regular expression too: - -```javascript -var regexed = qs.parse('a=b;c=d,e=f', { delimiter: /[;,]/ }); -assert.deepEqual(regexed, { a: 'b', c: 'd', e: 'f' }); -``` - -Option `allowDots` can be used to enable dot notation: - -```javascript -var withDots = qs.parse('a.b=c', { allowDots: true }); -assert.deepEqual(withDots, { a: { b: 'c' } }); -``` - -### Parsing Arrays - -**qs** can also parse arrays using a similar `[]` notation: - -```javascript -var withArray = qs.parse('a[]=b&a[]=c'); -assert.deepEqual(withArray, { a: ['b', 'c'] }); -``` - -You may specify an index as well: - -```javascript -var withIndexes = qs.parse('a[1]=c&a[0]=b'); -assert.deepEqual(withIndexes, { a: ['b', 'c'] }); -``` - -Note that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number -to create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving -their order: - -```javascript -var noSparse = qs.parse('a[1]=b&a[15]=c'); -assert.deepEqual(noSparse, { a: ['b', 'c'] }); -``` - -Note that an empty string is also a value, and will be preserved: - -```javascript -var withEmptyString = qs.parse('a[]=&a[]=b'); -assert.deepEqual(withEmptyString, { a: ['', 'b'] }); - -var withIndexedEmptyString = qs.parse('a[0]=b&a[1]=&a[2]=c'); -assert.deepEqual(withIndexedEmptyString, { a: ['b', '', 'c'] }); -``` - -**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will -instead be converted to an object with the index as the key: - -```javascript -var withMaxIndex = qs.parse('a[100]=b'); -assert.deepEqual(withMaxIndex, { a: { '100': 'b' } }); -``` - -This limit can be overridden by passing an `arrayLimit` option: - -```javascript -var withArrayLimit = qs.parse('a[1]=b', { arrayLimit: 0 }); -assert.deepEqual(withArrayLimit, { a: { '1': 'b' } }); -``` - -To disable array parsing entirely, set `parseArrays` to `false`. - -```javascript -var noParsingArrays = qs.parse('a[]=b', { parseArrays: false }); -assert.deepEqual(noParsingArrays, { a: { '0': 'b' } }); -``` - -If you mix notations, **qs** will merge the two items into an object: - -```javascript -var mixedNotation = qs.parse('a[0]=b&a[b]=c'); -assert.deepEqual(mixedNotation, { a: { '0': 'b', b: 'c' } }); -``` - -You can also create arrays of objects: - -```javascript -var arraysOfObjects = qs.parse('a[][b]=c'); -assert.deepEqual(arraysOfObjects, { a: [{ b: 'c' }] }); -``` - -### Stringifying - -[](#preventEval) -```javascript -qs.stringify(object, [options]); -``` - -When stringifying, **qs** by default URI encodes output. Objects are stringified as you would expect: - -```javascript -assert.equal(qs.stringify({ a: 'b' }), 'a=b'); -assert.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c'); -``` - -This encoding can be disabled by setting the `encode` option to `false`: - -```javascript -var unencoded = qs.stringify({ a: { b: 'c' } }, { encode: false }); -assert.equal(unencoded, 'a[b]=c'); -``` - -This encoding can also be replaced by a custom encoding method set as `encoder` option: - -```javascript -var encoded = qs.stringify({ a: { b: 'c' } }, { encoder: function (str) { - // Passed in values `a`, `b`, `c` - return // Return encoded string -}}) -``` - -_(Note: the `encoder` option does not apply if `encode` is `false`)_ - -Analogue to the `encoder` there is a `decoder` option for `parse` to override decoding of properties and values: - -```javascript -var decoded = qs.parse('x=z', { decoder: function (str) { - // Passed in values `x`, `z` - return // Return decoded string -}}) -``` - -Examples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage. - -When arrays are stringified, by default they are given explicit indices: - -```javascript -qs.stringify({ a: ['b', 'c', 'd'] }); -// 'a[0]=b&a[1]=c&a[2]=d' -``` - -You may override this by setting the `indices` option to `false`: - -```javascript -qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false }); -// 'a=b&a=c&a=d' -``` - -You may use the `arrayFormat` option to specify the format of the output array - -```javascript -qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' }) -// 'a[0]=b&a[1]=c' -qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' }) -// 'a[]=b&a[]=c' -qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' }) -// 'a=b&a=c' -``` - -Empty strings and null values will omit the value, but the equals sign (=) remains in place: - -```javascript -assert.equal(qs.stringify({ a: '' }), 'a='); -``` - -Properties that are set to `undefined` will be omitted entirely: - -```javascript -assert.equal(qs.stringify({ a: null, b: undefined }), 'a='); -``` - -The delimiter may be overridden with stringify as well: - -```javascript -assert.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d'); -``` - -If you only want to override the serialization of `Date` objects, you can provide a `serializeDate` option: - -```javascript -var date = new Date(7); -assert.equal(qs.stringify({ a: date }), 'a=1970-01-01T00:00:00.007Z'.replace(/:/g, '%3A')); -assert.equal( - qs.stringify({ a: date }, { serializeDate: function (d) { return d.getTime(); } }), - 'a=7' -); -``` - -Finally, you can use the `filter` option to restrict which keys will be included in the stringified output. -If you pass a function, it will be called for each key to obtain the replacement value. Otherwise, if you -pass an array, it will be used to select properties and array indices for stringification: - -```javascript -function filterFunc(prefix, value) { - if (prefix == 'b') { - // Return an `undefined` value to omit a property. - return; - } - if (prefix == 'e[f]') { - return value.getTime(); - } - if (prefix == 'e[g][0]') { - return value * 2; - } - return value; -} -qs.stringify({ a: 'b', c: 'd', e: { f: new Date(123), g: [2] } }, { filter: filterFunc }); -// 'a=b&c=d&e[f]=123&e[g][0]=4' -qs.stringify({ a: 'b', c: 'd', e: 'f' }, { filter: ['a', 'e'] }); -// 'a=b&e=f' -qs.stringify({ a: ['b', 'c', 'd'], e: 'f' }, { filter: ['a', 0, 2] }); -// 'a[0]=b&a[2]=d' -``` - -### Handling of `null` values - -By default, `null` values are treated like empty strings: - -```javascript -var withNull = qs.stringify({ a: null, b: '' }); -assert.equal(withNull, 'a=&b='); -``` - -Parsing does not distinguish between parameters with and without equal signs. Both are converted to empty strings. - -```javascript -var equalsInsensitive = qs.parse('a&b='); -assert.deepEqual(equalsInsensitive, { a: '', b: '' }); -``` - -To distinguish between `null` values and empty strings use the `strictNullHandling` flag. In the result string the `null` -values have no `=` sign: - -```javascript -var strictNull = qs.stringify({ a: null, b: '' }, { strictNullHandling: true }); -assert.equal(strictNull, 'a&b='); -``` - -To parse values without `=` back to `null` use the `strictNullHandling` flag: - -```javascript -var parsedStrictNull = qs.parse('a&b=', { strictNullHandling: true }); -assert.deepEqual(parsedStrictNull, { a: null, b: '' }); -``` - -To completely skip rendering keys with `null` values, use the `skipNulls` flag: - -```javascript -var nullsSkipped = qs.stringify({ a: 'b', c: null}, { skipNulls: true }); -assert.equal(nullsSkipped, 'a=b'); -``` - -### Dealing with special character sets - -By default the encoding and decoding of characters is done in `utf-8`. If you -wish to encode querystrings to a different character set (i.e. -[Shift JIS](https://en.wikipedia.org/wiki/Shift_JIS)) you can use the -[`qs-iconv`](https://github.com/martinheidegger/qs-iconv) library: - -```javascript -var encoder = require('qs-iconv/encoder')('shift_jis'); -var shiftJISEncoded = qs.stringify({ a: 'こんにちは!' }, { encoder: encoder }); -assert.equal(shiftJISEncoded, 'a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I'); -``` - -This also works for decoding of query strings: - -```javascript -var decoder = require('qs-iconv/decoder')('shift_jis'); -var obj = qs.parse('a=%82%B1%82%F1%82%C9%82%BF%82%CD%81I', { decoder: decoder }); -assert.deepEqual(obj, { a: 'こんにちは!' }); -``` - -### RFC 3986 and RFC 1738 space encoding - -RFC3986 used as default option and encodes ' ' to *%20* which is backward compatible. -In the same time, output can be stringified as per RFC1738 with ' ' equal to '+'. - -``` -assert.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); -assert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC3986' }), 'a=b%20c'); -assert.equal(qs.stringify({ a: 'b c' }, { format : 'RFC1738' }), 'a=b+c'); -``` diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/qs/dist/qs.js b/node_modules/node-base64-image/node_modules/request/node_modules/qs/dist/qs.js deleted file mode 100644 index 1a80d2d..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/qs/dist/qs.js +++ /dev/null @@ -1,574 +0,0 @@ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Qs = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 0 && - (options.parseArrays && index <= options.arrayLimit) - ) { - obj = []; - obj[index] = parseObject(chain, val, options); - } else { - obj[cleanRoot] = parseObject(chain, val, options); - } - } - - return obj; -}; - -var parseKeys = function parseKeys(givenKey, val, options) { - if (!givenKey) { - return; - } - - // Transform dot notation to bracket notation - var key = options.allowDots ? givenKey.replace(/\.([^\.\[]+)/g, '[$1]') : givenKey; - - // The regex chunks - - var parent = /^([^\[\]]*)/; - var child = /(\[[^\[\]]*\])/g; - - // Get the parent - - var segment = parent.exec(key); - - // Stash the parent if it exists - - var keys = []; - if (segment[1]) { - // If we aren't using plain objects, optionally prefix keys - // that would overwrite object prototype properties - if (!options.plainObjects && has.call(Object.prototype, segment[1])) { - if (!options.allowPrototypes) { - return; - } - } - - keys.push(segment[1]); - } - - // Loop through children appending to the array until we hit depth - - var i = 0; - while ((segment = child.exec(key)) !== null && i < options.depth) { - i += 1; - if (!options.plainObjects && has.call(Object.prototype, segment[1].replace(/\[|\]/g, ''))) { - if (!options.allowPrototypes) { - continue; - } - } - keys.push(segment[1]); - } - - // If there's a remainder, just add whatever is left - - if (segment) { - keys.push('[' + key.slice(segment.index) + ']'); - } - - return parseObject(keys, val, options); -}; - -module.exports = function (str, opts) { - var options = opts || {}; - - if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') { - throw new TypeError('Decoder has to be a function.'); - } - - options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter; - options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth; - options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit; - options.parseArrays = options.parseArrays !== false; - options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder; - options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots; - options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects; - options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes; - options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit; - options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling; - - if (str === '' || str === null || typeof str === 'undefined') { - return options.plainObjects ? Object.create(null) : {}; - } - - var tempObj = typeof str === 'string' ? parseValues(str, options) : str; - var obj = options.plainObjects ? Object.create(null) : {}; - - // Iterate over the keys and setup the new object - - var keys = Object.keys(tempObj); - for (var i = 0; i < keys.length; ++i) { - var key = keys[i]; - var newObj = parseKeys(key, tempObj[key], options); - obj = utils.merge(obj, newObj, options); - } - - return utils.compact(obj); -}; - -},{"./utils":5}],4:[function(require,module,exports){ -'use strict'; - -var utils = require('./utils'); -var formats = require('./formats'); - -var arrayPrefixGenerators = { - brackets: function brackets(prefix) { - return prefix + '[]'; - }, - indices: function indices(prefix, key) { - return prefix + '[' + key + ']'; - }, - repeat: function repeat(prefix) { - return prefix; - } -}; - -var toISO = Date.prototype.toISOString; - -var defaults = { - delimiter: '&', - encode: true, - encoder: utils.encode, - serializeDate: function serializeDate(date) { - return toISO.call(date); - }, - skipNulls: false, - strictNullHandling: false -}; - -var stringify = function stringify(object, prefix, generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots, serializeDate, formatter) { - var obj = object; - if (typeof filter === 'function') { - obj = filter(prefix, obj); - } else if (obj instanceof Date) { - obj = serializeDate(obj); - } else if (obj === null) { - if (strictNullHandling) { - return encoder ? encoder(prefix) : prefix; - } - - obj = ''; - } - - if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) { - if (encoder) { - return [formatter(encoder(prefix)) + '=' + formatter(encoder(obj))]; - } - return [formatter(prefix) + '=' + formatter(String(obj))]; - } - - var values = []; - - if (typeof obj === 'undefined') { - return values; - } - - var objKeys; - if (Array.isArray(filter)) { - objKeys = filter; - } else { - var keys = Object.keys(obj); - objKeys = sort ? keys.sort(sort) : keys; - } - - for (var i = 0; i < objKeys.length; ++i) { - var key = objKeys[i]; - - if (skipNulls && obj[key] === null) { - continue; - } - - if (Array.isArray(obj)) { - values = values.concat(stringify( - obj[key], - generateArrayPrefix(prefix, key), - generateArrayPrefix, - strictNullHandling, - skipNulls, - encoder, - filter, - sort, - allowDots, - serializeDate, - formatter - )); - } else { - values = values.concat(stringify( - obj[key], - prefix + (allowDots ? '.' + key : '[' + key + ']'), - generateArrayPrefix, - strictNullHandling, - skipNulls, - encoder, - filter, - sort, - allowDots, - serializeDate, - formatter - )); - } - } - - return values; -}; - -module.exports = function (object, opts) { - var obj = object; - var options = opts || {}; - var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter; - var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling; - var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls; - var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode; - var encoder = encode ? (typeof options.encoder === 'function' ? options.encoder : defaults.encoder) : null; - var sort = typeof options.sort === 'function' ? options.sort : null; - var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots; - var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate; - if (typeof options.format === 'undefined') { - options.format = formats.default; - } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) { - throw new TypeError('Unknown format option provided.'); - } - var formatter = formats.formatters[options.format]; - var objKeys; - var filter; - - if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') { - throw new TypeError('Encoder has to be a function.'); - } - - if (typeof options.filter === 'function') { - filter = options.filter; - obj = filter('', obj); - } else if (Array.isArray(options.filter)) { - filter = options.filter; - objKeys = filter; - } - - var keys = []; - - if (typeof obj !== 'object' || obj === null) { - return ''; - } - - var arrayFormat; - if (options.arrayFormat in arrayPrefixGenerators) { - arrayFormat = options.arrayFormat; - } else if ('indices' in options) { - arrayFormat = options.indices ? 'indices' : 'repeat'; - } else { - arrayFormat = 'indices'; - } - - var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; - - if (!objKeys) { - objKeys = Object.keys(obj); - } - - if (sort) { - objKeys.sort(sort); - } - - for (var i = 0; i < objKeys.length; ++i) { - var key = objKeys[i]; - - if (skipNulls && obj[key] === null) { - continue; - } - - keys = keys.concat(stringify( - obj[key], - key, - generateArrayPrefix, - strictNullHandling, - skipNulls, - encoder, - filter, - sort, - allowDots, - serializeDate, - formatter - )); - } - - return keys.join(delimiter); -}; - -},{"./formats":1,"./utils":5}],5:[function(require,module,exports){ -'use strict'; - -var has = Object.prototype.hasOwnProperty; - -var hexTable = (function () { - var array = []; - for (var i = 0; i < 256; ++i) { - array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase()); - } - - return array; -}()); - -exports.arrayToObject = function (source, options) { - var obj = options && options.plainObjects ? Object.create(null) : {}; - for (var i = 0; i < source.length; ++i) { - if (typeof source[i] !== 'undefined') { - obj[i] = source[i]; - } - } - - return obj; -}; - -exports.merge = function (target, source, options) { - if (!source) { - return target; - } - - if (typeof source !== 'object') { - if (Array.isArray(target)) { - target.push(source); - } else if (typeof target === 'object') { - target[source] = true; - } else { - return [target, source]; - } - - return target; - } - - if (typeof target !== 'object') { - return [target].concat(source); - } - - var mergeTarget = target; - if (Array.isArray(target) && !Array.isArray(source)) { - mergeTarget = exports.arrayToObject(target, options); - } - - if (Array.isArray(target) && Array.isArray(source)) { - source.forEach(function (item, i) { - if (has.call(target, i)) { - if (target[i] && typeof target[i] === 'object') { - target[i] = exports.merge(target[i], item, options); - } else { - target.push(item); - } - } else { - target[i] = item; - } - }); - return target; - } - - return Object.keys(source).reduce(function (acc, key) { - var value = source[key]; - - if (Object.prototype.hasOwnProperty.call(acc, key)) { - acc[key] = exports.merge(acc[key], value, options); - } else { - acc[key] = value; - } - return acc; - }, mergeTarget); -}; - -exports.decode = function (str) { - try { - return decodeURIComponent(str.replace(/\+/g, ' ')); - } catch (e) { - return str; - } -}; - -exports.encode = function (str) { - // This code was originally written by Brian White (mscdex) for the io.js core querystring library. - // It has been adapted here for stricter adherence to RFC 3986 - if (str.length === 0) { - return str; - } - - var string = typeof str === 'string' ? str : String(str); - - var out = ''; - for (var i = 0; i < string.length; ++i) { - var c = string.charCodeAt(i); - - if ( - c === 0x2D || // - - c === 0x2E || // . - c === 0x5F || // _ - c === 0x7E || // ~ - (c >= 0x30 && c <= 0x39) || // 0-9 - (c >= 0x41 && c <= 0x5A) || // a-z - (c >= 0x61 && c <= 0x7A) // A-Z - ) { - out += string.charAt(i); - continue; - } - - if (c < 0x80) { - out = out + hexTable[c]; - continue; - } - - if (c < 0x800) { - out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]); - continue; - } - - if (c < 0xD800 || c >= 0xE000) { - out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]); - continue; - } - - i += 1; - c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF)); - out += hexTable[0xF0 | (c >> 18)] + hexTable[0x80 | ((c >> 12) & 0x3F)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]; - } - - return out; -}; - -exports.compact = function (obj, references) { - if (typeof obj !== 'object' || obj === null) { - return obj; - } - - var refs = references || []; - var lookup = refs.indexOf(obj); - if (lookup !== -1) { - return refs[lookup]; - } - - refs.push(obj); - - if (Array.isArray(obj)) { - var compacted = []; - - for (var i = 0; i < obj.length; ++i) { - if (obj[i] && typeof obj[i] === 'object') { - compacted.push(exports.compact(obj[i], refs)); - } else if (typeof obj[i] !== 'undefined') { - compacted.push(obj[i]); - } - } - - return compacted; - } - - var keys = Object.keys(obj); - keys.forEach(function (key) { - obj[key] = exports.compact(obj[key], refs); - }); - - return obj; -}; - -exports.isRegExp = function (obj) { - return Object.prototype.toString.call(obj) === '[object RegExp]'; -}; - -exports.isBuffer = function (obj) { - if (obj === null || typeof obj === 'undefined') { - return false; - } - - return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); -}; - -},{}]},{},[2])(2) -}); \ No newline at end of file diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/qs/lib/formats.js b/node_modules/node-base64-image/node_modules/request/node_modules/qs/lib/formats.js deleted file mode 100644 index df45997..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/qs/lib/formats.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; - -var replace = String.prototype.replace; -var percentTwenties = /%20/g; - -module.exports = { - 'default': 'RFC3986', - formatters: { - RFC1738: function (value) { - return replace.call(value, percentTwenties, '+'); - }, - RFC3986: function (value) { - return value; - } - }, - RFC1738: 'RFC1738', - RFC3986: 'RFC3986' -}; diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/qs/lib/index.js b/node_modules/node-base64-image/node_modules/request/node_modules/qs/lib/index.js deleted file mode 100644 index 0d6a97d..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/qs/lib/index.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; - -var stringify = require('./stringify'); -var parse = require('./parse'); -var formats = require('./formats'); - -module.exports = { - formats: formats, - parse: parse, - stringify: stringify -}; diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/qs/lib/parse.js b/node_modules/node-base64-image/node_modules/request/node_modules/qs/lib/parse.js deleted file mode 100644 index 97387a6..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/qs/lib/parse.js +++ /dev/null @@ -1,166 +0,0 @@ -'use strict'; - -var utils = require('./utils'); - -var has = Object.prototype.hasOwnProperty; - -var defaults = { - allowDots: false, - allowPrototypes: false, - arrayLimit: 20, - decoder: utils.decode, - delimiter: '&', - depth: 5, - parameterLimit: 1000, - plainObjects: false, - strictNullHandling: false -}; - -var parseValues = function parseValues(str, options) { - var obj = {}; - var parts = str.split(options.delimiter, options.parameterLimit === Infinity ? undefined : options.parameterLimit); - - for (var i = 0; i < parts.length; ++i) { - var part = parts[i]; - var pos = part.indexOf(']=') === -1 ? part.indexOf('=') : part.indexOf(']=') + 1; - - var key, val; - if (pos === -1) { - key = options.decoder(part); - val = options.strictNullHandling ? null : ''; - } else { - key = options.decoder(part.slice(0, pos)); - val = options.decoder(part.slice(pos + 1)); - } - if (has.call(obj, key)) { - obj[key] = [].concat(obj[key]).concat(val); - } else { - obj[key] = val; - } - } - - return obj; -}; - -var parseObject = function parseObject(chain, val, options) { - if (!chain.length) { - return val; - } - - var root = chain.shift(); - - var obj; - if (root === '[]') { - obj = []; - obj = obj.concat(parseObject(chain, val, options)); - } else { - obj = options.plainObjects ? Object.create(null) : {}; - var cleanRoot = root[0] === '[' && root[root.length - 1] === ']' ? root.slice(1, root.length - 1) : root; - var index = parseInt(cleanRoot, 10); - if ( - !isNaN(index) && - root !== cleanRoot && - String(index) === cleanRoot && - index >= 0 && - (options.parseArrays && index <= options.arrayLimit) - ) { - obj = []; - obj[index] = parseObject(chain, val, options); - } else { - obj[cleanRoot] = parseObject(chain, val, options); - } - } - - return obj; -}; - -var parseKeys = function parseKeys(givenKey, val, options) { - if (!givenKey) { - return; - } - - // Transform dot notation to bracket notation - var key = options.allowDots ? givenKey.replace(/\.([^\.\[]+)/g, '[$1]') : givenKey; - - // The regex chunks - - var parent = /^([^\[\]]*)/; - var child = /(\[[^\[\]]*\])/g; - - // Get the parent - - var segment = parent.exec(key); - - // Stash the parent if it exists - - var keys = []; - if (segment[1]) { - // If we aren't using plain objects, optionally prefix keys - // that would overwrite object prototype properties - if (!options.plainObjects && has.call(Object.prototype, segment[1])) { - if (!options.allowPrototypes) { - return; - } - } - - keys.push(segment[1]); - } - - // Loop through children appending to the array until we hit depth - - var i = 0; - while ((segment = child.exec(key)) !== null && i < options.depth) { - i += 1; - if (!options.plainObjects && has.call(Object.prototype, segment[1].replace(/\[|\]/g, ''))) { - if (!options.allowPrototypes) { - continue; - } - } - keys.push(segment[1]); - } - - // If there's a remainder, just add whatever is left - - if (segment) { - keys.push('[' + key.slice(segment.index) + ']'); - } - - return parseObject(keys, val, options); -}; - -module.exports = function (str, opts) { - var options = opts || {}; - - if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') { - throw new TypeError('Decoder has to be a function.'); - } - - options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter; - options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth; - options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit; - options.parseArrays = options.parseArrays !== false; - options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder; - options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots; - options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects; - options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes; - options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit; - options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling; - - if (str === '' || str === null || typeof str === 'undefined') { - return options.plainObjects ? Object.create(null) : {}; - } - - var tempObj = typeof str === 'string' ? parseValues(str, options) : str; - var obj = options.plainObjects ? Object.create(null) : {}; - - // Iterate over the keys and setup the new object - - var keys = Object.keys(tempObj); - for (var i = 0; i < keys.length; ++i) { - var key = keys[i]; - var newObj = parseKeys(key, tempObj[key], options); - obj = utils.merge(obj, newObj, options); - } - - return utils.compact(obj); -}; diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/qs/lib/stringify.js b/node_modules/node-base64-image/node_modules/request/node_modules/qs/lib/stringify.js deleted file mode 100644 index 88cd791..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/qs/lib/stringify.js +++ /dev/null @@ -1,187 +0,0 @@ -'use strict'; - -var utils = require('./utils'); -var formats = require('./formats'); - -var arrayPrefixGenerators = { - brackets: function brackets(prefix) { - return prefix + '[]'; - }, - indices: function indices(prefix, key) { - return prefix + '[' + key + ']'; - }, - repeat: function repeat(prefix) { - return prefix; - } -}; - -var toISO = Date.prototype.toISOString; - -var defaults = { - delimiter: '&', - encode: true, - encoder: utils.encode, - serializeDate: function serializeDate(date) { - return toISO.call(date); - }, - skipNulls: false, - strictNullHandling: false -}; - -var stringify = function stringify(object, prefix, generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots, serializeDate, formatter) { - var obj = object; - if (typeof filter === 'function') { - obj = filter(prefix, obj); - } else if (obj instanceof Date) { - obj = serializeDate(obj); - } else if (obj === null) { - if (strictNullHandling) { - return encoder ? encoder(prefix) : prefix; - } - - obj = ''; - } - - if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) { - if (encoder) { - return [formatter(encoder(prefix)) + '=' + formatter(encoder(obj))]; - } - return [formatter(prefix) + '=' + formatter(String(obj))]; - } - - var values = []; - - if (typeof obj === 'undefined') { - return values; - } - - var objKeys; - if (Array.isArray(filter)) { - objKeys = filter; - } else { - var keys = Object.keys(obj); - objKeys = sort ? keys.sort(sort) : keys; - } - - for (var i = 0; i < objKeys.length; ++i) { - var key = objKeys[i]; - - if (skipNulls && obj[key] === null) { - continue; - } - - if (Array.isArray(obj)) { - values = values.concat(stringify( - obj[key], - generateArrayPrefix(prefix, key), - generateArrayPrefix, - strictNullHandling, - skipNulls, - encoder, - filter, - sort, - allowDots, - serializeDate, - formatter - )); - } else { - values = values.concat(stringify( - obj[key], - prefix + (allowDots ? '.' + key : '[' + key + ']'), - generateArrayPrefix, - strictNullHandling, - skipNulls, - encoder, - filter, - sort, - allowDots, - serializeDate, - formatter - )); - } - } - - return values; -}; - -module.exports = function (object, opts) { - var obj = object; - var options = opts || {}; - var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter; - var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling; - var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls; - var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode; - var encoder = encode ? (typeof options.encoder === 'function' ? options.encoder : defaults.encoder) : null; - var sort = typeof options.sort === 'function' ? options.sort : null; - var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots; - var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate; - if (typeof options.format === 'undefined') { - options.format = formats.default; - } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) { - throw new TypeError('Unknown format option provided.'); - } - var formatter = formats.formatters[options.format]; - var objKeys; - var filter; - - if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') { - throw new TypeError('Encoder has to be a function.'); - } - - if (typeof options.filter === 'function') { - filter = options.filter; - obj = filter('', obj); - } else if (Array.isArray(options.filter)) { - filter = options.filter; - objKeys = filter; - } - - var keys = []; - - if (typeof obj !== 'object' || obj === null) { - return ''; - } - - var arrayFormat; - if (options.arrayFormat in arrayPrefixGenerators) { - arrayFormat = options.arrayFormat; - } else if ('indices' in options) { - arrayFormat = options.indices ? 'indices' : 'repeat'; - } else { - arrayFormat = 'indices'; - } - - var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; - - if (!objKeys) { - objKeys = Object.keys(obj); - } - - if (sort) { - objKeys.sort(sort); - } - - for (var i = 0; i < objKeys.length; ++i) { - var key = objKeys[i]; - - if (skipNulls && obj[key] === null) { - continue; - } - - keys = keys.concat(stringify( - obj[key], - key, - generateArrayPrefix, - strictNullHandling, - skipNulls, - encoder, - filter, - sort, - allowDots, - serializeDate, - formatter - )); - } - - return keys.join(delimiter); -}; diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/qs/lib/utils.js b/node_modules/node-base64-image/node_modules/request/node_modules/qs/lib/utils.js deleted file mode 100644 index 33c01c0..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/qs/lib/utils.js +++ /dev/null @@ -1,180 +0,0 @@ -'use strict'; - -var has = Object.prototype.hasOwnProperty; - -var hexTable = (function () { - var array = []; - for (var i = 0; i < 256; ++i) { - array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase()); - } - - return array; -}()); - -exports.arrayToObject = function (source, options) { - var obj = options && options.plainObjects ? Object.create(null) : {}; - for (var i = 0; i < source.length; ++i) { - if (typeof source[i] !== 'undefined') { - obj[i] = source[i]; - } - } - - return obj; -}; - -exports.merge = function (target, source, options) { - if (!source) { - return target; - } - - if (typeof source !== 'object') { - if (Array.isArray(target)) { - target.push(source); - } else if (typeof target === 'object') { - target[source] = true; - } else { - return [target, source]; - } - - return target; - } - - if (typeof target !== 'object') { - return [target].concat(source); - } - - var mergeTarget = target; - if (Array.isArray(target) && !Array.isArray(source)) { - mergeTarget = exports.arrayToObject(target, options); - } - - if (Array.isArray(target) && Array.isArray(source)) { - source.forEach(function (item, i) { - if (has.call(target, i)) { - if (target[i] && typeof target[i] === 'object') { - target[i] = exports.merge(target[i], item, options); - } else { - target.push(item); - } - } else { - target[i] = item; - } - }); - return target; - } - - return Object.keys(source).reduce(function (acc, key) { - var value = source[key]; - - if (Object.prototype.hasOwnProperty.call(acc, key)) { - acc[key] = exports.merge(acc[key], value, options); - } else { - acc[key] = value; - } - return acc; - }, mergeTarget); -}; - -exports.decode = function (str) { - try { - return decodeURIComponent(str.replace(/\+/g, ' ')); - } catch (e) { - return str; - } -}; - -exports.encode = function (str) { - // This code was originally written by Brian White (mscdex) for the io.js core querystring library. - // It has been adapted here for stricter adherence to RFC 3986 - if (str.length === 0) { - return str; - } - - var string = typeof str === 'string' ? str : String(str); - - var out = ''; - for (var i = 0; i < string.length; ++i) { - var c = string.charCodeAt(i); - - if ( - c === 0x2D || // - - c === 0x2E || // . - c === 0x5F || // _ - c === 0x7E || // ~ - (c >= 0x30 && c <= 0x39) || // 0-9 - (c >= 0x41 && c <= 0x5A) || // a-z - (c >= 0x61 && c <= 0x7A) // A-Z - ) { - out += string.charAt(i); - continue; - } - - if (c < 0x80) { - out = out + hexTable[c]; - continue; - } - - if (c < 0x800) { - out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]); - continue; - } - - if (c < 0xD800 || c >= 0xE000) { - out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]); - continue; - } - - i += 1; - c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF)); - out += hexTable[0xF0 | (c >> 18)] + hexTable[0x80 | ((c >> 12) & 0x3F)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]; - } - - return out; -}; - -exports.compact = function (obj, references) { - if (typeof obj !== 'object' || obj === null) { - return obj; - } - - var refs = references || []; - var lookup = refs.indexOf(obj); - if (lookup !== -1) { - return refs[lookup]; - } - - refs.push(obj); - - if (Array.isArray(obj)) { - var compacted = []; - - for (var i = 0; i < obj.length; ++i) { - if (obj[i] && typeof obj[i] === 'object') { - compacted.push(exports.compact(obj[i], refs)); - } else if (typeof obj[i] !== 'undefined') { - compacted.push(obj[i]); - } - } - - return compacted; - } - - var keys = Object.keys(obj); - keys.forEach(function (key) { - obj[key] = exports.compact(obj[key], refs); - }); - - return obj; -}; - -exports.isRegExp = function (obj) { - return Object.prototype.toString.call(obj) === '[object RegExp]'; -}; - -exports.isBuffer = function (obj) { - if (obj === null || typeof obj === 'undefined') { - return false; - } - - return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); -}; diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/qs/package.json b/node_modules/node-base64-image/node_modules/request/node_modules/qs/package.json deleted file mode 100644 index 7339713..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/qs/package.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "name": "qs", - "description": "A querystring parser that supports nesting and arrays, with a depth limit", - "homepage": "https://github.com/ljharb/qs", - "version": "6.3.0", - "repository": { - "type": "git", - "url": "git+https://github.com/ljharb/qs.git" - }, - "main": "lib/index.js", - "contributors": [ - { - "name": "Jordan Harband", - "email": "ljharb@gmail.com", - "url": "http://ljharb.codes" - } - ], - "keywords": [ - "querystring", - "qs" - ], - "engines": { - "node": ">=0.6" - }, - "dependencies": {}, - "devDependencies": { - "@ljharb/eslint-config": "^8.0.0", - "browserify": "^13.1.0", - "covert": "^1.1.0", - "eslint": "^3.8.0", - "evalmd": "^0.0.17", - "iconv-lite": "^0.4.13", - "mkdirp": "^0.5.1", - "parallelshell": "^2.0.0", - "qs-iconv": "^1.0.3", - "safe-publish-latest": "^1.1.1", - "tape": "^4.6.2" - }, - "scripts": { - "prepublish": "safe-publish-latest && npm run dist", - "pretest": "npm run --silent readme && npm run --silent lint", - "test": "npm run --silent coverage", - "tests-only": "node test", - "readme": "evalmd README.md", - "lint": "eslint lib/*.js test/*.js", - "coverage": "covert test", - "dist": "mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js" - }, - "license": "BSD-3-Clause", - "gitHead": "8aa9c26f90335b5483a4f456dea9acbada8a881c", - "bugs": { - "url": "https://github.com/ljharb/qs/issues" - }, - "_id": "qs@6.3.0", - "_shasum": "f403b264f23bc01228c74131b407f18d5ea5d442", - "_from": "qs@>=6.3.0 <6.4.0", - "_npmVersion": "3.10.3", - "_nodeVersion": "6.6.0", - "_npmUser": { - "name": "ljharb", - "email": "ljharb@gmail.com" - }, - "dist": { - "shasum": "f403b264f23bc01228c74131b407f18d5ea5d442", - "tarball": "https://registry.npmjs.org/qs/-/qs-6.3.0.tgz" - }, - "maintainers": [ - { - "name": "hueniverse", - "email": "eran@hammer.io" - }, - { - "name": "ljharb", - "email": "ljharb@gmail.com" - }, - { - "name": "nlf", - "email": "quitlahok@gmail.com" - } - ], - "_npmOperationalInternal": { - "host": "packages-16-east.internal.npmjs.com", - "tmp": "tmp/qs-6.3.0.tgz_1476663988179_0.7400497454218566" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/qs/-/qs-6.3.0.tgz" -} diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/qs/test/.eslintrc b/node_modules/node-base64-image/node_modules/request/node_modules/qs/test/.eslintrc deleted file mode 100644 index 7155394..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/qs/test/.eslintrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "rules": { - "max-lines": 0, - "max-nested-callbacks": [2, 3], - "max-statements": 0, - "no-extend-native": 0, - "sort-keys": 1 - } -} diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/qs/test/index.js b/node_modules/node-base64-image/node_modules/request/node_modules/qs/test/index.js deleted file mode 100644 index 5e6bc8f..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/qs/test/index.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -require('./parse'); - -require('./stringify'); - -require('./utils'); diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/qs/test/parse.js b/node_modules/node-base64-image/node_modules/request/node_modules/qs/test/parse.js deleted file mode 100644 index 3a9611e..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/qs/test/parse.js +++ /dev/null @@ -1,459 +0,0 @@ -'use strict'; - -var test = require('tape'); -var qs = require('../'); -var iconv = require('iconv-lite'); - -test('parse()', function (t) { - t.test('parses a simple string', function (st) { - st.deepEqual(qs.parse('0=foo'), { 0: 'foo' }); - st.deepEqual(qs.parse('foo=c++'), { foo: 'c ' }); - st.deepEqual(qs.parse('a[>=]=23'), { a: { '>=': '23' } }); - st.deepEqual(qs.parse('a[<=>]==23'), { a: { '<=>': '=23' } }); - st.deepEqual(qs.parse('a[==]=23'), { a: { '==': '23' } }); - st.deepEqual(qs.parse('foo', { strictNullHandling: true }), { foo: null }); - st.deepEqual(qs.parse('foo'), { foo: '' }); - st.deepEqual(qs.parse('foo='), { foo: '' }); - st.deepEqual(qs.parse('foo=bar'), { foo: 'bar' }); - st.deepEqual(qs.parse(' foo = bar = baz '), { ' foo ': ' bar = baz ' }); - st.deepEqual(qs.parse('foo=bar=baz'), { foo: 'bar=baz' }); - st.deepEqual(qs.parse('foo=bar&bar=baz'), { foo: 'bar', bar: 'baz' }); - st.deepEqual(qs.parse('foo2=bar2&baz2='), { foo2: 'bar2', baz2: '' }); - st.deepEqual(qs.parse('foo=bar&baz', { strictNullHandling: true }), { foo: 'bar', baz: null }); - st.deepEqual(qs.parse('foo=bar&baz'), { foo: 'bar', baz: '' }); - st.deepEqual(qs.parse('cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World'), { - cht: 'p3', - chd: 't:60,40', - chs: '250x100', - chl: 'Hello|World' - }); - st.end(); - }); - - t.test('allows enabling dot notation', function (st) { - st.deepEqual(qs.parse('a.b=c'), { 'a.b': 'c' }); - st.deepEqual(qs.parse('a.b=c', { allowDots: true }), { a: { b: 'c' } }); - st.end(); - }); - - t.deepEqual(qs.parse('a[b]=c'), { a: { b: 'c' } }, 'parses a single nested string'); - t.deepEqual(qs.parse('a[b][c]=d'), { a: { b: { c: 'd' } } }, 'parses a double nested string'); - t.deepEqual( - qs.parse('a[b][c][d][e][f][g][h]=i'), - { a: { b: { c: { d: { e: { f: { '[g][h]': 'i' } } } } } } }, - 'defaults to a depth of 5' - ); - - t.test('only parses one level when depth = 1', function (st) { - st.deepEqual(qs.parse('a[b][c]=d', { depth: 1 }), { a: { b: { '[c]': 'd' } } }); - st.deepEqual(qs.parse('a[b][c][d]=e', { depth: 1 }), { a: { b: { '[c][d]': 'e' } } }); - st.end(); - }); - - t.deepEqual(qs.parse('a=b&a=c'), { a: ['b', 'c'] }, 'parses a simple array'); - - t.test('parses an explicit array', function (st) { - st.deepEqual(qs.parse('a[]=b'), { a: ['b'] }); - st.deepEqual(qs.parse('a[]=b&a[]=c'), { a: ['b', 'c'] }); - st.deepEqual(qs.parse('a[]=b&a[]=c&a[]=d'), { a: ['b', 'c', 'd'] }); - st.end(); - }); - - t.test('parses a mix of simple and explicit arrays', function (st) { - st.deepEqual(qs.parse('a=b&a[]=c'), { a: ['b', 'c'] }); - st.deepEqual(qs.parse('a[]=b&a=c'), { a: ['b', 'c'] }); - st.deepEqual(qs.parse('a[0]=b&a=c'), { a: ['b', 'c'] }); - st.deepEqual(qs.parse('a=b&a[0]=c'), { a: ['b', 'c'] }); - - st.deepEqual(qs.parse('a[1]=b&a=c', { arrayLimit: 20 }), { a: ['b', 'c'] }); - st.deepEqual(qs.parse('a[]=b&a=c', { arrayLimit: 0 }), { a: ['b', 'c'] }); - st.deepEqual(qs.parse('a[]=b&a=c'), { a: ['b', 'c'] }); - - st.deepEqual(qs.parse('a=b&a[1]=c', { arrayLimit: 20 }), { a: ['b', 'c'] }); - st.deepEqual(qs.parse('a=b&a[]=c', { arrayLimit: 0 }), { a: ['b', 'c'] }); - st.deepEqual(qs.parse('a=b&a[]=c'), { a: ['b', 'c'] }); - - st.end(); - }); - - t.test('parses a nested array', function (st) { - st.deepEqual(qs.parse('a[b][]=c&a[b][]=d'), { a: { b: ['c', 'd'] } }); - st.deepEqual(qs.parse('a[>=]=25'), { a: { '>=': '25' } }); - st.end(); - }); - - t.test('allows to specify array indices', function (st) { - st.deepEqual(qs.parse('a[1]=c&a[0]=b&a[2]=d'), { a: ['b', 'c', 'd'] }); - st.deepEqual(qs.parse('a[1]=c&a[0]=b'), { a: ['b', 'c'] }); - st.deepEqual(qs.parse('a[1]=c', { arrayLimit: 20 }), { a: ['c'] }); - st.deepEqual(qs.parse('a[1]=c', { arrayLimit: 0 }), { a: { 1: 'c' } }); - st.deepEqual(qs.parse('a[1]=c'), { a: ['c'] }); - st.end(); - }); - - t.test('limits specific array indices to arrayLimit', function (st) { - st.deepEqual(qs.parse('a[20]=a', { arrayLimit: 20 }), { a: ['a'] }); - st.deepEqual(qs.parse('a[21]=a', { arrayLimit: 20 }), { a: { 21: 'a' } }); - st.end(); - }); - - t.deepEqual(qs.parse('a[12b]=c'), { a: { '12b': 'c' } }, 'supports keys that begin with a number'); - - t.test('supports encoded = signs', function (st) { - st.deepEqual(qs.parse('he%3Dllo=th%3Dere'), { 'he=llo': 'th=ere' }); - st.end(); - }); - - t.test('is ok with url encoded strings', function (st) { - st.deepEqual(qs.parse('a[b%20c]=d'), { a: { 'b c': 'd' } }); - st.deepEqual(qs.parse('a[b]=c%20d'), { a: { b: 'c d' } }); - st.end(); - }); - - t.test('allows brackets in the value', function (st) { - st.deepEqual(qs.parse('pets=["tobi"]'), { pets: '["tobi"]' }); - st.deepEqual(qs.parse('operators=[">=", "<="]'), { operators: '[">=", "<="]' }); - st.end(); - }); - - t.test('allows empty values', function (st) { - st.deepEqual(qs.parse(''), {}); - st.deepEqual(qs.parse(null), {}); - st.deepEqual(qs.parse(undefined), {}); - st.end(); - }); - - t.test('transforms arrays to objects', function (st) { - st.deepEqual(qs.parse('foo[0]=bar&foo[bad]=baz'), { foo: { 0: 'bar', bad: 'baz' } }); - st.deepEqual(qs.parse('foo[bad]=baz&foo[0]=bar'), { foo: { bad: 'baz', 0: 'bar' } }); - st.deepEqual(qs.parse('foo[bad]=baz&foo[]=bar'), { foo: { bad: 'baz', 0: 'bar' } }); - st.deepEqual(qs.parse('foo[]=bar&foo[bad]=baz'), { foo: { 0: 'bar', bad: 'baz' } }); - st.deepEqual(qs.parse('foo[bad]=baz&foo[]=bar&foo[]=foo'), { foo: { bad: 'baz', 0: 'bar', 1: 'foo' } }); - st.deepEqual(qs.parse('foo[0][a]=a&foo[0][b]=b&foo[1][a]=aa&foo[1][b]=bb'), { foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] }); - - st.deepEqual(qs.parse('a[]=b&a[t]=u&a[hasOwnProperty]=c', { allowPrototypes: false }), { a: { 0: 'b', c: true, t: 'u' } }); - st.deepEqual(qs.parse('a[]=b&a[t]=u&a[hasOwnProperty]=c', { allowPrototypes: true }), { a: { 0: 'b', t: 'u', hasOwnProperty: 'c' } }); - st.deepEqual(qs.parse('a[]=b&a[hasOwnProperty]=c&a[x]=y', { allowPrototypes: false }), { a: { 0: 'b', 1: 'c', x: 'y' } }); - st.deepEqual(qs.parse('a[]=b&a[hasOwnProperty]=c&a[x]=y', { allowPrototypes: true }), { a: { 0: 'b', hasOwnProperty: 'c', x: 'y' } }); - st.end(); - }); - - t.test('transforms arrays to objects (dot notation)', function (st) { - st.deepEqual(qs.parse('foo[0].baz=bar&fool.bad=baz', { allowDots: true }), { foo: [{ baz: 'bar' }], fool: { bad: 'baz' } }); - st.deepEqual(qs.parse('foo[0].baz=bar&fool.bad.boo=baz', { allowDots: true }), { foo: [{ baz: 'bar' }], fool: { bad: { boo: 'baz' } } }); - st.deepEqual(qs.parse('foo[0][0].baz=bar&fool.bad=baz', { allowDots: true }), { foo: [[{ baz: 'bar' }]], fool: { bad: 'baz' } }); - st.deepEqual(qs.parse('foo[0].baz[0]=15&foo[0].bar=2', { allowDots: true }), { foo: [{ baz: ['15'], bar: '2' }] }); - st.deepEqual(qs.parse('foo[0].baz[0]=15&foo[0].baz[1]=16&foo[0].bar=2', { allowDots: true }), { foo: [{ baz: ['15', '16'], bar: '2' }] }); - st.deepEqual(qs.parse('foo.bad=baz&foo[0]=bar', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar' } }); - st.deepEqual(qs.parse('foo.bad=baz&foo[]=bar', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar' } }); - st.deepEqual(qs.parse('foo[]=bar&foo.bad=baz', { allowDots: true }), { foo: { 0: 'bar', bad: 'baz' } }); - st.deepEqual(qs.parse('foo.bad=baz&foo[]=bar&foo[]=foo', { allowDots: true }), { foo: { bad: 'baz', 0: 'bar', 1: 'foo' } }); - st.deepEqual(qs.parse('foo[0].a=a&foo[0].b=b&foo[1].a=aa&foo[1].b=bb', { allowDots: true }), { foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] }); - st.end(); - }); - - t.deepEqual(qs.parse('a[b]=c&a=d'), { a: { b: 'c', d: true } }, 'can add keys to objects'); - - t.test('correctly prunes undefined values when converting an array to an object', function (st) { - st.deepEqual(qs.parse('a[2]=b&a[99999999]=c'), { a: { 2: 'b', 99999999: 'c' } }); - st.end(); - }); - - t.test('supports malformed uri characters', function (st) { - st.deepEqual(qs.parse('{%:%}', { strictNullHandling: true }), { '{%:%}': null }); - st.deepEqual(qs.parse('{%:%}='), { '{%:%}': '' }); - st.deepEqual(qs.parse('foo=%:%}'), { foo: '%:%}' }); - st.end(); - }); - - t.test('doesn\'t produce empty keys', function (st) { - st.deepEqual(qs.parse('_r=1&'), { _r: '1' }); - st.end(); - }); - - t.test('cannot access Object prototype', function (st) { - qs.parse('constructor[prototype][bad]=bad'); - qs.parse('bad[constructor][prototype][bad]=bad'); - st.equal(typeof Object.prototype.bad, 'undefined'); - st.end(); - }); - - t.test('parses arrays of objects', function (st) { - st.deepEqual(qs.parse('a[][b]=c'), { a: [{ b: 'c' }] }); - st.deepEqual(qs.parse('a[0][b]=c'), { a: [{ b: 'c' }] }); - st.end(); - }); - - t.test('allows for empty strings in arrays', function (st) { - st.deepEqual(qs.parse('a[]=b&a[]=&a[]=c'), { a: ['b', '', 'c'] }); - - st.deepEqual( - qs.parse('a[0]=b&a[1]&a[2]=c&a[19]=', { strictNullHandling: true, arrayLimit: 20 }), - { a: ['b', null, 'c', ''] }, - 'with arrayLimit 20 + array indices: null then empty string works' - ); - st.deepEqual( - qs.parse('a[]=b&a[]&a[]=c&a[]=', { strictNullHandling: true, arrayLimit: 0 }), - { a: ['b', null, 'c', ''] }, - 'with arrayLimit 0 + array brackets: null then empty string works' - ); - - st.deepEqual( - qs.parse('a[0]=b&a[1]=&a[2]=c&a[19]', { strictNullHandling: true, arrayLimit: 20 }), - { a: ['b', '', 'c', null] }, - 'with arrayLimit 20 + array indices: empty string then null works' - ); - st.deepEqual( - qs.parse('a[]=b&a[]=&a[]=c&a[]', { strictNullHandling: true, arrayLimit: 0 }), - { a: ['b', '', 'c', null] }, - 'with arrayLimit 0 + array brackets: empty string then null works' - ); - - st.deepEqual( - qs.parse('a[]=&a[]=b&a[]=c'), - { a: ['', 'b', 'c'] }, - 'array brackets: empty strings work' - ); - st.end(); - }); - - t.test('compacts sparse arrays', function (st) { - st.deepEqual(qs.parse('a[10]=1&a[2]=2', { arrayLimit: 20 }), { a: ['2', '1'] }); - st.deepEqual(qs.parse('a[1][b][2][c]=1', { arrayLimit: 20 }), { a: [{ b: [{ c: '1' }] }] }); - st.deepEqual(qs.parse('a[1][2][3][c]=1', { arrayLimit: 20 }), { a: [[[{ c: '1' }]]] }); - st.deepEqual(qs.parse('a[1][2][3][c][1]=1', { arrayLimit: 20 }), { a: [[[{ c: ['1'] }]]] }); - st.end(); - }); - - t.test('parses semi-parsed strings', function (st) { - st.deepEqual(qs.parse({ 'a[b]': 'c' }), { a: { b: 'c' } }); - st.deepEqual(qs.parse({ 'a[b]': 'c', 'a[d]': 'e' }), { a: { b: 'c', d: 'e' } }); - st.end(); - }); - - t.test('parses buffers correctly', function (st) { - var b = new Buffer('test'); - st.deepEqual(qs.parse({ a: b }), { a: b }); - st.end(); - }); - - t.test('continues parsing when no parent is found', function (st) { - st.deepEqual(qs.parse('[]=&a=b'), { 0: '', a: 'b' }); - st.deepEqual(qs.parse('[]&a=b', { strictNullHandling: true }), { 0: null, a: 'b' }); - st.deepEqual(qs.parse('[foo]=bar'), { foo: 'bar' }); - st.end(); - }); - - t.test('does not error when parsing a very long array', function (st) { - var str = 'a[]=a'; - while (Buffer.byteLength(str) < 128 * 1024) { - str = str + '&' + str; - } - - st.doesNotThrow(function () { - qs.parse(str); - }); - - st.end(); - }); - - t.test('should not throw when a native prototype has an enumerable property', { parallel: false }, function (st) { - Object.prototype.crash = ''; - Array.prototype.crash = ''; - st.doesNotThrow(qs.parse.bind(null, 'a=b')); - st.deepEqual(qs.parse('a=b'), { a: 'b' }); - st.doesNotThrow(qs.parse.bind(null, 'a[][b]=c')); - st.deepEqual(qs.parse('a[][b]=c'), { a: [{ b: 'c' }] }); - delete Object.prototype.crash; - delete Array.prototype.crash; - st.end(); - }); - - t.test('parses a string with an alternative string delimiter', function (st) { - st.deepEqual(qs.parse('a=b;c=d', { delimiter: ';' }), { a: 'b', c: 'd' }); - st.end(); - }); - - t.test('parses a string with an alternative RegExp delimiter', function (st) { - st.deepEqual(qs.parse('a=b; c=d', { delimiter: /[;,] */ }), { a: 'b', c: 'd' }); - st.end(); - }); - - t.test('does not use non-splittable objects as delimiters', function (st) { - st.deepEqual(qs.parse('a=b&c=d', { delimiter: true }), { a: 'b', c: 'd' }); - st.end(); - }); - - t.test('allows overriding parameter limit', function (st) { - st.deepEqual(qs.parse('a=b&c=d', { parameterLimit: 1 }), { a: 'b' }); - st.end(); - }); - - t.test('allows setting the parameter limit to Infinity', function (st) { - st.deepEqual(qs.parse('a=b&c=d', { parameterLimit: Infinity }), { a: 'b', c: 'd' }); - st.end(); - }); - - t.test('allows overriding array limit', function (st) { - st.deepEqual(qs.parse('a[0]=b', { arrayLimit: -1 }), { a: { 0: 'b' } }); - st.deepEqual(qs.parse('a[-1]=b', { arrayLimit: -1 }), { a: { '-1': 'b' } }); - st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayLimit: 0 }), { a: { 0: 'b', 1: 'c' } }); - st.end(); - }); - - t.test('allows disabling array parsing', function (st) { - st.deepEqual(qs.parse('a[0]=b&a[1]=c', { parseArrays: false }), { a: { 0: 'b', 1: 'c' } }); - st.end(); - }); - - t.test('parses an object', function (st) { - var input = { - 'user[name]': { 'pop[bob]': 3 }, - 'user[email]': null - }; - - var expected = { - user: { - name: { 'pop[bob]': 3 }, - email: null - } - }; - - var result = qs.parse(input); - - st.deepEqual(result, expected); - st.end(); - }); - - t.test('parses an object in dot notation', function (st) { - var input = { - 'user.name': { 'pop[bob]': 3 }, - 'user.email.': null - }; - - var expected = { - user: { - name: { 'pop[bob]': 3 }, - email: null - } - }; - - var result = qs.parse(input, { allowDots: true }); - - st.deepEqual(result, expected); - st.end(); - }); - - t.test('parses an object and not child values', function (st) { - var input = { - 'user[name]': { 'pop[bob]': { test: 3 } }, - 'user[email]': null - }; - - var expected = { - user: { - name: { 'pop[bob]': { test: 3 } }, - email: null - } - }; - - var result = qs.parse(input); - - st.deepEqual(result, expected); - st.end(); - }); - - t.test('does not blow up when Buffer global is missing', function (st) { - var tempBuffer = global.Buffer; - delete global.Buffer; - var result = qs.parse('a=b&c=d'); - global.Buffer = tempBuffer; - st.deepEqual(result, { a: 'b', c: 'd' }); - st.end(); - }); - - t.test('does not crash when parsing circular references', function (st) { - var a = {}; - a.b = a; - - var parsed; - - st.doesNotThrow(function () { - parsed = qs.parse({ 'foo[bar]': 'baz', 'foo[baz]': a }); - }); - - st.equal('foo' in parsed, true, 'parsed has "foo" property'); - st.equal('bar' in parsed.foo, true); - st.equal('baz' in parsed.foo, true); - st.equal(parsed.foo.bar, 'baz'); - st.deepEqual(parsed.foo.baz, a); - st.end(); - }); - - t.test('parses null objects correctly', { skip: !Object.create }, function (st) { - var a = Object.create(null); - a.b = 'c'; - - st.deepEqual(qs.parse(a), { b: 'c' }); - var result = qs.parse({ a: a }); - st.equal('a' in result, true, 'result has "a" property'); - st.deepEqual(result.a, a); - st.end(); - }); - - t.test('parses dates correctly', function (st) { - var now = new Date(); - st.deepEqual(qs.parse({ a: now }), { a: now }); - st.end(); - }); - - t.test('parses regular expressions correctly', function (st) { - var re = /^test$/; - st.deepEqual(qs.parse({ a: re }), { a: re }); - st.end(); - }); - - t.test('can allow overwriting prototype properties', function (st) { - st.deepEqual(qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true }), { a: { hasOwnProperty: 'b' } }, { prototype: false }); - st.deepEqual(qs.parse('hasOwnProperty=b', { allowPrototypes: true }), { hasOwnProperty: 'b' }, { prototype: false }); - st.end(); - }); - - t.test('can return null objects', { skip: !Object.create }, function (st) { - var expected = Object.create(null); - expected.a = Object.create(null); - expected.a.b = 'c'; - expected.a.hasOwnProperty = 'd'; - st.deepEqual(qs.parse('a[b]=c&a[hasOwnProperty]=d', { plainObjects: true }), expected); - st.deepEqual(qs.parse(null, { plainObjects: true }), Object.create(null)); - var expectedArray = Object.create(null); - expectedArray.a = Object.create(null); - expectedArray.a[0] = 'b'; - expectedArray.a.c = 'd'; - st.deepEqual(qs.parse('a[]=b&a[c]=d', { plainObjects: true }), expectedArray); - st.end(); - }); - - t.test('can parse with custom encoding', function (st) { - st.deepEqual(qs.parse('%8c%a7=%91%e5%8d%e3%95%7b', { - decoder: function (str) { - var reg = /%([0-9A-F]{2})/ig; - var result = []; - var parts = reg.exec(str); - while (parts) { - result.push(parseInt(parts[1], 16)); - parts = reg.exec(str); - } - return iconv.decode(new Buffer(result), 'shift_jis').toString(); - } - }), { 県: '大阪府' }); - st.end(); - }); - - t.test('throws error with wrong decoder', function (st) { - st.throws(function () { - qs.parse({}, { decoder: 'string' }); - }, new TypeError('Decoder has to be a function.')); - st.end(); - }); -}); diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/qs/test/stringify.js b/node_modules/node-base64-image/node_modules/request/node_modules/qs/test/stringify.js deleted file mode 100644 index 8818eac..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/qs/test/stringify.js +++ /dev/null @@ -1,538 +0,0 @@ -'use strict'; - -var test = require('tape'); -var qs = require('../'); -var iconv = require('iconv-lite'); - -test('stringify()', function (t) { - t.test('stringifies a querystring object', function (st) { - st.equal(qs.stringify({ a: 'b' }), 'a=b'); - st.equal(qs.stringify({ a: 1 }), 'a=1'); - st.equal(qs.stringify({ a: 1, b: 2 }), 'a=1&b=2'); - st.equal(qs.stringify({ a: 'A_Z' }), 'a=A_Z'); - st.equal(qs.stringify({ a: '€' }), 'a=%E2%82%AC'); - st.equal(qs.stringify({ a: '' }), 'a=%EE%80%80'); - st.equal(qs.stringify({ a: 'א' }), 'a=%D7%90'); - st.equal(qs.stringify({ a: '𐐷' }), 'a=%F0%90%90%B7'); - st.end(); - }); - - t.test('stringifies a nested object', function (st) { - st.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c'); - st.equal(qs.stringify({ a: { b: { c: { d: 'e' } } } }), 'a%5Bb%5D%5Bc%5D%5Bd%5D=e'); - st.end(); - }); - - t.test('stringifies a nested object with dots notation', function (st) { - st.equal(qs.stringify({ a: { b: 'c' } }, { allowDots: true }), 'a.b=c'); - st.equal(qs.stringify({ a: { b: { c: { d: 'e' } } } }, { allowDots: true }), 'a.b.c.d=e'); - st.end(); - }); - - t.test('stringifies an array value', function (st) { - st.equal( - qs.stringify({ a: ['b', 'c', 'd'] }, { arrayFormat: 'indices' }), - 'a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d', - 'indices => indices' - ); - st.equal( - qs.stringify({ a: ['b', 'c', 'd'] }, { arrayFormat: 'brackets' }), - 'a%5B%5D=b&a%5B%5D=c&a%5B%5D=d', - 'brackets => brackets' - ); - st.equal( - qs.stringify({ a: ['b', 'c', 'd'] }), - 'a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d', - 'default => indices' - ); - st.end(); - }); - - t.test('omits nulls when asked', function (st) { - st.equal(qs.stringify({ a: 'b', c: null }, { skipNulls: true }), 'a=b'); - st.end(); - }); - - t.test('omits nested nulls when asked', function (st) { - st.equal(qs.stringify({ a: { b: 'c', d: null } }, { skipNulls: true }), 'a%5Bb%5D=c'); - st.end(); - }); - - t.test('omits array indices when asked', function (st) { - st.equal(qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false }), 'a=b&a=c&a=d'); - st.end(); - }); - - t.test('stringifies a nested array value', function (st) { - st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'indices' }), 'a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d'); - st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { arrayFormat: 'brackets' }), 'a%5Bb%5D%5B%5D=c&a%5Bb%5D%5B%5D=d'); - st.equal(qs.stringify({ a: { b: ['c', 'd'] } }), 'a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d'); - st.end(); - }); - - t.test('stringifies a nested array value with dots notation', function (st) { - st.equal( - qs.stringify( - { a: { b: ['c', 'd'] } }, - { allowDots: true, encode: false, arrayFormat: 'indices' } - ), - 'a.b[0]=c&a.b[1]=d', - 'indices: stringifies with dots + indices' - ); - st.equal( - qs.stringify( - { a: { b: ['c', 'd'] } }, - { allowDots: true, encode: false, arrayFormat: 'brackets' } - ), - 'a.b[]=c&a.b[]=d', - 'brackets: stringifies with dots + brackets' - ); - st.equal( - qs.stringify( - { a: { b: ['c', 'd'] } }, - { allowDots: true, encode: false } - ), - 'a.b[0]=c&a.b[1]=d', - 'default: stringifies with dots + indices' - ); - st.end(); - }); - - t.test('stringifies an object inside an array', function (st) { - st.equal( - qs.stringify({ a: [{ b: 'c' }] }, { arrayFormat: 'indices' }), - 'a%5B0%5D%5Bb%5D=c', - 'indices => brackets' - ); - st.equal( - qs.stringify({ a: [{ b: 'c' }] }, { arrayFormat: 'brackets' }), - 'a%5B%5D%5Bb%5D=c', - 'brackets => brackets' - ); - st.equal( - qs.stringify({ a: [{ b: 'c' }] }), - 'a%5B0%5D%5Bb%5D=c', - 'default => indices' - ); - - st.equal( - qs.stringify({ a: [{ b: { c: [1] } }] }, { arrayFormat: 'indices' }), - 'a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1', - 'indices => indices' - ); - - st.equal( - qs.stringify({ a: [{ b: { c: [1] } }] }, { arrayFormat: 'brackets' }), - 'a%5B%5D%5Bb%5D%5Bc%5D%5B%5D=1', - 'brackets => brackets' - ); - - st.equal( - qs.stringify({ a: [{ b: { c: [1] } }] }), - 'a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1', - 'default => indices' - ); - - st.end(); - }); - - t.test('stringifies an array with mixed objects and primitives', function (st) { - st.equal( - qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false, arrayFormat: 'indices' }), - 'a[0][b]=1&a[1]=2&a[2]=3', - 'indices => indices' - ); - st.equal( - qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false, arrayFormat: 'brackets' }), - 'a[][b]=1&a[]=2&a[]=3', - 'brackets => brackets' - ); - st.equal( - qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false }), - 'a[0][b]=1&a[1]=2&a[2]=3', - 'default => indices' - ); - - st.end(); - }); - - t.test('stringifies an object inside an array with dots notation', function (st) { - st.equal( - qs.stringify( - { a: [{ b: 'c' }] }, - { allowDots: true, encode: false, arrayFormat: 'indices' } - ), - 'a[0].b=c', - 'indices => indices' - ); - st.equal( - qs.stringify( - { a: [{ b: 'c' }] }, - { allowDots: true, encode: false, arrayFormat: 'brackets' } - ), - 'a[].b=c', - 'brackets => brackets' - ); - st.equal( - qs.stringify( - { a: [{ b: 'c' }] }, - { allowDots: true, encode: false } - ), - 'a[0].b=c', - 'default => indices' - ); - - st.equal( - qs.stringify( - { a: [{ b: { c: [1] } }] }, - { allowDots: true, encode: false, arrayFormat: 'indices' } - ), - 'a[0].b.c[0]=1', - 'indices => indices' - ); - st.equal( - qs.stringify( - { a: [{ b: { c: [1] } }] }, - { allowDots: true, encode: false, arrayFormat: 'brackets' } - ), - 'a[].b.c[]=1', - 'brackets => brackets' - ); - st.equal( - qs.stringify( - { a: [{ b: { c: [1] } }] }, - { allowDots: true, encode: false } - ), - 'a[0].b.c[0]=1', - 'default => indices' - ); - - st.end(); - }); - - t.test('does not omit object keys when indices = false', function (st) { - st.equal(qs.stringify({ a: [{ b: 'c' }] }, { indices: false }), 'a%5Bb%5D=c'); - st.end(); - }); - - t.test('uses indices notation for arrays when indices=true', function (st) { - st.equal(qs.stringify({ a: ['b', 'c'] }, { indices: true }), 'a%5B0%5D=b&a%5B1%5D=c'); - st.end(); - }); - - t.test('uses indices notation for arrays when no arrayFormat is specified', function (st) { - st.equal(qs.stringify({ a: ['b', 'c'] }), 'a%5B0%5D=b&a%5B1%5D=c'); - st.end(); - }); - - t.test('uses indices notation for arrays when no arrayFormat=indices', function (st) { - st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' }), 'a%5B0%5D=b&a%5B1%5D=c'); - st.end(); - }); - - t.test('uses repeat notation for arrays when no arrayFormat=repeat', function (st) { - st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' }), 'a=b&a=c'); - st.end(); - }); - - t.test('uses brackets notation for arrays when no arrayFormat=brackets', function (st) { - st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' }), 'a%5B%5D=b&a%5B%5D=c'); - st.end(); - }); - - t.test('stringifies a complicated object', function (st) { - st.equal(qs.stringify({ a: { b: 'c', d: 'e' } }), 'a%5Bb%5D=c&a%5Bd%5D=e'); - st.end(); - }); - - t.test('stringifies an empty value', function (st) { - st.equal(qs.stringify({ a: '' }), 'a='); - st.equal(qs.stringify({ a: null }, { strictNullHandling: true }), 'a'); - - st.equal(qs.stringify({ a: '', b: '' }), 'a=&b='); - st.equal(qs.stringify({ a: null, b: '' }, { strictNullHandling: true }), 'a&b='); - - st.equal(qs.stringify({ a: { b: '' } }), 'a%5Bb%5D='); - st.equal(qs.stringify({ a: { b: null } }, { strictNullHandling: true }), 'a%5Bb%5D'); - st.equal(qs.stringify({ a: { b: null } }, { strictNullHandling: false }), 'a%5Bb%5D='); - - st.end(); - }); - - t.test('stringifies a null object', { skip: !Object.create }, function (st) { - var obj = Object.create(null); - obj.a = 'b'; - st.equal(qs.stringify(obj), 'a=b'); - st.end(); - }); - - t.test('returns an empty string for invalid input', function (st) { - st.equal(qs.stringify(undefined), ''); - st.equal(qs.stringify(false), ''); - st.equal(qs.stringify(null), ''); - st.equal(qs.stringify(''), ''); - st.end(); - }); - - t.test('stringifies an object with a null object as a child', { skip: !Object.create }, function (st) { - var obj = { a: Object.create(null) }; - - obj.a.b = 'c'; - st.equal(qs.stringify(obj), 'a%5Bb%5D=c'); - st.end(); - }); - - t.test('drops keys with a value of undefined', function (st) { - st.equal(qs.stringify({ a: undefined }), ''); - - st.equal(qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: true }), 'a%5Bc%5D'); - st.equal(qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: false }), 'a%5Bc%5D='); - st.equal(qs.stringify({ a: { b: undefined, c: '' } }), 'a%5Bc%5D='); - st.end(); - }); - - t.test('url encodes values', function (st) { - st.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); - st.end(); - }); - - t.test('stringifies a date', function (st) { - var now = new Date(); - var str = 'a=' + encodeURIComponent(now.toISOString()); - st.equal(qs.stringify({ a: now }), str); - st.end(); - }); - - t.test('stringifies the weird object from qs', function (st) { - st.equal(qs.stringify({ 'my weird field': '~q1!2"\'w$5&7/z8)?' }), 'my%20weird%20field=~q1%212%22%27w%245%267%2Fz8%29%3F'); - st.end(); - }); - - t.test('skips properties that are part of the object prototype', function (st) { - Object.prototype.crash = 'test'; - st.equal(qs.stringify({ a: 'b' }), 'a=b'); - st.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c'); - delete Object.prototype.crash; - st.end(); - }); - - t.test('stringifies boolean values', function (st) { - st.equal(qs.stringify({ a: true }), 'a=true'); - st.equal(qs.stringify({ a: { b: true } }), 'a%5Bb%5D=true'); - st.equal(qs.stringify({ b: false }), 'b=false'); - st.equal(qs.stringify({ b: { c: false } }), 'b%5Bc%5D=false'); - st.end(); - }); - - t.test('stringifies buffer values', function (st) { - st.equal(qs.stringify({ a: new Buffer('test') }), 'a=test'); - st.equal(qs.stringify({ a: { b: new Buffer('test') } }), 'a%5Bb%5D=test'); - st.end(); - }); - - t.test('stringifies an object using an alternative delimiter', function (st) { - st.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d'); - st.end(); - }); - - t.test('doesn\'t blow up when Buffer global is missing', function (st) { - var tempBuffer = global.Buffer; - delete global.Buffer; - var result = qs.stringify({ a: 'b', c: 'd' }); - global.Buffer = tempBuffer; - st.equal(result, 'a=b&c=d'); - st.end(); - }); - - t.test('selects properties when filter=array', function (st) { - st.equal(qs.stringify({ a: 'b' }, { filter: ['a'] }), 'a=b'); - st.equal(qs.stringify({ a: 1 }, { filter: [] }), ''); - - st.equal( - qs.stringify( - { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, - { filter: ['a', 'b', 0, 2], arrayFormat: 'indices' } - ), - 'a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3', - 'indices => indices' - ); - st.equal( - qs.stringify( - { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, - { filter: ['a', 'b', 0, 2], arrayFormat: 'brackets' } - ), - 'a%5Bb%5D%5B%5D=1&a%5Bb%5D%5B%5D=3', - 'brackets => brackets' - ); - st.equal( - qs.stringify( - { a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, - { filter: ['a', 'b', 0, 2] } - ), - 'a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3', - 'default => indices' - ); - - st.end(); - }); - - t.test('supports custom representations when filter=function', function (st) { - var calls = 0; - var obj = { a: 'b', c: 'd', e: { f: new Date(1257894000000) } }; - var filterFunc = function (prefix, value) { - calls += 1; - if (calls === 1) { - st.equal(prefix, '', 'prefix is empty'); - st.equal(value, obj); - } else if (prefix === 'c') { - return; - } else if (value instanceof Date) { - st.equal(prefix, 'e[f]'); - return value.getTime(); - } - return value; - }; - - st.equal(qs.stringify(obj, { filter: filterFunc }), 'a=b&e%5Bf%5D=1257894000000'); - st.equal(calls, 5); - st.end(); - }); - - t.test('can disable uri encoding', function (st) { - st.equal(qs.stringify({ a: 'b' }, { encode: false }), 'a=b'); - st.equal(qs.stringify({ a: { b: 'c' } }, { encode: false }), 'a[b]=c'); - st.equal(qs.stringify({ a: 'b', c: null }, { strictNullHandling: true, encode: false }), 'a=b&c'); - st.end(); - }); - - t.test('can sort the keys', function (st) { - var sort = function (a, b) { - return a.localeCompare(b); - }; - st.equal(qs.stringify({ a: 'c', z: 'y', b: 'f' }, { sort: sort }), 'a=c&b=f&z=y'); - st.equal(qs.stringify({ a: 'c', z: { j: 'a', i: 'b' }, b: 'f' }, { sort: sort }), 'a=c&b=f&z%5Bi%5D=b&z%5Bj%5D=a'); - st.end(); - }); - - t.test('can sort the keys at depth 3 or more too', function (st) { - var sort = function (a, b) { - return a.localeCompare(b); - }; - st.equal( - qs.stringify( - { a: 'a', z: { zj: { zjb: 'zjb', zja: 'zja' }, zi: { zib: 'zib', zia: 'zia' } }, b: 'b' }, - { sort: sort, encode: false } - ), - 'a=a&b=b&z[zi][zia]=zia&z[zi][zib]=zib&z[zj][zja]=zja&z[zj][zjb]=zjb' - ); - st.equal( - qs.stringify( - { a: 'a', z: { zj: { zjb: 'zjb', zja: 'zja' }, zi: { zib: 'zib', zia: 'zia' } }, b: 'b' }, - { sort: null, encode: false } - ), - 'a=a&z[zj][zjb]=zjb&z[zj][zja]=zja&z[zi][zib]=zib&z[zi][zia]=zia&b=b' - ); - st.end(); - }); - - t.test('can stringify with custom encoding', function (st) { - st.equal(qs.stringify({ 県: '大阪府', '': '' }, { - encoder: function (str) { - if (str.length === 0) { - return ''; - } - var buf = iconv.encode(str, 'shiftjis'); - var result = []; - for (var i = 0; i < buf.length; ++i) { - result.push(buf.readUInt8(i).toString(16)); - } - return '%' + result.join('%'); - } - }), '%8c%a7=%91%e5%8d%e3%95%7b&='); - st.end(); - }); - - t.test('throws error with wrong encoder', function (st) { - st.throws(function () { - qs.stringify({}, { encoder: 'string' }); - }, new TypeError('Encoder has to be a function.')); - st.end(); - }); - - t.test('can use custom encoder for a buffer object', { skip: typeof Buffer === 'undefined' }, function (st) { - st.equal(qs.stringify({ a: new Buffer([1]) }, { - encoder: function (buffer) { - if (typeof buffer === 'string') { - return buffer; - } - return String.fromCharCode(buffer.readUInt8(0) + 97); - } - }), 'a=b'); - st.end(); - }); - - t.test('serializeDate option', function (st) { - var date = new Date(); - st.equal( - qs.stringify({ a: date }), - 'a=' + date.toISOString().replace(/:/g, '%3A'), - 'default is toISOString' - ); - - var mutatedDate = new Date(); - mutatedDate.toISOString = function () { - throw new SyntaxError(); - }; - st.throws(function () { - mutatedDate.toISOString(); - }, SyntaxError); - st.equal( - qs.stringify({ a: mutatedDate }), - 'a=' + Date.prototype.toISOString.call(mutatedDate).replace(/:/g, '%3A'), - 'toISOString works even when method is not locally present' - ); - - var specificDate = new Date(6); - st.equal( - qs.stringify( - { a: specificDate }, - { serializeDate: function (d) { return d.getTime() * 7; } } - ), - 'a=42', - 'custom serializeDate function called' - ); - - st.end(); - }); - - t.test('RFC 1738 spaces serialization', function (st) { - st.equal(qs.stringify({ a: 'b c' }, { format: qs.formats.RFC1738 }), 'a=b+c'); - st.equal(qs.stringify({ 'a b': 'c d' }, { format: qs.formats.RFC1738 }), 'a+b=c+d'); - st.end(); - }); - - t.test('RFC 3986 spaces serialization', function (st) { - st.equal(qs.stringify({ a: 'b c' }, { format: qs.formats.RFC3986 }), 'a=b%20c'); - st.equal(qs.stringify({ 'a b': 'c d' }, { format: qs.formats.RFC3986 }), 'a%20b=c%20d'); - st.end(); - }); - - t.test('Backward compatibility to RFC 3986', function (st) { - st.equal(qs.stringify({ a: 'b c' }), 'a=b%20c'); - st.end(); - }); - - t.test('Edge cases and unknown formats', function (st) { - ['UFO1234', false, 1234, null, {}, []].forEach( - function (format) { - st.throws( - function () { - qs.stringify({ a: 'b c' }, { format: format }); - }, - new TypeError('Unknown format option provided.') - ); - } - ); - st.end(); - }); -}); diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/qs/test/utils.js b/node_modules/node-base64-image/node_modules/request/node_modules/qs/test/utils.js deleted file mode 100644 index 0721dd8..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/qs/test/utils.js +++ /dev/null @@ -1,22 +0,0 @@ -'use strict'; - -var test = require('tape'); -var utils = require('../lib/utils'); - -test('merge()', function (t) { - t.deepEqual(utils.merge({ a: 'b' }, { a: 'c' }), { a: ['b', 'c'] }, 'merges two objects with the same key'); - - var oneMerged = utils.merge({ foo: 'bar' }, { foo: { first: '123' } }); - t.deepEqual(oneMerged, { foo: ['bar', { first: '123' }] }, 'merges a standalone and an object into an array'); - - var twoMerged = utils.merge({ foo: ['bar', { first: '123' }] }, { foo: { second: '456' } }); - t.deepEqual(twoMerged, { foo: { 0: 'bar', 1: { first: '123' }, second: '456' } }, 'merges a standalone and two objects into an array'); - - var sandwiched = utils.merge({ foo: ['bar', { first: '123', second: '456' }] }, { foo: 'baz' }); - t.deepEqual(sandwiched, { foo: ['bar', { first: '123', second: '456' }, 'baz'] }, 'merges an object sandwiched by two standalones into an array'); - - var nestedArrays = utils.merge({ foo: ['baz'] }, { foo: ['bar', 'xyzzy'] }); - t.deepEqual(nestedArrays, { foo: ['baz', 'bar', 'xyzzy'] }); - - t.end(); -}); diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/stringstream/.npmignore b/node_modules/node-base64-image/node_modules/request/node_modules/stringstream/.npmignore deleted file mode 100644 index 7dccd97..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/stringstream/.npmignore +++ /dev/null @@ -1,15 +0,0 @@ -lib-cov -*.seed -*.log -*.csv -*.dat -*.out -*.pid -*.gz - -pids -logs -results - -node_modules -npm-debug.log \ No newline at end of file diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/stringstream/.travis.yml b/node_modules/node-base64-image/node_modules/request/node_modules/stringstream/.travis.yml deleted file mode 100644 index f1d0f13..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/stringstream/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.4 - - 0.6 diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/stringstream/LICENSE.txt b/node_modules/node-base64-image/node_modules/request/node_modules/stringstream/LICENSE.txt deleted file mode 100644 index ab861ac..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/stringstream/LICENSE.txt +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2012 Michael Hart (michael.hart.au@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. diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/stringstream/README.md b/node_modules/node-base64-image/node_modules/request/node_modules/stringstream/README.md deleted file mode 100644 index 32fc982..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/stringstream/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# Decode streams into strings The Right Way(tm) - -```javascript -var fs = require('fs') -var zlib = require('zlib') -var strs = require('stringstream') - -var utf8Stream = fs.createReadStream('massiveLogFile.gz') - .pipe(zlib.createGunzip()) - .pipe(strs('utf8')) -``` - -No need to deal with `setEncoding()` weirdness, just compose streams -like they were supposed to be! - -Handles input and output encoding: - -```javascript -// Stream from utf8 to hex to base64... Why not, ay. -var hex64Stream = fs.createReadStream('myFile') - .pipe(strs('utf8', 'hex')) - .pipe(strs('hex', 'base64')) -``` - -Also deals with `base64` output correctly by aligning each emitted data -chunk so that there are no dangling `=` characters: - -```javascript -var stream = fs.createReadStream('myFile').pipe(strs('base64')) - -var base64Str = '' - -stream.on('data', function(data) { base64Str += data }) -stream.on('end', function() { - console.log('My base64 encoded file is: ' + base64Str) // Wouldn't work with setEncoding() - console.log('Original file is: ' + new Buffer(base64Str, 'base64')) -}) -``` diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/stringstream/example.js b/node_modules/node-base64-image/node_modules/request/node_modules/stringstream/example.js deleted file mode 100644 index f82b85e..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/stringstream/example.js +++ /dev/null @@ -1,27 +0,0 @@ -var fs = require('fs') -var zlib = require('zlib') -var strs = require('stringstream') - -var utf8Stream = fs.createReadStream('massiveLogFile.gz') - .pipe(zlib.createGunzip()) - .pipe(strs('utf8')) - -utf8Stream.pipe(process.stdout) - -// Stream from utf8 to hex to base64... Why not, ay. -var hex64Stream = fs.createReadStream('myFile') - .pipe(strs('utf8', 'hex')) - .pipe(strs('hex', 'base64')) - -hex64Stream.pipe(process.stdout) - -// Deals with base64 correctly by aligning chunks -var stream = fs.createReadStream('myFile').pipe(strs('base64')) - -var base64Str = '' - -stream.on('data', function(data) { base64Str += data }) -stream.on('end', function() { - console.log('My base64 encoded file is: ' + base64Str) // Wouldn't work with setEncoding() - console.log('Original file is: ' + new Buffer(base64Str, 'base64')) -}) diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/stringstream/package.json b/node_modules/node-base64-image/node_modules/request/node_modules/stringstream/package.json deleted file mode 100644 index 2c6d7cd..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/stringstream/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "stringstream", - "version": "0.0.5", - "description": "Encode and decode streams into string streams", - "author": { - "name": "Michael Hart", - "email": "michael.hart.au@gmail.com", - "url": "http://github.com/mhart" - }, - "main": "stringstream.js", - "keywords": [ - "string", - "stream", - "base64", - "gzip" - ], - "repository": { - "type": "git", - "url": "git+https://github.com/mhart/StringStream.git" - }, - "license": "MIT", - "gitHead": "1efe3bf507bf3a1161f8473908b60e881d41422b", - "bugs": { - "url": "https://github.com/mhart/StringStream/issues" - }, - "homepage": "https://github.com/mhart/StringStream#readme", - "_id": "stringstream@0.0.5", - "scripts": {}, - "_shasum": "4e484cd4de5a0bbbee18e46307710a8a81621878", - "_from": "stringstream@>=0.0.4 <0.1.0", - "_npmVersion": "2.14.8", - "_nodeVersion": "4.2.1", - "_npmUser": { - "name": "hichaelmart", - "email": "michael.hart.au@gmail.com" - }, - "maintainers": [ - { - "name": "hichaelmart", - "email": "michael.hart.au@gmail.com" - } - ], - "dist": { - "shasum": "4e484cd4de5a0bbbee18e46307710a8a81621878", - "tarball": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/stringstream/stringstream.js b/node_modules/node-base64-image/node_modules/request/node_modules/stringstream/stringstream.js deleted file mode 100644 index 4ece127..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/stringstream/stringstream.js +++ /dev/null @@ -1,102 +0,0 @@ -var util = require('util') -var Stream = require('stream') -var StringDecoder = require('string_decoder').StringDecoder - -module.exports = StringStream -module.exports.AlignedStringDecoder = AlignedStringDecoder - -function StringStream(from, to) { - if (!(this instanceof StringStream)) return new StringStream(from, to) - - Stream.call(this) - - if (from == null) from = 'utf8' - - this.readable = this.writable = true - this.paused = false - this.toEncoding = (to == null ? from : to) - this.fromEncoding = (to == null ? '' : from) - this.decoder = new AlignedStringDecoder(this.toEncoding) -} -util.inherits(StringStream, Stream) - -StringStream.prototype.write = function(data) { - if (!this.writable) { - var err = new Error('stream not writable') - err.code = 'EPIPE' - this.emit('error', err) - return false - } - if (this.fromEncoding) { - if (Buffer.isBuffer(data)) data = data.toString() - data = new Buffer(data, this.fromEncoding) - } - var string = this.decoder.write(data) - if (string.length) this.emit('data', string) - return !this.paused -} - -StringStream.prototype.flush = function() { - if (this.decoder.flush) { - var string = this.decoder.flush() - if (string.length) this.emit('data', string) - } -} - -StringStream.prototype.end = function() { - if (!this.writable && !this.readable) return - this.flush() - this.emit('end') - this.writable = this.readable = false - this.destroy() -} - -StringStream.prototype.destroy = function() { - this.decoder = null - this.writable = this.readable = false - this.emit('close') -} - -StringStream.prototype.pause = function() { - this.paused = true -} - -StringStream.prototype.resume = function () { - if (this.paused) this.emit('drain') - this.paused = false -} - -function AlignedStringDecoder(encoding) { - StringDecoder.call(this, encoding) - - switch (this.encoding) { - case 'base64': - this.write = alignedWrite - this.alignedBuffer = new Buffer(3) - this.alignedBytes = 0 - break - } -} -util.inherits(AlignedStringDecoder, StringDecoder) - -AlignedStringDecoder.prototype.flush = function() { - if (!this.alignedBuffer || !this.alignedBytes) return '' - var leftover = this.alignedBuffer.toString(this.encoding, 0, this.alignedBytes) - this.alignedBytes = 0 - return leftover -} - -function alignedWrite(buffer) { - var rem = (this.alignedBytes + buffer.length) % this.alignedBuffer.length - if (!rem && !this.alignedBytes) return buffer.toString(this.encoding) - - var returnBuffer = new Buffer(this.alignedBytes + buffer.length - rem) - - this.alignedBuffer.copy(returnBuffer, 0, 0, this.alignedBytes) - buffer.copy(returnBuffer, this.alignedBytes, 0, buffer.length - rem) - - buffer.copy(this.alignedBuffer, 0, buffer.length - rem, buffer.length) - this.alignedBytes = rem - - return returnBuffer.toString(this.encoding) -} diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/LICENSE b/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/LICENSE deleted file mode 100644 index 1bc286f..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2015, Salesforce.com, Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -2. 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. - -3. Neither the name of Salesforce.com 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. - -=== - -The following exceptions apply: - -=== - -`public_suffix_list.dat` was obtained from - via -. The license for this file is MPL/2.0. The header of -that file reads as follows: - - // This Source Code Form is subject to the terms of the Mozilla Public - // License, v. 2.0. If a copy of the MPL was not distributed with this - // file, You can obtain one at http://mozilla.org/MPL/2.0/. diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/README.md b/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/README.md deleted file mode 100644 index ba2bdbb..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/README.md +++ /dev/null @@ -1,506 +0,0 @@ -[RFC6265](https://tools.ietf.org/html/rfc6265) Cookies and CookieJar for Node.js - -[![npm package](https://nodei.co/npm/tough-cookie.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/tough-cookie/) - -[![Build Status](https://travis-ci.org/salesforce/tough-cookie.png?branch=master)](https://travis-ci.org/salesforce/tough-cookie) - -# Synopsis - -``` javascript -var tough = require('tough-cookie'); -var Cookie = tough.Cookie; -var cookie = Cookie.parse(header); -cookie.value = 'somethingdifferent'; -header = cookie.toString(); - -var cookiejar = new tough.CookieJar(); -cookiejar.setCookie(cookie, 'http://currentdomain.example.com/path', cb); -// ... -cookiejar.getCookies('http://example.com/otherpath',function(err,cookies) { - res.headers['cookie'] = cookies.join('; '); -}); -``` - -# Installation - -It's _so_ easy! - -`npm install tough-cookie` - -Why the name? NPM modules `cookie`, `cookies` and `cookiejar` were already taken. - -## Version Support - -Support for versions of node.js will follow that of the [request](https://www.npmjs.com/package/request) module. - -# API - -## tough - -Functions on the module you get from `require('tough-cookie')`. All can be used as pure functions and don't need to be "bound". - -**Note**: prior to 1.0.x, several of these functions took a `strict` parameter. This has since been removed from the API as it was no longer necessary. - -### `parseDate(string)` - -Parse a cookie date string into a `Date`. Parses according to RFC6265 Section 5.1.1, not `Date.parse()`. - -### `formatDate(date)` - -Format a Date into a RFC1123 string (the RFC6265-recommended format). - -### `canonicalDomain(str)` - -Transforms a domain-name into a canonical domain-name. The canonical domain-name is a trimmed, lowercased, stripped-of-leading-dot and optionally punycode-encoded domain-name (Section 5.1.2 of RFC6265). For the most part, this function is idempotent (can be run again on its output without ill effects). - -### `domainMatch(str,domStr[,canonicalize=true])` - -Answers "does this real domain match the domain in a cookie?". The `str` is the "current" domain-name and the `domStr` is the "cookie" domain-name. Matches according to RFC6265 Section 5.1.3, but it helps to think of it as a "suffix match". - -The `canonicalize` parameter will run the other two paramters through `canonicalDomain` or not. - -### `defaultPath(path)` - -Given a current request/response path, gives the Path apropriate for storing in a cookie. This is basically the "directory" of a "file" in the path, but is specified by Section 5.1.4 of the RFC. - -The `path` parameter MUST be _only_ the pathname part of a URI (i.e. excludes the hostname, query, fragment, etc.). This is the `.pathname` property of node's `uri.parse()` output. - -### `pathMatch(reqPath,cookiePath)` - -Answers "does the request-path path-match a given cookie-path?" as per RFC6265 Section 5.1.4. Returns a boolean. - -This is essentially a prefix-match where `cookiePath` is a prefix of `reqPath`. - -### `parse(cookieString[, options])` - -alias for `Cookie.parse(cookieString[, options])` - -### `fromJSON(string)` - -alias for `Cookie.fromJSON(string)` - -### `getPublicSuffix(hostname)` - -Returns the public suffix of this hostname. The public suffix is the shortest domain-name upon which a cookie can be set. Returns `null` if the hostname cannot have cookies set for it. - -For example: `www.example.com` and `www.subdomain.example.com` both have public suffix `example.com`. - -For further information, see http://publicsuffix.org/. This module derives its list from that site. - -### `cookieCompare(a,b)` - -For use with `.sort()`, sorts a list of cookies into the recommended order given in the RFC (Section 5.4 step 2). The sort algorithm is, in order of precedence: - -* Longest `.path` -* oldest `.creation` (which has a 1ms precision, same as `Date`) -* lowest `.creationIndex` (to get beyond the 1ms precision) - -``` javascript -var cookies = [ /* unsorted array of Cookie objects */ ]; -cookies = cookies.sort(cookieCompare); -``` - -**Note**: Since JavaScript's `Date` is limited to a 1ms precision, cookies within the same milisecond are entirely possible. This is especially true when using the `now` option to `.setCookie()`. The `.creationIndex` property is a per-process global counter, assigned during construction with `new Cookie()`. This preserves the spirit of the RFC sorting: older cookies go first. This works great for `MemoryCookieStore`, since `Set-Cookie` headers are parsed in order, but may not be so great for distributed systems. Sophisticated `Store`s may wish to set this to some other _logical clock_ such that if cookies A and B are created in the same millisecond, but cookie A is created before cookie B, then `A.creationIndex < B.creationIndex`. If you want to alter the global counter, which you probably _shouldn't_ do, it's stored in `Cookie.cookiesCreated`. - -### `permuteDomain(domain)` - -Generates a list of all possible domains that `domainMatch()` the parameter. May be handy for implementing cookie stores. - -### `permutePath(path)` - -Generates a list of all possible paths that `pathMatch()` the parameter. May be handy for implementing cookie stores. - - -## Cookie - -Exported via `tough.Cookie`. - -### `Cookie.parse(cookieString[, options])` - -Parses a single Cookie or Set-Cookie HTTP header into a `Cookie` object. Returns `undefined` if the string can't be parsed. - -The options parameter is not required and currently has only one property: - - * _loose_ - boolean - if `true` enable parsing of key-less cookies like `=abc` and `=`, which are not RFC-compliant. - -If options is not an object, it is ignored, which means you can use `Array#map` with it. - -Here's how to process the Set-Cookie header(s) on a node HTTP/HTTPS response: - -``` javascript -if (res.headers['set-cookie'] instanceof Array) - cookies = res.headers['set-cookie'].map(Cookie.parse); -else - cookies = [Cookie.parse(res.headers['set-cookie'])]; -``` - -### Properties - -Cookie object properties: - - * _key_ - string - the name or key of the cookie (default "") - * _value_ - string - the value of the cookie (default "") - * _expires_ - `Date` - if set, the `Expires=` attribute of the cookie (defaults to the string `"Infinity"`). See `setExpires()` - * _maxAge_ - seconds - if set, the `Max-Age=` attribute _in seconds_ of the cookie. May also be set to strings `"Infinity"` and `"-Infinity"` for non-expiry and immediate-expiry, respectively. See `setMaxAge()` - * _domain_ - string - the `Domain=` attribute of the cookie - * _path_ - string - the `Path=` of the cookie - * _secure_ - boolean - the `Secure` cookie flag - * _httpOnly_ - boolean - the `HttpOnly` cookie flag - * _extensions_ - `Array` - any unrecognized cookie attributes as strings (even if equal-signs inside) - * _creation_ - `Date` - when this cookie was constructed - * _creationIndex_ - number - set at construction, used to provide greater sort precision (please see `cookieCompare(a,b)` for a full explanation) - -After a cookie has been passed through `CookieJar.setCookie()` it will have the following additional attributes: - - * _hostOnly_ - boolean - is this a host-only cookie (i.e. no Domain field was set, but was instead implied) - * _pathIsDefault_ - boolean - if true, there was no Path field on the cookie and `defaultPath()` was used to derive one. - * _creation_ - `Date` - **modified** from construction to when the cookie was added to the jar - * _lastAccessed_ - `Date` - last time the cookie got accessed. Will affect cookie cleaning once implemented. Using `cookiejar.getCookies(...)` will update this attribute. - -### `Cookie([{properties}])` - -Receives an options object that can contain any of the above Cookie properties, uses the default for unspecified properties. - -### `.toString()` - -encode to a Set-Cookie header value. The Expires cookie field is set using `formatDate()`, but is omitted entirely if `.expires` is `Infinity`. - -### `.cookieString()` - -encode to a Cookie header value (i.e. the `.key` and `.value` properties joined with '='). - -### `.setExpires(String)` - -sets the expiry based on a date-string passed through `parseDate()`. If parseDate returns `null` (i.e. can't parse this date string), `.expires` is set to `"Infinity"` (a string) is set. - -### `.setMaxAge(number)` - -sets the maxAge in seconds. Coerces `-Infinity` to `"-Infinity"` and `Infinity` to `"Infinity"` so it JSON serializes correctly. - -### `.expiryTime([now=Date.now()])` - -### `.expiryDate([now=Date.now()])` - -expiryTime() Computes the absolute unix-epoch milliseconds that this cookie expires. expiryDate() works similarly, except it returns a `Date` object. Note that in both cases the `now` parameter should be milliseconds. - -Max-Age takes precedence over Expires (as per the RFC). The `.creation` attribute -- or, by default, the `now` paramter -- is used to offset the `.maxAge` attribute. - -If Expires (`.expires`) is set, that's returned. - -Otherwise, `expiryTime()` returns `Infinity` and `expiryDate()` returns a `Date` object for "Tue, 19 Jan 2038 03:14:07 GMT" (latest date that can be expressed by a 32-bit `time_t`; the common limit for most user-agents). - -### `.TTL([now=Date.now()])` - -compute the TTL relative to `now` (milliseconds). The same precedence rules as for `expiryTime`/`expiryDate` apply. - -The "number" `Infinity` is returned for cookies without an explicit expiry and `0` is returned if the cookie is expired. Otherwise a time-to-live in milliseconds is returned. - -### `.canonicalizedDoman()` - -### `.cdomain()` - -return the canonicalized `.domain` field. This is lower-cased and punycode (RFC3490) encoded if the domain has any non-ASCII characters. - -### `.toJSON()` - -For convenience in using `JSON.serialize(cookie)`. Returns a plain-old `Object` that can be JSON-serialized. - -Any `Date` properties (i.e., `.expires`, `.creation`, and `.lastAccessed`) are exported in ISO format (`.toISOString()`). - -**NOTE**: Custom `Cookie` properties will be discarded. In tough-cookie 1.x, since there was no `.toJSON` method explicitly defined, all enumerable properties were captured. If you want a property to be serialized, add the property name to the `Cookie.serializableProperties` Array. - -### `Cookie.fromJSON(strOrObj)` - -Does the reverse of `cookie.toJSON()`. If passed a string, will `JSON.parse()` that first. - -Any `Date` properties (i.e., `.expires`, `.creation`, and `.lastAccessed`) are parsed via `Date.parse()`, not the tough-cookie `parseDate`, since it's JavaScript/JSON-y timestamps being handled at this layer. - -Returns `null` upon JSON parsing error. - -### `.clone()` - -Does a deep clone of this cookie, exactly implemented as `Cookie.fromJSON(cookie.toJSON())`. - -### `.validate()` - -Status: *IN PROGRESS*. Works for a few things, but is by no means comprehensive. - -validates cookie attributes for semantic correctness. Useful for "lint" checking any Set-Cookie headers you generate. For now, it returns a boolean, but eventually could return a reason string -- you can future-proof with this construct: - -``` javascript -if (cookie.validate() === true) { - // it's tasty -} else { - // yuck! -} -``` - - -## CookieJar - -Exported via `tough.CookieJar`. - -### `CookieJar([store],[options])` - -Simply use `new CookieJar()`. If you'd like to use a custom store, pass that to the constructor otherwise a `MemoryCookieStore` will be created and used. - -The `options` object can be omitted and can have the following properties: - - * _rejectPublicSuffixes_ - boolean - default `true` - reject cookies with domains like "com" and "co.uk" - * _looseMode_ - boolean - default `false` - accept malformed cookies like `bar` and `=bar`, which have an implied empty name. - This is not in the standard, but is used sometimes on the web and is accepted by (most) browsers. - -Since eventually this module would like to support database/remote/etc. CookieJars, continuation passing style is used for CookieJar methods. - -### `.setCookie(cookieOrString, currentUrl, [{options},] cb(err,cookie))` - -Attempt to set the cookie in the cookie jar. If the operation fails, an error will be given to the callback `cb`, otherwise the cookie is passed through. The cookie will have updated `.creation`, `.lastAccessed` and `.hostOnly` properties. - -The `options` object can be omitted and can have the following properties: - - * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API. Affects HttpOnly cookies. - * _secure_ - boolean - autodetect from url - indicates if this is a "Secure" API. If the currentUrl starts with `https:` or `wss:` then this is defaulted to `true`, otherwise `false`. - * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies - * _ignoreError_ - boolean - default `false` - silently ignore things like parse errors and invalid domains. `Store` errors aren't ignored by this option. - -As per the RFC, the `.hostOnly` property is set if there was no "Domain=" parameter in the cookie string (or `.domain` was null on the Cookie object). The `.domain` property is set to the fully-qualified hostname of `currentUrl` in this case. Matching this cookie requires an exact hostname match (not a `domainMatch` as per usual). - -### `.setCookieSync(cookieOrString, currentUrl, [{options}])` - -Synchronous version of `setCookie`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). - -### `.getCookies(currentUrl, [{options},] cb(err,cookies))` - -Retrieve the list of cookies that can be sent in a Cookie header for the current url. - -If an error is encountered, that's passed as `err` to the callback, otherwise an `Array` of `Cookie` objects is passed. The array is sorted with `cookieCompare()` unless the `{sort:false}` option is given. - -The `options` object can be omitted and can have the following properties: - - * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API. Affects HttpOnly cookies. - * _secure_ - boolean - autodetect from url - indicates if this is a "Secure" API. If the currentUrl starts with `https:` or `wss:` then this is defaulted to `true`, otherwise `false`. - * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies - * _expire_ - boolean - default `true` - perform expiry-time checking of cookies and asynchronously remove expired cookies from the store. Using `false` will return expired cookies and **not** remove them from the store (which is useful for replaying Set-Cookie headers, potentially). - * _allPaths_ - boolean - default `false` - if `true`, do not scope cookies by path. The default uses RFC-compliant path scoping. **Note**: may not be supported by the underlying store (the default `MemoryCookieStore` supports it). - -The `.lastAccessed` property of the returned cookies will have been updated. - -### `.getCookiesSync(currentUrl, [{options}])` - -Synchronous version of `getCookies`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). - -### `.getCookieString(...)` - -Accepts the same options as `.getCookies()` but passes a string suitable for a Cookie header rather than an array to the callback. Simply maps the `Cookie` array via `.cookieString()`. - -### `.getCookieStringSync(...)` - -Synchronous version of `getCookieString`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). - -### `.getSetCookieStrings(...)` - -Returns an array of strings suitable for **Set-Cookie** headers. Accepts the same options as `.getCookies()`. Simply maps the cookie array via `.toString()`. - -### `.getSetCookieStringsSync(...)` - -Synchronous version of `getSetCookieStrings`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). - -### `.serialize(cb(err,serializedObject))` - -Serialize the Jar if the underlying store supports `.getAllCookies`. - -**NOTE**: Custom `Cookie` properties will be discarded. If you want a property to be serialized, add the property name to the `Cookie.serializableProperties` Array. - -See [Serialization Format]. - -### `.serializeSync()` - -Sync version of .serialize - -### `.toJSON()` - -Alias of .serializeSync() for the convenience of `JSON.stringify(cookiejar)`. - -### `CookieJar.deserialize(serialized, [store], cb(err,object))` - -A new Jar is created and the serialized Cookies are added to the underlying store. Each `Cookie` is added via `store.putCookie` in the order in which they appear in the serialization. - -The `store` argument is optional, but should be an instance of `Store`. By default, a new instance of `MemoryCookieStore` is created. - -As a convenience, if `serialized` is a string, it is passed through `JSON.parse` first. If that throws an error, this is passed to the callback. - -### `CookieJar.deserializeSync(serialized, [store])` - -Sync version of `.deserialize`. _Note_ that the `store` must be synchronous for this to work. - -### `CookieJar.fromJSON(string)` - -Alias of `.deserializeSync` to provide consistency with `Cookie.fromJSON()`. - -### `.clone([store,]cb(err,newJar))` - -Produces a deep clone of this jar. Modifications to the original won't affect the clone, and vice versa. - -The `store` argument is optional, but should be an instance of `Store`. By default, a new instance of `MemoryCookieStore` is created. Transferring between store types is supported so long as the source implements `.getAllCookies()` and the destination implements `.putCookie()`. - -### `.cloneSync([store])` - -Synchronous version of `.clone`, returning a new `CookieJar` instance. - -The `store` argument is optional, but must be a _synchronous_ `Store` instance if specified. If not passed, a new instance of `MemoryCookieStore` is used. - -The _source_ and _destination_ must both be synchronous `Store`s. If one or both stores are asynchronous, use `.clone` instead. Recall that `MemoryCookieStore` supports both synchronous and asynchronous API calls. - -## Store - -Base class for CookieJar stores. Available as `tough.Store`. - -## Store API - -The storage model for each `CookieJar` instance can be replaced with a custom implementation. The default is `MemoryCookieStore` which can be found in the `lib/memstore.js` file. The API uses continuation-passing-style to allow for asynchronous stores. - -Stores should inherit from the base `Store` class, which is available as `require('tough-cookie').Store`. - -Stores are asynchronous by default, but if `store.synchronous` is set to `true`, then the `*Sync` methods on the of the containing `CookieJar` can be used (however, the continuation-passing style - -All `domain` parameters will have been normalized before calling. - -The Cookie store must have all of the following methods. - -### `store.findCookie(domain, path, key, cb(err,cookie))` - -Retrieve a cookie with the given domain, path and key (a.k.a. name). The RFC maintains that exactly one of these cookies should exist in a store. If the store is using versioning, this means that the latest/newest such cookie should be returned. - -Callback takes an error and the resulting `Cookie` object. If no cookie is found then `null` MUST be passed instead (i.e. not an error). - -### `store.findCookies(domain, path, cb(err,cookies))` - -Locates cookies matching the given domain and path. This is most often called in the context of `cookiejar.getCookies()` above. - -If no cookies are found, the callback MUST be passed an empty array. - -The resulting list will be checked for applicability to the current request according to the RFC (domain-match, path-match, http-only-flag, secure-flag, expiry, etc.), so it's OK to use an optimistic search algorithm when implementing this method. However, the search algorithm used SHOULD try to find cookies that `domainMatch()` the domain and `pathMatch()` the path in order to limit the amount of checking that needs to be done. - -As of version 0.9.12, the `allPaths` option to `cookiejar.getCookies()` above will cause the path here to be `null`. If the path is `null`, path-matching MUST NOT be performed (i.e. domain-matching only). - -### `store.putCookie(cookie, cb(err))` - -Adds a new cookie to the store. The implementation SHOULD replace any existing cookie with the same `.domain`, `.path`, and `.key` properties -- depending on the nature of the implementation, it's possible that between the call to `fetchCookie` and `putCookie` that a duplicate `putCookie` can occur. - -The `cookie` object MUST NOT be modified; the caller will have already updated the `.creation` and `.lastAccessed` properties. - -Pass an error if the cookie cannot be stored. - -### `store.updateCookie(oldCookie, newCookie, cb(err))` - -Update an existing cookie. The implementation MUST update the `.value` for a cookie with the same `domain`, `.path` and `.key`. The implementation SHOULD check that the old value in the store is equivalent to `oldCookie` - how the conflict is resolved is up to the store. - -The `.lastAccessed` property will always be different between the two objects (to the precision possible via JavaScript's clock). Both `.creation` and `.creationIndex` are guaranteed to be the same. Stores MAY ignore or defer the `.lastAccessed` change at the cost of affecting how cookies are selected for automatic deletion (e.g., least-recently-used, which is up to the store to implement). - -Stores may wish to optimize changing the `.value` of the cookie in the store versus storing a new cookie. If the implementation doesn't define this method a stub that calls `putCookie(newCookie,cb)` will be added to the store object. - -The `newCookie` and `oldCookie` objects MUST NOT be modified. - -Pass an error if the newCookie cannot be stored. - -### `store.removeCookie(domain, path, key, cb(err))` - -Remove a cookie from the store (see notes on `findCookie` about the uniqueness constraint). - -The implementation MUST NOT pass an error if the cookie doesn't exist; only pass an error due to the failure to remove an existing cookie. - -### `store.removeCookies(domain, path, cb(err))` - -Removes matching cookies from the store. The `path` parameter is optional, and if missing means all paths in a domain should be removed. - -Pass an error ONLY if removing any existing cookies failed. - -### `store.getAllCookies(cb(err, cookies))` - -Produces an `Array` of all cookies during `jar.serialize()`. The items in the array can be true `Cookie` objects or generic `Object`s with the [Serialization Format] data structure. - -Cookies SHOULD be returned in creation order to preserve sorting via `compareCookies()`. For reference, `MemoryCookieStore` will sort by `.creationIndex` since it uses true `Cookie` objects internally. If you don't return the cookies in creation order, they'll still be sorted by creation time, but this only has a precision of 1ms. See `compareCookies` for more detail. - -Pass an error if retrieval fails. - -## MemoryCookieStore - -Inherits from `Store`. - -A just-in-memory CookieJar synchronous store implementation, used by default. Despite being a synchronous implementation, it's usable with both the synchronous and asynchronous forms of the `CookieJar` API. - -## Community Cookie Stores - -These are some Store implementations authored and maintained by the community. They aren't official and we don't vouch for them but you may be interested to have a look: - -- [`db-cookie-store`](https://github.com/JSBizon/db-cookie-store): SQL including SQLite-based databases -- [`file-cookie-store`](https://github.com/JSBizon/file-cookie-store): Netscape cookie file format on disk -- [`redis-cookie-store`](https://github.com/benkroeger/redis-cookie-store): Redis -- [`tough-cookie-filestore`](https://github.com/mitsuru/tough-cookie-filestore): JSON on disk -- [`tough-cookie-web-storage-store`](https://github.com/exponentjs/tough-cookie-web-storage-store): DOM localStorage and sessionStorage - - -# Serialization Format - -**NOTE**: if you want to have custom `Cookie` properties serialized, add the property name to `Cookie.serializableProperties`. - -```js - { - // The version of tough-cookie that serialized this jar. - version: 'tough-cookie@1.x.y', - - // add the store type, to make humans happy: - storeType: 'MemoryCookieStore', - - // CookieJar configuration: - rejectPublicSuffixes: true, - // ... future items go here - - // Gets filled from jar.store.getAllCookies(): - cookies: [ - { - key: 'string', - value: 'string', - // ... - /* other Cookie.serializableProperties go here */ - } - ] - } -``` - -# Copyright and License - -(tl;dr: BSD-3-Clause with some MPL/2.0) - -```text - Copyright (c) 2015, Salesforce.com, Inc. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. 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. - - 3. Neither the name of Salesforce.com 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. -``` - -Portions may be licensed under different licenses (in particular `public_suffix_list.dat` is MPL/2.0); please read that file and the LICENSE file for full details. diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/lib/cookie.js b/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/lib/cookie.js deleted file mode 100644 index c3dacfe..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/lib/cookie.js +++ /dev/null @@ -1,1336 +0,0 @@ -/*! - * Copyright (c) 2015, Salesforce.com, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. 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. - * - * 3. Neither the name of Salesforce.com 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. - */ -'use strict'; -var net = require('net'); -var urlParse = require('url').parse; -var pubsuffix = require('./pubsuffix'); -var Store = require('./store').Store; -var MemoryCookieStore = require('./memstore').MemoryCookieStore; -var pathMatch = require('./pathMatch').pathMatch; -var VERSION = require('../package.json').version; - -var punycode; -try { - punycode = require('punycode'); -} catch(e) { - console.warn("cookie: can't load punycode; won't use punycode for domain normalization"); -} - -var DATE_DELIM = /[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]/; - -// From RFC6265 S4.1.1 -// note that it excludes \x3B ";" -var COOKIE_OCTET = /[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]/; -var COOKIE_OCTETS = new RegExp('^'+COOKIE_OCTET.source+'+$'); - -var CONTROL_CHARS = /[\x00-\x1F]/; - -// Double quotes are part of the value (see: S4.1.1). -// '\r', '\n' and '\0' should be treated as a terminator in the "relaxed" mode -// (see: https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/parsed_cookie.cc#L60) -// '=' and ';' are attribute/values separators -// (see: https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/parsed_cookie.cc#L64) -var COOKIE_PAIR = /^(([^=;]+))\s*=\s*([^\n\r\0]*)/; - -// Used to parse non-RFC-compliant cookies like '=abc' when given the `loose` -// option in Cookie.parse: -var LOOSE_COOKIE_PAIR = /^((?:=)?([^=;]*)\s*=\s*)?([^\n\r\0]*)/; - -// RFC6265 S4.1.1 defines path value as 'any CHAR except CTLs or ";"' -// Note ';' is \x3B -var PATH_VALUE = /[\x20-\x3A\x3C-\x7E]+/; - -var DAY_OF_MONTH = /^(\d{1,2})[^\d]*$/; -var TIME = /^(\d{1,2})[^\d]*:(\d{1,2})[^\d]*:(\d{1,2})[^\d]*$/; -var MONTH = /^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)/i; - -var MONTH_TO_NUM = { - jan:0, feb:1, mar:2, apr:3, may:4, jun:5, - jul:6, aug:7, sep:8, oct:9, nov:10, dec:11 -}; -var NUM_TO_MONTH = [ - 'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec' -]; -var NUM_TO_DAY = [ - 'Sun','Mon','Tue','Wed','Thu','Fri','Sat' -]; - -var YEAR = /^(\d{2}|\d{4})$/; // 2 to 4 digits - -var MAX_TIME = 2147483647000; // 31-bit max -var MIN_TIME = 0; // 31-bit min - - -// RFC6265 S5.1.1 date parser: -function parseDate(str) { - if (!str) { - return; - } - - /* RFC6265 S5.1.1: - * 2. Process each date-token sequentially in the order the date-tokens - * appear in the cookie-date - */ - var tokens = str.split(DATE_DELIM); - if (!tokens) { - return; - } - - var hour = null; - var minutes = null; - var seconds = null; - var day = null; - var month = null; - var year = null; - - for (var i=0; i 23 || minutes > 59 || seconds > 59) { - return; - } - - continue; - } - } - - /* 2.2. If the found-day-of-month flag is not set and the date-token matches - * the day-of-month production, set the found-day-of- month flag and set - * the day-of-month-value to the number denoted by the date-token. Skip - * the remaining sub-steps and continue to the next date-token. - */ - if (day === null) { - result = DAY_OF_MONTH.exec(token); - if (result) { - day = parseInt(result, 10); - /* RFC6265 S5.1.1.5: - * [fail if] the day-of-month-value is less than 1 or greater than 31 - */ - if(day < 1 || day > 31) { - return; - } - continue; - } - } - - /* 2.3. If the found-month flag is not set and the date-token matches the - * month production, set the found-month flag and set the month-value to - * the month denoted by the date-token. Skip the remaining sub-steps and - * continue to the next date-token. - */ - if (month === null) { - result = MONTH.exec(token); - if (result) { - month = MONTH_TO_NUM[result[1].toLowerCase()]; - continue; - } - } - - /* 2.4. If the found-year flag is not set and the date-token matches the year - * production, set the found-year flag and set the year-value to the number - * denoted by the date-token. Skip the remaining sub-steps and continue to - * the next date-token. - */ - if (year === null) { - result = YEAR.exec(token); - if (result) { - year = parseInt(result[0], 10); - /* From S5.1.1: - * 3. If the year-value is greater than or equal to 70 and less - * than or equal to 99, increment the year-value by 1900. - * 4. If the year-value is greater than or equal to 0 and less - * than or equal to 69, increment the year-value by 2000. - */ - if (70 <= year && year <= 99) { - year += 1900; - } else if (0 <= year && year <= 69) { - year += 2000; - } - - if (year < 1601) { - return; // 5. ... the year-value is less than 1601 - } - } - } - } - - if (seconds === null || day === null || month === null || year === null) { - return; // 5. ... at least one of the found-day-of-month, found-month, found- - // year, or found-time flags is not set, - } - - return new Date(Date.UTC(year, month, day, hour, minutes, seconds)); -} - -function formatDate(date) { - var d = date.getUTCDate(); d = d >= 10 ? d : '0'+d; - var h = date.getUTCHours(); h = h >= 10 ? h : '0'+h; - var m = date.getUTCMinutes(); m = m >= 10 ? m : '0'+m; - var s = date.getUTCSeconds(); s = s >= 10 ? s : '0'+s; - return NUM_TO_DAY[date.getUTCDay()] + ', ' + - d+' '+ NUM_TO_MONTH[date.getUTCMonth()] +' '+ date.getUTCFullYear() +' '+ - h+':'+m+':'+s+' GMT'; -} - -// S5.1.2 Canonicalized Host Names -function canonicalDomain(str) { - if (str == null) { - return null; - } - str = str.trim().replace(/^\./,''); // S4.1.2.3 & S5.2.3: ignore leading . - - // convert to IDN if any non-ASCII characters - if (punycode && /[^\u0001-\u007f]/.test(str)) { - str = punycode.toASCII(str); - } - - return str.toLowerCase(); -} - -// S5.1.3 Domain Matching -function domainMatch(str, domStr, canonicalize) { - if (str == null || domStr == null) { - return null; - } - if (canonicalize !== false) { - str = canonicalDomain(str); - domStr = canonicalDomain(domStr); - } - - /* - * "The domain string and the string are identical. (Note that both the - * domain string and the string will have been canonicalized to lower case at - * this point)" - */ - if (str == domStr) { - return true; - } - - /* "All of the following [three] conditions hold:" (order adjusted from the RFC) */ - - /* "* The string is a host name (i.e., not an IP address)." */ - if (net.isIP(str)) { - return false; - } - - /* "* The domain string is a suffix of the string" */ - var idx = str.indexOf(domStr); - if (idx <= 0) { - return false; // it's a non-match (-1) or prefix (0) - } - - // e.g "a.b.c".indexOf("b.c") === 2 - // 5 === 3+2 - if (str.length !== domStr.length + idx) { // it's not a suffix - return false; - } - - /* "* The last character of the string that is not included in the domain - * string is a %x2E (".") character." */ - if (str.substr(idx-1,1) !== '.') { - return false; - } - - return true; -} - - -// RFC6265 S5.1.4 Paths and Path-Match - -/* - * "The user agent MUST use an algorithm equivalent to the following algorithm - * to compute the default-path of a cookie:" - * - * Assumption: the path (and not query part or absolute uri) is passed in. - */ -function defaultPath(path) { - // "2. If the uri-path is empty or if the first character of the uri-path is not - // a %x2F ("/") character, output %x2F ("/") and skip the remaining steps. - if (!path || path.substr(0,1) !== "/") { - return "/"; - } - - // "3. If the uri-path contains no more than one %x2F ("/") character, output - // %x2F ("/") and skip the remaining step." - if (path === "/") { - return path; - } - - var rightSlash = path.lastIndexOf("/"); - if (rightSlash === 0) { - return "/"; - } - - // "4. Output the characters of the uri-path from the first character up to, - // but not including, the right-most %x2F ("/")." - return path.slice(0, rightSlash); -} - - -function parse(str, options) { - if (!options || typeof options !== 'object') { - options = {}; - } - str = str.trim(); - - // We use a regex to parse the "name-value-pair" part of S5.2 - var firstSemi = str.indexOf(';'); // S5.2 step 1 - var pairRe = options.loose ? LOOSE_COOKIE_PAIR : COOKIE_PAIR; - var result = pairRe.exec(firstSemi === -1 ? str : str.substr(0,firstSemi)); - - // Rx satisfies the "the name string is empty" and "lacks a %x3D ("=")" - // constraints as well as trimming any whitespace. - if (!result) { - return; - } - - var c = new Cookie(); - if (result[1]) { - c.key = result[2].trim(); - } else { - c.key = ''; - } - c.value = result[3].trim(); - if (CONTROL_CHARS.test(c.key) || CONTROL_CHARS.test(c.value)) { - return; - } - - if (firstSemi === -1) { - return c; - } - - // S5.2.3 "unparsed-attributes consist of the remainder of the set-cookie-string - // (including the %x3B (";") in question)." plus later on in the same section - // "discard the first ";" and trim". - var unparsed = str.slice(firstSemi + 1).trim(); - - // "If the unparsed-attributes string is empty, skip the rest of these - // steps." - if (unparsed.length === 0) { - return c; - } - - /* - * S5.2 says that when looping over the items "[p]rocess the attribute-name - * and attribute-value according to the requirements in the following - * subsections" for every item. Plus, for many of the individual attributes - * in S5.3 it says to use the "attribute-value of the last attribute in the - * cookie-attribute-list". Therefore, in this implementation, we overwrite - * the previous value. - */ - var cookie_avs = unparsed.split(';'); - while (cookie_avs.length) { - var av = cookie_avs.shift().trim(); - if (av.length === 0) { // happens if ";;" appears - continue; - } - var av_sep = av.indexOf('='); - var av_key, av_value; - - if (av_sep === -1) { - av_key = av; - av_value = null; - } else { - av_key = av.substr(0,av_sep); - av_value = av.substr(av_sep+1); - } - - av_key = av_key.trim().toLowerCase(); - - if (av_value) { - av_value = av_value.trim(); - } - - switch(av_key) { - case 'expires': // S5.2.1 - if (av_value) { - var exp = parseDate(av_value); - // "If the attribute-value failed to parse as a cookie date, ignore the - // cookie-av." - if (exp) { - // over and underflow not realistically a concern: V8's getTime() seems to - // store something larger than a 32-bit time_t (even with 32-bit node) - c.expires = exp; - } - } - break; - - case 'max-age': // S5.2.2 - if (av_value) { - // "If the first character of the attribute-value is not a DIGIT or a "-" - // character ...[or]... If the remainder of attribute-value contains a - // non-DIGIT character, ignore the cookie-av." - if (/^-?[0-9]+$/.test(av_value)) { - var delta = parseInt(av_value, 10); - // "If delta-seconds is less than or equal to zero (0), let expiry-time - // be the earliest representable date and time." - c.setMaxAge(delta); - } - } - break; - - case 'domain': // S5.2.3 - // "If the attribute-value is empty, the behavior is undefined. However, - // the user agent SHOULD ignore the cookie-av entirely." - if (av_value) { - // S5.2.3 "Let cookie-domain be the attribute-value without the leading %x2E - // (".") character." - var domain = av_value.trim().replace(/^\./, ''); - if (domain) { - // "Convert the cookie-domain to lower case." - c.domain = domain.toLowerCase(); - } - } - break; - - case 'path': // S5.2.4 - /* - * "If the attribute-value is empty or if the first character of the - * attribute-value is not %x2F ("/"): - * Let cookie-path be the default-path. - * Otherwise: - * Let cookie-path be the attribute-value." - * - * We'll represent the default-path as null since it depends on the - * context of the parsing. - */ - c.path = av_value && av_value[0] === "/" ? av_value : null; - break; - - case 'secure': // S5.2.5 - /* - * "If the attribute-name case-insensitively matches the string "Secure", - * the user agent MUST append an attribute to the cookie-attribute-list - * with an attribute-name of Secure and an empty attribute-value." - */ - c.secure = true; - break; - - case 'httponly': // S5.2.6 -- effectively the same as 'secure' - c.httpOnly = true; - break; - - default: - c.extensions = c.extensions || []; - c.extensions.push(av); - break; - } - } - - return c; -} - -// avoid the V8 deoptimization monster! -function jsonParse(str) { - var obj; - try { - obj = JSON.parse(str); - } catch (e) { - return e; - } - return obj; -} - -function fromJSON(str) { - if (!str) { - return null; - } - - var obj; - if (typeof str === 'string') { - obj = jsonParse(str); - if (obj instanceof Error) { - return null; - } - } else { - // assume it's an Object - obj = str; - } - - var c = new Cookie(); - for (var i=0; i 1) { - var lindex = path.lastIndexOf('/'); - if (lindex === 0) { - break; - } - path = path.substr(0,lindex); - permutations.push(path); - } - permutations.push('/'); - return permutations; -} - -function getCookieContext(url) { - if (url instanceof Object) { - return url; - } - // NOTE: decodeURI will throw on malformed URIs (see GH-32). - // Therefore, we will just skip decoding for such URIs. - try { - url = decodeURI(url); - } - catch(err) { - // Silently swallow error - } - - return urlParse(url); -} - -function Cookie(options) { - options = options || {}; - - Object.keys(options).forEach(function(prop) { - if (Cookie.prototype.hasOwnProperty(prop) && - Cookie.prototype[prop] !== options[prop] && - prop.substr(0,1) !== '_') - { - this[prop] = options[prop]; - } - }, this); - - this.creation = this.creation || new Date(); - - // used to break creation ties in cookieCompare(): - Object.defineProperty(this, 'creationIndex', { - configurable: false, - enumerable: false, // important for assert.deepEqual checks - writable: true, - value: ++Cookie.cookiesCreated - }); -} - -Cookie.cookiesCreated = 0; // incremented each time a cookie is created - -Cookie.parse = parse; -Cookie.fromJSON = fromJSON; - -Cookie.prototype.key = ""; -Cookie.prototype.value = ""; - -// the order in which the RFC has them: -Cookie.prototype.expires = "Infinity"; // coerces to literal Infinity -Cookie.prototype.maxAge = null; // takes precedence over expires for TTL -Cookie.prototype.domain = null; -Cookie.prototype.path = null; -Cookie.prototype.secure = false; -Cookie.prototype.httpOnly = false; -Cookie.prototype.extensions = null; - -// set by the CookieJar: -Cookie.prototype.hostOnly = null; // boolean when set -Cookie.prototype.pathIsDefault = null; // boolean when set -Cookie.prototype.creation = null; // Date when set; defaulted by Cookie.parse -Cookie.prototype.lastAccessed = null; // Date when set -Object.defineProperty(Cookie.prototype, 'creationIndex', { - configurable: true, - enumerable: false, - writable: true, - value: 0 -}); - -Cookie.serializableProperties = Object.keys(Cookie.prototype) - .filter(function(prop) { - return !( - Cookie.prototype[prop] instanceof Function || - prop === 'creationIndex' || - prop.substr(0,1) === '_' - ); - }); - -Cookie.prototype.inspect = function inspect() { - var now = Date.now(); - return 'Cookie="'+this.toString() + - '; hostOnly='+(this.hostOnly != null ? this.hostOnly : '?') + - '; aAge='+(this.lastAccessed ? (now-this.lastAccessed.getTime())+'ms' : '?') + - '; cAge='+(this.creation ? (now-this.creation.getTime())+'ms' : '?') + - '"'; -}; - -Cookie.prototype.toJSON = function() { - var obj = {}; - - var props = Cookie.serializableProperties; - for (var i=0; i suffixLen) { - var publicSuffix = parts.slice(0,suffixLen+1).reverse().join('.'); - return converted ? punycode.toUnicode(publicSuffix) : publicSuffix; - } - - return null; -}; - -// The following generated structure is used under the MPL version 2.0 -// See public-suffix.txt for more information - -var index = module.exports.index = Object.freeze( -{"ac":true,"com.ac":true,"edu.ac":true,"gov.ac":true,"net.ac":true,"mil.ac":true,"org.ac":true,"ad":true,"nom.ad":true,"ae":true,"co.ae":true,"net.ae":true,"org.ae":true,"sch.ae":true,"ac.ae":true,"gov.ae":true,"mil.ae":true,"aero":true,"accident-investigation.aero":true,"accident-prevention.aero":true,"aerobatic.aero":true,"aeroclub.aero":true,"aerodrome.aero":true,"agents.aero":true,"aircraft.aero":true,"airline.aero":true,"airport.aero":true,"air-surveillance.aero":true,"airtraffic.aero":true,"air-traffic-control.aero":true,"ambulance.aero":true,"amusement.aero":true,"association.aero":true,"author.aero":true,"ballooning.aero":true,"broker.aero":true,"caa.aero":true,"cargo.aero":true,"catering.aero":true,"certification.aero":true,"championship.aero":true,"charter.aero":true,"civilaviation.aero":true,"club.aero":true,"conference.aero":true,"consultant.aero":true,"consulting.aero":true,"control.aero":true,"council.aero":true,"crew.aero":true,"design.aero":true,"dgca.aero":true,"educator.aero":true,"emergency.aero":true,"engine.aero":true,"engineer.aero":true,"entertainment.aero":true,"equipment.aero":true,"exchange.aero":true,"express.aero":true,"federation.aero":true,"flight.aero":true,"freight.aero":true,"fuel.aero":true,"gliding.aero":true,"government.aero":true,"groundhandling.aero":true,"group.aero":true,"hanggliding.aero":true,"homebuilt.aero":true,"insurance.aero":true,"journal.aero":true,"journalist.aero":true,"leasing.aero":true,"logistics.aero":true,"magazine.aero":true,"maintenance.aero":true,"marketplace.aero":true,"media.aero":true,"microlight.aero":true,"modelling.aero":true,"navigation.aero":true,"parachuting.aero":true,"paragliding.aero":true,"passenger-association.aero":true,"pilot.aero":true,"press.aero":true,"production.aero":true,"recreation.aero":true,"repbody.aero":true,"res.aero":true,"research.aero":true,"rotorcraft.aero":true,"safety.aero":true,"scientist.aero":true,"services.aero":true,"show.aero":true,"skydiving.aero":true,"software.aero":true,"student.aero":true,"taxi.aero":true,"trader.aero":true,"trading.aero":true,"trainer.aero":true,"union.aero":true,"workinggroup.aero":true,"works.aero":true,"af":true,"gov.af":true,"com.af":true,"org.af":true,"net.af":true,"edu.af":true,"ag":true,"com.ag":true,"org.ag":true,"net.ag":true,"co.ag":true,"nom.ag":true,"ai":true,"off.ai":true,"com.ai":true,"net.ai":true,"org.ai":true,"al":true,"com.al":true,"edu.al":true,"gov.al":true,"mil.al":true,"net.al":true,"org.al":true,"am":true,"an":true,"com.an":true,"net.an":true,"org.an":true,"edu.an":true,"ao":true,"ed.ao":true,"gv.ao":true,"og.ao":true,"co.ao":true,"pb.ao":true,"it.ao":true,"aq":true,"ar":true,"com.ar":true,"edu.ar":true,"gob.ar":true,"gov.ar":true,"int.ar":true,"mil.ar":true,"net.ar":true,"org.ar":true,"tur.ar":true,"arpa":true,"e164.arpa":true,"in-addr.arpa":true,"ip6.arpa":true,"iris.arpa":true,"uri.arpa":true,"urn.arpa":true,"as":true,"gov.as":true,"asia":true,"at":true,"ac.at":true,"co.at":true,"gv.at":true,"or.at":true,"au":true,"com.au":true,"net.au":true,"org.au":true,"edu.au":true,"gov.au":true,"asn.au":true,"id.au":true,"info.au":true,"conf.au":true,"oz.au":true,"act.au":true,"nsw.au":true,"nt.au":true,"qld.au":true,"sa.au":true,"tas.au":true,"vic.au":true,"wa.au":true,"act.edu.au":true,"nsw.edu.au":true,"nt.edu.au":true,"qld.edu.au":true,"sa.edu.au":true,"tas.edu.au":true,"vic.edu.au":true,"wa.edu.au":true,"qld.gov.au":true,"sa.gov.au":true,"tas.gov.au":true,"vic.gov.au":true,"wa.gov.au":true,"aw":true,"com.aw":true,"ax":true,"az":true,"com.az":true,"net.az":true,"int.az":true,"gov.az":true,"org.az":true,"edu.az":true,"info.az":true,"pp.az":true,"mil.az":true,"name.az":true,"pro.az":true,"biz.az":true,"ba":true,"org.ba":true,"net.ba":true,"edu.ba":true,"gov.ba":true,"mil.ba":true,"unsa.ba":true,"unbi.ba":true,"co.ba":true,"com.ba":true,"rs.ba":true,"bb":true,"biz.bb":true,"co.bb":true,"com.bb":true,"edu.bb":true,"gov.bb":true,"info.bb":true,"net.bb":true,"org.bb":true,"store.bb":true,"tv.bb":true,"*.bd":true,"be":true,"ac.be":true,"bf":true,"gov.bf":true,"bg":true,"a.bg":true,"b.bg":true,"c.bg":true,"d.bg":true,"e.bg":true,"f.bg":true,"g.bg":true,"h.bg":true,"i.bg":true,"j.bg":true,"k.bg":true,"l.bg":true,"m.bg":true,"n.bg":true,"o.bg":true,"p.bg":true,"q.bg":true,"r.bg":true,"s.bg":true,"t.bg":true,"u.bg":true,"v.bg":true,"w.bg":true,"x.bg":true,"y.bg":true,"z.bg":true,"0.bg":true,"1.bg":true,"2.bg":true,"3.bg":true,"4.bg":true,"5.bg":true,"6.bg":true,"7.bg":true,"8.bg":true,"9.bg":true,"bh":true,"com.bh":true,"edu.bh":true,"net.bh":true,"org.bh":true,"gov.bh":true,"bi":true,"co.bi":true,"com.bi":true,"edu.bi":true,"or.bi":true,"org.bi":true,"biz":true,"bj":true,"asso.bj":true,"barreau.bj":true,"gouv.bj":true,"bm":true,"com.bm":true,"edu.bm":true,"gov.bm":true,"net.bm":true,"org.bm":true,"*.bn":true,"bo":true,"com.bo":true,"edu.bo":true,"gov.bo":true,"gob.bo":true,"int.bo":true,"org.bo":true,"net.bo":true,"mil.bo":true,"tv.bo":true,"br":true,"adm.br":true,"adv.br":true,"agr.br":true,"am.br":true,"arq.br":true,"art.br":true,"ato.br":true,"b.br":true,"bio.br":true,"blog.br":true,"bmd.br":true,"cim.br":true,"cng.br":true,"cnt.br":true,"com.br":true,"coop.br":true,"ecn.br":true,"eco.br":true,"edu.br":true,"emp.br":true,"eng.br":true,"esp.br":true,"etc.br":true,"eti.br":true,"far.br":true,"flog.br":true,"fm.br":true,"fnd.br":true,"fot.br":true,"fst.br":true,"g12.br":true,"ggf.br":true,"gov.br":true,"imb.br":true,"ind.br":true,"inf.br":true,"jor.br":true,"jus.br":true,"leg.br":true,"lel.br":true,"mat.br":true,"med.br":true,"mil.br":true,"mp.br":true,"mus.br":true,"net.br":true,"*.nom.br":true,"not.br":true,"ntr.br":true,"odo.br":true,"org.br":true,"ppg.br":true,"pro.br":true,"psc.br":true,"psi.br":true,"qsl.br":true,"radio.br":true,"rec.br":true,"slg.br":true,"srv.br":true,"taxi.br":true,"teo.br":true,"tmp.br":true,"trd.br":true,"tur.br":true,"tv.br":true,"vet.br":true,"vlog.br":true,"wiki.br":true,"zlg.br":true,"bs":true,"com.bs":true,"net.bs":true,"org.bs":true,"edu.bs":true,"gov.bs":true,"bt":true,"com.bt":true,"edu.bt":true,"gov.bt":true,"net.bt":true,"org.bt":true,"bv":true,"bw":true,"co.bw":true,"org.bw":true,"by":true,"gov.by":true,"mil.by":true,"com.by":true,"of.by":true,"bz":true,"com.bz":true,"net.bz":true,"org.bz":true,"edu.bz":true,"gov.bz":true,"ca":true,"ab.ca":true,"bc.ca":true,"mb.ca":true,"nb.ca":true,"nf.ca":true,"nl.ca":true,"ns.ca":true,"nt.ca":true,"nu.ca":true,"on.ca":true,"pe.ca":true,"qc.ca":true,"sk.ca":true,"yk.ca":true,"gc.ca":true,"cat":true,"cc":true,"cd":true,"gov.cd":true,"cf":true,"cg":true,"ch":true,"ci":true,"org.ci":true,"or.ci":true,"com.ci":true,"co.ci":true,"edu.ci":true,"ed.ci":true,"ac.ci":true,"net.ci":true,"go.ci":true,"asso.ci":true,"xn--aroport-bya.ci":true,"int.ci":true,"presse.ci":true,"md.ci":true,"gouv.ci":true,"*.ck":true,"www.ck":false,"cl":true,"gov.cl":true,"gob.cl":true,"co.cl":true,"mil.cl":true,"cm":true,"co.cm":true,"com.cm":true,"gov.cm":true,"net.cm":true,"cn":true,"ac.cn":true,"com.cn":true,"edu.cn":true,"gov.cn":true,"net.cn":true,"org.cn":true,"mil.cn":true,"xn--55qx5d.cn":true,"xn--io0a7i.cn":true,"xn--od0alg.cn":true,"ah.cn":true,"bj.cn":true,"cq.cn":true,"fj.cn":true,"gd.cn":true,"gs.cn":true,"gz.cn":true,"gx.cn":true,"ha.cn":true,"hb.cn":true,"he.cn":true,"hi.cn":true,"hl.cn":true,"hn.cn":true,"jl.cn":true,"js.cn":true,"jx.cn":true,"ln.cn":true,"nm.cn":true,"nx.cn":true,"qh.cn":true,"sc.cn":true,"sd.cn":true,"sh.cn":true,"sn.cn":true,"sx.cn":true,"tj.cn":true,"xj.cn":true,"xz.cn":true,"yn.cn":true,"zj.cn":true,"hk.cn":true,"mo.cn":true,"tw.cn":true,"co":true,"arts.co":true,"com.co":true,"edu.co":true,"firm.co":true,"gov.co":true,"info.co":true,"int.co":true,"mil.co":true,"net.co":true,"nom.co":true,"org.co":true,"rec.co":true,"web.co":true,"com":true,"coop":true,"cr":true,"ac.cr":true,"co.cr":true,"ed.cr":true,"fi.cr":true,"go.cr":true,"or.cr":true,"sa.cr":true,"cu":true,"com.cu":true,"edu.cu":true,"org.cu":true,"net.cu":true,"gov.cu":true,"inf.cu":true,"cv":true,"cw":true,"com.cw":true,"edu.cw":true,"net.cw":true,"org.cw":true,"cx":true,"gov.cx":true,"ac.cy":true,"biz.cy":true,"com.cy":true,"ekloges.cy":true,"gov.cy":true,"ltd.cy":true,"name.cy":true,"net.cy":true,"org.cy":true,"parliament.cy":true,"press.cy":true,"pro.cy":true,"tm.cy":true,"cz":true,"de":true,"dj":true,"dk":true,"dm":true,"com.dm":true,"net.dm":true,"org.dm":true,"edu.dm":true,"gov.dm":true,"do":true,"art.do":true,"com.do":true,"edu.do":true,"gob.do":true,"gov.do":true,"mil.do":true,"net.do":true,"org.do":true,"sld.do":true,"web.do":true,"dz":true,"com.dz":true,"org.dz":true,"net.dz":true,"gov.dz":true,"edu.dz":true,"asso.dz":true,"pol.dz":true,"art.dz":true,"ec":true,"com.ec":true,"info.ec":true,"net.ec":true,"fin.ec":true,"k12.ec":true,"med.ec":true,"pro.ec":true,"org.ec":true,"edu.ec":true,"gov.ec":true,"gob.ec":true,"mil.ec":true,"edu":true,"ee":true,"edu.ee":true,"gov.ee":true,"riik.ee":true,"lib.ee":true,"med.ee":true,"com.ee":true,"pri.ee":true,"aip.ee":true,"org.ee":true,"fie.ee":true,"eg":true,"com.eg":true,"edu.eg":true,"eun.eg":true,"gov.eg":true,"mil.eg":true,"name.eg":true,"net.eg":true,"org.eg":true,"sci.eg":true,"*.er":true,"es":true,"com.es":true,"nom.es":true,"org.es":true,"gob.es":true,"edu.es":true,"et":true,"com.et":true,"gov.et":true,"org.et":true,"edu.et":true,"biz.et":true,"name.et":true,"info.et":true,"net.et":true,"eu":true,"fi":true,"aland.fi":true,"*.fj":true,"*.fk":true,"fm":true,"fo":true,"fr":true,"com.fr":true,"asso.fr":true,"nom.fr":true,"prd.fr":true,"presse.fr":true,"tm.fr":true,"aeroport.fr":true,"assedic.fr":true,"avocat.fr":true,"avoues.fr":true,"cci.fr":true,"chambagri.fr":true,"chirurgiens-dentistes.fr":true,"experts-comptables.fr":true,"geometre-expert.fr":true,"gouv.fr":true,"greta.fr":true,"huissier-justice.fr":true,"medecin.fr":true,"notaires.fr":true,"pharmacien.fr":true,"port.fr":true,"veterinaire.fr":true,"ga":true,"gb":true,"gd":true,"ge":true,"com.ge":true,"edu.ge":true,"gov.ge":true,"org.ge":true,"mil.ge":true,"net.ge":true,"pvt.ge":true,"gf":true,"gg":true,"co.gg":true,"net.gg":true,"org.gg":true,"gh":true,"com.gh":true,"edu.gh":true,"gov.gh":true,"org.gh":true,"mil.gh":true,"gi":true,"com.gi":true,"ltd.gi":true,"gov.gi":true,"mod.gi":true,"edu.gi":true,"org.gi":true,"gl":true,"co.gl":true,"com.gl":true,"edu.gl":true,"net.gl":true,"org.gl":true,"gm":true,"gn":true,"ac.gn":true,"com.gn":true,"edu.gn":true,"gov.gn":true,"org.gn":true,"net.gn":true,"gov":true,"gp":true,"com.gp":true,"net.gp":true,"mobi.gp":true,"edu.gp":true,"org.gp":true,"asso.gp":true,"gq":true,"gr":true,"com.gr":true,"edu.gr":true,"net.gr":true,"org.gr":true,"gov.gr":true,"gs":true,"gt":true,"com.gt":true,"edu.gt":true,"gob.gt":true,"ind.gt":true,"mil.gt":true,"net.gt":true,"org.gt":true,"*.gu":true,"gw":true,"gy":true,"co.gy":true,"com.gy":true,"net.gy":true,"hk":true,"com.hk":true,"edu.hk":true,"gov.hk":true,"idv.hk":true,"net.hk":true,"org.hk":true,"xn--55qx5d.hk":true,"xn--wcvs22d.hk":true,"xn--lcvr32d.hk":true,"xn--mxtq1m.hk":true,"xn--gmqw5a.hk":true,"xn--ciqpn.hk":true,"xn--gmq050i.hk":true,"xn--zf0avx.hk":true,"xn--io0a7i.hk":true,"xn--mk0axi.hk":true,"xn--od0alg.hk":true,"xn--od0aq3b.hk":true,"xn--tn0ag.hk":true,"xn--uc0atv.hk":true,"xn--uc0ay4a.hk":true,"hm":true,"hn":true,"com.hn":true,"edu.hn":true,"org.hn":true,"net.hn":true,"mil.hn":true,"gob.hn":true,"hr":true,"iz.hr":true,"from.hr":true,"name.hr":true,"com.hr":true,"ht":true,"com.ht":true,"shop.ht":true,"firm.ht":true,"info.ht":true,"adult.ht":true,"net.ht":true,"pro.ht":true,"org.ht":true,"med.ht":true,"art.ht":true,"coop.ht":true,"pol.ht":true,"asso.ht":true,"edu.ht":true,"rel.ht":true,"gouv.ht":true,"perso.ht":true,"hu":true,"co.hu":true,"info.hu":true,"org.hu":true,"priv.hu":true,"sport.hu":true,"tm.hu":true,"2000.hu":true,"agrar.hu":true,"bolt.hu":true,"casino.hu":true,"city.hu":true,"erotica.hu":true,"erotika.hu":true,"film.hu":true,"forum.hu":true,"games.hu":true,"hotel.hu":true,"ingatlan.hu":true,"jogasz.hu":true,"konyvelo.hu":true,"lakas.hu":true,"media.hu":true,"news.hu":true,"reklam.hu":true,"sex.hu":true,"shop.hu":true,"suli.hu":true,"szex.hu":true,"tozsde.hu":true,"utazas.hu":true,"video.hu":true,"id":true,"ac.id":true,"biz.id":true,"co.id":true,"desa.id":true,"go.id":true,"mil.id":true,"my.id":true,"net.id":true,"or.id":true,"sch.id":true,"web.id":true,"ie":true,"gov.ie":true,"il":true,"ac.il":true,"co.il":true,"gov.il":true,"idf.il":true,"k12.il":true,"muni.il":true,"net.il":true,"org.il":true,"im":true,"ac.im":true,"co.im":true,"com.im":true,"ltd.co.im":true,"net.im":true,"org.im":true,"plc.co.im":true,"tt.im":true,"tv.im":true,"in":true,"co.in":true,"firm.in":true,"net.in":true,"org.in":true,"gen.in":true,"ind.in":true,"nic.in":true,"ac.in":true,"edu.in":true,"res.in":true,"gov.in":true,"mil.in":true,"info":true,"int":true,"eu.int":true,"io":true,"com.io":true,"iq":true,"gov.iq":true,"edu.iq":true,"mil.iq":true,"com.iq":true,"org.iq":true,"net.iq":true,"ir":true,"ac.ir":true,"co.ir":true,"gov.ir":true,"id.ir":true,"net.ir":true,"org.ir":true,"sch.ir":true,"xn--mgba3a4f16a.ir":true,"xn--mgba3a4fra.ir":true,"is":true,"net.is":true,"com.is":true,"edu.is":true,"gov.is":true,"org.is":true,"int.is":true,"it":true,"gov.it":true,"edu.it":true,"abr.it":true,"abruzzo.it":true,"aosta-valley.it":true,"aostavalley.it":true,"bas.it":true,"basilicata.it":true,"cal.it":true,"calabria.it":true,"cam.it":true,"campania.it":true,"emilia-romagna.it":true,"emiliaromagna.it":true,"emr.it":true,"friuli-v-giulia.it":true,"friuli-ve-giulia.it":true,"friuli-vegiulia.it":true,"friuli-venezia-giulia.it":true,"friuli-veneziagiulia.it":true,"friuli-vgiulia.it":true,"friuliv-giulia.it":true,"friulive-giulia.it":true,"friulivegiulia.it":true,"friulivenezia-giulia.it":true,"friuliveneziagiulia.it":true,"friulivgiulia.it":true,"fvg.it":true,"laz.it":true,"lazio.it":true,"lig.it":true,"liguria.it":true,"lom.it":true,"lombardia.it":true,"lombardy.it":true,"lucania.it":true,"mar.it":true,"marche.it":true,"mol.it":true,"molise.it":true,"piedmont.it":true,"piemonte.it":true,"pmn.it":true,"pug.it":true,"puglia.it":true,"sar.it":true,"sardegna.it":true,"sardinia.it":true,"sic.it":true,"sicilia.it":true,"sicily.it":true,"taa.it":true,"tos.it":true,"toscana.it":true,"trentino-a-adige.it":true,"trentino-aadige.it":true,"trentino-alto-adige.it":true,"trentino-altoadige.it":true,"trentino-s-tirol.it":true,"trentino-stirol.it":true,"trentino-sud-tirol.it":true,"trentino-sudtirol.it":true,"trentino-sued-tirol.it":true,"trentino-suedtirol.it":true,"trentinoa-adige.it":true,"trentinoaadige.it":true,"trentinoalto-adige.it":true,"trentinoaltoadige.it":true,"trentinos-tirol.it":true,"trentinostirol.it":true,"trentinosud-tirol.it":true,"trentinosudtirol.it":true,"trentinosued-tirol.it":true,"trentinosuedtirol.it":true,"tuscany.it":true,"umb.it":true,"umbria.it":true,"val-d-aosta.it":true,"val-daosta.it":true,"vald-aosta.it":true,"valdaosta.it":true,"valle-aosta.it":true,"valle-d-aosta.it":true,"valle-daosta.it":true,"valleaosta.it":true,"valled-aosta.it":true,"valledaosta.it":true,"vallee-aoste.it":true,"valleeaoste.it":true,"vao.it":true,"vda.it":true,"ven.it":true,"veneto.it":true,"ag.it":true,"agrigento.it":true,"al.it":true,"alessandria.it":true,"alto-adige.it":true,"altoadige.it":true,"an.it":true,"ancona.it":true,"andria-barletta-trani.it":true,"andria-trani-barletta.it":true,"andriabarlettatrani.it":true,"andriatranibarletta.it":true,"ao.it":true,"aosta.it":true,"aoste.it":true,"ap.it":true,"aq.it":true,"aquila.it":true,"ar.it":true,"arezzo.it":true,"ascoli-piceno.it":true,"ascolipiceno.it":true,"asti.it":true,"at.it":true,"av.it":true,"avellino.it":true,"ba.it":true,"balsan.it":true,"bari.it":true,"barletta-trani-andria.it":true,"barlettatraniandria.it":true,"belluno.it":true,"benevento.it":true,"bergamo.it":true,"bg.it":true,"bi.it":true,"biella.it":true,"bl.it":true,"bn.it":true,"bo.it":true,"bologna.it":true,"bolzano.it":true,"bozen.it":true,"br.it":true,"brescia.it":true,"brindisi.it":true,"bs.it":true,"bt.it":true,"bz.it":true,"ca.it":true,"cagliari.it":true,"caltanissetta.it":true,"campidano-medio.it":true,"campidanomedio.it":true,"campobasso.it":true,"carbonia-iglesias.it":true,"carboniaiglesias.it":true,"carrara-massa.it":true,"carraramassa.it":true,"caserta.it":true,"catania.it":true,"catanzaro.it":true,"cb.it":true,"ce.it":true,"cesena-forli.it":true,"cesenaforli.it":true,"ch.it":true,"chieti.it":true,"ci.it":true,"cl.it":true,"cn.it":true,"co.it":true,"como.it":true,"cosenza.it":true,"cr.it":true,"cremona.it":true,"crotone.it":true,"cs.it":true,"ct.it":true,"cuneo.it":true,"cz.it":true,"dell-ogliastra.it":true,"dellogliastra.it":true,"en.it":true,"enna.it":true,"fc.it":true,"fe.it":true,"fermo.it":true,"ferrara.it":true,"fg.it":true,"fi.it":true,"firenze.it":true,"florence.it":true,"fm.it":true,"foggia.it":true,"forli-cesena.it":true,"forlicesena.it":true,"fr.it":true,"frosinone.it":true,"ge.it":true,"genoa.it":true,"genova.it":true,"go.it":true,"gorizia.it":true,"gr.it":true,"grosseto.it":true,"iglesias-carbonia.it":true,"iglesiascarbonia.it":true,"im.it":true,"imperia.it":true,"is.it":true,"isernia.it":true,"kr.it":true,"la-spezia.it":true,"laquila.it":true,"laspezia.it":true,"latina.it":true,"lc.it":true,"le.it":true,"lecce.it":true,"lecco.it":true,"li.it":true,"livorno.it":true,"lo.it":true,"lodi.it":true,"lt.it":true,"lu.it":true,"lucca.it":true,"macerata.it":true,"mantova.it":true,"massa-carrara.it":true,"massacarrara.it":true,"matera.it":true,"mb.it":true,"mc.it":true,"me.it":true,"medio-campidano.it":true,"mediocampidano.it":true,"messina.it":true,"mi.it":true,"milan.it":true,"milano.it":true,"mn.it":true,"mo.it":true,"modena.it":true,"monza-brianza.it":true,"monza-e-della-brianza.it":true,"monza.it":true,"monzabrianza.it":true,"monzaebrianza.it":true,"monzaedellabrianza.it":true,"ms.it":true,"mt.it":true,"na.it":true,"naples.it":true,"napoli.it":true,"no.it":true,"novara.it":true,"nu.it":true,"nuoro.it":true,"og.it":true,"ogliastra.it":true,"olbia-tempio.it":true,"olbiatempio.it":true,"or.it":true,"oristano.it":true,"ot.it":true,"pa.it":true,"padova.it":true,"padua.it":true,"palermo.it":true,"parma.it":true,"pavia.it":true,"pc.it":true,"pd.it":true,"pe.it":true,"perugia.it":true,"pesaro-urbino.it":true,"pesarourbino.it":true,"pescara.it":true,"pg.it":true,"pi.it":true,"piacenza.it":true,"pisa.it":true,"pistoia.it":true,"pn.it":true,"po.it":true,"pordenone.it":true,"potenza.it":true,"pr.it":true,"prato.it":true,"pt.it":true,"pu.it":true,"pv.it":true,"pz.it":true,"ra.it":true,"ragusa.it":true,"ravenna.it":true,"rc.it":true,"re.it":true,"reggio-calabria.it":true,"reggio-emilia.it":true,"reggiocalabria.it":true,"reggioemilia.it":true,"rg.it":true,"ri.it":true,"rieti.it":true,"rimini.it":true,"rm.it":true,"rn.it":true,"ro.it":true,"roma.it":true,"rome.it":true,"rovigo.it":true,"sa.it":true,"salerno.it":true,"sassari.it":true,"savona.it":true,"si.it":true,"siena.it":true,"siracusa.it":true,"so.it":true,"sondrio.it":true,"sp.it":true,"sr.it":true,"ss.it":true,"suedtirol.it":true,"sv.it":true,"ta.it":true,"taranto.it":true,"te.it":true,"tempio-olbia.it":true,"tempioolbia.it":true,"teramo.it":true,"terni.it":true,"tn.it":true,"to.it":true,"torino.it":true,"tp.it":true,"tr.it":true,"trani-andria-barletta.it":true,"trani-barletta-andria.it":true,"traniandriabarletta.it":true,"tranibarlettaandria.it":true,"trapani.it":true,"trentino.it":true,"trento.it":true,"treviso.it":true,"trieste.it":true,"ts.it":true,"turin.it":true,"tv.it":true,"ud.it":true,"udine.it":true,"urbino-pesaro.it":true,"urbinopesaro.it":true,"va.it":true,"varese.it":true,"vb.it":true,"vc.it":true,"ve.it":true,"venezia.it":true,"venice.it":true,"verbania.it":true,"vercelli.it":true,"verona.it":true,"vi.it":true,"vibo-valentia.it":true,"vibovalentia.it":true,"vicenza.it":true,"viterbo.it":true,"vr.it":true,"vs.it":true,"vt.it":true,"vv.it":true,"je":true,"co.je":true,"net.je":true,"org.je":true,"*.jm":true,"jo":true,"com.jo":true,"org.jo":true,"net.jo":true,"edu.jo":true,"sch.jo":true,"gov.jo":true,"mil.jo":true,"name.jo":true,"jobs":true,"jp":true,"ac.jp":true,"ad.jp":true,"co.jp":true,"ed.jp":true,"go.jp":true,"gr.jp":true,"lg.jp":true,"ne.jp":true,"or.jp":true,"aichi.jp":true,"akita.jp":true,"aomori.jp":true,"chiba.jp":true,"ehime.jp":true,"fukui.jp":true,"fukuoka.jp":true,"fukushima.jp":true,"gifu.jp":true,"gunma.jp":true,"hiroshima.jp":true,"hokkaido.jp":true,"hyogo.jp":true,"ibaraki.jp":true,"ishikawa.jp":true,"iwate.jp":true,"kagawa.jp":true,"kagoshima.jp":true,"kanagawa.jp":true,"kochi.jp":true,"kumamoto.jp":true,"kyoto.jp":true,"mie.jp":true,"miyagi.jp":true,"miyazaki.jp":true,"nagano.jp":true,"nagasaki.jp":true,"nara.jp":true,"niigata.jp":true,"oita.jp":true,"okayama.jp":true,"okinawa.jp":true,"osaka.jp":true,"saga.jp":true,"saitama.jp":true,"shiga.jp":true,"shimane.jp":true,"shizuoka.jp":true,"tochigi.jp":true,"tokushima.jp":true,"tokyo.jp":true,"tottori.jp":true,"toyama.jp":true,"wakayama.jp":true,"yamagata.jp":true,"yamaguchi.jp":true,"yamanashi.jp":true,"xn--4pvxs.jp":true,"xn--vgu402c.jp":true,"xn--c3s14m.jp":true,"xn--f6qx53a.jp":true,"xn--8pvr4u.jp":true,"xn--uist22h.jp":true,"xn--djrs72d6uy.jp":true,"xn--mkru45i.jp":true,"xn--0trq7p7nn.jp":true,"xn--8ltr62k.jp":true,"xn--2m4a15e.jp":true,"xn--efvn9s.jp":true,"xn--32vp30h.jp":true,"xn--4it797k.jp":true,"xn--1lqs71d.jp":true,"xn--5rtp49c.jp":true,"xn--5js045d.jp":true,"xn--ehqz56n.jp":true,"xn--1lqs03n.jp":true,"xn--qqqt11m.jp":true,"xn--kbrq7o.jp":true,"xn--pssu33l.jp":true,"xn--ntsq17g.jp":true,"xn--uisz3g.jp":true,"xn--6btw5a.jp":true,"xn--1ctwo.jp":true,"xn--6orx2r.jp":true,"xn--rht61e.jp":true,"xn--rht27z.jp":true,"xn--djty4k.jp":true,"xn--nit225k.jp":true,"xn--rht3d.jp":true,"xn--klty5x.jp":true,"xn--kltx9a.jp":true,"xn--kltp7d.jp":true,"xn--uuwu58a.jp":true,"xn--zbx025d.jp":true,"xn--ntso0iqx3a.jp":true,"xn--elqq16h.jp":true,"xn--4it168d.jp":true,"xn--klt787d.jp":true,"xn--rny31h.jp":true,"xn--7t0a264c.jp":true,"xn--5rtq34k.jp":true,"xn--k7yn95e.jp":true,"xn--tor131o.jp":true,"xn--d5qv7z876c.jp":true,"*.kawasaki.jp":true,"*.kitakyushu.jp":true,"*.kobe.jp":true,"*.nagoya.jp":true,"*.sapporo.jp":true,"*.sendai.jp":true,"*.yokohama.jp":true,"city.kawasaki.jp":false,"city.kitakyushu.jp":false,"city.kobe.jp":false,"city.nagoya.jp":false,"city.sapporo.jp":false,"city.sendai.jp":false,"city.yokohama.jp":false,"aisai.aichi.jp":true,"ama.aichi.jp":true,"anjo.aichi.jp":true,"asuke.aichi.jp":true,"chiryu.aichi.jp":true,"chita.aichi.jp":true,"fuso.aichi.jp":true,"gamagori.aichi.jp":true,"handa.aichi.jp":true,"hazu.aichi.jp":true,"hekinan.aichi.jp":true,"higashiura.aichi.jp":true,"ichinomiya.aichi.jp":true,"inazawa.aichi.jp":true,"inuyama.aichi.jp":true,"isshiki.aichi.jp":true,"iwakura.aichi.jp":true,"kanie.aichi.jp":true,"kariya.aichi.jp":true,"kasugai.aichi.jp":true,"kira.aichi.jp":true,"kiyosu.aichi.jp":true,"komaki.aichi.jp":true,"konan.aichi.jp":true,"kota.aichi.jp":true,"mihama.aichi.jp":true,"miyoshi.aichi.jp":true,"nishio.aichi.jp":true,"nisshin.aichi.jp":true,"obu.aichi.jp":true,"oguchi.aichi.jp":true,"oharu.aichi.jp":true,"okazaki.aichi.jp":true,"owariasahi.aichi.jp":true,"seto.aichi.jp":true,"shikatsu.aichi.jp":true,"shinshiro.aichi.jp":true,"shitara.aichi.jp":true,"tahara.aichi.jp":true,"takahama.aichi.jp":true,"tobishima.aichi.jp":true,"toei.aichi.jp":true,"togo.aichi.jp":true,"tokai.aichi.jp":true,"tokoname.aichi.jp":true,"toyoake.aichi.jp":true,"toyohashi.aichi.jp":true,"toyokawa.aichi.jp":true,"toyone.aichi.jp":true,"toyota.aichi.jp":true,"tsushima.aichi.jp":true,"yatomi.aichi.jp":true,"akita.akita.jp":true,"daisen.akita.jp":true,"fujisato.akita.jp":true,"gojome.akita.jp":true,"hachirogata.akita.jp":true,"happou.akita.jp":true,"higashinaruse.akita.jp":true,"honjo.akita.jp":true,"honjyo.akita.jp":true,"ikawa.akita.jp":true,"kamikoani.akita.jp":true,"kamioka.akita.jp":true,"katagami.akita.jp":true,"kazuno.akita.jp":true,"kitaakita.akita.jp":true,"kosaka.akita.jp":true,"kyowa.akita.jp":true,"misato.akita.jp":true,"mitane.akita.jp":true,"moriyoshi.akita.jp":true,"nikaho.akita.jp":true,"noshiro.akita.jp":true,"odate.akita.jp":true,"oga.akita.jp":true,"ogata.akita.jp":true,"semboku.akita.jp":true,"yokote.akita.jp":true,"yurihonjo.akita.jp":true,"aomori.aomori.jp":true,"gonohe.aomori.jp":true,"hachinohe.aomori.jp":true,"hashikami.aomori.jp":true,"hiranai.aomori.jp":true,"hirosaki.aomori.jp":true,"itayanagi.aomori.jp":true,"kuroishi.aomori.jp":true,"misawa.aomori.jp":true,"mutsu.aomori.jp":true,"nakadomari.aomori.jp":true,"noheji.aomori.jp":true,"oirase.aomori.jp":true,"owani.aomori.jp":true,"rokunohe.aomori.jp":true,"sannohe.aomori.jp":true,"shichinohe.aomori.jp":true,"shingo.aomori.jp":true,"takko.aomori.jp":true,"towada.aomori.jp":true,"tsugaru.aomori.jp":true,"tsuruta.aomori.jp":true,"abiko.chiba.jp":true,"asahi.chiba.jp":true,"chonan.chiba.jp":true,"chosei.chiba.jp":true,"choshi.chiba.jp":true,"chuo.chiba.jp":true,"funabashi.chiba.jp":true,"futtsu.chiba.jp":true,"hanamigawa.chiba.jp":true,"ichihara.chiba.jp":true,"ichikawa.chiba.jp":true,"ichinomiya.chiba.jp":true,"inzai.chiba.jp":true,"isumi.chiba.jp":true,"kamagaya.chiba.jp":true,"kamogawa.chiba.jp":true,"kashiwa.chiba.jp":true,"katori.chiba.jp":true,"katsuura.chiba.jp":true,"kimitsu.chiba.jp":true,"kisarazu.chiba.jp":true,"kozaki.chiba.jp":true,"kujukuri.chiba.jp":true,"kyonan.chiba.jp":true,"matsudo.chiba.jp":true,"midori.chiba.jp":true,"mihama.chiba.jp":true,"minamiboso.chiba.jp":true,"mobara.chiba.jp":true,"mutsuzawa.chiba.jp":true,"nagara.chiba.jp":true,"nagareyama.chiba.jp":true,"narashino.chiba.jp":true,"narita.chiba.jp":true,"noda.chiba.jp":true,"oamishirasato.chiba.jp":true,"omigawa.chiba.jp":true,"onjuku.chiba.jp":true,"otaki.chiba.jp":true,"sakae.chiba.jp":true,"sakura.chiba.jp":true,"shimofusa.chiba.jp":true,"shirako.chiba.jp":true,"shiroi.chiba.jp":true,"shisui.chiba.jp":true,"sodegaura.chiba.jp":true,"sosa.chiba.jp":true,"tako.chiba.jp":true,"tateyama.chiba.jp":true,"togane.chiba.jp":true,"tohnosho.chiba.jp":true,"tomisato.chiba.jp":true,"urayasu.chiba.jp":true,"yachimata.chiba.jp":true,"yachiyo.chiba.jp":true,"yokaichiba.chiba.jp":true,"yokoshibahikari.chiba.jp":true,"yotsukaido.chiba.jp":true,"ainan.ehime.jp":true,"honai.ehime.jp":true,"ikata.ehime.jp":true,"imabari.ehime.jp":true,"iyo.ehime.jp":true,"kamijima.ehime.jp":true,"kihoku.ehime.jp":true,"kumakogen.ehime.jp":true,"masaki.ehime.jp":true,"matsuno.ehime.jp":true,"matsuyama.ehime.jp":true,"namikata.ehime.jp":true,"niihama.ehime.jp":true,"ozu.ehime.jp":true,"saijo.ehime.jp":true,"seiyo.ehime.jp":true,"shikokuchuo.ehime.jp":true,"tobe.ehime.jp":true,"toon.ehime.jp":true,"uchiko.ehime.jp":true,"uwajima.ehime.jp":true,"yawatahama.ehime.jp":true,"echizen.fukui.jp":true,"eiheiji.fukui.jp":true,"fukui.fukui.jp":true,"ikeda.fukui.jp":true,"katsuyama.fukui.jp":true,"mihama.fukui.jp":true,"minamiechizen.fukui.jp":true,"obama.fukui.jp":true,"ohi.fukui.jp":true,"ono.fukui.jp":true,"sabae.fukui.jp":true,"sakai.fukui.jp":true,"takahama.fukui.jp":true,"tsuruga.fukui.jp":true,"wakasa.fukui.jp":true,"ashiya.fukuoka.jp":true,"buzen.fukuoka.jp":true,"chikugo.fukuoka.jp":true,"chikuho.fukuoka.jp":true,"chikujo.fukuoka.jp":true,"chikushino.fukuoka.jp":true,"chikuzen.fukuoka.jp":true,"chuo.fukuoka.jp":true,"dazaifu.fukuoka.jp":true,"fukuchi.fukuoka.jp":true,"hakata.fukuoka.jp":true,"higashi.fukuoka.jp":true,"hirokawa.fukuoka.jp":true,"hisayama.fukuoka.jp":true,"iizuka.fukuoka.jp":true,"inatsuki.fukuoka.jp":true,"kaho.fukuoka.jp":true,"kasuga.fukuoka.jp":true,"kasuya.fukuoka.jp":true,"kawara.fukuoka.jp":true,"keisen.fukuoka.jp":true,"koga.fukuoka.jp":true,"kurate.fukuoka.jp":true,"kurogi.fukuoka.jp":true,"kurume.fukuoka.jp":true,"minami.fukuoka.jp":true,"miyako.fukuoka.jp":true,"miyama.fukuoka.jp":true,"miyawaka.fukuoka.jp":true,"mizumaki.fukuoka.jp":true,"munakata.fukuoka.jp":true,"nakagawa.fukuoka.jp":true,"nakama.fukuoka.jp":true,"nishi.fukuoka.jp":true,"nogata.fukuoka.jp":true,"ogori.fukuoka.jp":true,"okagaki.fukuoka.jp":true,"okawa.fukuoka.jp":true,"oki.fukuoka.jp":true,"omuta.fukuoka.jp":true,"onga.fukuoka.jp":true,"onojo.fukuoka.jp":true,"oto.fukuoka.jp":true,"saigawa.fukuoka.jp":true,"sasaguri.fukuoka.jp":true,"shingu.fukuoka.jp":true,"shinyoshitomi.fukuoka.jp":true,"shonai.fukuoka.jp":true,"soeda.fukuoka.jp":true,"sue.fukuoka.jp":true,"tachiarai.fukuoka.jp":true,"tagawa.fukuoka.jp":true,"takata.fukuoka.jp":true,"toho.fukuoka.jp":true,"toyotsu.fukuoka.jp":true,"tsuiki.fukuoka.jp":true,"ukiha.fukuoka.jp":true,"umi.fukuoka.jp":true,"usui.fukuoka.jp":true,"yamada.fukuoka.jp":true,"yame.fukuoka.jp":true,"yanagawa.fukuoka.jp":true,"yukuhashi.fukuoka.jp":true,"aizubange.fukushima.jp":true,"aizumisato.fukushima.jp":true,"aizuwakamatsu.fukushima.jp":true,"asakawa.fukushima.jp":true,"bandai.fukushima.jp":true,"date.fukushima.jp":true,"fukushima.fukushima.jp":true,"furudono.fukushima.jp":true,"futaba.fukushima.jp":true,"hanawa.fukushima.jp":true,"higashi.fukushima.jp":true,"hirata.fukushima.jp":true,"hirono.fukushima.jp":true,"iitate.fukushima.jp":true,"inawashiro.fukushima.jp":true,"ishikawa.fukushima.jp":true,"iwaki.fukushima.jp":true,"izumizaki.fukushima.jp":true,"kagamiishi.fukushima.jp":true,"kaneyama.fukushima.jp":true,"kawamata.fukushima.jp":true,"kitakata.fukushima.jp":true,"kitashiobara.fukushima.jp":true,"koori.fukushima.jp":true,"koriyama.fukushima.jp":true,"kunimi.fukushima.jp":true,"miharu.fukushima.jp":true,"mishima.fukushima.jp":true,"namie.fukushima.jp":true,"nango.fukushima.jp":true,"nishiaizu.fukushima.jp":true,"nishigo.fukushima.jp":true,"okuma.fukushima.jp":true,"omotego.fukushima.jp":true,"ono.fukushima.jp":true,"otama.fukushima.jp":true,"samegawa.fukushima.jp":true,"shimogo.fukushima.jp":true,"shirakawa.fukushima.jp":true,"showa.fukushima.jp":true,"soma.fukushima.jp":true,"sukagawa.fukushima.jp":true,"taishin.fukushima.jp":true,"tamakawa.fukushima.jp":true,"tanagura.fukushima.jp":true,"tenei.fukushima.jp":true,"yabuki.fukushima.jp":true,"yamato.fukushima.jp":true,"yamatsuri.fukushima.jp":true,"yanaizu.fukushima.jp":true,"yugawa.fukushima.jp":true,"anpachi.gifu.jp":true,"ena.gifu.jp":true,"gifu.gifu.jp":true,"ginan.gifu.jp":true,"godo.gifu.jp":true,"gujo.gifu.jp":true,"hashima.gifu.jp":true,"hichiso.gifu.jp":true,"hida.gifu.jp":true,"higashishirakawa.gifu.jp":true,"ibigawa.gifu.jp":true,"ikeda.gifu.jp":true,"kakamigahara.gifu.jp":true,"kani.gifu.jp":true,"kasahara.gifu.jp":true,"kasamatsu.gifu.jp":true,"kawaue.gifu.jp":true,"kitagata.gifu.jp":true,"mino.gifu.jp":true,"minokamo.gifu.jp":true,"mitake.gifu.jp":true,"mizunami.gifu.jp":true,"motosu.gifu.jp":true,"nakatsugawa.gifu.jp":true,"ogaki.gifu.jp":true,"sakahogi.gifu.jp":true,"seki.gifu.jp":true,"sekigahara.gifu.jp":true,"shirakawa.gifu.jp":true,"tajimi.gifu.jp":true,"takayama.gifu.jp":true,"tarui.gifu.jp":true,"toki.gifu.jp":true,"tomika.gifu.jp":true,"wanouchi.gifu.jp":true,"yamagata.gifu.jp":true,"yaotsu.gifu.jp":true,"yoro.gifu.jp":true,"annaka.gunma.jp":true,"chiyoda.gunma.jp":true,"fujioka.gunma.jp":true,"higashiagatsuma.gunma.jp":true,"isesaki.gunma.jp":true,"itakura.gunma.jp":true,"kanna.gunma.jp":true,"kanra.gunma.jp":true,"katashina.gunma.jp":true,"kawaba.gunma.jp":true,"kiryu.gunma.jp":true,"kusatsu.gunma.jp":true,"maebashi.gunma.jp":true,"meiwa.gunma.jp":true,"midori.gunma.jp":true,"minakami.gunma.jp":true,"naganohara.gunma.jp":true,"nakanojo.gunma.jp":true,"nanmoku.gunma.jp":true,"numata.gunma.jp":true,"oizumi.gunma.jp":true,"ora.gunma.jp":true,"ota.gunma.jp":true,"shibukawa.gunma.jp":true,"shimonita.gunma.jp":true,"shinto.gunma.jp":true,"showa.gunma.jp":true,"takasaki.gunma.jp":true,"takayama.gunma.jp":true,"tamamura.gunma.jp":true,"tatebayashi.gunma.jp":true,"tomioka.gunma.jp":true,"tsukiyono.gunma.jp":true,"tsumagoi.gunma.jp":true,"ueno.gunma.jp":true,"yoshioka.gunma.jp":true,"asaminami.hiroshima.jp":true,"daiwa.hiroshima.jp":true,"etajima.hiroshima.jp":true,"fuchu.hiroshima.jp":true,"fukuyama.hiroshima.jp":true,"hatsukaichi.hiroshima.jp":true,"higashihiroshima.hiroshima.jp":true,"hongo.hiroshima.jp":true,"jinsekikogen.hiroshima.jp":true,"kaita.hiroshima.jp":true,"kui.hiroshima.jp":true,"kumano.hiroshima.jp":true,"kure.hiroshima.jp":true,"mihara.hiroshima.jp":true,"miyoshi.hiroshima.jp":true,"naka.hiroshima.jp":true,"onomichi.hiroshima.jp":true,"osakikamijima.hiroshima.jp":true,"otake.hiroshima.jp":true,"saka.hiroshima.jp":true,"sera.hiroshima.jp":true,"seranishi.hiroshima.jp":true,"shinichi.hiroshima.jp":true,"shobara.hiroshima.jp":true,"takehara.hiroshima.jp":true,"abashiri.hokkaido.jp":true,"abira.hokkaido.jp":true,"aibetsu.hokkaido.jp":true,"akabira.hokkaido.jp":true,"akkeshi.hokkaido.jp":true,"asahikawa.hokkaido.jp":true,"ashibetsu.hokkaido.jp":true,"ashoro.hokkaido.jp":true,"assabu.hokkaido.jp":true,"atsuma.hokkaido.jp":true,"bibai.hokkaido.jp":true,"biei.hokkaido.jp":true,"bifuka.hokkaido.jp":true,"bihoro.hokkaido.jp":true,"biratori.hokkaido.jp":true,"chippubetsu.hokkaido.jp":true,"chitose.hokkaido.jp":true,"date.hokkaido.jp":true,"ebetsu.hokkaido.jp":true,"embetsu.hokkaido.jp":true,"eniwa.hokkaido.jp":true,"erimo.hokkaido.jp":true,"esan.hokkaido.jp":true,"esashi.hokkaido.jp":true,"fukagawa.hokkaido.jp":true,"fukushima.hokkaido.jp":true,"furano.hokkaido.jp":true,"furubira.hokkaido.jp":true,"haboro.hokkaido.jp":true,"hakodate.hokkaido.jp":true,"hamatonbetsu.hokkaido.jp":true,"hidaka.hokkaido.jp":true,"higashikagura.hokkaido.jp":true,"higashikawa.hokkaido.jp":true,"hiroo.hokkaido.jp":true,"hokuryu.hokkaido.jp":true,"hokuto.hokkaido.jp":true,"honbetsu.hokkaido.jp":true,"horokanai.hokkaido.jp":true,"horonobe.hokkaido.jp":true,"ikeda.hokkaido.jp":true,"imakane.hokkaido.jp":true,"ishikari.hokkaido.jp":true,"iwamizawa.hokkaido.jp":true,"iwanai.hokkaido.jp":true,"kamifurano.hokkaido.jp":true,"kamikawa.hokkaido.jp":true,"kamishihoro.hokkaido.jp":true,"kamisunagawa.hokkaido.jp":true,"kamoenai.hokkaido.jp":true,"kayabe.hokkaido.jp":true,"kembuchi.hokkaido.jp":true,"kikonai.hokkaido.jp":true,"kimobetsu.hokkaido.jp":true,"kitahiroshima.hokkaido.jp":true,"kitami.hokkaido.jp":true,"kiyosato.hokkaido.jp":true,"koshimizu.hokkaido.jp":true,"kunneppu.hokkaido.jp":true,"kuriyama.hokkaido.jp":true,"kuromatsunai.hokkaido.jp":true,"kushiro.hokkaido.jp":true,"kutchan.hokkaido.jp":true,"kyowa.hokkaido.jp":true,"mashike.hokkaido.jp":true,"matsumae.hokkaido.jp":true,"mikasa.hokkaido.jp":true,"minamifurano.hokkaido.jp":true,"mombetsu.hokkaido.jp":true,"moseushi.hokkaido.jp":true,"mukawa.hokkaido.jp":true,"muroran.hokkaido.jp":true,"naie.hokkaido.jp":true,"nakagawa.hokkaido.jp":true,"nakasatsunai.hokkaido.jp":true,"nakatombetsu.hokkaido.jp":true,"nanae.hokkaido.jp":true,"nanporo.hokkaido.jp":true,"nayoro.hokkaido.jp":true,"nemuro.hokkaido.jp":true,"niikappu.hokkaido.jp":true,"niki.hokkaido.jp":true,"nishiokoppe.hokkaido.jp":true,"noboribetsu.hokkaido.jp":true,"numata.hokkaido.jp":true,"obihiro.hokkaido.jp":true,"obira.hokkaido.jp":true,"oketo.hokkaido.jp":true,"okoppe.hokkaido.jp":true,"otaru.hokkaido.jp":true,"otobe.hokkaido.jp":true,"otofuke.hokkaido.jp":true,"otoineppu.hokkaido.jp":true,"oumu.hokkaido.jp":true,"ozora.hokkaido.jp":true,"pippu.hokkaido.jp":true,"rankoshi.hokkaido.jp":true,"rebun.hokkaido.jp":true,"rikubetsu.hokkaido.jp":true,"rishiri.hokkaido.jp":true,"rishirifuji.hokkaido.jp":true,"saroma.hokkaido.jp":true,"sarufutsu.hokkaido.jp":true,"shakotan.hokkaido.jp":true,"shari.hokkaido.jp":true,"shibecha.hokkaido.jp":true,"shibetsu.hokkaido.jp":true,"shikabe.hokkaido.jp":true,"shikaoi.hokkaido.jp":true,"shimamaki.hokkaido.jp":true,"shimizu.hokkaido.jp":true,"shimokawa.hokkaido.jp":true,"shinshinotsu.hokkaido.jp":true,"shintoku.hokkaido.jp":true,"shiranuka.hokkaido.jp":true,"shiraoi.hokkaido.jp":true,"shiriuchi.hokkaido.jp":true,"sobetsu.hokkaido.jp":true,"sunagawa.hokkaido.jp":true,"taiki.hokkaido.jp":true,"takasu.hokkaido.jp":true,"takikawa.hokkaido.jp":true,"takinoue.hokkaido.jp":true,"teshikaga.hokkaido.jp":true,"tobetsu.hokkaido.jp":true,"tohma.hokkaido.jp":true,"tomakomai.hokkaido.jp":true,"tomari.hokkaido.jp":true,"toya.hokkaido.jp":true,"toyako.hokkaido.jp":true,"toyotomi.hokkaido.jp":true,"toyoura.hokkaido.jp":true,"tsubetsu.hokkaido.jp":true,"tsukigata.hokkaido.jp":true,"urakawa.hokkaido.jp":true,"urausu.hokkaido.jp":true,"uryu.hokkaido.jp":true,"utashinai.hokkaido.jp":true,"wakkanai.hokkaido.jp":true,"wassamu.hokkaido.jp":true,"yakumo.hokkaido.jp":true,"yoichi.hokkaido.jp":true,"aioi.hyogo.jp":true,"akashi.hyogo.jp":true,"ako.hyogo.jp":true,"amagasaki.hyogo.jp":true,"aogaki.hyogo.jp":true,"asago.hyogo.jp":true,"ashiya.hyogo.jp":true,"awaji.hyogo.jp":true,"fukusaki.hyogo.jp":true,"goshiki.hyogo.jp":true,"harima.hyogo.jp":true,"himeji.hyogo.jp":true,"ichikawa.hyogo.jp":true,"inagawa.hyogo.jp":true,"itami.hyogo.jp":true,"kakogawa.hyogo.jp":true,"kamigori.hyogo.jp":true,"kamikawa.hyogo.jp":true,"kasai.hyogo.jp":true,"kasuga.hyogo.jp":true,"kawanishi.hyogo.jp":true,"miki.hyogo.jp":true,"minamiawaji.hyogo.jp":true,"nishinomiya.hyogo.jp":true,"nishiwaki.hyogo.jp":true,"ono.hyogo.jp":true,"sanda.hyogo.jp":true,"sannan.hyogo.jp":true,"sasayama.hyogo.jp":true,"sayo.hyogo.jp":true,"shingu.hyogo.jp":true,"shinonsen.hyogo.jp":true,"shiso.hyogo.jp":true,"sumoto.hyogo.jp":true,"taishi.hyogo.jp":true,"taka.hyogo.jp":true,"takarazuka.hyogo.jp":true,"takasago.hyogo.jp":true,"takino.hyogo.jp":true,"tamba.hyogo.jp":true,"tatsuno.hyogo.jp":true,"toyooka.hyogo.jp":true,"yabu.hyogo.jp":true,"yashiro.hyogo.jp":true,"yoka.hyogo.jp":true,"yokawa.hyogo.jp":true,"ami.ibaraki.jp":true,"asahi.ibaraki.jp":true,"bando.ibaraki.jp":true,"chikusei.ibaraki.jp":true,"daigo.ibaraki.jp":true,"fujishiro.ibaraki.jp":true,"hitachi.ibaraki.jp":true,"hitachinaka.ibaraki.jp":true,"hitachiomiya.ibaraki.jp":true,"hitachiota.ibaraki.jp":true,"ibaraki.ibaraki.jp":true,"ina.ibaraki.jp":true,"inashiki.ibaraki.jp":true,"itako.ibaraki.jp":true,"iwama.ibaraki.jp":true,"joso.ibaraki.jp":true,"kamisu.ibaraki.jp":true,"kasama.ibaraki.jp":true,"kashima.ibaraki.jp":true,"kasumigaura.ibaraki.jp":true,"koga.ibaraki.jp":true,"miho.ibaraki.jp":true,"mito.ibaraki.jp":true,"moriya.ibaraki.jp":true,"naka.ibaraki.jp":true,"namegata.ibaraki.jp":true,"oarai.ibaraki.jp":true,"ogawa.ibaraki.jp":true,"omitama.ibaraki.jp":true,"ryugasaki.ibaraki.jp":true,"sakai.ibaraki.jp":true,"sakuragawa.ibaraki.jp":true,"shimodate.ibaraki.jp":true,"shimotsuma.ibaraki.jp":true,"shirosato.ibaraki.jp":true,"sowa.ibaraki.jp":true,"suifu.ibaraki.jp":true,"takahagi.ibaraki.jp":true,"tamatsukuri.ibaraki.jp":true,"tokai.ibaraki.jp":true,"tomobe.ibaraki.jp":true,"tone.ibaraki.jp":true,"toride.ibaraki.jp":true,"tsuchiura.ibaraki.jp":true,"tsukuba.ibaraki.jp":true,"uchihara.ibaraki.jp":true,"ushiku.ibaraki.jp":true,"yachiyo.ibaraki.jp":true,"yamagata.ibaraki.jp":true,"yawara.ibaraki.jp":true,"yuki.ibaraki.jp":true,"anamizu.ishikawa.jp":true,"hakui.ishikawa.jp":true,"hakusan.ishikawa.jp":true,"kaga.ishikawa.jp":true,"kahoku.ishikawa.jp":true,"kanazawa.ishikawa.jp":true,"kawakita.ishikawa.jp":true,"komatsu.ishikawa.jp":true,"nakanoto.ishikawa.jp":true,"nanao.ishikawa.jp":true,"nomi.ishikawa.jp":true,"nonoichi.ishikawa.jp":true,"noto.ishikawa.jp":true,"shika.ishikawa.jp":true,"suzu.ishikawa.jp":true,"tsubata.ishikawa.jp":true,"tsurugi.ishikawa.jp":true,"uchinada.ishikawa.jp":true,"wajima.ishikawa.jp":true,"fudai.iwate.jp":true,"fujisawa.iwate.jp":true,"hanamaki.iwate.jp":true,"hiraizumi.iwate.jp":true,"hirono.iwate.jp":true,"ichinohe.iwate.jp":true,"ichinoseki.iwate.jp":true,"iwaizumi.iwate.jp":true,"iwate.iwate.jp":true,"joboji.iwate.jp":true,"kamaishi.iwate.jp":true,"kanegasaki.iwate.jp":true,"karumai.iwate.jp":true,"kawai.iwate.jp":true,"kitakami.iwate.jp":true,"kuji.iwate.jp":true,"kunohe.iwate.jp":true,"kuzumaki.iwate.jp":true,"miyako.iwate.jp":true,"mizusawa.iwate.jp":true,"morioka.iwate.jp":true,"ninohe.iwate.jp":true,"noda.iwate.jp":true,"ofunato.iwate.jp":true,"oshu.iwate.jp":true,"otsuchi.iwate.jp":true,"rikuzentakata.iwate.jp":true,"shiwa.iwate.jp":true,"shizukuishi.iwate.jp":true,"sumita.iwate.jp":true,"tanohata.iwate.jp":true,"tono.iwate.jp":true,"yahaba.iwate.jp":true,"yamada.iwate.jp":true,"ayagawa.kagawa.jp":true,"higashikagawa.kagawa.jp":true,"kanonji.kagawa.jp":true,"kotohira.kagawa.jp":true,"manno.kagawa.jp":true,"marugame.kagawa.jp":true,"mitoyo.kagawa.jp":true,"naoshima.kagawa.jp":true,"sanuki.kagawa.jp":true,"tadotsu.kagawa.jp":true,"takamatsu.kagawa.jp":true,"tonosho.kagawa.jp":true,"uchinomi.kagawa.jp":true,"utazu.kagawa.jp":true,"zentsuji.kagawa.jp":true,"akune.kagoshima.jp":true,"amami.kagoshima.jp":true,"hioki.kagoshima.jp":true,"isa.kagoshima.jp":true,"isen.kagoshima.jp":true,"izumi.kagoshima.jp":true,"kagoshima.kagoshima.jp":true,"kanoya.kagoshima.jp":true,"kawanabe.kagoshima.jp":true,"kinko.kagoshima.jp":true,"kouyama.kagoshima.jp":true,"makurazaki.kagoshima.jp":true,"matsumoto.kagoshima.jp":true,"minamitane.kagoshima.jp":true,"nakatane.kagoshima.jp":true,"nishinoomote.kagoshima.jp":true,"satsumasendai.kagoshima.jp":true,"soo.kagoshima.jp":true,"tarumizu.kagoshima.jp":true,"yusui.kagoshima.jp":true,"aikawa.kanagawa.jp":true,"atsugi.kanagawa.jp":true,"ayase.kanagawa.jp":true,"chigasaki.kanagawa.jp":true,"ebina.kanagawa.jp":true,"fujisawa.kanagawa.jp":true,"hadano.kanagawa.jp":true,"hakone.kanagawa.jp":true,"hiratsuka.kanagawa.jp":true,"isehara.kanagawa.jp":true,"kaisei.kanagawa.jp":true,"kamakura.kanagawa.jp":true,"kiyokawa.kanagawa.jp":true,"matsuda.kanagawa.jp":true,"minamiashigara.kanagawa.jp":true,"miura.kanagawa.jp":true,"nakai.kanagawa.jp":true,"ninomiya.kanagawa.jp":true,"odawara.kanagawa.jp":true,"oi.kanagawa.jp":true,"oiso.kanagawa.jp":true,"sagamihara.kanagawa.jp":true,"samukawa.kanagawa.jp":true,"tsukui.kanagawa.jp":true,"yamakita.kanagawa.jp":true,"yamato.kanagawa.jp":true,"yokosuka.kanagawa.jp":true,"yugawara.kanagawa.jp":true,"zama.kanagawa.jp":true,"zushi.kanagawa.jp":true,"aki.kochi.jp":true,"geisei.kochi.jp":true,"hidaka.kochi.jp":true,"higashitsuno.kochi.jp":true,"ino.kochi.jp":true,"kagami.kochi.jp":true,"kami.kochi.jp":true,"kitagawa.kochi.jp":true,"kochi.kochi.jp":true,"mihara.kochi.jp":true,"motoyama.kochi.jp":true,"muroto.kochi.jp":true,"nahari.kochi.jp":true,"nakamura.kochi.jp":true,"nankoku.kochi.jp":true,"nishitosa.kochi.jp":true,"niyodogawa.kochi.jp":true,"ochi.kochi.jp":true,"okawa.kochi.jp":true,"otoyo.kochi.jp":true,"otsuki.kochi.jp":true,"sakawa.kochi.jp":true,"sukumo.kochi.jp":true,"susaki.kochi.jp":true,"tosa.kochi.jp":true,"tosashimizu.kochi.jp":true,"toyo.kochi.jp":true,"tsuno.kochi.jp":true,"umaji.kochi.jp":true,"yasuda.kochi.jp":true,"yusuhara.kochi.jp":true,"amakusa.kumamoto.jp":true,"arao.kumamoto.jp":true,"aso.kumamoto.jp":true,"choyo.kumamoto.jp":true,"gyokuto.kumamoto.jp":true,"hitoyoshi.kumamoto.jp":true,"kamiamakusa.kumamoto.jp":true,"kashima.kumamoto.jp":true,"kikuchi.kumamoto.jp":true,"kosa.kumamoto.jp":true,"kumamoto.kumamoto.jp":true,"mashiki.kumamoto.jp":true,"mifune.kumamoto.jp":true,"minamata.kumamoto.jp":true,"minamioguni.kumamoto.jp":true,"nagasu.kumamoto.jp":true,"nishihara.kumamoto.jp":true,"oguni.kumamoto.jp":true,"ozu.kumamoto.jp":true,"sumoto.kumamoto.jp":true,"takamori.kumamoto.jp":true,"uki.kumamoto.jp":true,"uto.kumamoto.jp":true,"yamaga.kumamoto.jp":true,"yamato.kumamoto.jp":true,"yatsushiro.kumamoto.jp":true,"ayabe.kyoto.jp":true,"fukuchiyama.kyoto.jp":true,"higashiyama.kyoto.jp":true,"ide.kyoto.jp":true,"ine.kyoto.jp":true,"joyo.kyoto.jp":true,"kameoka.kyoto.jp":true,"kamo.kyoto.jp":true,"kita.kyoto.jp":true,"kizu.kyoto.jp":true,"kumiyama.kyoto.jp":true,"kyotamba.kyoto.jp":true,"kyotanabe.kyoto.jp":true,"kyotango.kyoto.jp":true,"maizuru.kyoto.jp":true,"minami.kyoto.jp":true,"minamiyamashiro.kyoto.jp":true,"miyazu.kyoto.jp":true,"muko.kyoto.jp":true,"nagaokakyo.kyoto.jp":true,"nakagyo.kyoto.jp":true,"nantan.kyoto.jp":true,"oyamazaki.kyoto.jp":true,"sakyo.kyoto.jp":true,"seika.kyoto.jp":true,"tanabe.kyoto.jp":true,"uji.kyoto.jp":true,"ujitawara.kyoto.jp":true,"wazuka.kyoto.jp":true,"yamashina.kyoto.jp":true,"yawata.kyoto.jp":true,"asahi.mie.jp":true,"inabe.mie.jp":true,"ise.mie.jp":true,"kameyama.mie.jp":true,"kawagoe.mie.jp":true,"kiho.mie.jp":true,"kisosaki.mie.jp":true,"kiwa.mie.jp":true,"komono.mie.jp":true,"kumano.mie.jp":true,"kuwana.mie.jp":true,"matsusaka.mie.jp":true,"meiwa.mie.jp":true,"mihama.mie.jp":true,"minamiise.mie.jp":true,"misugi.mie.jp":true,"miyama.mie.jp":true,"nabari.mie.jp":true,"shima.mie.jp":true,"suzuka.mie.jp":true,"tado.mie.jp":true,"taiki.mie.jp":true,"taki.mie.jp":true,"tamaki.mie.jp":true,"toba.mie.jp":true,"tsu.mie.jp":true,"udono.mie.jp":true,"ureshino.mie.jp":true,"watarai.mie.jp":true,"yokkaichi.mie.jp":true,"furukawa.miyagi.jp":true,"higashimatsushima.miyagi.jp":true,"ishinomaki.miyagi.jp":true,"iwanuma.miyagi.jp":true,"kakuda.miyagi.jp":true,"kami.miyagi.jp":true,"kawasaki.miyagi.jp":true,"kesennuma.miyagi.jp":true,"marumori.miyagi.jp":true,"matsushima.miyagi.jp":true,"minamisanriku.miyagi.jp":true,"misato.miyagi.jp":true,"murata.miyagi.jp":true,"natori.miyagi.jp":true,"ogawara.miyagi.jp":true,"ohira.miyagi.jp":true,"onagawa.miyagi.jp":true,"osaki.miyagi.jp":true,"rifu.miyagi.jp":true,"semine.miyagi.jp":true,"shibata.miyagi.jp":true,"shichikashuku.miyagi.jp":true,"shikama.miyagi.jp":true,"shiogama.miyagi.jp":true,"shiroishi.miyagi.jp":true,"tagajo.miyagi.jp":true,"taiwa.miyagi.jp":true,"tome.miyagi.jp":true,"tomiya.miyagi.jp":true,"wakuya.miyagi.jp":true,"watari.miyagi.jp":true,"yamamoto.miyagi.jp":true,"zao.miyagi.jp":true,"aya.miyazaki.jp":true,"ebino.miyazaki.jp":true,"gokase.miyazaki.jp":true,"hyuga.miyazaki.jp":true,"kadogawa.miyazaki.jp":true,"kawaminami.miyazaki.jp":true,"kijo.miyazaki.jp":true,"kitagawa.miyazaki.jp":true,"kitakata.miyazaki.jp":true,"kitaura.miyazaki.jp":true,"kobayashi.miyazaki.jp":true,"kunitomi.miyazaki.jp":true,"kushima.miyazaki.jp":true,"mimata.miyazaki.jp":true,"miyakonojo.miyazaki.jp":true,"miyazaki.miyazaki.jp":true,"morotsuka.miyazaki.jp":true,"nichinan.miyazaki.jp":true,"nishimera.miyazaki.jp":true,"nobeoka.miyazaki.jp":true,"saito.miyazaki.jp":true,"shiiba.miyazaki.jp":true,"shintomi.miyazaki.jp":true,"takaharu.miyazaki.jp":true,"takanabe.miyazaki.jp":true,"takazaki.miyazaki.jp":true,"tsuno.miyazaki.jp":true,"achi.nagano.jp":true,"agematsu.nagano.jp":true,"anan.nagano.jp":true,"aoki.nagano.jp":true,"asahi.nagano.jp":true,"azumino.nagano.jp":true,"chikuhoku.nagano.jp":true,"chikuma.nagano.jp":true,"chino.nagano.jp":true,"fujimi.nagano.jp":true,"hakuba.nagano.jp":true,"hara.nagano.jp":true,"hiraya.nagano.jp":true,"iida.nagano.jp":true,"iijima.nagano.jp":true,"iiyama.nagano.jp":true,"iizuna.nagano.jp":true,"ikeda.nagano.jp":true,"ikusaka.nagano.jp":true,"ina.nagano.jp":true,"karuizawa.nagano.jp":true,"kawakami.nagano.jp":true,"kiso.nagano.jp":true,"kisofukushima.nagano.jp":true,"kitaaiki.nagano.jp":true,"komagane.nagano.jp":true,"komoro.nagano.jp":true,"matsukawa.nagano.jp":true,"matsumoto.nagano.jp":true,"miasa.nagano.jp":true,"minamiaiki.nagano.jp":true,"minamimaki.nagano.jp":true,"minamiminowa.nagano.jp":true,"minowa.nagano.jp":true,"miyada.nagano.jp":true,"miyota.nagano.jp":true,"mochizuki.nagano.jp":true,"nagano.nagano.jp":true,"nagawa.nagano.jp":true,"nagiso.nagano.jp":true,"nakagawa.nagano.jp":true,"nakano.nagano.jp":true,"nozawaonsen.nagano.jp":true,"obuse.nagano.jp":true,"ogawa.nagano.jp":true,"okaya.nagano.jp":true,"omachi.nagano.jp":true,"omi.nagano.jp":true,"ookuwa.nagano.jp":true,"ooshika.nagano.jp":true,"otaki.nagano.jp":true,"otari.nagano.jp":true,"sakae.nagano.jp":true,"sakaki.nagano.jp":true,"saku.nagano.jp":true,"sakuho.nagano.jp":true,"shimosuwa.nagano.jp":true,"shinanomachi.nagano.jp":true,"shiojiri.nagano.jp":true,"suwa.nagano.jp":true,"suzaka.nagano.jp":true,"takagi.nagano.jp":true,"takamori.nagano.jp":true,"takayama.nagano.jp":true,"tateshina.nagano.jp":true,"tatsuno.nagano.jp":true,"togakushi.nagano.jp":true,"togura.nagano.jp":true,"tomi.nagano.jp":true,"ueda.nagano.jp":true,"wada.nagano.jp":true,"yamagata.nagano.jp":true,"yamanouchi.nagano.jp":true,"yasaka.nagano.jp":true,"yasuoka.nagano.jp":true,"chijiwa.nagasaki.jp":true,"futsu.nagasaki.jp":true,"goto.nagasaki.jp":true,"hasami.nagasaki.jp":true,"hirado.nagasaki.jp":true,"iki.nagasaki.jp":true,"isahaya.nagasaki.jp":true,"kawatana.nagasaki.jp":true,"kuchinotsu.nagasaki.jp":true,"matsuura.nagasaki.jp":true,"nagasaki.nagasaki.jp":true,"obama.nagasaki.jp":true,"omura.nagasaki.jp":true,"oseto.nagasaki.jp":true,"saikai.nagasaki.jp":true,"sasebo.nagasaki.jp":true,"seihi.nagasaki.jp":true,"shimabara.nagasaki.jp":true,"shinkamigoto.nagasaki.jp":true,"togitsu.nagasaki.jp":true,"tsushima.nagasaki.jp":true,"unzen.nagasaki.jp":true,"ando.nara.jp":true,"gose.nara.jp":true,"heguri.nara.jp":true,"higashiyoshino.nara.jp":true,"ikaruga.nara.jp":true,"ikoma.nara.jp":true,"kamikitayama.nara.jp":true,"kanmaki.nara.jp":true,"kashiba.nara.jp":true,"kashihara.nara.jp":true,"katsuragi.nara.jp":true,"kawai.nara.jp":true,"kawakami.nara.jp":true,"kawanishi.nara.jp":true,"koryo.nara.jp":true,"kurotaki.nara.jp":true,"mitsue.nara.jp":true,"miyake.nara.jp":true,"nara.nara.jp":true,"nosegawa.nara.jp":true,"oji.nara.jp":true,"ouda.nara.jp":true,"oyodo.nara.jp":true,"sakurai.nara.jp":true,"sango.nara.jp":true,"shimoichi.nara.jp":true,"shimokitayama.nara.jp":true,"shinjo.nara.jp":true,"soni.nara.jp":true,"takatori.nara.jp":true,"tawaramoto.nara.jp":true,"tenkawa.nara.jp":true,"tenri.nara.jp":true,"uda.nara.jp":true,"yamatokoriyama.nara.jp":true,"yamatotakada.nara.jp":true,"yamazoe.nara.jp":true,"yoshino.nara.jp":true,"aga.niigata.jp":true,"agano.niigata.jp":true,"gosen.niigata.jp":true,"itoigawa.niigata.jp":true,"izumozaki.niigata.jp":true,"joetsu.niigata.jp":true,"kamo.niigata.jp":true,"kariwa.niigata.jp":true,"kashiwazaki.niigata.jp":true,"minamiuonuma.niigata.jp":true,"mitsuke.niigata.jp":true,"muika.niigata.jp":true,"murakami.niigata.jp":true,"myoko.niigata.jp":true,"nagaoka.niigata.jp":true,"niigata.niigata.jp":true,"ojiya.niigata.jp":true,"omi.niigata.jp":true,"sado.niigata.jp":true,"sanjo.niigata.jp":true,"seiro.niigata.jp":true,"seirou.niigata.jp":true,"sekikawa.niigata.jp":true,"shibata.niigata.jp":true,"tagami.niigata.jp":true,"tainai.niigata.jp":true,"tochio.niigata.jp":true,"tokamachi.niigata.jp":true,"tsubame.niigata.jp":true,"tsunan.niigata.jp":true,"uonuma.niigata.jp":true,"yahiko.niigata.jp":true,"yoita.niigata.jp":true,"yuzawa.niigata.jp":true,"beppu.oita.jp":true,"bungoono.oita.jp":true,"bungotakada.oita.jp":true,"hasama.oita.jp":true,"hiji.oita.jp":true,"himeshima.oita.jp":true,"hita.oita.jp":true,"kamitsue.oita.jp":true,"kokonoe.oita.jp":true,"kuju.oita.jp":true,"kunisaki.oita.jp":true,"kusu.oita.jp":true,"oita.oita.jp":true,"saiki.oita.jp":true,"taketa.oita.jp":true,"tsukumi.oita.jp":true,"usa.oita.jp":true,"usuki.oita.jp":true,"yufu.oita.jp":true,"akaiwa.okayama.jp":true,"asakuchi.okayama.jp":true,"bizen.okayama.jp":true,"hayashima.okayama.jp":true,"ibara.okayama.jp":true,"kagamino.okayama.jp":true,"kasaoka.okayama.jp":true,"kibichuo.okayama.jp":true,"kumenan.okayama.jp":true,"kurashiki.okayama.jp":true,"maniwa.okayama.jp":true,"misaki.okayama.jp":true,"nagi.okayama.jp":true,"niimi.okayama.jp":true,"nishiawakura.okayama.jp":true,"okayama.okayama.jp":true,"satosho.okayama.jp":true,"setouchi.okayama.jp":true,"shinjo.okayama.jp":true,"shoo.okayama.jp":true,"soja.okayama.jp":true,"takahashi.okayama.jp":true,"tamano.okayama.jp":true,"tsuyama.okayama.jp":true,"wake.okayama.jp":true,"yakage.okayama.jp":true,"aguni.okinawa.jp":true,"ginowan.okinawa.jp":true,"ginoza.okinawa.jp":true,"gushikami.okinawa.jp":true,"haebaru.okinawa.jp":true,"higashi.okinawa.jp":true,"hirara.okinawa.jp":true,"iheya.okinawa.jp":true,"ishigaki.okinawa.jp":true,"ishikawa.okinawa.jp":true,"itoman.okinawa.jp":true,"izena.okinawa.jp":true,"kadena.okinawa.jp":true,"kin.okinawa.jp":true,"kitadaito.okinawa.jp":true,"kitanakagusuku.okinawa.jp":true,"kumejima.okinawa.jp":true,"kunigami.okinawa.jp":true,"minamidaito.okinawa.jp":true,"motobu.okinawa.jp":true,"nago.okinawa.jp":true,"naha.okinawa.jp":true,"nakagusuku.okinawa.jp":true,"nakijin.okinawa.jp":true,"nanjo.okinawa.jp":true,"nishihara.okinawa.jp":true,"ogimi.okinawa.jp":true,"okinawa.okinawa.jp":true,"onna.okinawa.jp":true,"shimoji.okinawa.jp":true,"taketomi.okinawa.jp":true,"tarama.okinawa.jp":true,"tokashiki.okinawa.jp":true,"tomigusuku.okinawa.jp":true,"tonaki.okinawa.jp":true,"urasoe.okinawa.jp":true,"uruma.okinawa.jp":true,"yaese.okinawa.jp":true,"yomitan.okinawa.jp":true,"yonabaru.okinawa.jp":true,"yonaguni.okinawa.jp":true,"zamami.okinawa.jp":true,"abeno.osaka.jp":true,"chihayaakasaka.osaka.jp":true,"chuo.osaka.jp":true,"daito.osaka.jp":true,"fujiidera.osaka.jp":true,"habikino.osaka.jp":true,"hannan.osaka.jp":true,"higashiosaka.osaka.jp":true,"higashisumiyoshi.osaka.jp":true,"higashiyodogawa.osaka.jp":true,"hirakata.osaka.jp":true,"ibaraki.osaka.jp":true,"ikeda.osaka.jp":true,"izumi.osaka.jp":true,"izumiotsu.osaka.jp":true,"izumisano.osaka.jp":true,"kadoma.osaka.jp":true,"kaizuka.osaka.jp":true,"kanan.osaka.jp":true,"kashiwara.osaka.jp":true,"katano.osaka.jp":true,"kawachinagano.osaka.jp":true,"kishiwada.osaka.jp":true,"kita.osaka.jp":true,"kumatori.osaka.jp":true,"matsubara.osaka.jp":true,"minato.osaka.jp":true,"minoh.osaka.jp":true,"misaki.osaka.jp":true,"moriguchi.osaka.jp":true,"neyagawa.osaka.jp":true,"nishi.osaka.jp":true,"nose.osaka.jp":true,"osakasayama.osaka.jp":true,"sakai.osaka.jp":true,"sayama.osaka.jp":true,"sennan.osaka.jp":true,"settsu.osaka.jp":true,"shijonawate.osaka.jp":true,"shimamoto.osaka.jp":true,"suita.osaka.jp":true,"tadaoka.osaka.jp":true,"taishi.osaka.jp":true,"tajiri.osaka.jp":true,"takaishi.osaka.jp":true,"takatsuki.osaka.jp":true,"tondabayashi.osaka.jp":true,"toyonaka.osaka.jp":true,"toyono.osaka.jp":true,"yao.osaka.jp":true,"ariake.saga.jp":true,"arita.saga.jp":true,"fukudomi.saga.jp":true,"genkai.saga.jp":true,"hamatama.saga.jp":true,"hizen.saga.jp":true,"imari.saga.jp":true,"kamimine.saga.jp":true,"kanzaki.saga.jp":true,"karatsu.saga.jp":true,"kashima.saga.jp":true,"kitagata.saga.jp":true,"kitahata.saga.jp":true,"kiyama.saga.jp":true,"kouhoku.saga.jp":true,"kyuragi.saga.jp":true,"nishiarita.saga.jp":true,"ogi.saga.jp":true,"omachi.saga.jp":true,"ouchi.saga.jp":true,"saga.saga.jp":true,"shiroishi.saga.jp":true,"taku.saga.jp":true,"tara.saga.jp":true,"tosu.saga.jp":true,"yoshinogari.saga.jp":true,"arakawa.saitama.jp":true,"asaka.saitama.jp":true,"chichibu.saitama.jp":true,"fujimi.saitama.jp":true,"fujimino.saitama.jp":true,"fukaya.saitama.jp":true,"hanno.saitama.jp":true,"hanyu.saitama.jp":true,"hasuda.saitama.jp":true,"hatogaya.saitama.jp":true,"hatoyama.saitama.jp":true,"hidaka.saitama.jp":true,"higashichichibu.saitama.jp":true,"higashimatsuyama.saitama.jp":true,"honjo.saitama.jp":true,"ina.saitama.jp":true,"iruma.saitama.jp":true,"iwatsuki.saitama.jp":true,"kamiizumi.saitama.jp":true,"kamikawa.saitama.jp":true,"kamisato.saitama.jp":true,"kasukabe.saitama.jp":true,"kawagoe.saitama.jp":true,"kawaguchi.saitama.jp":true,"kawajima.saitama.jp":true,"kazo.saitama.jp":true,"kitamoto.saitama.jp":true,"koshigaya.saitama.jp":true,"kounosu.saitama.jp":true,"kuki.saitama.jp":true,"kumagaya.saitama.jp":true,"matsubushi.saitama.jp":true,"minano.saitama.jp":true,"misato.saitama.jp":true,"miyashiro.saitama.jp":true,"miyoshi.saitama.jp":true,"moroyama.saitama.jp":true,"nagatoro.saitama.jp":true,"namegawa.saitama.jp":true,"niiza.saitama.jp":true,"ogano.saitama.jp":true,"ogawa.saitama.jp":true,"ogose.saitama.jp":true,"okegawa.saitama.jp":true,"omiya.saitama.jp":true,"otaki.saitama.jp":true,"ranzan.saitama.jp":true,"ryokami.saitama.jp":true,"saitama.saitama.jp":true,"sakado.saitama.jp":true,"satte.saitama.jp":true,"sayama.saitama.jp":true,"shiki.saitama.jp":true,"shiraoka.saitama.jp":true,"soka.saitama.jp":true,"sugito.saitama.jp":true,"toda.saitama.jp":true,"tokigawa.saitama.jp":true,"tokorozawa.saitama.jp":true,"tsurugashima.saitama.jp":true,"urawa.saitama.jp":true,"warabi.saitama.jp":true,"yashio.saitama.jp":true,"yokoze.saitama.jp":true,"yono.saitama.jp":true,"yorii.saitama.jp":true,"yoshida.saitama.jp":true,"yoshikawa.saitama.jp":true,"yoshimi.saitama.jp":true,"aisho.shiga.jp":true,"gamo.shiga.jp":true,"higashiomi.shiga.jp":true,"hikone.shiga.jp":true,"koka.shiga.jp":true,"konan.shiga.jp":true,"kosei.shiga.jp":true,"koto.shiga.jp":true,"kusatsu.shiga.jp":true,"maibara.shiga.jp":true,"moriyama.shiga.jp":true,"nagahama.shiga.jp":true,"nishiazai.shiga.jp":true,"notogawa.shiga.jp":true,"omihachiman.shiga.jp":true,"otsu.shiga.jp":true,"ritto.shiga.jp":true,"ryuoh.shiga.jp":true,"takashima.shiga.jp":true,"takatsuki.shiga.jp":true,"torahime.shiga.jp":true,"toyosato.shiga.jp":true,"yasu.shiga.jp":true,"akagi.shimane.jp":true,"ama.shimane.jp":true,"gotsu.shimane.jp":true,"hamada.shimane.jp":true,"higashiizumo.shimane.jp":true,"hikawa.shimane.jp":true,"hikimi.shimane.jp":true,"izumo.shimane.jp":true,"kakinoki.shimane.jp":true,"masuda.shimane.jp":true,"matsue.shimane.jp":true,"misato.shimane.jp":true,"nishinoshima.shimane.jp":true,"ohda.shimane.jp":true,"okinoshima.shimane.jp":true,"okuizumo.shimane.jp":true,"shimane.shimane.jp":true,"tamayu.shimane.jp":true,"tsuwano.shimane.jp":true,"unnan.shimane.jp":true,"yakumo.shimane.jp":true,"yasugi.shimane.jp":true,"yatsuka.shimane.jp":true,"arai.shizuoka.jp":true,"atami.shizuoka.jp":true,"fuji.shizuoka.jp":true,"fujieda.shizuoka.jp":true,"fujikawa.shizuoka.jp":true,"fujinomiya.shizuoka.jp":true,"fukuroi.shizuoka.jp":true,"gotemba.shizuoka.jp":true,"haibara.shizuoka.jp":true,"hamamatsu.shizuoka.jp":true,"higashiizu.shizuoka.jp":true,"ito.shizuoka.jp":true,"iwata.shizuoka.jp":true,"izu.shizuoka.jp":true,"izunokuni.shizuoka.jp":true,"kakegawa.shizuoka.jp":true,"kannami.shizuoka.jp":true,"kawanehon.shizuoka.jp":true,"kawazu.shizuoka.jp":true,"kikugawa.shizuoka.jp":true,"kosai.shizuoka.jp":true,"makinohara.shizuoka.jp":true,"matsuzaki.shizuoka.jp":true,"minamiizu.shizuoka.jp":true,"mishima.shizuoka.jp":true,"morimachi.shizuoka.jp":true,"nishiizu.shizuoka.jp":true,"numazu.shizuoka.jp":true,"omaezaki.shizuoka.jp":true,"shimada.shizuoka.jp":true,"shimizu.shizuoka.jp":true,"shimoda.shizuoka.jp":true,"shizuoka.shizuoka.jp":true,"susono.shizuoka.jp":true,"yaizu.shizuoka.jp":true,"yoshida.shizuoka.jp":true,"ashikaga.tochigi.jp":true,"bato.tochigi.jp":true,"haga.tochigi.jp":true,"ichikai.tochigi.jp":true,"iwafune.tochigi.jp":true,"kaminokawa.tochigi.jp":true,"kanuma.tochigi.jp":true,"karasuyama.tochigi.jp":true,"kuroiso.tochigi.jp":true,"mashiko.tochigi.jp":true,"mibu.tochigi.jp":true,"moka.tochigi.jp":true,"motegi.tochigi.jp":true,"nasu.tochigi.jp":true,"nasushiobara.tochigi.jp":true,"nikko.tochigi.jp":true,"nishikata.tochigi.jp":true,"nogi.tochigi.jp":true,"ohira.tochigi.jp":true,"ohtawara.tochigi.jp":true,"oyama.tochigi.jp":true,"sakura.tochigi.jp":true,"sano.tochigi.jp":true,"shimotsuke.tochigi.jp":true,"shioya.tochigi.jp":true,"takanezawa.tochigi.jp":true,"tochigi.tochigi.jp":true,"tsuga.tochigi.jp":true,"ujiie.tochigi.jp":true,"utsunomiya.tochigi.jp":true,"yaita.tochigi.jp":true,"aizumi.tokushima.jp":true,"anan.tokushima.jp":true,"ichiba.tokushima.jp":true,"itano.tokushima.jp":true,"kainan.tokushima.jp":true,"komatsushima.tokushima.jp":true,"matsushige.tokushima.jp":true,"mima.tokushima.jp":true,"minami.tokushima.jp":true,"miyoshi.tokushima.jp":true,"mugi.tokushima.jp":true,"nakagawa.tokushima.jp":true,"naruto.tokushima.jp":true,"sanagochi.tokushima.jp":true,"shishikui.tokushima.jp":true,"tokushima.tokushima.jp":true,"wajiki.tokushima.jp":true,"adachi.tokyo.jp":true,"akiruno.tokyo.jp":true,"akishima.tokyo.jp":true,"aogashima.tokyo.jp":true,"arakawa.tokyo.jp":true,"bunkyo.tokyo.jp":true,"chiyoda.tokyo.jp":true,"chofu.tokyo.jp":true,"chuo.tokyo.jp":true,"edogawa.tokyo.jp":true,"fuchu.tokyo.jp":true,"fussa.tokyo.jp":true,"hachijo.tokyo.jp":true,"hachioji.tokyo.jp":true,"hamura.tokyo.jp":true,"higashikurume.tokyo.jp":true,"higashimurayama.tokyo.jp":true,"higashiyamato.tokyo.jp":true,"hino.tokyo.jp":true,"hinode.tokyo.jp":true,"hinohara.tokyo.jp":true,"inagi.tokyo.jp":true,"itabashi.tokyo.jp":true,"katsushika.tokyo.jp":true,"kita.tokyo.jp":true,"kiyose.tokyo.jp":true,"kodaira.tokyo.jp":true,"koganei.tokyo.jp":true,"kokubunji.tokyo.jp":true,"komae.tokyo.jp":true,"koto.tokyo.jp":true,"kouzushima.tokyo.jp":true,"kunitachi.tokyo.jp":true,"machida.tokyo.jp":true,"meguro.tokyo.jp":true,"minato.tokyo.jp":true,"mitaka.tokyo.jp":true,"mizuho.tokyo.jp":true,"musashimurayama.tokyo.jp":true,"musashino.tokyo.jp":true,"nakano.tokyo.jp":true,"nerima.tokyo.jp":true,"ogasawara.tokyo.jp":true,"okutama.tokyo.jp":true,"ome.tokyo.jp":true,"oshima.tokyo.jp":true,"ota.tokyo.jp":true,"setagaya.tokyo.jp":true,"shibuya.tokyo.jp":true,"shinagawa.tokyo.jp":true,"shinjuku.tokyo.jp":true,"suginami.tokyo.jp":true,"sumida.tokyo.jp":true,"tachikawa.tokyo.jp":true,"taito.tokyo.jp":true,"tama.tokyo.jp":true,"toshima.tokyo.jp":true,"chizu.tottori.jp":true,"hino.tottori.jp":true,"kawahara.tottori.jp":true,"koge.tottori.jp":true,"kotoura.tottori.jp":true,"misasa.tottori.jp":true,"nanbu.tottori.jp":true,"nichinan.tottori.jp":true,"sakaiminato.tottori.jp":true,"tottori.tottori.jp":true,"wakasa.tottori.jp":true,"yazu.tottori.jp":true,"yonago.tottori.jp":true,"asahi.toyama.jp":true,"fuchu.toyama.jp":true,"fukumitsu.toyama.jp":true,"funahashi.toyama.jp":true,"himi.toyama.jp":true,"imizu.toyama.jp":true,"inami.toyama.jp":true,"johana.toyama.jp":true,"kamiichi.toyama.jp":true,"kurobe.toyama.jp":true,"nakaniikawa.toyama.jp":true,"namerikawa.toyama.jp":true,"nanto.toyama.jp":true,"nyuzen.toyama.jp":true,"oyabe.toyama.jp":true,"taira.toyama.jp":true,"takaoka.toyama.jp":true,"tateyama.toyama.jp":true,"toga.toyama.jp":true,"tonami.toyama.jp":true,"toyama.toyama.jp":true,"unazuki.toyama.jp":true,"uozu.toyama.jp":true,"yamada.toyama.jp":true,"arida.wakayama.jp":true,"aridagawa.wakayama.jp":true,"gobo.wakayama.jp":true,"hashimoto.wakayama.jp":true,"hidaka.wakayama.jp":true,"hirogawa.wakayama.jp":true,"inami.wakayama.jp":true,"iwade.wakayama.jp":true,"kainan.wakayama.jp":true,"kamitonda.wakayama.jp":true,"katsuragi.wakayama.jp":true,"kimino.wakayama.jp":true,"kinokawa.wakayama.jp":true,"kitayama.wakayama.jp":true,"koya.wakayama.jp":true,"koza.wakayama.jp":true,"kozagawa.wakayama.jp":true,"kudoyama.wakayama.jp":true,"kushimoto.wakayama.jp":true,"mihama.wakayama.jp":true,"misato.wakayama.jp":true,"nachikatsuura.wakayama.jp":true,"shingu.wakayama.jp":true,"shirahama.wakayama.jp":true,"taiji.wakayama.jp":true,"tanabe.wakayama.jp":true,"wakayama.wakayama.jp":true,"yuasa.wakayama.jp":true,"yura.wakayama.jp":true,"asahi.yamagata.jp":true,"funagata.yamagata.jp":true,"higashine.yamagata.jp":true,"iide.yamagata.jp":true,"kahoku.yamagata.jp":true,"kaminoyama.yamagata.jp":true,"kaneyama.yamagata.jp":true,"kawanishi.yamagata.jp":true,"mamurogawa.yamagata.jp":true,"mikawa.yamagata.jp":true,"murayama.yamagata.jp":true,"nagai.yamagata.jp":true,"nakayama.yamagata.jp":true,"nanyo.yamagata.jp":true,"nishikawa.yamagata.jp":true,"obanazawa.yamagata.jp":true,"oe.yamagata.jp":true,"oguni.yamagata.jp":true,"ohkura.yamagata.jp":true,"oishida.yamagata.jp":true,"sagae.yamagata.jp":true,"sakata.yamagata.jp":true,"sakegawa.yamagata.jp":true,"shinjo.yamagata.jp":true,"shirataka.yamagata.jp":true,"shonai.yamagata.jp":true,"takahata.yamagata.jp":true,"tendo.yamagata.jp":true,"tozawa.yamagata.jp":true,"tsuruoka.yamagata.jp":true,"yamagata.yamagata.jp":true,"yamanobe.yamagata.jp":true,"yonezawa.yamagata.jp":true,"yuza.yamagata.jp":true,"abu.yamaguchi.jp":true,"hagi.yamaguchi.jp":true,"hikari.yamaguchi.jp":true,"hofu.yamaguchi.jp":true,"iwakuni.yamaguchi.jp":true,"kudamatsu.yamaguchi.jp":true,"mitou.yamaguchi.jp":true,"nagato.yamaguchi.jp":true,"oshima.yamaguchi.jp":true,"shimonoseki.yamaguchi.jp":true,"shunan.yamaguchi.jp":true,"tabuse.yamaguchi.jp":true,"tokuyama.yamaguchi.jp":true,"toyota.yamaguchi.jp":true,"ube.yamaguchi.jp":true,"yuu.yamaguchi.jp":true,"chuo.yamanashi.jp":true,"doshi.yamanashi.jp":true,"fuefuki.yamanashi.jp":true,"fujikawa.yamanashi.jp":true,"fujikawaguchiko.yamanashi.jp":true,"fujiyoshida.yamanashi.jp":true,"hayakawa.yamanashi.jp":true,"hokuto.yamanashi.jp":true,"ichikawamisato.yamanashi.jp":true,"kai.yamanashi.jp":true,"kofu.yamanashi.jp":true,"koshu.yamanashi.jp":true,"kosuge.yamanashi.jp":true,"minami-alps.yamanashi.jp":true,"minobu.yamanashi.jp":true,"nakamichi.yamanashi.jp":true,"nanbu.yamanashi.jp":true,"narusawa.yamanashi.jp":true,"nirasaki.yamanashi.jp":true,"nishikatsura.yamanashi.jp":true,"oshino.yamanashi.jp":true,"otsuki.yamanashi.jp":true,"showa.yamanashi.jp":true,"tabayama.yamanashi.jp":true,"tsuru.yamanashi.jp":true,"uenohara.yamanashi.jp":true,"yamanakako.yamanashi.jp":true,"yamanashi.yamanashi.jp":true,"*.ke":true,"kg":true,"org.kg":true,"net.kg":true,"com.kg":true,"edu.kg":true,"gov.kg":true,"mil.kg":true,"*.kh":true,"ki":true,"edu.ki":true,"biz.ki":true,"net.ki":true,"org.ki":true,"gov.ki":true,"info.ki":true,"com.ki":true,"km":true,"org.km":true,"nom.km":true,"gov.km":true,"prd.km":true,"tm.km":true,"edu.km":true,"mil.km":true,"ass.km":true,"com.km":true,"coop.km":true,"asso.km":true,"presse.km":true,"medecin.km":true,"notaires.km":true,"pharmaciens.km":true,"veterinaire.km":true,"gouv.km":true,"kn":true,"net.kn":true,"org.kn":true,"edu.kn":true,"gov.kn":true,"kp":true,"com.kp":true,"edu.kp":true,"gov.kp":true,"org.kp":true,"rep.kp":true,"tra.kp":true,"kr":true,"ac.kr":true,"co.kr":true,"es.kr":true,"go.kr":true,"hs.kr":true,"kg.kr":true,"mil.kr":true,"ms.kr":true,"ne.kr":true,"or.kr":true,"pe.kr":true,"re.kr":true,"sc.kr":true,"busan.kr":true,"chungbuk.kr":true,"chungnam.kr":true,"daegu.kr":true,"daejeon.kr":true,"gangwon.kr":true,"gwangju.kr":true,"gyeongbuk.kr":true,"gyeonggi.kr":true,"gyeongnam.kr":true,"incheon.kr":true,"jeju.kr":true,"jeonbuk.kr":true,"jeonnam.kr":true,"seoul.kr":true,"ulsan.kr":true,"*.kw":true,"ky":true,"edu.ky":true,"gov.ky":true,"com.ky":true,"org.ky":true,"net.ky":true,"kz":true,"org.kz":true,"edu.kz":true,"net.kz":true,"gov.kz":true,"mil.kz":true,"com.kz":true,"la":true,"int.la":true,"net.la":true,"info.la":true,"edu.la":true,"gov.la":true,"per.la":true,"com.la":true,"org.la":true,"lb":true,"com.lb":true,"edu.lb":true,"gov.lb":true,"net.lb":true,"org.lb":true,"lc":true,"com.lc":true,"net.lc":true,"co.lc":true,"org.lc":true,"edu.lc":true,"gov.lc":true,"li":true,"lk":true,"gov.lk":true,"sch.lk":true,"net.lk":true,"int.lk":true,"com.lk":true,"org.lk":true,"edu.lk":true,"ngo.lk":true,"soc.lk":true,"web.lk":true,"ltd.lk":true,"assn.lk":true,"grp.lk":true,"hotel.lk":true,"ac.lk":true,"lr":true,"com.lr":true,"edu.lr":true,"gov.lr":true,"org.lr":true,"net.lr":true,"ls":true,"co.ls":true,"org.ls":true,"lt":true,"gov.lt":true,"lu":true,"lv":true,"com.lv":true,"edu.lv":true,"gov.lv":true,"org.lv":true,"mil.lv":true,"id.lv":true,"net.lv":true,"asn.lv":true,"conf.lv":true,"ly":true,"com.ly":true,"net.ly":true,"gov.ly":true,"plc.ly":true,"edu.ly":true,"sch.ly":true,"med.ly":true,"org.ly":true,"id.ly":true,"ma":true,"co.ma":true,"net.ma":true,"gov.ma":true,"org.ma":true,"ac.ma":true,"press.ma":true,"mc":true,"tm.mc":true,"asso.mc":true,"md":true,"me":true,"co.me":true,"net.me":true,"org.me":true,"edu.me":true,"ac.me":true,"gov.me":true,"its.me":true,"priv.me":true,"mg":true,"org.mg":true,"nom.mg":true,"gov.mg":true,"prd.mg":true,"tm.mg":true,"edu.mg":true,"mil.mg":true,"com.mg":true,"co.mg":true,"mh":true,"mil":true,"mk":true,"com.mk":true,"org.mk":true,"net.mk":true,"edu.mk":true,"gov.mk":true,"inf.mk":true,"name.mk":true,"ml":true,"com.ml":true,"edu.ml":true,"gouv.ml":true,"gov.ml":true,"net.ml":true,"org.ml":true,"presse.ml":true,"*.mm":true,"mn":true,"gov.mn":true,"edu.mn":true,"org.mn":true,"mo":true,"com.mo":true,"net.mo":true,"org.mo":true,"edu.mo":true,"gov.mo":true,"mobi":true,"mp":true,"mq":true,"mr":true,"gov.mr":true,"ms":true,"com.ms":true,"edu.ms":true,"gov.ms":true,"net.ms":true,"org.ms":true,"mt":true,"com.mt":true,"edu.mt":true,"net.mt":true,"org.mt":true,"mu":true,"com.mu":true,"net.mu":true,"org.mu":true,"gov.mu":true,"ac.mu":true,"co.mu":true,"or.mu":true,"museum":true,"academy.museum":true,"agriculture.museum":true,"air.museum":true,"airguard.museum":true,"alabama.museum":true,"alaska.museum":true,"amber.museum":true,"ambulance.museum":true,"american.museum":true,"americana.museum":true,"americanantiques.museum":true,"americanart.museum":true,"amsterdam.museum":true,"and.museum":true,"annefrank.museum":true,"anthro.museum":true,"anthropology.museum":true,"antiques.museum":true,"aquarium.museum":true,"arboretum.museum":true,"archaeological.museum":true,"archaeology.museum":true,"architecture.museum":true,"art.museum":true,"artanddesign.museum":true,"artcenter.museum":true,"artdeco.museum":true,"arteducation.museum":true,"artgallery.museum":true,"arts.museum":true,"artsandcrafts.museum":true,"asmatart.museum":true,"assassination.museum":true,"assisi.museum":true,"association.museum":true,"astronomy.museum":true,"atlanta.museum":true,"austin.museum":true,"australia.museum":true,"automotive.museum":true,"aviation.museum":true,"axis.museum":true,"badajoz.museum":true,"baghdad.museum":true,"bahn.museum":true,"bale.museum":true,"baltimore.museum":true,"barcelona.museum":true,"baseball.museum":true,"basel.museum":true,"baths.museum":true,"bauern.museum":true,"beauxarts.museum":true,"beeldengeluid.museum":true,"bellevue.museum":true,"bergbau.museum":true,"berkeley.museum":true,"berlin.museum":true,"bern.museum":true,"bible.museum":true,"bilbao.museum":true,"bill.museum":true,"birdart.museum":true,"birthplace.museum":true,"bonn.museum":true,"boston.museum":true,"botanical.museum":true,"botanicalgarden.museum":true,"botanicgarden.museum":true,"botany.museum":true,"brandywinevalley.museum":true,"brasil.museum":true,"bristol.museum":true,"british.museum":true,"britishcolumbia.museum":true,"broadcast.museum":true,"brunel.museum":true,"brussel.museum":true,"brussels.museum":true,"bruxelles.museum":true,"building.museum":true,"burghof.museum":true,"bus.museum":true,"bushey.museum":true,"cadaques.museum":true,"california.museum":true,"cambridge.museum":true,"can.museum":true,"canada.museum":true,"capebreton.museum":true,"carrier.museum":true,"cartoonart.museum":true,"casadelamoneda.museum":true,"castle.museum":true,"castres.museum":true,"celtic.museum":true,"center.museum":true,"chattanooga.museum":true,"cheltenham.museum":true,"chesapeakebay.museum":true,"chicago.museum":true,"children.museum":true,"childrens.museum":true,"childrensgarden.museum":true,"chiropractic.museum":true,"chocolate.museum":true,"christiansburg.museum":true,"cincinnati.museum":true,"cinema.museum":true,"circus.museum":true,"civilisation.museum":true,"civilization.museum":true,"civilwar.museum":true,"clinton.museum":true,"clock.museum":true,"coal.museum":true,"coastaldefence.museum":true,"cody.museum":true,"coldwar.museum":true,"collection.museum":true,"colonialwilliamsburg.museum":true,"coloradoplateau.museum":true,"columbia.museum":true,"columbus.museum":true,"communication.museum":true,"communications.museum":true,"community.museum":true,"computer.museum":true,"computerhistory.museum":true,"xn--comunicaes-v6a2o.museum":true,"contemporary.museum":true,"contemporaryart.museum":true,"convent.museum":true,"copenhagen.museum":true,"corporation.museum":true,"xn--correios-e-telecomunicaes-ghc29a.museum":true,"corvette.museum":true,"costume.museum":true,"countryestate.museum":true,"county.museum":true,"crafts.museum":true,"cranbrook.museum":true,"creation.museum":true,"cultural.museum":true,"culturalcenter.museum":true,"culture.museum":true,"cyber.museum":true,"cymru.museum":true,"dali.museum":true,"dallas.museum":true,"database.museum":true,"ddr.museum":true,"decorativearts.museum":true,"delaware.museum":true,"delmenhorst.museum":true,"denmark.museum":true,"depot.museum":true,"design.museum":true,"detroit.museum":true,"dinosaur.museum":true,"discovery.museum":true,"dolls.museum":true,"donostia.museum":true,"durham.museum":true,"eastafrica.museum":true,"eastcoast.museum":true,"education.museum":true,"educational.museum":true,"egyptian.museum":true,"eisenbahn.museum":true,"elburg.museum":true,"elvendrell.museum":true,"embroidery.museum":true,"encyclopedic.museum":true,"england.museum":true,"entomology.museum":true,"environment.museum":true,"environmentalconservation.museum":true,"epilepsy.museum":true,"essex.museum":true,"estate.museum":true,"ethnology.museum":true,"exeter.museum":true,"exhibition.museum":true,"family.museum":true,"farm.museum":true,"farmequipment.museum":true,"farmers.museum":true,"farmstead.museum":true,"field.museum":true,"figueres.museum":true,"filatelia.museum":true,"film.museum":true,"fineart.museum":true,"finearts.museum":true,"finland.museum":true,"flanders.museum":true,"florida.museum":true,"force.museum":true,"fortmissoula.museum":true,"fortworth.museum":true,"foundation.museum":true,"francaise.museum":true,"frankfurt.museum":true,"franziskaner.museum":true,"freemasonry.museum":true,"freiburg.museum":true,"fribourg.museum":true,"frog.museum":true,"fundacio.museum":true,"furniture.museum":true,"gallery.museum":true,"garden.museum":true,"gateway.museum":true,"geelvinck.museum":true,"gemological.museum":true,"geology.museum":true,"georgia.museum":true,"giessen.museum":true,"glas.museum":true,"glass.museum":true,"gorge.museum":true,"grandrapids.museum":true,"graz.museum":true,"guernsey.museum":true,"halloffame.museum":true,"hamburg.museum":true,"handson.museum":true,"harvestcelebration.museum":true,"hawaii.museum":true,"health.museum":true,"heimatunduhren.museum":true,"hellas.museum":true,"helsinki.museum":true,"hembygdsforbund.museum":true,"heritage.museum":true,"histoire.museum":true,"historical.museum":true,"historicalsociety.museum":true,"historichouses.museum":true,"historisch.museum":true,"historisches.museum":true,"history.museum":true,"historyofscience.museum":true,"horology.museum":true,"house.museum":true,"humanities.museum":true,"illustration.museum":true,"imageandsound.museum":true,"indian.museum":true,"indiana.museum":true,"indianapolis.museum":true,"indianmarket.museum":true,"intelligence.museum":true,"interactive.museum":true,"iraq.museum":true,"iron.museum":true,"isleofman.museum":true,"jamison.museum":true,"jefferson.museum":true,"jerusalem.museum":true,"jewelry.museum":true,"jewish.museum":true,"jewishart.museum":true,"jfk.museum":true,"journalism.museum":true,"judaica.museum":true,"judygarland.museum":true,"juedisches.museum":true,"juif.museum":true,"karate.museum":true,"karikatur.museum":true,"kids.museum":true,"koebenhavn.museum":true,"koeln.museum":true,"kunst.museum":true,"kunstsammlung.museum":true,"kunstunddesign.museum":true,"labor.museum":true,"labour.museum":true,"lajolla.museum":true,"lancashire.museum":true,"landes.museum":true,"lans.museum":true,"xn--lns-qla.museum":true,"larsson.museum":true,"lewismiller.museum":true,"lincoln.museum":true,"linz.museum":true,"living.museum":true,"livinghistory.museum":true,"localhistory.museum":true,"london.museum":true,"losangeles.museum":true,"louvre.museum":true,"loyalist.museum":true,"lucerne.museum":true,"luxembourg.museum":true,"luzern.museum":true,"mad.museum":true,"madrid.museum":true,"mallorca.museum":true,"manchester.museum":true,"mansion.museum":true,"mansions.museum":true,"manx.museum":true,"marburg.museum":true,"maritime.museum":true,"maritimo.museum":true,"maryland.museum":true,"marylhurst.museum":true,"media.museum":true,"medical.museum":true,"medizinhistorisches.museum":true,"meeres.museum":true,"memorial.museum":true,"mesaverde.museum":true,"michigan.museum":true,"midatlantic.museum":true,"military.museum":true,"mill.museum":true,"miners.museum":true,"mining.museum":true,"minnesota.museum":true,"missile.museum":true,"missoula.museum":true,"modern.museum":true,"moma.museum":true,"money.museum":true,"monmouth.museum":true,"monticello.museum":true,"montreal.museum":true,"moscow.museum":true,"motorcycle.museum":true,"muenchen.museum":true,"muenster.museum":true,"mulhouse.museum":true,"muncie.museum":true,"museet.museum":true,"museumcenter.museum":true,"museumvereniging.museum":true,"music.museum":true,"national.museum":true,"nationalfirearms.museum":true,"nationalheritage.museum":true,"nativeamerican.museum":true,"naturalhistory.museum":true,"naturalhistorymuseum.museum":true,"naturalsciences.museum":true,"nature.museum":true,"naturhistorisches.museum":true,"natuurwetenschappen.museum":true,"naumburg.museum":true,"naval.museum":true,"nebraska.museum":true,"neues.museum":true,"newhampshire.museum":true,"newjersey.museum":true,"newmexico.museum":true,"newport.museum":true,"newspaper.museum":true,"newyork.museum":true,"niepce.museum":true,"norfolk.museum":true,"north.museum":true,"nrw.museum":true,"nuernberg.museum":true,"nuremberg.museum":true,"nyc.museum":true,"nyny.museum":true,"oceanographic.museum":true,"oceanographique.museum":true,"omaha.museum":true,"online.museum":true,"ontario.museum":true,"openair.museum":true,"oregon.museum":true,"oregontrail.museum":true,"otago.museum":true,"oxford.museum":true,"pacific.museum":true,"paderborn.museum":true,"palace.museum":true,"paleo.museum":true,"palmsprings.museum":true,"panama.museum":true,"paris.museum":true,"pasadena.museum":true,"pharmacy.museum":true,"philadelphia.museum":true,"philadelphiaarea.museum":true,"philately.museum":true,"phoenix.museum":true,"photography.museum":true,"pilots.museum":true,"pittsburgh.museum":true,"planetarium.museum":true,"plantation.museum":true,"plants.museum":true,"plaza.museum":true,"portal.museum":true,"portland.museum":true,"portlligat.museum":true,"posts-and-telecommunications.museum":true,"preservation.museum":true,"presidio.museum":true,"press.museum":true,"project.museum":true,"public.museum":true,"pubol.museum":true,"quebec.museum":true,"railroad.museum":true,"railway.museum":true,"research.museum":true,"resistance.museum":true,"riodejaneiro.museum":true,"rochester.museum":true,"rockart.museum":true,"roma.museum":true,"russia.museum":true,"saintlouis.museum":true,"salem.museum":true,"salvadordali.museum":true,"salzburg.museum":true,"sandiego.museum":true,"sanfrancisco.museum":true,"santabarbara.museum":true,"santacruz.museum":true,"santafe.museum":true,"saskatchewan.museum":true,"satx.museum":true,"savannahga.museum":true,"schlesisches.museum":true,"schoenbrunn.museum":true,"schokoladen.museum":true,"school.museum":true,"schweiz.museum":true,"science.museum":true,"scienceandhistory.museum":true,"scienceandindustry.museum":true,"sciencecenter.museum":true,"sciencecenters.museum":true,"science-fiction.museum":true,"sciencehistory.museum":true,"sciences.museum":true,"sciencesnaturelles.museum":true,"scotland.museum":true,"seaport.museum":true,"settlement.museum":true,"settlers.museum":true,"shell.museum":true,"sherbrooke.museum":true,"sibenik.museum":true,"silk.museum":true,"ski.museum":true,"skole.museum":true,"society.museum":true,"sologne.museum":true,"soundandvision.museum":true,"southcarolina.museum":true,"southwest.museum":true,"space.museum":true,"spy.museum":true,"square.museum":true,"stadt.museum":true,"stalbans.museum":true,"starnberg.museum":true,"state.museum":true,"stateofdelaware.museum":true,"station.museum":true,"steam.museum":true,"steiermark.museum":true,"stjohn.museum":true,"stockholm.museum":true,"stpetersburg.museum":true,"stuttgart.museum":true,"suisse.museum":true,"surgeonshall.museum":true,"surrey.museum":true,"svizzera.museum":true,"sweden.museum":true,"sydney.museum":true,"tank.museum":true,"tcm.museum":true,"technology.museum":true,"telekommunikation.museum":true,"television.museum":true,"texas.museum":true,"textile.museum":true,"theater.museum":true,"time.museum":true,"timekeeping.museum":true,"topology.museum":true,"torino.museum":true,"touch.museum":true,"town.museum":true,"transport.museum":true,"tree.museum":true,"trolley.museum":true,"trust.museum":true,"trustee.museum":true,"uhren.museum":true,"ulm.museum":true,"undersea.museum":true,"university.museum":true,"usa.museum":true,"usantiques.museum":true,"usarts.museum":true,"uscountryestate.museum":true,"usculture.museum":true,"usdecorativearts.museum":true,"usgarden.museum":true,"ushistory.museum":true,"ushuaia.museum":true,"uslivinghistory.museum":true,"utah.museum":true,"uvic.museum":true,"valley.museum":true,"vantaa.museum":true,"versailles.museum":true,"viking.museum":true,"village.museum":true,"virginia.museum":true,"virtual.museum":true,"virtuel.museum":true,"vlaanderen.museum":true,"volkenkunde.museum":true,"wales.museum":true,"wallonie.museum":true,"war.museum":true,"washingtondc.museum":true,"watchandclock.museum":true,"watch-and-clock.museum":true,"western.museum":true,"westfalen.museum":true,"whaling.museum":true,"wildlife.museum":true,"williamsburg.museum":true,"windmill.museum":true,"workshop.museum":true,"york.museum":true,"yorkshire.museum":true,"yosemite.museum":true,"youth.museum":true,"zoological.museum":true,"zoology.museum":true,"xn--9dbhblg6di.museum":true,"xn--h1aegh.museum":true,"mv":true,"aero.mv":true,"biz.mv":true,"com.mv":true,"coop.mv":true,"edu.mv":true,"gov.mv":true,"info.mv":true,"int.mv":true,"mil.mv":true,"museum.mv":true,"name.mv":true,"net.mv":true,"org.mv":true,"pro.mv":true,"mw":true,"ac.mw":true,"biz.mw":true,"co.mw":true,"com.mw":true,"coop.mw":true,"edu.mw":true,"gov.mw":true,"int.mw":true,"museum.mw":true,"net.mw":true,"org.mw":true,"mx":true,"com.mx":true,"org.mx":true,"gob.mx":true,"edu.mx":true,"net.mx":true,"my":true,"com.my":true,"net.my":true,"org.my":true,"gov.my":true,"edu.my":true,"mil.my":true,"name.my":true,"*.mz":true,"teledata.mz":false,"na":true,"info.na":true,"pro.na":true,"name.na":true,"school.na":true,"or.na":true,"dr.na":true,"us.na":true,"mx.na":true,"ca.na":true,"in.na":true,"cc.na":true,"tv.na":true,"ws.na":true,"mobi.na":true,"co.na":true,"com.na":true,"org.na":true,"name":true,"nc":true,"asso.nc":true,"ne":true,"net":true,"nf":true,"com.nf":true,"net.nf":true,"per.nf":true,"rec.nf":true,"web.nf":true,"arts.nf":true,"firm.nf":true,"info.nf":true,"other.nf":true,"store.nf":true,"ng":true,"com.ng":true,"edu.ng":true,"name.ng":true,"net.ng":true,"org.ng":true,"sch.ng":true,"gov.ng":true,"mil.ng":true,"mobi.ng":true,"*.ni":true,"nl":true,"bv.nl":true,"no":true,"fhs.no":true,"vgs.no":true,"fylkesbibl.no":true,"folkebibl.no":true,"museum.no":true,"idrett.no":true,"priv.no":true,"mil.no":true,"stat.no":true,"dep.no":true,"kommune.no":true,"herad.no":true,"aa.no":true,"ah.no":true,"bu.no":true,"fm.no":true,"hl.no":true,"hm.no":true,"jan-mayen.no":true,"mr.no":true,"nl.no":true,"nt.no":true,"of.no":true,"ol.no":true,"oslo.no":true,"rl.no":true,"sf.no":true,"st.no":true,"svalbard.no":true,"tm.no":true,"tr.no":true,"va.no":true,"vf.no":true,"gs.aa.no":true,"gs.ah.no":true,"gs.bu.no":true,"gs.fm.no":true,"gs.hl.no":true,"gs.hm.no":true,"gs.jan-mayen.no":true,"gs.mr.no":true,"gs.nl.no":true,"gs.nt.no":true,"gs.of.no":true,"gs.ol.no":true,"gs.oslo.no":true,"gs.rl.no":true,"gs.sf.no":true,"gs.st.no":true,"gs.svalbard.no":true,"gs.tm.no":true,"gs.tr.no":true,"gs.va.no":true,"gs.vf.no":true,"akrehamn.no":true,"xn--krehamn-dxa.no":true,"algard.no":true,"xn--lgrd-poac.no":true,"arna.no":true,"brumunddal.no":true,"bryne.no":true,"bronnoysund.no":true,"xn--brnnysund-m8ac.no":true,"drobak.no":true,"xn--drbak-wua.no":true,"egersund.no":true,"fetsund.no":true,"floro.no":true,"xn--flor-jra.no":true,"fredrikstad.no":true,"hokksund.no":true,"honefoss.no":true,"xn--hnefoss-q1a.no":true,"jessheim.no":true,"jorpeland.no":true,"xn--jrpeland-54a.no":true,"kirkenes.no":true,"kopervik.no":true,"krokstadelva.no":true,"langevag.no":true,"xn--langevg-jxa.no":true,"leirvik.no":true,"mjondalen.no":true,"xn--mjndalen-64a.no":true,"mo-i-rana.no":true,"mosjoen.no":true,"xn--mosjen-eya.no":true,"nesoddtangen.no":true,"orkanger.no":true,"osoyro.no":true,"xn--osyro-wua.no":true,"raholt.no":true,"xn--rholt-mra.no":true,"sandnessjoen.no":true,"xn--sandnessjen-ogb.no":true,"skedsmokorset.no":true,"slattum.no":true,"spjelkavik.no":true,"stathelle.no":true,"stavern.no":true,"stjordalshalsen.no":true,"xn--stjrdalshalsen-sqb.no":true,"tananger.no":true,"tranby.no":true,"vossevangen.no":true,"afjord.no":true,"xn--fjord-lra.no":true,"agdenes.no":true,"al.no":true,"xn--l-1fa.no":true,"alesund.no":true,"xn--lesund-hua.no":true,"alstahaug.no":true,"alta.no":true,"xn--lt-liac.no":true,"alaheadju.no":true,"xn--laheadju-7ya.no":true,"alvdal.no":true,"amli.no":true,"xn--mli-tla.no":true,"amot.no":true,"xn--mot-tla.no":true,"andebu.no":true,"andoy.no":true,"xn--andy-ira.no":true,"andasuolo.no":true,"ardal.no":true,"xn--rdal-poa.no":true,"aremark.no":true,"arendal.no":true,"xn--s-1fa.no":true,"aseral.no":true,"xn--seral-lra.no":true,"asker.no":true,"askim.no":true,"askvoll.no":true,"askoy.no":true,"xn--asky-ira.no":true,"asnes.no":true,"xn--snes-poa.no":true,"audnedaln.no":true,"aukra.no":true,"aure.no":true,"aurland.no":true,"aurskog-holand.no":true,"xn--aurskog-hland-jnb.no":true,"austevoll.no":true,"austrheim.no":true,"averoy.no":true,"xn--avery-yua.no":true,"balestrand.no":true,"ballangen.no":true,"balat.no":true,"xn--blt-elab.no":true,"balsfjord.no":true,"bahccavuotna.no":true,"xn--bhccavuotna-k7a.no":true,"bamble.no":true,"bardu.no":true,"beardu.no":true,"beiarn.no":true,"bajddar.no":true,"xn--bjddar-pta.no":true,"baidar.no":true,"xn--bidr-5nac.no":true,"berg.no":true,"bergen.no":true,"berlevag.no":true,"xn--berlevg-jxa.no":true,"bearalvahki.no":true,"xn--bearalvhki-y4a.no":true,"bindal.no":true,"birkenes.no":true,"bjarkoy.no":true,"xn--bjarky-fya.no":true,"bjerkreim.no":true,"bjugn.no":true,"bodo.no":true,"xn--bod-2na.no":true,"badaddja.no":true,"xn--bdddj-mrabd.no":true,"budejju.no":true,"bokn.no":true,"bremanger.no":true,"bronnoy.no":true,"xn--brnny-wuac.no":true,"bygland.no":true,"bykle.no":true,"barum.no":true,"xn--brum-voa.no":true,"bo.telemark.no":true,"xn--b-5ga.telemark.no":true,"bo.nordland.no":true,"xn--b-5ga.nordland.no":true,"bievat.no":true,"xn--bievt-0qa.no":true,"bomlo.no":true,"xn--bmlo-gra.no":true,"batsfjord.no":true,"xn--btsfjord-9za.no":true,"bahcavuotna.no":true,"xn--bhcavuotna-s4a.no":true,"dovre.no":true,"drammen.no":true,"drangedal.no":true,"dyroy.no":true,"xn--dyry-ira.no":true,"donna.no":true,"xn--dnna-gra.no":true,"eid.no":true,"eidfjord.no":true,"eidsberg.no":true,"eidskog.no":true,"eidsvoll.no":true,"eigersund.no":true,"elverum.no":true,"enebakk.no":true,"engerdal.no":true,"etne.no":true,"etnedal.no":true,"evenes.no":true,"evenassi.no":true,"xn--eveni-0qa01ga.no":true,"evje-og-hornnes.no":true,"farsund.no":true,"fauske.no":true,"fuossko.no":true,"fuoisku.no":true,"fedje.no":true,"fet.no":true,"finnoy.no":true,"xn--finny-yua.no":true,"fitjar.no":true,"fjaler.no":true,"fjell.no":true,"flakstad.no":true,"flatanger.no":true,"flekkefjord.no":true,"flesberg.no":true,"flora.no":true,"fla.no":true,"xn--fl-zia.no":true,"folldal.no":true,"forsand.no":true,"fosnes.no":true,"frei.no":true,"frogn.no":true,"froland.no":true,"frosta.no":true,"frana.no":true,"xn--frna-woa.no":true,"froya.no":true,"xn--frya-hra.no":true,"fusa.no":true,"fyresdal.no":true,"forde.no":true,"xn--frde-gra.no":true,"gamvik.no":true,"gangaviika.no":true,"xn--ggaviika-8ya47h.no":true,"gaular.no":true,"gausdal.no":true,"gildeskal.no":true,"xn--gildeskl-g0a.no":true,"giske.no":true,"gjemnes.no":true,"gjerdrum.no":true,"gjerstad.no":true,"gjesdal.no":true,"gjovik.no":true,"xn--gjvik-wua.no":true,"gloppen.no":true,"gol.no":true,"gran.no":true,"grane.no":true,"granvin.no":true,"gratangen.no":true,"grimstad.no":true,"grong.no":true,"kraanghke.no":true,"xn--kranghke-b0a.no":true,"grue.no":true,"gulen.no":true,"hadsel.no":true,"halden.no":true,"halsa.no":true,"hamar.no":true,"hamaroy.no":true,"habmer.no":true,"xn--hbmer-xqa.no":true,"hapmir.no":true,"xn--hpmir-xqa.no":true,"hammerfest.no":true,"hammarfeasta.no":true,"xn--hmmrfeasta-s4ac.no":true,"haram.no":true,"hareid.no":true,"harstad.no":true,"hasvik.no":true,"aknoluokta.no":true,"xn--koluokta-7ya57h.no":true,"hattfjelldal.no":true,"aarborte.no":true,"haugesund.no":true,"hemne.no":true,"hemnes.no":true,"hemsedal.no":true,"heroy.more-og-romsdal.no":true,"xn--hery-ira.xn--mre-og-romsdal-qqb.no":true,"heroy.nordland.no":true,"xn--hery-ira.nordland.no":true,"hitra.no":true,"hjartdal.no":true,"hjelmeland.no":true,"hobol.no":true,"xn--hobl-ira.no":true,"hof.no":true,"hol.no":true,"hole.no":true,"holmestrand.no":true,"holtalen.no":true,"xn--holtlen-hxa.no":true,"hornindal.no":true,"horten.no":true,"hurdal.no":true,"hurum.no":true,"hvaler.no":true,"hyllestad.no":true,"hagebostad.no":true,"xn--hgebostad-g3a.no":true,"hoyanger.no":true,"xn--hyanger-q1a.no":true,"hoylandet.no":true,"xn--hylandet-54a.no":true,"ha.no":true,"xn--h-2fa.no":true,"ibestad.no":true,"inderoy.no":true,"xn--indery-fya.no":true,"iveland.no":true,"jevnaker.no":true,"jondal.no":true,"jolster.no":true,"xn--jlster-bya.no":true,"karasjok.no":true,"karasjohka.no":true,"xn--krjohka-hwab49j.no":true,"karlsoy.no":true,"galsa.no":true,"xn--gls-elac.no":true,"karmoy.no":true,"xn--karmy-yua.no":true,"kautokeino.no":true,"guovdageaidnu.no":true,"klepp.no":true,"klabu.no":true,"xn--klbu-woa.no":true,"kongsberg.no":true,"kongsvinger.no":true,"kragero.no":true,"xn--krager-gya.no":true,"kristiansand.no":true,"kristiansund.no":true,"krodsherad.no":true,"xn--krdsherad-m8a.no":true,"kvalsund.no":true,"rahkkeravju.no":true,"xn--rhkkervju-01af.no":true,"kvam.no":true,"kvinesdal.no":true,"kvinnherad.no":true,"kviteseid.no":true,"kvitsoy.no":true,"xn--kvitsy-fya.no":true,"kvafjord.no":true,"xn--kvfjord-nxa.no":true,"giehtavuoatna.no":true,"kvanangen.no":true,"xn--kvnangen-k0a.no":true,"navuotna.no":true,"xn--nvuotna-hwa.no":true,"kafjord.no":true,"xn--kfjord-iua.no":true,"gaivuotna.no":true,"xn--givuotna-8ya.no":true,"larvik.no":true,"lavangen.no":true,"lavagis.no":true,"loabat.no":true,"xn--loabt-0qa.no":true,"lebesby.no":true,"davvesiida.no":true,"leikanger.no":true,"leirfjord.no":true,"leka.no":true,"leksvik.no":true,"lenvik.no":true,"leangaviika.no":true,"xn--leagaviika-52b.no":true,"lesja.no":true,"levanger.no":true,"lier.no":true,"lierne.no":true,"lillehammer.no":true,"lillesand.no":true,"lindesnes.no":true,"lindas.no":true,"xn--linds-pra.no":true,"lom.no":true,"loppa.no":true,"lahppi.no":true,"xn--lhppi-xqa.no":true,"lund.no":true,"lunner.no":true,"luroy.no":true,"xn--lury-ira.no":true,"luster.no":true,"lyngdal.no":true,"lyngen.no":true,"ivgu.no":true,"lardal.no":true,"lerdal.no":true,"xn--lrdal-sra.no":true,"lodingen.no":true,"xn--ldingen-q1a.no":true,"lorenskog.no":true,"xn--lrenskog-54a.no":true,"loten.no":true,"xn--lten-gra.no":true,"malvik.no":true,"masoy.no":true,"xn--msy-ula0h.no":true,"muosat.no":true,"xn--muost-0qa.no":true,"mandal.no":true,"marker.no":true,"marnardal.no":true,"masfjorden.no":true,"meland.no":true,"meldal.no":true,"melhus.no":true,"meloy.no":true,"xn--mely-ira.no":true,"meraker.no":true,"xn--merker-kua.no":true,"moareke.no":true,"xn--moreke-jua.no":true,"midsund.no":true,"midtre-gauldal.no":true,"modalen.no":true,"modum.no":true,"molde.no":true,"moskenes.no":true,"moss.no":true,"mosvik.no":true,"malselv.no":true,"xn--mlselv-iua.no":true,"malatvuopmi.no":true,"xn--mlatvuopmi-s4a.no":true,"namdalseid.no":true,"aejrie.no":true,"namsos.no":true,"namsskogan.no":true,"naamesjevuemie.no":true,"xn--nmesjevuemie-tcba.no":true,"laakesvuemie.no":true,"nannestad.no":true,"narvik.no":true,"narviika.no":true,"naustdal.no":true,"nedre-eiker.no":true,"nes.akershus.no":true,"nes.buskerud.no":true,"nesna.no":true,"nesodden.no":true,"nesseby.no":true,"unjarga.no":true,"xn--unjrga-rta.no":true,"nesset.no":true,"nissedal.no":true,"nittedal.no":true,"nord-aurdal.no":true,"nord-fron.no":true,"nord-odal.no":true,"norddal.no":true,"nordkapp.no":true,"davvenjarga.no":true,"xn--davvenjrga-y4a.no":true,"nordre-land.no":true,"nordreisa.no":true,"raisa.no":true,"xn--risa-5na.no":true,"nore-og-uvdal.no":true,"notodden.no":true,"naroy.no":true,"xn--nry-yla5g.no":true,"notteroy.no":true,"xn--nttery-byae.no":true,"odda.no":true,"oksnes.no":true,"xn--ksnes-uua.no":true,"oppdal.no":true,"oppegard.no":true,"xn--oppegrd-ixa.no":true,"orkdal.no":true,"orland.no":true,"xn--rland-uua.no":true,"orskog.no":true,"xn--rskog-uua.no":true,"orsta.no":true,"xn--rsta-fra.no":true,"os.hedmark.no":true,"os.hordaland.no":true,"osen.no":true,"osteroy.no":true,"xn--ostery-fya.no":true,"ostre-toten.no":true,"xn--stre-toten-zcb.no":true,"overhalla.no":true,"ovre-eiker.no":true,"xn--vre-eiker-k8a.no":true,"oyer.no":true,"xn--yer-zna.no":true,"oygarden.no":true,"xn--ygarden-p1a.no":true,"oystre-slidre.no":true,"xn--ystre-slidre-ujb.no":true,"porsanger.no":true,"porsangu.no":true,"xn--porsgu-sta26f.no":true,"porsgrunn.no":true,"radoy.no":true,"xn--rady-ira.no":true,"rakkestad.no":true,"rana.no":true,"ruovat.no":true,"randaberg.no":true,"rauma.no":true,"rendalen.no":true,"rennebu.no":true,"rennesoy.no":true,"xn--rennesy-v1a.no":true,"rindal.no":true,"ringebu.no":true,"ringerike.no":true,"ringsaker.no":true,"rissa.no":true,"risor.no":true,"xn--risr-ira.no":true,"roan.no":true,"rollag.no":true,"rygge.no":true,"ralingen.no":true,"xn--rlingen-mxa.no":true,"rodoy.no":true,"xn--rdy-0nab.no":true,"romskog.no":true,"xn--rmskog-bya.no":true,"roros.no":true,"xn--rros-gra.no":true,"rost.no":true,"xn--rst-0na.no":true,"royken.no":true,"xn--ryken-vua.no":true,"royrvik.no":true,"xn--ryrvik-bya.no":true,"rade.no":true,"xn--rde-ula.no":true,"salangen.no":true,"siellak.no":true,"saltdal.no":true,"salat.no":true,"xn--slt-elab.no":true,"xn--slat-5na.no":true,"samnanger.no":true,"sande.more-og-romsdal.no":true,"sande.xn--mre-og-romsdal-qqb.no":true,"sande.vestfold.no":true,"sandefjord.no":true,"sandnes.no":true,"sandoy.no":true,"xn--sandy-yua.no":true,"sarpsborg.no":true,"sauda.no":true,"sauherad.no":true,"sel.no":true,"selbu.no":true,"selje.no":true,"seljord.no":true,"sigdal.no":true,"siljan.no":true,"sirdal.no":true,"skaun.no":true,"skedsmo.no":true,"ski.no":true,"skien.no":true,"skiptvet.no":true,"skjervoy.no":true,"xn--skjervy-v1a.no":true,"skierva.no":true,"xn--skierv-uta.no":true,"skjak.no":true,"xn--skjk-soa.no":true,"skodje.no":true,"skanland.no":true,"xn--sknland-fxa.no":true,"skanit.no":true,"xn--sknit-yqa.no":true,"smola.no":true,"xn--smla-hra.no":true,"snillfjord.no":true,"snasa.no":true,"xn--snsa-roa.no":true,"snoasa.no":true,"snaase.no":true,"xn--snase-nra.no":true,"sogndal.no":true,"sokndal.no":true,"sola.no":true,"solund.no":true,"songdalen.no":true,"sortland.no":true,"spydeberg.no":true,"stange.no":true,"stavanger.no":true,"steigen.no":true,"steinkjer.no":true,"stjordal.no":true,"xn--stjrdal-s1a.no":true,"stokke.no":true,"stor-elvdal.no":true,"stord.no":true,"stordal.no":true,"storfjord.no":true,"omasvuotna.no":true,"strand.no":true,"stranda.no":true,"stryn.no":true,"sula.no":true,"suldal.no":true,"sund.no":true,"sunndal.no":true,"surnadal.no":true,"sveio.no":true,"svelvik.no":true,"sykkylven.no":true,"sogne.no":true,"xn--sgne-gra.no":true,"somna.no":true,"xn--smna-gra.no":true,"sondre-land.no":true,"xn--sndre-land-0cb.no":true,"sor-aurdal.no":true,"xn--sr-aurdal-l8a.no":true,"sor-fron.no":true,"xn--sr-fron-q1a.no":true,"sor-odal.no":true,"xn--sr-odal-q1a.no":true,"sor-varanger.no":true,"xn--sr-varanger-ggb.no":true,"matta-varjjat.no":true,"xn--mtta-vrjjat-k7af.no":true,"sorfold.no":true,"xn--srfold-bya.no":true,"sorreisa.no":true,"xn--srreisa-q1a.no":true,"sorum.no":true,"xn--srum-gra.no":true,"tana.no":true,"deatnu.no":true,"time.no":true,"tingvoll.no":true,"tinn.no":true,"tjeldsund.no":true,"dielddanuorri.no":true,"tjome.no":true,"xn--tjme-hra.no":true,"tokke.no":true,"tolga.no":true,"torsken.no":true,"tranoy.no":true,"xn--trany-yua.no":true,"tromso.no":true,"xn--troms-zua.no":true,"tromsa.no":true,"romsa.no":true,"trondheim.no":true,"troandin.no":true,"trysil.no":true,"trana.no":true,"xn--trna-woa.no":true,"trogstad.no":true,"xn--trgstad-r1a.no":true,"tvedestrand.no":true,"tydal.no":true,"tynset.no":true,"tysfjord.no":true,"divtasvuodna.no":true,"divttasvuotna.no":true,"tysnes.no":true,"tysvar.no":true,"xn--tysvr-vra.no":true,"tonsberg.no":true,"xn--tnsberg-q1a.no":true,"ullensaker.no":true,"ullensvang.no":true,"ulvik.no":true,"utsira.no":true,"vadso.no":true,"xn--vads-jra.no":true,"cahcesuolo.no":true,"xn--hcesuolo-7ya35b.no":true,"vaksdal.no":true,"valle.no":true,"vang.no":true,"vanylven.no":true,"vardo.no":true,"xn--vard-jra.no":true,"varggat.no":true,"xn--vrggt-xqad.no":true,"vefsn.no":true,"vaapste.no":true,"vega.no":true,"vegarshei.no":true,"xn--vegrshei-c0a.no":true,"vennesla.no":true,"verdal.no":true,"verran.no":true,"vestby.no":true,"vestnes.no":true,"vestre-slidre.no":true,"vestre-toten.no":true,"vestvagoy.no":true,"xn--vestvgy-ixa6o.no":true,"vevelstad.no":true,"vik.no":true,"vikna.no":true,"vindafjord.no":true,"volda.no":true,"voss.no":true,"varoy.no":true,"xn--vry-yla5g.no":true,"vagan.no":true,"xn--vgan-qoa.no":true,"voagat.no":true,"vagsoy.no":true,"xn--vgsy-qoa0j.no":true,"vaga.no":true,"xn--vg-yiab.no":true,"valer.ostfold.no":true,"xn--vler-qoa.xn--stfold-9xa.no":true,"valer.hedmark.no":true,"xn--vler-qoa.hedmark.no":true,"*.np":true,"nr":true,"biz.nr":true,"info.nr":true,"gov.nr":true,"edu.nr":true,"org.nr":true,"net.nr":true,"com.nr":true,"nu":true,"nz":true,"ac.nz":true,"co.nz":true,"cri.nz":true,"geek.nz":true,"gen.nz":true,"govt.nz":true,"health.nz":true,"iwi.nz":true,"kiwi.nz":true,"maori.nz":true,"mil.nz":true,"xn--mori-qsa.nz":true,"net.nz":true,"org.nz":true,"parliament.nz":true,"school.nz":true,"om":true,"co.om":true,"com.om":true,"edu.om":true,"gov.om":true,"med.om":true,"museum.om":true,"net.om":true,"org.om":true,"pro.om":true,"org":true,"pa":true,"ac.pa":true,"gob.pa":true,"com.pa":true,"org.pa":true,"sld.pa":true,"edu.pa":true,"net.pa":true,"ing.pa":true,"abo.pa":true,"med.pa":true,"nom.pa":true,"pe":true,"edu.pe":true,"gob.pe":true,"nom.pe":true,"mil.pe":true,"org.pe":true,"com.pe":true,"net.pe":true,"pf":true,"com.pf":true,"org.pf":true,"edu.pf":true,"*.pg":true,"ph":true,"com.ph":true,"net.ph":true,"org.ph":true,"gov.ph":true,"edu.ph":true,"ngo.ph":true,"mil.ph":true,"i.ph":true,"pk":true,"com.pk":true,"net.pk":true,"edu.pk":true,"org.pk":true,"fam.pk":true,"biz.pk":true,"web.pk":true,"gov.pk":true,"gob.pk":true,"gok.pk":true,"gon.pk":true,"gop.pk":true,"gos.pk":true,"info.pk":true,"pl":true,"com.pl":true,"net.pl":true,"org.pl":true,"aid.pl":true,"agro.pl":true,"atm.pl":true,"auto.pl":true,"biz.pl":true,"edu.pl":true,"gmina.pl":true,"gsm.pl":true,"info.pl":true,"mail.pl":true,"miasta.pl":true,"media.pl":true,"mil.pl":true,"nieruchomosci.pl":true,"nom.pl":true,"pc.pl":true,"powiat.pl":true,"priv.pl":true,"realestate.pl":true,"rel.pl":true,"sex.pl":true,"shop.pl":true,"sklep.pl":true,"sos.pl":true,"szkola.pl":true,"targi.pl":true,"tm.pl":true,"tourism.pl":true,"travel.pl":true,"turystyka.pl":true,"gov.pl":true,"ap.gov.pl":true,"ic.gov.pl":true,"is.gov.pl":true,"us.gov.pl":true,"kmpsp.gov.pl":true,"kppsp.gov.pl":true,"kwpsp.gov.pl":true,"psp.gov.pl":true,"wskr.gov.pl":true,"kwp.gov.pl":true,"mw.gov.pl":true,"ug.gov.pl":true,"um.gov.pl":true,"umig.gov.pl":true,"ugim.gov.pl":true,"upow.gov.pl":true,"uw.gov.pl":true,"starostwo.gov.pl":true,"pa.gov.pl":true,"po.gov.pl":true,"psse.gov.pl":true,"pup.gov.pl":true,"rzgw.gov.pl":true,"sa.gov.pl":true,"so.gov.pl":true,"sr.gov.pl":true,"wsa.gov.pl":true,"sko.gov.pl":true,"uzs.gov.pl":true,"wiih.gov.pl":true,"winb.gov.pl":true,"pinb.gov.pl":true,"wios.gov.pl":true,"witd.gov.pl":true,"wzmiuw.gov.pl":true,"piw.gov.pl":true,"wiw.gov.pl":true,"griw.gov.pl":true,"wif.gov.pl":true,"oum.gov.pl":true,"sdn.gov.pl":true,"zp.gov.pl":true,"uppo.gov.pl":true,"mup.gov.pl":true,"wuoz.gov.pl":true,"konsulat.gov.pl":true,"oirm.gov.pl":true,"augustow.pl":true,"babia-gora.pl":true,"bedzin.pl":true,"beskidy.pl":true,"bialowieza.pl":true,"bialystok.pl":true,"bielawa.pl":true,"bieszczady.pl":true,"boleslawiec.pl":true,"bydgoszcz.pl":true,"bytom.pl":true,"cieszyn.pl":true,"czeladz.pl":true,"czest.pl":true,"dlugoleka.pl":true,"elblag.pl":true,"elk.pl":true,"glogow.pl":true,"gniezno.pl":true,"gorlice.pl":true,"grajewo.pl":true,"ilawa.pl":true,"jaworzno.pl":true,"jelenia-gora.pl":true,"jgora.pl":true,"kalisz.pl":true,"kazimierz-dolny.pl":true,"karpacz.pl":true,"kartuzy.pl":true,"kaszuby.pl":true,"katowice.pl":true,"kepno.pl":true,"ketrzyn.pl":true,"klodzko.pl":true,"kobierzyce.pl":true,"kolobrzeg.pl":true,"konin.pl":true,"konskowola.pl":true,"kutno.pl":true,"lapy.pl":true,"lebork.pl":true,"legnica.pl":true,"lezajsk.pl":true,"limanowa.pl":true,"lomza.pl":true,"lowicz.pl":true,"lubin.pl":true,"lukow.pl":true,"malbork.pl":true,"malopolska.pl":true,"mazowsze.pl":true,"mazury.pl":true,"mielec.pl":true,"mielno.pl":true,"mragowo.pl":true,"naklo.pl":true,"nowaruda.pl":true,"nysa.pl":true,"olawa.pl":true,"olecko.pl":true,"olkusz.pl":true,"olsztyn.pl":true,"opoczno.pl":true,"opole.pl":true,"ostroda.pl":true,"ostroleka.pl":true,"ostrowiec.pl":true,"ostrowwlkp.pl":true,"pila.pl":true,"pisz.pl":true,"podhale.pl":true,"podlasie.pl":true,"polkowice.pl":true,"pomorze.pl":true,"pomorskie.pl":true,"prochowice.pl":true,"pruszkow.pl":true,"przeworsk.pl":true,"pulawy.pl":true,"radom.pl":true,"rawa-maz.pl":true,"rybnik.pl":true,"rzeszow.pl":true,"sanok.pl":true,"sejny.pl":true,"slask.pl":true,"slupsk.pl":true,"sosnowiec.pl":true,"stalowa-wola.pl":true,"skoczow.pl":true,"starachowice.pl":true,"stargard.pl":true,"suwalki.pl":true,"swidnica.pl":true,"swiebodzin.pl":true,"swinoujscie.pl":true,"szczecin.pl":true,"szczytno.pl":true,"tarnobrzeg.pl":true,"tgory.pl":true,"turek.pl":true,"tychy.pl":true,"ustka.pl":true,"walbrzych.pl":true,"warmia.pl":true,"warszawa.pl":true,"waw.pl":true,"wegrow.pl":true,"wielun.pl":true,"wlocl.pl":true,"wloclawek.pl":true,"wodzislaw.pl":true,"wolomin.pl":true,"wroclaw.pl":true,"zachpomor.pl":true,"zagan.pl":true,"zarow.pl":true,"zgora.pl":true,"zgorzelec.pl":true,"pm":true,"pn":true,"gov.pn":true,"co.pn":true,"org.pn":true,"edu.pn":true,"net.pn":true,"post":true,"pr":true,"com.pr":true,"net.pr":true,"org.pr":true,"gov.pr":true,"edu.pr":true,"isla.pr":true,"pro.pr":true,"biz.pr":true,"info.pr":true,"name.pr":true,"est.pr":true,"prof.pr":true,"ac.pr":true,"pro":true,"aca.pro":true,"bar.pro":true,"cpa.pro":true,"jur.pro":true,"law.pro":true,"med.pro":true,"eng.pro":true,"ps":true,"edu.ps":true,"gov.ps":true,"sec.ps":true,"plo.ps":true,"com.ps":true,"org.ps":true,"net.ps":true,"pt":true,"net.pt":true,"gov.pt":true,"org.pt":true,"edu.pt":true,"int.pt":true,"publ.pt":true,"com.pt":true,"nome.pt":true,"pw":true,"co.pw":true,"ne.pw":true,"or.pw":true,"ed.pw":true,"go.pw":true,"belau.pw":true,"py":true,"com.py":true,"coop.py":true,"edu.py":true,"gov.py":true,"mil.py":true,"net.py":true,"org.py":true,"qa":true,"com.qa":true,"edu.qa":true,"gov.qa":true,"mil.qa":true,"name.qa":true,"net.qa":true,"org.qa":true,"sch.qa":true,"re":true,"com.re":true,"asso.re":true,"nom.re":true,"ro":true,"com.ro":true,"org.ro":true,"tm.ro":true,"nt.ro":true,"nom.ro":true,"info.ro":true,"rec.ro":true,"arts.ro":true,"firm.ro":true,"store.ro":true,"www.ro":true,"rs":true,"co.rs":true,"org.rs":true,"edu.rs":true,"ac.rs":true,"gov.rs":true,"in.rs":true,"ru":true,"ac.ru":true,"com.ru":true,"edu.ru":true,"int.ru":true,"net.ru":true,"org.ru":true,"pp.ru":true,"adygeya.ru":true,"altai.ru":true,"amur.ru":true,"arkhangelsk.ru":true,"astrakhan.ru":true,"bashkiria.ru":true,"belgorod.ru":true,"bir.ru":true,"bryansk.ru":true,"buryatia.ru":true,"cbg.ru":true,"chel.ru":true,"chelyabinsk.ru":true,"chita.ru":true,"chukotka.ru":true,"chuvashia.ru":true,"dagestan.ru":true,"dudinka.ru":true,"e-burg.ru":true,"grozny.ru":true,"irkutsk.ru":true,"ivanovo.ru":true,"izhevsk.ru":true,"jar.ru":true,"joshkar-ola.ru":true,"kalmykia.ru":true,"kaluga.ru":true,"kamchatka.ru":true,"karelia.ru":true,"kazan.ru":true,"kchr.ru":true,"kemerovo.ru":true,"khabarovsk.ru":true,"khakassia.ru":true,"khv.ru":true,"kirov.ru":true,"koenig.ru":true,"komi.ru":true,"kostroma.ru":true,"krasnoyarsk.ru":true,"kuban.ru":true,"kurgan.ru":true,"kursk.ru":true,"lipetsk.ru":true,"magadan.ru":true,"mari.ru":true,"mari-el.ru":true,"marine.ru":true,"mordovia.ru":true,"msk.ru":true,"murmansk.ru":true,"nalchik.ru":true,"nnov.ru":true,"nov.ru":true,"novosibirsk.ru":true,"nsk.ru":true,"omsk.ru":true,"orenburg.ru":true,"oryol.ru":true,"palana.ru":true,"penza.ru":true,"perm.ru":true,"ptz.ru":true,"rnd.ru":true,"ryazan.ru":true,"sakhalin.ru":true,"samara.ru":true,"saratov.ru":true,"simbirsk.ru":true,"smolensk.ru":true,"spb.ru":true,"stavropol.ru":true,"stv.ru":true,"surgut.ru":true,"tambov.ru":true,"tatarstan.ru":true,"tom.ru":true,"tomsk.ru":true,"tsaritsyn.ru":true,"tsk.ru":true,"tula.ru":true,"tuva.ru":true,"tver.ru":true,"tyumen.ru":true,"udm.ru":true,"udmurtia.ru":true,"ulan-ude.ru":true,"vladikavkaz.ru":true,"vladimir.ru":true,"vladivostok.ru":true,"volgograd.ru":true,"vologda.ru":true,"voronezh.ru":true,"vrn.ru":true,"vyatka.ru":true,"yakutia.ru":true,"yamal.ru":true,"yaroslavl.ru":true,"yekaterinburg.ru":true,"yuzhno-sakhalinsk.ru":true,"amursk.ru":true,"baikal.ru":true,"cmw.ru":true,"fareast.ru":true,"jamal.ru":true,"kms.ru":true,"k-uralsk.ru":true,"kustanai.ru":true,"kuzbass.ru":true,"magnitka.ru":true,"mytis.ru":true,"nakhodka.ru":true,"nkz.ru":true,"norilsk.ru":true,"oskol.ru":true,"pyatigorsk.ru":true,"rubtsovsk.ru":true,"snz.ru":true,"syzran.ru":true,"vdonsk.ru":true,"zgrad.ru":true,"gov.ru":true,"mil.ru":true,"test.ru":true,"rw":true,"gov.rw":true,"net.rw":true,"edu.rw":true,"ac.rw":true,"com.rw":true,"co.rw":true,"int.rw":true,"mil.rw":true,"gouv.rw":true,"sa":true,"com.sa":true,"net.sa":true,"org.sa":true,"gov.sa":true,"med.sa":true,"pub.sa":true,"edu.sa":true,"sch.sa":true,"sb":true,"com.sb":true,"edu.sb":true,"gov.sb":true,"net.sb":true,"org.sb":true,"sc":true,"com.sc":true,"gov.sc":true,"net.sc":true,"org.sc":true,"edu.sc":true,"sd":true,"com.sd":true,"net.sd":true,"org.sd":true,"edu.sd":true,"med.sd":true,"tv.sd":true,"gov.sd":true,"info.sd":true,"se":true,"a.se":true,"ac.se":true,"b.se":true,"bd.se":true,"brand.se":true,"c.se":true,"d.se":true,"e.se":true,"f.se":true,"fh.se":true,"fhsk.se":true,"fhv.se":true,"g.se":true,"h.se":true,"i.se":true,"k.se":true,"komforb.se":true,"kommunalforbund.se":true,"komvux.se":true,"l.se":true,"lanbib.se":true,"m.se":true,"n.se":true,"naturbruksgymn.se":true,"o.se":true,"org.se":true,"p.se":true,"parti.se":true,"pp.se":true,"press.se":true,"r.se":true,"s.se":true,"t.se":true,"tm.se":true,"u.se":true,"w.se":true,"x.se":true,"y.se":true,"z.se":true,"sg":true,"com.sg":true,"net.sg":true,"org.sg":true,"gov.sg":true,"edu.sg":true,"per.sg":true,"sh":true,"com.sh":true,"net.sh":true,"gov.sh":true,"org.sh":true,"mil.sh":true,"si":true,"sj":true,"sk":true,"sl":true,"com.sl":true,"net.sl":true,"edu.sl":true,"gov.sl":true,"org.sl":true,"sm":true,"sn":true,"art.sn":true,"com.sn":true,"edu.sn":true,"gouv.sn":true,"org.sn":true,"perso.sn":true,"univ.sn":true,"so":true,"com.so":true,"net.so":true,"org.so":true,"sr":true,"st":true,"co.st":true,"com.st":true,"consulado.st":true,"edu.st":true,"embaixada.st":true,"gov.st":true,"mil.st":true,"net.st":true,"org.st":true,"principe.st":true,"saotome.st":true,"store.st":true,"su":true,"adygeya.su":true,"arkhangelsk.su":true,"balashov.su":true,"bashkiria.su":true,"bryansk.su":true,"dagestan.su":true,"grozny.su":true,"ivanovo.su":true,"kalmykia.su":true,"kaluga.su":true,"karelia.su":true,"khakassia.su":true,"krasnodar.su":true,"kurgan.su":true,"lenug.su":true,"mordovia.su":true,"msk.su":true,"murmansk.su":true,"nalchik.su":true,"nov.su":true,"obninsk.su":true,"penza.su":true,"pokrovsk.su":true,"sochi.su":true,"spb.su":true,"togliatti.su":true,"troitsk.su":true,"tula.su":true,"tuva.su":true,"vladikavkaz.su":true,"vladimir.su":true,"vologda.su":true,"sv":true,"com.sv":true,"edu.sv":true,"gob.sv":true,"org.sv":true,"red.sv":true,"sx":true,"gov.sx":true,"sy":true,"edu.sy":true,"gov.sy":true,"net.sy":true,"mil.sy":true,"com.sy":true,"org.sy":true,"sz":true,"co.sz":true,"ac.sz":true,"org.sz":true,"tc":true,"td":true,"tel":true,"tf":true,"tg":true,"th":true,"ac.th":true,"co.th":true,"go.th":true,"in.th":true,"mi.th":true,"net.th":true,"or.th":true,"tj":true,"ac.tj":true,"biz.tj":true,"co.tj":true,"com.tj":true,"edu.tj":true,"go.tj":true,"gov.tj":true,"int.tj":true,"mil.tj":true,"name.tj":true,"net.tj":true,"nic.tj":true,"org.tj":true,"test.tj":true,"web.tj":true,"tk":true,"tl":true,"gov.tl":true,"tm":true,"com.tm":true,"co.tm":true,"org.tm":true,"net.tm":true,"nom.tm":true,"gov.tm":true,"mil.tm":true,"edu.tm":true,"tn":true,"com.tn":true,"ens.tn":true,"fin.tn":true,"gov.tn":true,"ind.tn":true,"intl.tn":true,"nat.tn":true,"net.tn":true,"org.tn":true,"info.tn":true,"perso.tn":true,"tourism.tn":true,"edunet.tn":true,"rnrt.tn":true,"rns.tn":true,"rnu.tn":true,"mincom.tn":true,"agrinet.tn":true,"defense.tn":true,"turen.tn":true,"to":true,"com.to":true,"gov.to":true,"net.to":true,"org.to":true,"edu.to":true,"mil.to":true,"tp":true,"tr":true,"com.tr":true,"info.tr":true,"biz.tr":true,"net.tr":true,"org.tr":true,"web.tr":true,"gen.tr":true,"tv.tr":true,"av.tr":true,"dr.tr":true,"bbs.tr":true,"name.tr":true,"tel.tr":true,"gov.tr":true,"bel.tr":true,"pol.tr":true,"mil.tr":true,"k12.tr":true,"edu.tr":true,"kep.tr":true,"nc.tr":true,"gov.nc.tr":true,"travel":true,"tt":true,"co.tt":true,"com.tt":true,"org.tt":true,"net.tt":true,"biz.tt":true,"info.tt":true,"pro.tt":true,"int.tt":true,"coop.tt":true,"jobs.tt":true,"mobi.tt":true,"travel.tt":true,"museum.tt":true,"aero.tt":true,"name.tt":true,"gov.tt":true,"edu.tt":true,"tv":true,"tw":true,"edu.tw":true,"gov.tw":true,"mil.tw":true,"com.tw":true,"net.tw":true,"org.tw":true,"idv.tw":true,"game.tw":true,"ebiz.tw":true,"club.tw":true,"xn--zf0ao64a.tw":true,"xn--uc0atv.tw":true,"xn--czrw28b.tw":true,"tz":true,"ac.tz":true,"co.tz":true,"go.tz":true,"hotel.tz":true,"info.tz":true,"me.tz":true,"mil.tz":true,"mobi.tz":true,"ne.tz":true,"or.tz":true,"sc.tz":true,"tv.tz":true,"ua":true,"com.ua":true,"edu.ua":true,"gov.ua":true,"in.ua":true,"net.ua":true,"org.ua":true,"cherkassy.ua":true,"cherkasy.ua":true,"chernigov.ua":true,"chernihiv.ua":true,"chernivtsi.ua":true,"chernovtsy.ua":true,"ck.ua":true,"cn.ua":true,"cr.ua":true,"crimea.ua":true,"cv.ua":true,"dn.ua":true,"dnepropetrovsk.ua":true,"dnipropetrovsk.ua":true,"dominic.ua":true,"donetsk.ua":true,"dp.ua":true,"if.ua":true,"ivano-frankivsk.ua":true,"kh.ua":true,"kharkiv.ua":true,"kharkov.ua":true,"kherson.ua":true,"khmelnitskiy.ua":true,"khmelnytskyi.ua":true,"kiev.ua":true,"kirovograd.ua":true,"km.ua":true,"kr.ua":true,"krym.ua":true,"ks.ua":true,"kv.ua":true,"kyiv.ua":true,"lg.ua":true,"lt.ua":true,"lugansk.ua":true,"lutsk.ua":true,"lv.ua":true,"lviv.ua":true,"mk.ua":true,"mykolaiv.ua":true,"nikolaev.ua":true,"od.ua":true,"odesa.ua":true,"odessa.ua":true,"pl.ua":true,"poltava.ua":true,"rivne.ua":true,"rovno.ua":true,"rv.ua":true,"sb.ua":true,"sebastopol.ua":true,"sevastopol.ua":true,"sm.ua":true,"sumy.ua":true,"te.ua":true,"ternopil.ua":true,"uz.ua":true,"uzhgorod.ua":true,"vinnica.ua":true,"vinnytsia.ua":true,"vn.ua":true,"volyn.ua":true,"yalta.ua":true,"zaporizhzhe.ua":true,"zaporizhzhia.ua":true,"zhitomir.ua":true,"zhytomyr.ua":true,"zp.ua":true,"zt.ua":true,"ug":true,"co.ug":true,"or.ug":true,"ac.ug":true,"sc.ug":true,"go.ug":true,"ne.ug":true,"com.ug":true,"org.ug":true,"uk":true,"ac.uk":true,"co.uk":true,"gov.uk":true,"ltd.uk":true,"me.uk":true,"net.uk":true,"nhs.uk":true,"org.uk":true,"plc.uk":true,"police.uk":true,"*.sch.uk":true,"us":true,"dni.us":true,"fed.us":true,"isa.us":true,"kids.us":true,"nsn.us":true,"ak.us":true,"al.us":true,"ar.us":true,"as.us":true,"az.us":true,"ca.us":true,"co.us":true,"ct.us":true,"dc.us":true,"de.us":true,"fl.us":true,"ga.us":true,"gu.us":true,"hi.us":true,"ia.us":true,"id.us":true,"il.us":true,"in.us":true,"ks.us":true,"ky.us":true,"la.us":true,"ma.us":true,"md.us":true,"me.us":true,"mi.us":true,"mn.us":true,"mo.us":true,"ms.us":true,"mt.us":true,"nc.us":true,"nd.us":true,"ne.us":true,"nh.us":true,"nj.us":true,"nm.us":true,"nv.us":true,"ny.us":true,"oh.us":true,"ok.us":true,"or.us":true,"pa.us":true,"pr.us":true,"ri.us":true,"sc.us":true,"sd.us":true,"tn.us":true,"tx.us":true,"ut.us":true,"vi.us":true,"vt.us":true,"va.us":true,"wa.us":true,"wi.us":true,"wv.us":true,"wy.us":true,"k12.ak.us":true,"k12.al.us":true,"k12.ar.us":true,"k12.as.us":true,"k12.az.us":true,"k12.ca.us":true,"k12.co.us":true,"k12.ct.us":true,"k12.dc.us":true,"k12.de.us":true,"k12.fl.us":true,"k12.ga.us":true,"k12.gu.us":true,"k12.ia.us":true,"k12.id.us":true,"k12.il.us":true,"k12.in.us":true,"k12.ks.us":true,"k12.ky.us":true,"k12.la.us":true,"k12.ma.us":true,"k12.md.us":true,"k12.me.us":true,"k12.mi.us":true,"k12.mn.us":true,"k12.mo.us":true,"k12.ms.us":true,"k12.mt.us":true,"k12.nc.us":true,"k12.ne.us":true,"k12.nh.us":true,"k12.nj.us":true,"k12.nm.us":true,"k12.nv.us":true,"k12.ny.us":true,"k12.oh.us":true,"k12.ok.us":true,"k12.or.us":true,"k12.pa.us":true,"k12.pr.us":true,"k12.ri.us":true,"k12.sc.us":true,"k12.tn.us":true,"k12.tx.us":true,"k12.ut.us":true,"k12.vi.us":true,"k12.vt.us":true,"k12.va.us":true,"k12.wa.us":true,"k12.wi.us":true,"k12.wy.us":true,"cc.ak.us":true,"cc.al.us":true,"cc.ar.us":true,"cc.as.us":true,"cc.az.us":true,"cc.ca.us":true,"cc.co.us":true,"cc.ct.us":true,"cc.dc.us":true,"cc.de.us":true,"cc.fl.us":true,"cc.ga.us":true,"cc.gu.us":true,"cc.hi.us":true,"cc.ia.us":true,"cc.id.us":true,"cc.il.us":true,"cc.in.us":true,"cc.ks.us":true,"cc.ky.us":true,"cc.la.us":true,"cc.ma.us":true,"cc.md.us":true,"cc.me.us":true,"cc.mi.us":true,"cc.mn.us":true,"cc.mo.us":true,"cc.ms.us":true,"cc.mt.us":true,"cc.nc.us":true,"cc.nd.us":true,"cc.ne.us":true,"cc.nh.us":true,"cc.nj.us":true,"cc.nm.us":true,"cc.nv.us":true,"cc.ny.us":true,"cc.oh.us":true,"cc.ok.us":true,"cc.or.us":true,"cc.pa.us":true,"cc.pr.us":true,"cc.ri.us":true,"cc.sc.us":true,"cc.sd.us":true,"cc.tn.us":true,"cc.tx.us":true,"cc.ut.us":true,"cc.vi.us":true,"cc.vt.us":true,"cc.va.us":true,"cc.wa.us":true,"cc.wi.us":true,"cc.wv.us":true,"cc.wy.us":true,"lib.ak.us":true,"lib.al.us":true,"lib.ar.us":true,"lib.as.us":true,"lib.az.us":true,"lib.ca.us":true,"lib.co.us":true,"lib.ct.us":true,"lib.dc.us":true,"lib.de.us":true,"lib.fl.us":true,"lib.ga.us":true,"lib.gu.us":true,"lib.hi.us":true,"lib.ia.us":true,"lib.id.us":true,"lib.il.us":true,"lib.in.us":true,"lib.ks.us":true,"lib.ky.us":true,"lib.la.us":true,"lib.ma.us":true,"lib.md.us":true,"lib.me.us":true,"lib.mi.us":true,"lib.mn.us":true,"lib.mo.us":true,"lib.ms.us":true,"lib.mt.us":true,"lib.nc.us":true,"lib.nd.us":true,"lib.ne.us":true,"lib.nh.us":true,"lib.nj.us":true,"lib.nm.us":true,"lib.nv.us":true,"lib.ny.us":true,"lib.oh.us":true,"lib.ok.us":true,"lib.or.us":true,"lib.pa.us":true,"lib.pr.us":true,"lib.ri.us":true,"lib.sc.us":true,"lib.sd.us":true,"lib.tn.us":true,"lib.tx.us":true,"lib.ut.us":true,"lib.vi.us":true,"lib.vt.us":true,"lib.va.us":true,"lib.wa.us":true,"lib.wi.us":true,"lib.wy.us":true,"pvt.k12.ma.us":true,"chtr.k12.ma.us":true,"paroch.k12.ma.us":true,"uy":true,"com.uy":true,"edu.uy":true,"gub.uy":true,"mil.uy":true,"net.uy":true,"org.uy":true,"uz":true,"co.uz":true,"com.uz":true,"net.uz":true,"org.uz":true,"va":true,"vc":true,"com.vc":true,"net.vc":true,"org.vc":true,"gov.vc":true,"mil.vc":true,"edu.vc":true,"ve":true,"arts.ve":true,"co.ve":true,"com.ve":true,"e12.ve":true,"edu.ve":true,"firm.ve":true,"gob.ve":true,"gov.ve":true,"info.ve":true,"int.ve":true,"mil.ve":true,"net.ve":true,"org.ve":true,"rec.ve":true,"store.ve":true,"tec.ve":true,"web.ve":true,"vg":true,"vi":true,"co.vi":true,"com.vi":true,"k12.vi":true,"net.vi":true,"org.vi":true,"vn":true,"com.vn":true,"net.vn":true,"org.vn":true,"edu.vn":true,"gov.vn":true,"int.vn":true,"ac.vn":true,"biz.vn":true,"info.vn":true,"name.vn":true,"pro.vn":true,"health.vn":true,"vu":true,"com.vu":true,"edu.vu":true,"net.vu":true,"org.vu":true,"wf":true,"ws":true,"com.ws":true,"net.ws":true,"org.ws":true,"gov.ws":true,"edu.ws":true,"yt":true,"xn--mgbaam7a8h":true,"xn--y9a3aq":true,"xn--54b7fta0cc":true,"xn--90ais":true,"xn--fiqs8s":true,"xn--fiqz9s":true,"xn--lgbbat1ad8j":true,"xn--wgbh1c":true,"xn--node":true,"xn--qxam":true,"xn--j6w193g":true,"xn--h2brj9c":true,"xn--mgbbh1a71e":true,"xn--fpcrj9c3d":true,"xn--gecrj9c":true,"xn--s9brj9c":true,"xn--45brj9c":true,"xn--xkc2dl3a5ee0h":true,"xn--mgba3a4f16a":true,"xn--mgba3a4fra":true,"xn--mgbtx2b":true,"xn--mgbayh7gpa":true,"xn--3e0b707e":true,"xn--80ao21a":true,"xn--fzc2c9e2c":true,"xn--xkc2al3hye2a":true,"xn--mgbc0a9azcg":true,"xn--d1alf":true,"xn--l1acc":true,"xn--mix891f":true,"xn--mix082f":true,"xn--mgbx4cd0ab":true,"xn--mgb9awbf":true,"xn--mgbai9azgqp6j":true,"xn--mgbai9a5eva00b":true,"xn--ygbi2ammx":true,"xn--90a3ac":true,"xn--o1ac.xn--90a3ac":true,"xn--c1avg.xn--90a3ac":true,"xn--90azh.xn--90a3ac":true,"xn--d1at.xn--90a3ac":true,"xn--o1ach.xn--90a3ac":true,"xn--80au.xn--90a3ac":true,"xn--p1ai":true,"xn--wgbl6a":true,"xn--mgberp4a5d4ar":true,"xn--mgberp4a5d4a87g":true,"xn--mgbqly7c0a67fbc":true,"xn--mgbqly7cvafr":true,"xn--mgbpl2fh":true,"xn--yfro4i67o":true,"xn--clchc0ea0b2g2a9gcd":true,"xn--ogbpf8fl":true,"xn--mgbtf8fl":true,"xn--o3cw4h":true,"xn--pgbs0dh":true,"xn--kpry57d":true,"xn--kprw13d":true,"xn--nnx388a":true,"xn--j1amh":true,"xn--mgb2ddes":true,"xxx":true,"*.ye":true,"ac.za":true,"agrica.za":true,"alt.za":true,"co.za":true,"edu.za":true,"gov.za":true,"grondar.za":true,"law.za":true,"mil.za":true,"net.za":true,"ngo.za":true,"nis.za":true,"nom.za":true,"org.za":true,"school.za":true,"tm.za":true,"web.za":true,"*.zm":true,"*.zw":true,"aaa":true,"aarp":true,"abarth":true,"abb":true,"abbott":true,"abbvie":true,"abc":true,"able":true,"abogado":true,"abudhabi":true,"academy":true,"accenture":true,"accountant":true,"accountants":true,"aco":true,"active":true,"actor":true,"adac":true,"ads":true,"adult":true,"aeg":true,"aetna":true,"afamilycompany":true,"afl":true,"africa":true,"africamagic":true,"agakhan":true,"agency":true,"aig":true,"aigo":true,"airbus":true,"airforce":true,"airtel":true,"akdn":true,"alfaromeo":true,"alibaba":true,"alipay":true,"allfinanz":true,"allstate":true,"ally":true,"alsace":true,"alstom":true,"americanexpress":true,"americanfamily":true,"amex":true,"amfam":true,"amica":true,"amsterdam":true,"analytics":true,"android":true,"anquan":true,"anz":true,"aol":true,"apartments":true,"app":true,"apple":true,"aquarelle":true,"aramco":true,"archi":true,"army":true,"arte":true,"asda":true,"associates":true,"athleta":true,"attorney":true,"auction":true,"audi":true,"audible":true,"audio":true,"auspost":true,"author":true,"auto":true,"autos":true,"avianca":true,"aws":true,"axa":true,"azure":true,"baby":true,"baidu":true,"banamex":true,"bananarepublic":true,"band":true,"bank":true,"bar":true,"barcelona":true,"barclaycard":true,"barclays":true,"barefoot":true,"bargains":true,"basketball":true,"bauhaus":true,"bayern":true,"bbc":true,"bbt":true,"bbva":true,"bcg":true,"bcn":true,"beats":true,"beer":true,"bentley":true,"berlin":true,"best":true,"bestbuy":true,"bet":true,"bharti":true,"bible":true,"bid":true,"bike":true,"bing":true,"bingo":true,"bio":true,"black":true,"blackfriday":true,"blanco":true,"blockbuster":true,"blog":true,"bloomberg":true,"blue":true,"bms":true,"bmw":true,"bnl":true,"bnpparibas":true,"boats":true,"boehringer":true,"bofa":true,"bom":true,"bond":true,"boo":true,"book":true,"booking":true,"boots":true,"bosch":true,"bostik":true,"bot":true,"boutique":true,"bradesco":true,"bridgestone":true,"broadway":true,"broker":true,"brother":true,"brussels":true,"budapest":true,"bugatti":true,"build":true,"builders":true,"business":true,"buy":true,"buzz":true,"bzh":true,"cab":true,"cafe":true,"cal":true,"call":true,"calvinklein":true,"camera":true,"camp":true,"cancerresearch":true,"canon":true,"capetown":true,"capital":true,"capitalone":true,"car":true,"caravan":true,"cards":true,"care":true,"career":true,"careers":true,"cars":true,"cartier":true,"casa":true,"case":true,"caseih":true,"cash":true,"casino":true,"catering":true,"cba":true,"cbn":true,"cbre":true,"cbs":true,"ceb":true,"center":true,"ceo":true,"cern":true,"cfa":true,"cfd":true,"chanel":true,"channel":true,"chase":true,"chat":true,"cheap":true,"chintai":true,"chloe":true,"christmas":true,"chrome":true,"chrysler":true,"church":true,"cipriani":true,"circle":true,"cisco":true,"citadel":true,"citi":true,"citic":true,"city":true,"cityeats":true,"claims":true,"cleaning":true,"click":true,"clinic":true,"clothing":true,"cloud":true,"club":true,"clubmed":true,"coach":true,"codes":true,"coffee":true,"college":true,"cologne":true,"comcast":true,"commbank":true,"community":true,"company":true,"computer":true,"comsec":true,"condos":true,"construction":true,"consulting":true,"contact":true,"contractors":true,"cooking":true,"cookingchannel":true,"cool":true,"corsica":true,"country":true,"coupon":true,"coupons":true,"courses":true,"credit":true,"creditcard":true,"creditunion":true,"cricket":true,"crown":true,"crs":true,"cruises":true,"csc":true,"cuisinella":true,"cymru":true,"cyou":true,"dabur":true,"dad":true,"dance":true,"date":true,"dating":true,"datsun":true,"day":true,"dclk":true,"dds":true,"deal":true,"dealer":true,"deals":true,"degree":true,"delivery":true,"dell":true,"deloitte":true,"delta":true,"democrat":true,"dental":true,"dentist":true,"desi":true,"design":true,"dev":true,"dhl":true,"diamonds":true,"diet":true,"digital":true,"direct":true,"directory":true,"discount":true,"discover":true,"dish":true,"dnp":true,"docs":true,"dodge":true,"dog":true,"doha":true,"domains":true,"doosan":true,"dot":true,"download":true,"drive":true,"dstv":true,"dtv":true,"dubai":true,"duck":true,"dunlop":true,"duns":true,"dupont":true,"durban":true,"dvag":true,"dwg":true,"earth":true,"eat":true,"edeka":true,"education":true,"email":true,"emerck":true,"emerson":true,"energy":true,"engineer":true,"engineering":true,"enterprises":true,"epost":true,"epson":true,"equipment":true,"ericsson":true,"erni":true,"esq":true,"estate":true,"esurance":true,"etisalat":true,"eurovision":true,"eus":true,"events":true,"everbank":true,"exchange":true,"expert":true,"exposed":true,"express":true,"extraspace":true,"fage":true,"fail":true,"fairwinds":true,"faith":true,"family":true,"fan":true,"fans":true,"farm":true,"farmers":true,"fashion":true,"fast":true,"fedex":true,"feedback":true,"ferrari":true,"ferrero":true,"fiat":true,"fidelity":true,"fido":true,"film":true,"final":true,"finance":true,"financial":true,"fire":true,"firestone":true,"firmdale":true,"fish":true,"fishing":true,"fit":true,"fitness":true,"flickr":true,"flights":true,"flir":true,"florist":true,"flowers":true,"flsmidth":true,"fly":true,"foo":true,"foodnetwork":true,"football":true,"ford":true,"forex":true,"forsale":true,"forum":true,"foundation":true,"fox":true,"fresenius":true,"frl":true,"frogans":true,"frontdoor":true,"frontier":true,"ftr":true,"fujitsu":true,"fujixerox":true,"fund":true,"furniture":true,"futbol":true,"fyi":true,"gal":true,"gallery":true,"gallo":true,"gallup":true,"game":true,"games":true,"gap":true,"garden":true,"gbiz":true,"gdn":true,"gea":true,"gent":true,"genting":true,"george":true,"ggee":true,"gift":true,"gifts":true,"gives":true,"giving":true,"glade":true,"glass":true,"gle":true,"global":true,"globo":true,"gmail":true,"gmo":true,"gmx":true,"godaddy":true,"gold":true,"goldpoint":true,"golf":true,"goo":true,"goodhands":true,"goodyear":true,"goog":true,"google":true,"gop":true,"got":true,"gotv":true,"grainger":true,"graphics":true,"gratis":true,"green":true,"gripe":true,"group":true,"guardian":true,"gucci":true,"guge":true,"guide":true,"guitars":true,"guru":true,"hamburg":true,"hangout":true,"haus":true,"hbo":true,"hdfc":true,"hdfcbank":true,"health":true,"healthcare":true,"help":true,"helsinki":true,"here":true,"hermes":true,"hgtv":true,"hiphop":true,"hisamitsu":true,"hitachi":true,"hiv":true,"hkt":true,"hockey":true,"holdings":true,"holiday":true,"homedepot":true,"homegoods":true,"homes":true,"homesense":true,"honda":true,"honeywell":true,"horse":true,"host":true,"hosting":true,"hot":true,"hoteles":true,"hotmail":true,"house":true,"how":true,"hsbc":true,"htc":true,"hughes":true,"hyatt":true,"hyundai":true,"ibm":true,"icbc":true,"ice":true,"icu":true,"ieee":true,"ifm":true,"iinet":true,"ikano":true,"imamat":true,"imdb":true,"immo":true,"immobilien":true,"industries":true,"infiniti":true,"ing":true,"ink":true,"institute":true,"insurance":true,"insure":true,"intel":true,"international":true,"intuit":true,"investments":true,"ipiranga":true,"irish":true,"iselect":true,"ismaili":true,"ist":true,"istanbul":true,"itau":true,"itv":true,"iveco":true,"iwc":true,"jaguar":true,"java":true,"jcb":true,"jcp":true,"jeep":true,"jetzt":true,"jewelry":true,"jio":true,"jlc":true,"jll":true,"jmp":true,"jnj":true,"joburg":true,"jot":true,"joy":true,"jpmorgan":true,"jprs":true,"juegos":true,"juniper":true,"kaufen":true,"kddi":true,"kerryhotels":true,"kerrylogistics":true,"kerryproperties":true,"kfh":true,"kia":true,"kim":true,"kinder":true,"kindle":true,"kitchen":true,"kiwi":true,"koeln":true,"komatsu":true,"kosher":true,"kpmg":true,"kpn":true,"krd":true,"kred":true,"kuokgroup":true,"kyknet":true,"kyoto":true,"lacaixa":true,"ladbrokes":true,"lamborghini":true,"lancaster":true,"lancia":true,"lancome":true,"land":true,"landrover":true,"lanxess":true,"lasalle":true,"lat":true,"latino":true,"latrobe":true,"law":true,"lawyer":true,"lds":true,"lease":true,"leclerc":true,"lefrak":true,"legal":true,"lego":true,"lexus":true,"lgbt":true,"liaison":true,"lidl":true,"life":true,"lifeinsurance":true,"lifestyle":true,"lighting":true,"like":true,"lilly":true,"limited":true,"limo":true,"lincoln":true,"linde":true,"link":true,"lipsy":true,"live":true,"living":true,"lixil":true,"loan":true,"loans":true,"locker":true,"locus":true,"loft":true,"lol":true,"london":true,"lotte":true,"lotto":true,"love":true,"lpl":true,"lplfinancial":true,"ltd":true,"ltda":true,"lundbeck":true,"lupin":true,"luxe":true,"luxury":true,"macys":true,"madrid":true,"maif":true,"maison":true,"makeup":true,"man":true,"management":true,"mango":true,"market":true,"marketing":true,"markets":true,"marriott":true,"marshalls":true,"maserati":true,"mattel":true,"mba":true,"mcd":true,"mcdonalds":true,"mckinsey":true,"med":true,"media":true,"meet":true,"melbourne":true,"meme":true,"memorial":true,"men":true,"menu":true,"meo":true,"metlife":true,"miami":true,"microsoft":true,"mini":true,"mint":true,"mit":true,"mitsubishi":true,"mlb":true,"mls":true,"mma":true,"mnet":true,"mobily":true,"moda":true,"moe":true,"moi":true,"mom":true,"monash":true,"money":true,"monster":true,"montblanc":true,"mopar":true,"mormon":true,"mortgage":true,"moscow":true,"moto":true,"motorcycles":true,"mov":true,"movie":true,"movistar":true,"msd":true,"mtn":true,"mtpc":true,"mtr":true,"multichoice":true,"mutual":true,"mutuelle":true,"mzansimagic":true,"nab":true,"nadex":true,"nagoya":true,"naspers":true,"nationwide":true,"natura":true,"navy":true,"nba":true,"nec":true,"netbank":true,"netflix":true,"network":true,"neustar":true,"new":true,"newholland":true,"news":true,"next":true,"nextdirect":true,"nexus":true,"nfl":true,"ngo":true,"nhk":true,"nico":true,"nike":true,"nikon":true,"ninja":true,"nissan":true,"nokia":true,"northwesternmutual":true,"norton":true,"now":true,"nowruz":true,"nowtv":true,"nra":true,"nrw":true,"ntt":true,"nyc":true,"obi":true,"observer":true,"off":true,"office":true,"okinawa":true,"olayan":true,"olayangroup":true,"oldnavy":true,"ollo":true,"omega":true,"one":true,"ong":true,"onl":true,"online":true,"onyourside":true,"ooo":true,"open":true,"oracle":true,"orange":true,"organic":true,"orientexpress":true,"osaka":true,"otsuka":true,"ott":true,"ovh":true,"page":true,"pamperedchef":true,"panasonic":true,"panerai":true,"paris":true,"pars":true,"partners":true,"parts":true,"party":true,"passagens":true,"pay":true,"payu":true,"pccw":true,"pet":true,"pfizer":true,"pharmacy":true,"philips":true,"photo":true,"photography":true,"photos":true,"physio":true,"piaget":true,"pics":true,"pictet":true,"pictures":true,"pid":true,"pin":true,"ping":true,"pink":true,"pioneer":true,"pizza":true,"place":true,"play":true,"playstation":true,"plumbing":true,"plus":true,"pnc":true,"pohl":true,"poker":true,"politie":true,"porn":true,"pramerica":true,"praxi":true,"press":true,"prime":true,"prod":true,"productions":true,"prof":true,"progressive":true,"promo":true,"properties":true,"property":true,"protection":true,"pru":true,"prudential":true,"pub":true,"qpon":true,"quebec":true,"quest":true,"qvc":true,"racing":true,"raid":true,"read":true,"realestate":true,"realtor":true,"realty":true,"recipes":true,"red":true,"redstone":true,"redumbrella":true,"rehab":true,"reise":true,"reisen":true,"reit":true,"reliance":true,"ren":true,"rent":true,"rentals":true,"repair":true,"report":true,"republican":true,"rest":true,"restaurant":true,"review":true,"reviews":true,"rexroth":true,"rich":true,"richardli":true,"ricoh":true,"rightathome":true,"ril":true,"rio":true,"rip":true,"rocher":true,"rocks":true,"rodeo":true,"rogers":true,"room":true,"rsvp":true,"ruhr":true,"run":true,"rwe":true,"ryukyu":true,"saarland":true,"safe":true,"safety":true,"sakura":true,"sale":true,"salon":true,"samsclub":true,"samsung":true,"sandvik":true,"sandvikcoromant":true,"sanofi":true,"sap":true,"sapo":true,"sarl":true,"sas":true,"save":true,"saxo":true,"sbi":true,"sbs":true,"sca":true,"scb":true,"schaeffler":true,"schmidt":true,"scholarships":true,"school":true,"schule":true,"schwarz":true,"science":true,"scjohnson":true,"scor":true,"scot":true,"seat":true,"secure":true,"security":true,"seek":true,"sener":true,"services":true,"ses":true,"seven":true,"sew":true,"sex":true,"sexy":true,"sfr":true,"shangrila":true,"sharp":true,"shaw":true,"shell":true,"shia":true,"shiksha":true,"shoes":true,"shouji":true,"show":true,"showtime":true,"shriram":true,"silk":true,"sina":true,"singles":true,"site":true,"ski":true,"skin":true,"sky":true,"skype":true,"sling":true,"smart":true,"smile":true,"sncf":true,"soccer":true,"social":true,"softbank":true,"software":true,"sohu":true,"solar":true,"solutions":true,"song":true,"sony":true,"soy":true,"space":true,"spiegel":true,"spot":true,"spreadbetting":true,"srl":true,"srt":true,"stada":true,"staples":true,"star":true,"starhub":true,"statebank":true,"statefarm":true,"statoil":true,"stc":true,"stcgroup":true,"stockholm":true,"storage":true,"store":true,"studio":true,"study":true,"style":true,"sucks":true,"supersport":true,"supplies":true,"supply":true,"support":true,"surf":true,"surgery":true,"suzuki":true,"swatch":true,"swiftcover":true,"swiss":true,"sydney":true,"symantec":true,"systems":true,"tab":true,"taipei":true,"talk":true,"taobao":true,"target":true,"tatamotors":true,"tatar":true,"tattoo":true,"tax":true,"taxi":true,"tci":true,"tdk":true,"team":true,"tech":true,"technology":true,"telecity":true,"telefonica":true,"temasek":true,"tennis":true,"teva":true,"thd":true,"theater":true,"theatre":true,"theguardian":true,"tiaa":true,"tickets":true,"tienda":true,"tiffany":true,"tips":true,"tires":true,"tirol":true,"tjmaxx":true,"tjx":true,"tkmaxx":true,"tmall":true,"today":true,"tokyo":true,"tools":true,"top":true,"toray":true,"toshiba":true,"total":true,"tours":true,"town":true,"toyota":true,"toys":true,"trade":true,"trading":true,"training":true,"travelchannel":true,"travelers":true,"travelersinsurance":true,"trust":true,"trv":true,"tube":true,"tui":true,"tunes":true,"tushu":true,"tvs":true,"ubank":true,"ubs":true,"uconnect":true,"university":true,"uno":true,"uol":true,"ups":true,"vacations":true,"vana":true,"vanguard":true,"vegas":true,"ventures":true,"verisign":true,"versicherung":true,"vet":true,"viajes":true,"video":true,"vig":true,"viking":true,"villas":true,"vin":true,"vip":true,"virgin":true,"visa":true,"vision":true,"vista":true,"vistaprint":true,"viva":true,"vivo":true,"vlaanderen":true,"vodka":true,"volkswagen":true,"vote":true,"voting":true,"voto":true,"voyage":true,"vuelos":true,"wales":true,"walmart":true,"walter":true,"wang":true,"wanggou":true,"warman":true,"watch":true,"watches":true,"weather":true,"weatherchannel":true,"webcam":true,"weber":true,"website":true,"wed":true,"wedding":true,"weibo":true,"weir":true,"whoswho":true,"wien":true,"wiki":true,"williamhill":true,"win":true,"windows":true,"wine":true,"winners":true,"wme":true,"wolterskluwer":true,"woodside":true,"work":true,"works":true,"world":true,"wtc":true,"wtf":true,"xbox":true,"xerox":true,"xfinity":true,"xihuan":true,"xin":true,"xn--11b4c3d":true,"xn--1ck2e1b":true,"xn--1qqw23a":true,"xn--30rr7y":true,"xn--3bst00m":true,"xn--3ds443g":true,"xn--3oq18vl8pn36a":true,"xn--3pxu8k":true,"xn--42c2d9a":true,"xn--45q11c":true,"xn--4gbrim":true,"xn--4gq48lf9j":true,"xn--55qw42g":true,"xn--55qx5d":true,"xn--5su34j936bgsg":true,"xn--5tzm5g":true,"xn--6frz82g":true,"xn--6qq986b3xl":true,"xn--80adxhks":true,"xn--80asehdb":true,"xn--80aswg":true,"xn--8y0a063a":true,"xn--9dbq2a":true,"xn--9et52u":true,"xn--9krt00a":true,"xn--b4w605ferd":true,"xn--bck1b9a5dre4c":true,"xn--c1avg":true,"xn--c2br7g":true,"xn--cck2b3b":true,"xn--cg4bki":true,"xn--czr694b":true,"xn--czrs0t":true,"xn--czru2d":true,"xn--d1acj3b":true,"xn--eckvdtc9d":true,"xn--efvy88h":true,"xn--estv75g":true,"xn--fct429k":true,"xn--fhbei":true,"xn--fiq228c5hs":true,"xn--fiq64b":true,"xn--fjq720a":true,"xn--flw351e":true,"xn--fzys8d69uvgm":true,"xn--g2xx48c":true,"xn--gckr3f0f":true,"xn--hxt814e":true,"xn--i1b6b1a6a2e":true,"xn--imr513n":true,"xn--io0a7i":true,"xn--j1aef":true,"xn--jlq61u9w7b":true,"xn--jvr189m":true,"xn--kcrx77d1x4a":true,"xn--kpu716f":true,"xn--kput3i":true,"xn--mgba3a3ejt":true,"xn--mgba7c0bbn0a":true,"xn--mgbaakc7dvf":true,"xn--mgbab2bd":true,"xn--mgbb9fbpob":true,"xn--mgbca7dzdo":true,"xn--mgbt3dhd":true,"xn--mk1bu44c":true,"xn--mxtq1m":true,"xn--ngbc5azd":true,"xn--ngbe9e0a":true,"xn--nqv7f":true,"xn--nqv7fs00ema":true,"xn--nyqy26a":true,"xn--p1acf":true,"xn--pbt977c":true,"xn--pssy2u":true,"xn--q9jyb4c":true,"xn--qcka1pmc":true,"xn--rhqv96g":true,"xn--rovu88b":true,"xn--ses554g":true,"xn--t60b56a":true,"xn--tckwe":true,"xn--unup4y":true,"xn--vermgensberater-ctb":true,"xn--vermgensberatung-pwb":true,"xn--vhquv":true,"xn--vuq861b":true,"xn--w4r85el8fhu5dnra":true,"xn--w4rs40l":true,"xn--xhq521b":true,"xn--zfr164b":true,"xperia":true,"xyz":true,"yachts":true,"yahoo":true,"yamaxun":true,"yandex":true,"yodobashi":true,"yoga":true,"yokohama":true,"you":true,"youtube":true,"yun":true,"zappos":true,"zara":true,"zero":true,"zip":true,"zippo":true,"zone":true,"zuerich":true,"cloudfront.net":true,"ap-northeast-1.compute.amazonaws.com":true,"ap-southeast-1.compute.amazonaws.com":true,"ap-southeast-2.compute.amazonaws.com":true,"cn-north-1.compute.amazonaws.cn":true,"compute.amazonaws.cn":true,"compute.amazonaws.com":true,"compute-1.amazonaws.com":true,"eu-west-1.compute.amazonaws.com":true,"eu-central-1.compute.amazonaws.com":true,"sa-east-1.compute.amazonaws.com":true,"us-east-1.amazonaws.com":true,"us-gov-west-1.compute.amazonaws.com":true,"us-west-1.compute.amazonaws.com":true,"us-west-2.compute.amazonaws.com":true,"z-1.compute-1.amazonaws.com":true,"z-2.compute-1.amazonaws.com":true,"elasticbeanstalk.com":true,"elb.amazonaws.com":true,"s3.amazonaws.com":true,"s3-ap-northeast-1.amazonaws.com":true,"s3-ap-southeast-1.amazonaws.com":true,"s3-ap-southeast-2.amazonaws.com":true,"s3-external-1.amazonaws.com":true,"s3-external-2.amazonaws.com":true,"s3-fips-us-gov-west-1.amazonaws.com":true,"s3-eu-central-1.amazonaws.com":true,"s3-eu-west-1.amazonaws.com":true,"s3-sa-east-1.amazonaws.com":true,"s3-us-gov-west-1.amazonaws.com":true,"s3-us-west-1.amazonaws.com":true,"s3-us-west-2.amazonaws.com":true,"s3.cn-north-1.amazonaws.com.cn":true,"s3.eu-central-1.amazonaws.com":true,"betainabox.com":true,"ae.org":true,"ar.com":true,"br.com":true,"cn.com":true,"com.de":true,"com.se":true,"de.com":true,"eu.com":true,"gb.com":true,"gb.net":true,"hu.com":true,"hu.net":true,"jp.net":true,"jpn.com":true,"kr.com":true,"mex.com":true,"no.com":true,"qc.com":true,"ru.com":true,"sa.com":true,"se.com":true,"se.net":true,"uk.com":true,"uk.net":true,"us.com":true,"uy.com":true,"za.bz":true,"za.com":true,"africa.com":true,"gr.com":true,"in.net":true,"us.org":true,"co.com":true,"c.la":true,"cloudcontrolled.com":true,"cloudcontrolapp.com":true,"co.ca":true,"c.cdn77.org":true,"cdn77-ssl.net":true,"r.cdn77.net":true,"rsc.cdn77.org":true,"ssl.origin.cdn77-secure.org":true,"co.nl":true,"co.no":true,"*.platform.sh":true,"cupcake.is":true,"dreamhosters.com":true,"duckdns.org":true,"dyndns-at-home.com":true,"dyndns-at-work.com":true,"dyndns-blog.com":true,"dyndns-free.com":true,"dyndns-home.com":true,"dyndns-ip.com":true,"dyndns-mail.com":true,"dyndns-office.com":true,"dyndns-pics.com":true,"dyndns-remote.com":true,"dyndns-server.com":true,"dyndns-web.com":true,"dyndns-wiki.com":true,"dyndns-work.com":true,"dyndns.biz":true,"dyndns.info":true,"dyndns.org":true,"dyndns.tv":true,"at-band-camp.net":true,"ath.cx":true,"barrel-of-knowledge.info":true,"barrell-of-knowledge.info":true,"better-than.tv":true,"blogdns.com":true,"blogdns.net":true,"blogdns.org":true,"blogsite.org":true,"boldlygoingnowhere.org":true,"broke-it.net":true,"buyshouses.net":true,"cechire.com":true,"dnsalias.com":true,"dnsalias.net":true,"dnsalias.org":true,"dnsdojo.com":true,"dnsdojo.net":true,"dnsdojo.org":true,"does-it.net":true,"doesntexist.com":true,"doesntexist.org":true,"dontexist.com":true,"dontexist.net":true,"dontexist.org":true,"doomdns.com":true,"doomdns.org":true,"dvrdns.org":true,"dyn-o-saur.com":true,"dynalias.com":true,"dynalias.net":true,"dynalias.org":true,"dynathome.net":true,"dyndns.ws":true,"endofinternet.net":true,"endofinternet.org":true,"endoftheinternet.org":true,"est-a-la-maison.com":true,"est-a-la-masion.com":true,"est-le-patron.com":true,"est-mon-blogueur.com":true,"for-better.biz":true,"for-more.biz":true,"for-our.info":true,"for-some.biz":true,"for-the.biz":true,"forgot.her.name":true,"forgot.his.name":true,"from-ak.com":true,"from-al.com":true,"from-ar.com":true,"from-az.net":true,"from-ca.com":true,"from-co.net":true,"from-ct.com":true,"from-dc.com":true,"from-de.com":true,"from-fl.com":true,"from-ga.com":true,"from-hi.com":true,"from-ia.com":true,"from-id.com":true,"from-il.com":true,"from-in.com":true,"from-ks.com":true,"from-ky.com":true,"from-la.net":true,"from-ma.com":true,"from-md.com":true,"from-me.org":true,"from-mi.com":true,"from-mn.com":true,"from-mo.com":true,"from-ms.com":true,"from-mt.com":true,"from-nc.com":true,"from-nd.com":true,"from-ne.com":true,"from-nh.com":true,"from-nj.com":true,"from-nm.com":true,"from-nv.com":true,"from-ny.net":true,"from-oh.com":true,"from-ok.com":true,"from-or.com":true,"from-pa.com":true,"from-pr.com":true,"from-ri.com":true,"from-sc.com":true,"from-sd.com":true,"from-tn.com":true,"from-tx.com":true,"from-ut.com":true,"from-va.com":true,"from-vt.com":true,"from-wa.com":true,"from-wi.com":true,"from-wv.com":true,"from-wy.com":true,"ftpaccess.cc":true,"fuettertdasnetz.de":true,"game-host.org":true,"game-server.cc":true,"getmyip.com":true,"gets-it.net":true,"go.dyndns.org":true,"gotdns.com":true,"gotdns.org":true,"groks-the.info":true,"groks-this.info":true,"ham-radio-op.net":true,"here-for-more.info":true,"hobby-site.com":true,"hobby-site.org":true,"home.dyndns.org":true,"homedns.org":true,"homeftp.net":true,"homeftp.org":true,"homeip.net":true,"homelinux.com":true,"homelinux.net":true,"homelinux.org":true,"homeunix.com":true,"homeunix.net":true,"homeunix.org":true,"iamallama.com":true,"in-the-band.net":true,"is-a-anarchist.com":true,"is-a-blogger.com":true,"is-a-bookkeeper.com":true,"is-a-bruinsfan.org":true,"is-a-bulls-fan.com":true,"is-a-candidate.org":true,"is-a-caterer.com":true,"is-a-celticsfan.org":true,"is-a-chef.com":true,"is-a-chef.net":true,"is-a-chef.org":true,"is-a-conservative.com":true,"is-a-cpa.com":true,"is-a-cubicle-slave.com":true,"is-a-democrat.com":true,"is-a-designer.com":true,"is-a-doctor.com":true,"is-a-financialadvisor.com":true,"is-a-geek.com":true,"is-a-geek.net":true,"is-a-geek.org":true,"is-a-green.com":true,"is-a-guru.com":true,"is-a-hard-worker.com":true,"is-a-hunter.com":true,"is-a-knight.org":true,"is-a-landscaper.com":true,"is-a-lawyer.com":true,"is-a-liberal.com":true,"is-a-libertarian.com":true,"is-a-linux-user.org":true,"is-a-llama.com":true,"is-a-musician.com":true,"is-a-nascarfan.com":true,"is-a-nurse.com":true,"is-a-painter.com":true,"is-a-patsfan.org":true,"is-a-personaltrainer.com":true,"is-a-photographer.com":true,"is-a-player.com":true,"is-a-republican.com":true,"is-a-rockstar.com":true,"is-a-socialist.com":true,"is-a-soxfan.org":true,"is-a-student.com":true,"is-a-teacher.com":true,"is-a-techie.com":true,"is-a-therapist.com":true,"is-an-accountant.com":true,"is-an-actor.com":true,"is-an-actress.com":true,"is-an-anarchist.com":true,"is-an-artist.com":true,"is-an-engineer.com":true,"is-an-entertainer.com":true,"is-by.us":true,"is-certified.com":true,"is-found.org":true,"is-gone.com":true,"is-into-anime.com":true,"is-into-cars.com":true,"is-into-cartoons.com":true,"is-into-games.com":true,"is-leet.com":true,"is-lost.org":true,"is-not-certified.com":true,"is-saved.org":true,"is-slick.com":true,"is-uberleet.com":true,"is-very-bad.org":true,"is-very-evil.org":true,"is-very-good.org":true,"is-very-nice.org":true,"is-very-sweet.org":true,"is-with-theband.com":true,"isa-geek.com":true,"isa-geek.net":true,"isa-geek.org":true,"isa-hockeynut.com":true,"issmarterthanyou.com":true,"isteingeek.de":true,"istmein.de":true,"kicks-ass.net":true,"kicks-ass.org":true,"knowsitall.info":true,"land-4-sale.us":true,"lebtimnetz.de":true,"leitungsen.de":true,"likes-pie.com":true,"likescandy.com":true,"merseine.nu":true,"mine.nu":true,"misconfused.org":true,"mypets.ws":true,"myphotos.cc":true,"neat-url.com":true,"office-on-the.net":true,"on-the-web.tv":true,"podzone.net":true,"podzone.org":true,"readmyblog.org":true,"saves-the-whales.com":true,"scrapper-site.net":true,"scrapping.cc":true,"selfip.biz":true,"selfip.com":true,"selfip.info":true,"selfip.net":true,"selfip.org":true,"sells-for-less.com":true,"sells-for-u.com":true,"sells-it.net":true,"sellsyourhome.org":true,"servebbs.com":true,"servebbs.net":true,"servebbs.org":true,"serveftp.net":true,"serveftp.org":true,"servegame.org":true,"shacknet.nu":true,"simple-url.com":true,"space-to-rent.com":true,"stuff-4-sale.org":true,"stuff-4-sale.us":true,"teaches-yoga.com":true,"thruhere.net":true,"traeumtgerade.de":true,"webhop.biz":true,"webhop.info":true,"webhop.net":true,"webhop.org":true,"worse-than.tv":true,"writesthisblog.com":true,"eu.org":true,"al.eu.org":true,"asso.eu.org":true,"at.eu.org":true,"au.eu.org":true,"be.eu.org":true,"bg.eu.org":true,"ca.eu.org":true,"cd.eu.org":true,"ch.eu.org":true,"cn.eu.org":true,"cy.eu.org":true,"cz.eu.org":true,"de.eu.org":true,"dk.eu.org":true,"edu.eu.org":true,"ee.eu.org":true,"es.eu.org":true,"fi.eu.org":true,"fr.eu.org":true,"gr.eu.org":true,"hr.eu.org":true,"hu.eu.org":true,"ie.eu.org":true,"il.eu.org":true,"in.eu.org":true,"int.eu.org":true,"is.eu.org":true,"it.eu.org":true,"jp.eu.org":true,"kr.eu.org":true,"lt.eu.org":true,"lu.eu.org":true,"lv.eu.org":true,"mc.eu.org":true,"me.eu.org":true,"mk.eu.org":true,"mt.eu.org":true,"my.eu.org":true,"net.eu.org":true,"ng.eu.org":true,"nl.eu.org":true,"no.eu.org":true,"nz.eu.org":true,"paris.eu.org":true,"pl.eu.org":true,"pt.eu.org":true,"q-a.eu.org":true,"ro.eu.org":true,"ru.eu.org":true,"se.eu.org":true,"si.eu.org":true,"sk.eu.org":true,"tr.eu.org":true,"uk.eu.org":true,"us.eu.org":true,"a.ssl.fastly.net":true,"b.ssl.fastly.net":true,"global.ssl.fastly.net":true,"a.prod.fastly.net":true,"global.prod.fastly.net":true,"firebaseapp.com":true,"flynnhub.com":true,"service.gov.uk":true,"github.io":true,"githubusercontent.com":true,"ro.com":true,"appspot.com":true,"blogspot.ae":true,"blogspot.al":true,"blogspot.am":true,"blogspot.ba":true,"blogspot.be":true,"blogspot.bg":true,"blogspot.bj":true,"blogspot.ca":true,"blogspot.cf":true,"blogspot.ch":true,"blogspot.cl":true,"blogspot.co.at":true,"blogspot.co.id":true,"blogspot.co.il":true,"blogspot.co.ke":true,"blogspot.co.nz":true,"blogspot.co.uk":true,"blogspot.co.za":true,"blogspot.com":true,"blogspot.com.ar":true,"blogspot.com.au":true,"blogspot.com.br":true,"blogspot.com.by":true,"blogspot.com.co":true,"blogspot.com.cy":true,"blogspot.com.ee":true,"blogspot.com.eg":true,"blogspot.com.es":true,"blogspot.com.mt":true,"blogspot.com.ng":true,"blogspot.com.tr":true,"blogspot.com.uy":true,"blogspot.cv":true,"blogspot.cz":true,"blogspot.de":true,"blogspot.dk":true,"blogspot.fi":true,"blogspot.fr":true,"blogspot.gr":true,"blogspot.hk":true,"blogspot.hr":true,"blogspot.hu":true,"blogspot.ie":true,"blogspot.in":true,"blogspot.is":true,"blogspot.it":true,"blogspot.jp":true,"blogspot.kr":true,"blogspot.li":true,"blogspot.lt":true,"blogspot.lu":true,"blogspot.md":true,"blogspot.mk":true,"blogspot.mr":true,"blogspot.mx":true,"blogspot.my":true,"blogspot.nl":true,"blogspot.no":true,"blogspot.pe":true,"blogspot.pt":true,"blogspot.qa":true,"blogspot.re":true,"blogspot.ro":true,"blogspot.rs":true,"blogspot.ru":true,"blogspot.se":true,"blogspot.sg":true,"blogspot.si":true,"blogspot.sk":true,"blogspot.sn":true,"blogspot.td":true,"blogspot.tw":true,"blogspot.ug":true,"blogspot.vn":true,"codespot.com":true,"googleapis.com":true,"googlecode.com":true,"pagespeedmobilizer.com":true,"withgoogle.com":true,"withyoutube.com":true,"herokuapp.com":true,"herokussl.com":true,"iki.fi":true,"biz.at":true,"info.at":true,"co.pl":true,"azurewebsites.net":true,"azure-mobile.net":true,"cloudapp.net":true,"bmoattachments.org":true,"4u.com":true,"nfshost.com":true,"nyc.mn":true,"nid.io":true,"operaunite.com":true,"outsystemscloud.com":true,"art.pl":true,"gliwice.pl":true,"krakow.pl":true,"poznan.pl":true,"wroc.pl":true,"zakopane.pl":true,"pantheon.io":true,"gotpantheon.com":true,"priv.at":true,"qa2.com":true,"rhcloud.com":true,"sandcats.io":true,"biz.ua":true,"co.ua":true,"pp.ua":true,"sinaapp.com":true,"vipsinaapp.com":true,"1kapp.com":true,"gda.pl":true,"gdansk.pl":true,"gdynia.pl":true,"med.pl":true,"sopot.pl":true,"hk.com":true,"hk.org":true,"ltd.hk":true,"inc.hk":true,"yolasite.com":true,"za.net":true,"za.org":true}); - -// END of automatically generated file diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/lib/store.js b/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/lib/store.js deleted file mode 100644 index bce5292..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/lib/store.js +++ /dev/null @@ -1,71 +0,0 @@ -/*! - * Copyright (c) 2015, Salesforce.com, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. 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. - * - * 3. Neither the name of Salesforce.com 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. - */ -'use strict'; -/*jshint unused:false */ - -function Store() { -} -exports.Store = Store; - -// Stores may be synchronous, but are still required to use a -// Continuation-Passing Style API. The CookieJar itself will expose a "*Sync" -// API that converts from synchronous-callbacks to imperative style. -Store.prototype.synchronous = false; - -Store.prototype.findCookie = function(domain, path, key, cb) { - throw new Error('findCookie is not implemented'); -}; - -Store.prototype.findCookies = function(domain, path, cb) { - throw new Error('findCookies is not implemented'); -}; - -Store.prototype.putCookie = function(cookie, cb) { - throw new Error('putCookie is not implemented'); -}; - -Store.prototype.updateCookie = function(oldCookie, newCookie, cb) { - // recommended default implementation: - // return this.putCookie(newCookie, cb); - throw new Error('updateCookie is not implemented'); -}; - -Store.prototype.removeCookie = function(domain, path, key, cb) { - throw new Error('removeCookie is not implemented'); -}; - -Store.prototype.removeCookies = function(domain, path, cb) { - throw new Error('removeCookies is not implemented'); -}; - -Store.prototype.getAllCookies = function(cb) { - throw new Error('getAllCookies is not implemented (therefore jar cannot be serialized)'); -}; diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/node_modules/punycode/LICENSE-MIT.txt b/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/node_modules/punycode/LICENSE-MIT.txt deleted file mode 100644 index a41e0a7..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/node_modules/punycode/LICENSE-MIT.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright Mathias Bynens - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/node_modules/punycode/README.md b/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/node_modules/punycode/README.md deleted file mode 100644 index 7ad7d1f..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/node_modules/punycode/README.md +++ /dev/null @@ -1,176 +0,0 @@ -# Punycode.js [![Build status](https://travis-ci.org/bestiejs/punycode.js.svg?branch=master)](https://travis-ci.org/bestiejs/punycode.js) [![Code coverage status](http://img.shields.io/coveralls/bestiejs/punycode.js/master.svg)](https://coveralls.io/r/bestiejs/punycode.js) [![Dependency status](https://gemnasium.com/bestiejs/punycode.js.svg)](https://gemnasium.com/bestiejs/punycode.js) - -A robust Punycode converter that fully complies to [RFC 3492](https://tools.ietf.org/html/rfc3492) and [RFC 5891](https://tools.ietf.org/html/rfc5891), and works on nearly all JavaScript platforms. - -This JavaScript library is the result of comparing, optimizing and documenting different open-source implementations of the Punycode algorithm: - -* [The C example code from RFC 3492](https://tools.ietf.org/html/rfc3492#appendix-C) -* [`punycode.c` by _Markus W. Scherer_ (IBM)](http://opensource.apple.com/source/ICU/ICU-400.42/icuSources/common/punycode.c) -* [`punycode.c` by _Ben Noordhuis_](https://github.com/bnoordhuis/punycode/blob/master/punycode.c) -* [JavaScript implementation by _some_](http://stackoverflow.com/questions/183485/can-anyone-recommend-a-good-free-javascript-for-punycode-to-unicode-conversion/301287#301287) -* [`punycode.js` by _Ben Noordhuis_](https://github.com/joyent/node/blob/426298c8c1c0d5b5224ac3658c41e7c2a3fe9377/lib/punycode.js) (note: [not fully compliant](https://github.com/joyent/node/issues/2072)) - -This project is [bundled](https://github.com/joyent/node/blob/master/lib/punycode.js) with [Node.js v0.6.2+](https://github.com/joyent/node/compare/975f1930b1...61e796decc) and [io.js v1.0.0+](https://github.com/iojs/io.js/blob/v1.x/lib/punycode.js). - -## Installation - -Via [npm](https://www.npmjs.com/) (only required for Node.js releases older than v0.6.2): - -```bash -npm install punycode -``` - -Via [Bower](http://bower.io/): - -```bash -bower install punycode -``` - -Via [Component](https://github.com/component/component): - -```bash -component install bestiejs/punycode.js -``` - -In a browser: - -```html - -``` - -In [Node.js](https://nodejs.org/), [io.js](https://iojs.org/), [Narwhal](http://narwhaljs.org/), and [RingoJS](http://ringojs.org/): - -```js -var punycode = require('punycode'); -``` - -In [Rhino](http://www.mozilla.org/rhino/): - -```js -load('punycode.js'); -``` - -Using an AMD loader like [RequireJS](http://requirejs.org/): - -```js -require( - { - 'paths': { - 'punycode': 'path/to/punycode' - } - }, - ['punycode'], - function(punycode) { - console.log(punycode); - } -); -``` - -## API - -### `punycode.decode(string)` - -Converts a Punycode string of ASCII symbols to a string of Unicode symbols. - -```js -// decode domain name parts -punycode.decode('maana-pta'); // 'mañana' -punycode.decode('--dqo34k'); // '☃-⌘' -``` - -### `punycode.encode(string)` - -Converts a string of Unicode symbols to a Punycode string of ASCII symbols. - -```js -// encode domain name parts -punycode.encode('mañana'); // 'maana-pta' -punycode.encode('☃-⌘'); // '--dqo34k' -``` - -### `punycode.toUnicode(input)` - -Converts a Punycode string representing a domain name or an email address to Unicode. Only the Punycoded parts of the input will be converted, i.e. it doesn’t matter if you call it on a string that has already been converted to Unicode. - -```js -// decode domain names -punycode.toUnicode('xn--maana-pta.com'); -// → 'mañana.com' -punycode.toUnicode('xn----dqo34k.com'); -// → '☃-⌘.com' - -// decode email addresses -punycode.toUnicode('джумла@xn--p-8sbkgc5ag7bhce.xn--ba-lmcq'); -// → 'джумла@джpумлатест.bрфa' -``` - -### `punycode.toASCII(input)` - -Converts a lowercased Unicode string representing a domain name or an email address to Punycode. Only the non-ASCII parts of the input will be converted, i.e. it doesn’t matter if you call it with a domain that’s already in ASCII. - -```js -// encode domain names -punycode.toASCII('mañana.com'); -// → 'xn--maana-pta.com' -punycode.toASCII('☃-⌘.com'); -// → 'xn----dqo34k.com' - -// encode email addresses -punycode.toASCII('джумла@джpумлатест.bрфa'); -// → 'джумла@xn--p-8sbkgc5ag7bhce.xn--ba-lmcq' -``` - -### `punycode.ucs2` - -#### `punycode.ucs2.decode(string)` - -Creates an array containing the numeric code point values of each Unicode symbol in the string. While [JavaScript uses UCS-2 internally](https://mathiasbynens.be/notes/javascript-encoding), this function will convert a pair of surrogate halves (each of which UCS-2 exposes as separate characters) into a single code point, matching UTF-16. - -```js -punycode.ucs2.decode('abc'); -// → [0x61, 0x62, 0x63] -// surrogate pair for U+1D306 TETRAGRAM FOR CENTRE: -punycode.ucs2.decode('\uD834\uDF06'); -// → [0x1D306] -``` - -#### `punycode.ucs2.encode(codePoints)` - -Creates a string based on an array of numeric code point values. - -```js -punycode.ucs2.encode([0x61, 0x62, 0x63]); -// → 'abc' -punycode.ucs2.encode([0x1D306]); -// → '\uD834\uDF06' -``` - -### `punycode.version` - -A string representing the current Punycode.js version number. - -## Unit tests & code coverage - -After cloning this repository, run `npm install --dev` to install the dependencies needed for Punycode.js 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, PhantomJS, and web browsers as well, use `grunt test`. - -To generate the code coverage report, use `grunt cover`. - -Feel free to fork if you see possible improvements! - -## Author - -| [![twitter/mathias](https://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter") | -|---| -| [Mathias Bynens](https://mathiasbynens.be/) | - -## Contributors - -| [![twitter/jdalton](https://gravatar.com/avatar/299a3d891ff1920b69c364d061007043?s=70)](https://twitter.com/jdalton "Follow @jdalton on Twitter") | -|---| -| [John-David Dalton](http://allyoucanleet.com/) | - -## License - -Punycode.js is available under the [MIT](https://mths.be/mit) license. diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/node_modules/punycode/package.json b/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/node_modules/punycode/package.json deleted file mode 100644 index 0b7469a..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/node_modules/punycode/package.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "name": "punycode", - "version": "1.4.1", - "description": "A robust Punycode converter that fully complies to RFC 3492 and RFC 5891, and works on nearly all JavaScript platforms.", - "homepage": "https://mths.be/punycode", - "main": "punycode.js", - "keywords": [ - "punycode", - "unicode", - "idn", - "idna", - "dns", - "url", - "domain" - ], - "license": "MIT", - "author": { - "name": "Mathias Bynens", - "url": "https://mathiasbynens.be/" - }, - "contributors": [ - { - "name": "Mathias Bynens", - "url": "https://mathiasbynens.be/" - }, - { - "name": "John-David Dalton", - "url": "http://allyoucanleet.com/" - } - ], - "repository": { - "type": "git", - "url": "git+https://github.com/bestiejs/punycode.js.git" - }, - "bugs": { - "url": "https://github.com/bestiejs/punycode.js/issues" - }, - "files": [ - "LICENSE-MIT.txt", - "punycode.js" - ], - "scripts": { - "test": "node tests/tests.js" - }, - "devDependencies": { - "coveralls": "^2.11.4", - "grunt": "^0.4.5", - "grunt-contrib-uglify": "^0.11.0", - "grunt-shell": "^1.1.2", - "istanbul": "^0.4.1", - "qunit-extras": "^1.4.4", - "qunitjs": "~1.11.0", - "requirejs": "^2.1.22" - }, - "jspm": { - "map": { - "./punycode.js": { - "node": "@node/punycode" - } - } - }, - "gitHead": "0fbadd6e81f3a0ce06c38998040d6db6bdfbc5c9", - "_id": "punycode@1.4.1", - "_shasum": "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e", - "_from": "punycode@>=1.4.1 <2.0.0", - "_npmVersion": "3.8.2", - "_nodeVersion": "5.2.0", - "_npmUser": { - "name": "mathias", - "email": "mathias@qiwi.be" - }, - "maintainers": [ - { - "name": "mathias", - "email": "mathias@qiwi.be" - }, - { - "name": "reconbot", - "email": "wizard@roborooter.com" - } - ], - "dist": { - "shasum": "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e", - "tarball": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" - }, - "_npmOperationalInternal": { - "host": "packages-12-west.internal.npmjs.com", - "tmp": "tmp/punycode-1.4.1.tgz_1458437236261_0.07678767060860991" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" -} diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/node_modules/punycode/punycode.js b/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/node_modules/punycode/punycode.js deleted file mode 100644 index 2c87f6c..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/node_modules/punycode/punycode.js +++ /dev/null @@ -1,533 +0,0 @@ -/*! https://mths.be/punycode v1.4.1 by @mathias */ -;(function(root) { - - /** Detect free variables */ - var freeExports = typeof exports == 'object' && exports && - !exports.nodeType && exports; - var freeModule = typeof module == 'object' && module && - !module.nodeType && module; - var freeGlobal = typeof global == 'object' && global; - if ( - freeGlobal.global === freeGlobal || - freeGlobal.window === freeGlobal || - freeGlobal.self === freeGlobal - ) { - root = freeGlobal; - } - - /** - * The `punycode` object. - * @name punycode - * @type Object - */ - var punycode, - - /** Highest positive signed 32-bit float value */ - maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1 - - /** Bootstring parameters */ - base = 36, - tMin = 1, - tMax = 26, - skew = 38, - damp = 700, - initialBias = 72, - initialN = 128, // 0x80 - delimiter = '-', // '\x2D' - - /** Regular expressions */ - regexPunycode = /^xn--/, - regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars - regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators - - /** Error messages */ - errors = { - 'overflow': 'Overflow: input needs wider integers to process', - 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', - 'invalid-input': 'Invalid input' - }, - - /** Convenience shortcuts */ - baseMinusTMin = base - tMin, - floor = Math.floor, - stringFromCharCode = String.fromCharCode, - - /** Temporary variable */ - key; - - /*--------------------------------------------------------------------------*/ - - /** - * A generic error utility function. - * @private - * @param {String} type The error type. - * @returns {Error} Throws a `RangeError` with the applicable error message. - */ - function error(type) { - throw new RangeError(errors[type]); - } - - /** - * A generic `Array#map` utility function. - * @private - * @param {Array} array The array to iterate over. - * @param {Function} callback The function that gets called for every array - * item. - * @returns {Array} A new array of values returned by the callback function. - */ - function map(array, fn) { - var length = array.length; - var result = []; - while (length--) { - result[length] = fn(array[length]); - } - return result; - } - - /** - * A simple `Array#map`-like wrapper to work with domain name strings or email - * addresses. - * @private - * @param {String} domain The domain name or email address. - * @param {Function} callback The function that gets called for every - * character. - * @returns {Array} A new string of characters returned by the callback - * function. - */ - function mapDomain(string, fn) { - var parts = string.split('@'); - var result = ''; - if (parts.length > 1) { - // In email addresses, only the domain name should be punycoded. Leave - // the local part (i.e. everything up to `@`) intact. - result = parts[0] + '@'; - string = parts[1]; - } - // Avoid `split(regex)` for IE8 compatibility. See #17. - string = string.replace(regexSeparators, '\x2E'); - var labels = string.split('.'); - var encoded = map(labels, fn).join('.'); - return result + encoded; - } - - /** - * Creates an array containing the numeric code points of each Unicode - * character in the string. While JavaScript uses UCS-2 internally, - * this function will convert a pair of surrogate halves (each of which - * UCS-2 exposes as separate characters) into a single code point, - * matching UTF-16. - * @see `punycode.ucs2.encode` - * @see - * @memberOf punycode.ucs2 - * @name decode - * @param {String} string The Unicode input string (UCS-2). - * @returns {Array} The new array of code points. - */ - function ucs2decode(string) { - var output = [], - counter = 0, - length = string.length, - value, - extra; - while (counter < length) { - value = string.charCodeAt(counter++); - if (value >= 0xD800 && value <= 0xDBFF && counter < length) { - // high surrogate, and there is a next character - extra = string.charCodeAt(counter++); - if ((extra & 0xFC00) == 0xDC00) { // low surrogate - output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); - } else { - // unmatched surrogate; only append this code unit, in case the next - // code unit is the high surrogate of a surrogate pair - output.push(value); - counter--; - } - } else { - output.push(value); - } - } - return output; - } - - /** - * Creates a string based on an array of numeric code points. - * @see `punycode.ucs2.decode` - * @memberOf punycode.ucs2 - * @name encode - * @param {Array} codePoints The array of numeric code points. - * @returns {String} The new Unicode string (UCS-2). - */ - function ucs2encode(array) { - return map(array, function(value) { - var output = ''; - if (value > 0xFFFF) { - value -= 0x10000; - output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); - value = 0xDC00 | value & 0x3FF; - } - output += stringFromCharCode(value); - return output; - }).join(''); - } - - /** - * Converts a basic code point into a digit/integer. - * @see `digitToBasic()` - * @private - * @param {Number} codePoint The basic numeric code point value. - * @returns {Number} The numeric value of a basic code point (for use in - * representing integers) in the range `0` to `base - 1`, or `base` if - * the code point does not represent a value. - */ - function basicToDigit(codePoint) { - if (codePoint - 48 < 10) { - return codePoint - 22; - } - if (codePoint - 65 < 26) { - return codePoint - 65; - } - if (codePoint - 97 < 26) { - return codePoint - 97; - } - return base; - } - - /** - * Converts a digit/integer into a basic code point. - * @see `basicToDigit()` - * @private - * @param {Number} digit The numeric value of a basic code point. - * @returns {Number} The basic code point whose value (when used for - * representing integers) is `digit`, which needs to be in the range - * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is - * used; else, the lowercase form is used. The behavior is undefined - * if `flag` is non-zero and `digit` has no uppercase form. - */ - function digitToBasic(digit, flag) { - // 0..25 map to ASCII a..z or A..Z - // 26..35 map to ASCII 0..9 - return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); - } - - /** - * Bias adaptation function as per section 3.4 of RFC 3492. - * https://tools.ietf.org/html/rfc3492#section-3.4 - * @private - */ - function adapt(delta, numPoints, firstTime) { - var k = 0; - delta = firstTime ? floor(delta / damp) : delta >> 1; - delta += floor(delta / numPoints); - for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { - delta = floor(delta / baseMinusTMin); - } - return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); - } - - /** - * Converts a Punycode string of ASCII-only symbols to a string of Unicode - * symbols. - * @memberOf punycode - * @param {String} input The Punycode string of ASCII-only symbols. - * @returns {String} The resulting string of Unicode symbols. - */ - function decode(input) { - // Don't use UCS-2 - var output = [], - inputLength = input.length, - out, - i = 0, - n = initialN, - bias = initialBias, - basic, - j, - index, - oldi, - w, - k, - digit, - t, - /** Cached calculation results */ - baseMinusT; - - // Handle the basic code points: let `basic` be the number of input code - // points before the last delimiter, or `0` if there is none, then copy - // the first basic code points to the output. - - basic = input.lastIndexOf(delimiter); - if (basic < 0) { - basic = 0; - } - - for (j = 0; j < basic; ++j) { - // if it's not a basic code point - if (input.charCodeAt(j) >= 0x80) { - error('not-basic'); - } - output.push(input.charCodeAt(j)); - } - - // Main decoding loop: start just after the last delimiter if any basic code - // points were copied; start at the beginning otherwise. - - for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { - - // `index` is the index of the next character to be consumed. - // Decode a generalized variable-length integer into `delta`, - // which gets added to `i`. The overflow checking is easier - // if we increase `i` as we go, then subtract off its starting - // value at the end to obtain `delta`. - for (oldi = i, w = 1, k = base; /* no condition */; k += base) { - - if (index >= inputLength) { - error('invalid-input'); - } - - digit = basicToDigit(input.charCodeAt(index++)); - - if (digit >= base || digit > floor((maxInt - i) / w)) { - error('overflow'); - } - - i += digit * w; - t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); - - if (digit < t) { - break; - } - - baseMinusT = base - t; - if (w > floor(maxInt / baseMinusT)) { - error('overflow'); - } - - w *= baseMinusT; - - } - - out = output.length + 1; - bias = adapt(i - oldi, out, oldi == 0); - - // `i` was supposed to wrap around from `out` to `0`, - // incrementing `n` each time, so we'll fix that now: - if (floor(i / out) > maxInt - n) { - error('overflow'); - } - - n += floor(i / out); - i %= out; - - // Insert `n` at position `i` of the output - output.splice(i++, 0, n); - - } - - return ucs2encode(output); - } - - /** - * Converts a string of Unicode symbols (e.g. a domain name label) to a - * Punycode string of ASCII-only symbols. - * @memberOf punycode - * @param {String} input The string of Unicode symbols. - * @returns {String} The resulting Punycode string of ASCII-only symbols. - */ - function encode(input) { - var n, - delta, - handledCPCount, - basicLength, - bias, - j, - m, - q, - k, - t, - currentValue, - output = [], - /** `inputLength` will hold the number of code points in `input`. */ - inputLength, - /** Cached calculation results */ - handledCPCountPlusOne, - baseMinusT, - qMinusT; - - // Convert the input in UCS-2 to Unicode - input = ucs2decode(input); - - // Cache the length - inputLength = input.length; - - // Initialize the state - n = initialN; - delta = 0; - bias = initialBias; - - // Handle the basic code points - for (j = 0; j < inputLength; ++j) { - currentValue = input[j]; - if (currentValue < 0x80) { - output.push(stringFromCharCode(currentValue)); - } - } - - handledCPCount = basicLength = output.length; - - // `handledCPCount` is the number of code points that have been handled; - // `basicLength` is the number of basic code points. - - // Finish the basic string - if it is not empty - with a delimiter - if (basicLength) { - output.push(delimiter); - } - - // Main encoding loop: - while (handledCPCount < inputLength) { - - // All non-basic code points < n have been handled already. Find the next - // larger one: - for (m = maxInt, j = 0; j < inputLength; ++j) { - currentValue = input[j]; - if (currentValue >= n && currentValue < m) { - m = currentValue; - } - } - - // Increase `delta` enough to advance the decoder's state to , - // but guard against overflow - handledCPCountPlusOne = handledCPCount + 1; - if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { - error('overflow'); - } - - delta += (m - n) * handledCPCountPlusOne; - n = m; - - for (j = 0; j < inputLength; ++j) { - currentValue = input[j]; - - if (currentValue < n && ++delta > maxInt) { - error('overflow'); - } - - if (currentValue == n) { - // Represent delta as a generalized variable-length integer - for (q = delta, k = base; /* no condition */; k += base) { - t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); - if (q < t) { - break; - } - qMinusT = q - t; - baseMinusT = base - t; - output.push( - stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) - ); - q = floor(qMinusT / baseMinusT); - } - - output.push(stringFromCharCode(digitToBasic(q, 0))); - bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); - delta = 0; - ++handledCPCount; - } - } - - ++delta; - ++n; - - } - return output.join(''); - } - - /** - * Converts a Punycode string representing a domain name or an email address - * to Unicode. Only the Punycoded parts of the input will be converted, i.e. - * it doesn't matter if you call it on a string that has already been - * converted to Unicode. - * @memberOf punycode - * @param {String} input The Punycoded domain name or email address to - * convert to Unicode. - * @returns {String} The Unicode representation of the given Punycode - * string. - */ - function toUnicode(input) { - return mapDomain(input, function(string) { - return regexPunycode.test(string) - ? decode(string.slice(4).toLowerCase()) - : string; - }); - } - - /** - * Converts a Unicode string representing a domain name or an email address to - * Punycode. Only the non-ASCII parts of the domain name will be converted, - * i.e. it doesn't matter if you call it with a domain that's already in - * ASCII. - * @memberOf punycode - * @param {String} input The domain name or email address to convert, as a - * Unicode string. - * @returns {String} The Punycode representation of the given domain name or - * email address. - */ - function toASCII(input) { - return mapDomain(input, function(string) { - return regexNonASCII.test(string) - ? 'xn--' + encode(string) - : string; - }); - } - - /*--------------------------------------------------------------------------*/ - - /** Define the public API */ - punycode = { - /** - * A string representing the current Punycode.js version number. - * @memberOf punycode - * @type String - */ - 'version': '1.4.1', - /** - * An object of methods to convert from JavaScript's internal character - * representation (UCS-2) to Unicode code points, and back. - * @see - * @memberOf punycode - * @type Object - */ - 'ucs2': { - 'decode': ucs2decode, - 'encode': ucs2encode - }, - 'decode': decode, - 'encode': encode, - 'toASCII': toASCII, - 'toUnicode': toUnicode - }; - - /** Expose `punycode` */ - // 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('punycode', function() { - return punycode; - }); - } else if (freeExports && freeModule) { - if (module.exports == freeExports) { - // in Node.js, io.js, or RingoJS v0.8.0+ - freeModule.exports = punycode; - } else { - // in Narwhal or RingoJS v0.7.0- - for (key in punycode) { - punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]); - } - } - } else { - // in Rhino or a web browser - root.punycode = punycode; - } - -}(this)); diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/package.json b/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/package.json deleted file mode 100644 index 21c0765..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/tough-cookie/package.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "author": { - "name": "Jeremy Stashewsky", - "email": "jstashewsky@salesforce.com" - }, - "contributors": [ - { - "name": "Alexander Savin" - }, - { - "name": "Ian Livingstone" - }, - { - "name": "Ivan Nikulin" - }, - { - "name": "Lalit Kapoor" - }, - { - "name": "Sam Thompson" - }, - { - "name": "Sebastian Mayr" - } - ], - "license": "BSD-3-Clause", - "name": "tough-cookie", - "description": "RFC6265 Cookies and Cookie Jar for node.js", - "keywords": [ - "HTTP", - "cookie", - "cookies", - "set-cookie", - "cookiejar", - "jar", - "RFC6265", - "RFC2965" - ], - "version": "2.3.2", - "homepage": "https://github.com/salesforce/tough-cookie", - "repository": { - "type": "git", - "url": "git://github.com/salesforce/tough-cookie.git" - }, - "bugs": { - "url": "https://github.com/salesforce/tough-cookie/issues" - }, - "main": "./lib/cookie", - "files": [ - "lib" - ], - "scripts": { - "suffixup": "curl -o public_suffix_list.dat https://publicsuffix.org/list/public_suffix_list.dat && ./generate-pubsuffix.js", - "test": "vows test/*_test.js" - }, - "engines": { - "node": ">=0.8" - }, - "devDependencies": { - "async": "^1.4.2", - "string.prototype.repeat": "^0.2.0", - "vows": "^0.8.1" - }, - "dependencies": { - "punycode": "^1.4.1" - }, - "gitHead": "2610df5dc8ef7373a483d509006e5887572a4076", - "_id": "tough-cookie@2.3.2", - "_shasum": "f081f76e4c85720e6c37a5faced737150d84072a", - "_from": "tough-cookie@>=2.3.0 <2.4.0", - "_npmVersion": "3.10.8", - "_nodeVersion": "7.0.0", - "_npmUser": { - "name": "jstash", - "email": "jstash@gmail.com" - }, - "dist": { - "shasum": "f081f76e4c85720e6c37a5faced737150d84072a", - "tarball": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz" - }, - "maintainers": [ - { - "name": "awaterma", - "email": "awaterma@awaterma.net" - }, - { - "name": "jstash", - "email": "jstash@gmail.com" - }, - { - "name": "nexxy", - "email": "emily@contactvibe.com" - } - ], - "_npmOperationalInternal": { - "host": "packages-12-west.internal.npmjs.com", - "tmp": "tmp/tough-cookie-2.3.2.tgz_1477415232912_0.6133609430398792" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz" -} diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/tunnel-agent/LICENSE b/node_modules/node-base64-image/node_modules/request/node_modules/tunnel-agent/LICENSE deleted file mode 100644 index a4a9aee..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/tunnel-agent/LICENSE +++ /dev/null @@ -1,55 +0,0 @@ -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - -If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/tunnel-agent/README.md b/node_modules/node-base64-image/node_modules/request/node_modules/tunnel-agent/README.md deleted file mode 100644 index bb533d5..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/tunnel-agent/README.md +++ /dev/null @@ -1,4 +0,0 @@ -tunnel-agent -============ - -HTTP proxy tunneling agent. Formerly part of mikeal/request, now a standalone module. diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/tunnel-agent/index.js b/node_modules/node-base64-image/node_modules/request/node_modules/tunnel-agent/index.js deleted file mode 100644 index 68013ac..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/tunnel-agent/index.js +++ /dev/null @@ -1,243 +0,0 @@ -'use strict' - -var net = require('net') - , tls = require('tls') - , http = require('http') - , https = require('https') - , events = require('events') - , assert = require('assert') - , util = require('util') - ; - -exports.httpOverHttp = httpOverHttp -exports.httpsOverHttp = httpsOverHttp -exports.httpOverHttps = httpOverHttps -exports.httpsOverHttps = httpsOverHttps - - -function httpOverHttp(options) { - var agent = new TunnelingAgent(options) - agent.request = http.request - return agent -} - -function httpsOverHttp(options) { - var agent = new TunnelingAgent(options) - agent.request = http.request - agent.createSocket = createSecureSocket - agent.defaultPort = 443 - return agent -} - -function httpOverHttps(options) { - var agent = new TunnelingAgent(options) - agent.request = https.request - return agent -} - -function httpsOverHttps(options) { - var agent = new TunnelingAgent(options) - agent.request = https.request - agent.createSocket = createSecureSocket - agent.defaultPort = 443 - return agent -} - - -function TunnelingAgent(options) { - var self = this - self.options = options || {} - self.proxyOptions = self.options.proxy || {} - self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets - self.requests = [] - self.sockets = [] - - self.on('free', function onFree(socket, host, port) { - for (var i = 0, len = self.requests.length; i < len; ++i) { - var pending = self.requests[i] - if (pending.host === host && pending.port === port) { - // Detect the request to connect same origin server, - // reuse the connection. - self.requests.splice(i, 1) - pending.request.onSocket(socket) - return - } - } - socket.destroy() - self.removeSocket(socket) - }) -} -util.inherits(TunnelingAgent, events.EventEmitter) - -TunnelingAgent.prototype.addRequest = function addRequest(req, options) { - var self = this - - // Legacy API: addRequest(req, host, port, path) - if (typeof options === 'string') { - options = { - host: options, - port: arguments[2], - path: arguments[3] - }; - } - - if (self.sockets.length >= this.maxSockets) { - // We are over limit so we'll add it to the queue. - self.requests.push({host: options.host, port: options.port, request: req}) - return - } - - // If we are under maxSockets create a new one. - self.createConnection({host: options.host, port: options.port, request: req}) -} - -TunnelingAgent.prototype.createConnection = function createConnection(pending) { - var self = this - - self.createSocket(pending, function(socket) { - socket.on('free', onFree) - socket.on('close', onCloseOrRemove) - socket.on('agentRemove', onCloseOrRemove) - pending.request.onSocket(socket) - - function onFree() { - self.emit('free', socket, pending.host, pending.port) - } - - function onCloseOrRemove(err) { - self.removeSocket(socket) - socket.removeListener('free', onFree) - socket.removeListener('close', onCloseOrRemove) - socket.removeListener('agentRemove', onCloseOrRemove) - } - }) -} - -TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { - var self = this - var placeholder = {} - self.sockets.push(placeholder) - - var connectOptions = mergeOptions({}, self.proxyOptions, - { method: 'CONNECT' - , path: options.host + ':' + options.port - , agent: false - } - ) - if (connectOptions.proxyAuth) { - connectOptions.headers = connectOptions.headers || {} - connectOptions.headers['Proxy-Authorization'] = 'Basic ' + - new Buffer(connectOptions.proxyAuth).toString('base64') - } - - debug('making CONNECT request') - var connectReq = self.request(connectOptions) - connectReq.useChunkedEncodingByDefault = false // for v0.6 - connectReq.once('response', onResponse) // for v0.6 - connectReq.once('upgrade', onUpgrade) // for v0.6 - connectReq.once('connect', onConnect) // for v0.7 or later - connectReq.once('error', onError) - connectReq.end() - - function onResponse(res) { - // Very hacky. This is necessary to avoid http-parser leaks. - res.upgrade = true - } - - function onUpgrade(res, socket, head) { - // Hacky. - process.nextTick(function() { - onConnect(res, socket, head) - }) - } - - function onConnect(res, socket, head) { - connectReq.removeAllListeners() - socket.removeAllListeners() - - if (res.statusCode === 200) { - assert.equal(head.length, 0) - debug('tunneling connection has established') - self.sockets[self.sockets.indexOf(placeholder)] = socket - cb(socket) - } else { - debug('tunneling socket could not be established, statusCode=%d', res.statusCode) - var error = new Error('tunneling socket could not be established, ' + 'statusCode=' + res.statusCode) - error.code = 'ECONNRESET' - options.request.emit('error', error) - self.removeSocket(placeholder) - } - } - - function onError(cause) { - connectReq.removeAllListeners() - - debug('tunneling socket could not be established, cause=%s\n', cause.message, cause.stack) - var error = new Error('tunneling socket could not be established, ' + 'cause=' + cause.message) - error.code = 'ECONNRESET' - options.request.emit('error', error) - self.removeSocket(placeholder) - } -} - -TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { - var pos = this.sockets.indexOf(socket) - if (pos === -1) return - - this.sockets.splice(pos, 1) - - var pending = this.requests.shift() - if (pending) { - // If we have pending requests and a socket gets closed a new one - // needs to be created to take over in the pool for the one that closed. - this.createConnection(pending) - } -} - -function createSecureSocket(options, cb) { - var self = this - TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { - // 0 is dummy port for v0.6 - var secureSocket = tls.connect(0, mergeOptions({}, self.options, - { servername: options.host - , socket: socket - } - )) - self.sockets[self.sockets.indexOf(socket)] = secureSocket - cb(secureSocket) - }) -} - - -function mergeOptions(target) { - for (var i = 1, len = arguments.length; i < len; ++i) { - var overrides = arguments[i] - if (typeof overrides === 'object') { - var keys = Object.keys(overrides) - for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { - var k = keys[j] - if (overrides[k] !== undefined) { - target[k] = overrides[k] - } - } - } - } - return target -} - - -var debug -if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { - debug = function() { - var args = Array.prototype.slice.call(arguments) - if (typeof args[0] === 'string') { - args[0] = 'TUNNEL: ' + args[0] - } else { - args.unshift('TUNNEL:') - } - console.error.apply(console, args) - } -} else { - debug = function() {} -} -exports.debug = debug // for test diff --git a/node_modules/node-base64-image/node_modules/request/node_modules/tunnel-agent/package.json b/node_modules/node-base64-image/node_modules/request/node_modules/tunnel-agent/package.json deleted file mode 100644 index 6677690..0000000 --- a/node_modules/node-base64-image/node_modules/request/node_modules/tunnel-agent/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "author": { - "name": "Mikeal Rogers", - "email": "mikeal.rogers@gmail.com", - "url": "http://www.futurealoof.com" - }, - "name": "tunnel-agent", - "license": "Apache-2.0", - "description": "HTTP proxy tunneling agent. Formerly part of mikeal/request, now a standalone module.", - "version": "0.4.3", - "repository": { - "url": "git+https://github.com/mikeal/tunnel-agent.git" - }, - "main": "index.js", - "files": [ - "index.js" - ], - "dependencies": {}, - "devDependencies": {}, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "gitHead": "e72d830f5ed388a2a71d37ce062c38e3fb34bdde", - "bugs": { - "url": "https://github.com/mikeal/tunnel-agent/issues" - }, - "homepage": "https://github.com/mikeal/tunnel-agent#readme", - "_id": "tunnel-agent@0.4.3", - "scripts": {}, - "_shasum": "6373db76909fe570e08d73583365ed828a74eeeb", - "_from": "tunnel-agent@>=0.4.1 <0.5.0", - "_npmVersion": "2.15.3", - "_nodeVersion": "5.9.0", - "_npmUser": { - "name": "simov", - "email": "simeonvelichkov@gmail.com" - }, - "dist": { - "shasum": "6373db76909fe570e08d73583365ed828a74eeeb", - "tarball": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz" - }, - "maintainers": [ - { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - { - "name": "nylen", - "email": "jnylen@gmail.com" - }, - { - "name": "fredkschott", - "email": "fkschott@gmail.com" - }, - { - "name": "simov", - "email": "simeonvelichkov@gmail.com" - } - ], - "_npmOperationalInternal": { - "host": "packages-16-east.internal.npmjs.com", - "tmp": "tmp/tunnel-agent-0.4.3.tgz_1462396470295_0.23639482469297945" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/node-base64-image/node_modules/request/package.json b/node_modules/node-base64-image/node_modules/request/package.json deleted file mode 100644 index 52c9726..0000000 --- a/node_modules/node-base64-image/node_modules/request/package.json +++ /dev/null @@ -1,124 +0,0 @@ -{ - "name": "request", - "description": "Simplified HTTP request client.", - "tags": [ - "http", - "simple", - "util", - "utility" - ], - "version": "2.76.0", - "author": { - "name": "Mikeal Rogers", - "email": "mikeal.rogers@gmail.com" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/request/request.git" - }, - "bugs": { - "url": "http://github.com/request/request/issues" - }, - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - }, - "main": "index.js", - "dependencies": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.11.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~2.0.6", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "node-uuid": "~1.4.7", - "oauth-sign": "~0.8.1", - "qs": "~6.3.0", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "~0.4.1" - }, - "scripts": { - "test": "npm run lint && npm run test-ci && npm run test-browser", - "test-ci": "taper tests/test-*.js", - "test-cov": "istanbul cover tape tests/test-*.js", - "test-browser": "node tests/browser/start.js", - "lint": "eslint lib/ *.js tests/ && echo Lint passed." - }, - "devDependencies": { - "bluebird": "^3.2.1", - "browserify": "^13.0.1", - "browserify-istanbul": "^2.0.0", - "buffer-equal": "^1.0.0", - "codecov": "^1.0.1", - "coveralls": "^2.11.4", - "eslint": "^2.5.3", - "function-bind": "^1.0.2", - "istanbul": "^0.4.0", - "karma": "^1.1.1", - "karma-browserify": "^5.0.1", - "karma-cli": "^1.0.0", - "karma-coverage": "^1.0.0", - "karma-phantomjs-launcher": "^1.0.0", - "karma-tap": "^3.0.1", - "phantomjs-prebuilt": "^2.1.3", - "rimraf": "^2.2.8", - "server-destroy": "^1.0.1", - "tape": "^4.6.0", - "taper": "^0.4.0" - }, - "greenkeeper": { - "ignore": [ - "eslint", - "hawk", - "har-validator" - ] - }, - "gitHead": "7e873863803817d321dbc994d3eff943cde42ac7", - "homepage": "https://github.com/request/request#readme", - "_id": "request@2.76.0", - "_shasum": "be44505afef70360a0436955106be3945d95560e", - "_from": "request@>=2.51.0 <3.0.0", - "_npmVersion": "2.15.9", - "_nodeVersion": "6.5.0", - "_npmUser": { - "name": "simov", - "email": "simeonvelichkov@gmail.com" - }, - "dist": { - "shasum": "be44505afef70360a0436955106be3945d95560e", - "tarball": "https://registry.npmjs.org/request/-/request-2.76.0.tgz" - }, - "maintainers": [ - { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - { - "name": "nylen", - "email": "jnylen@gmail.com" - }, - { - "name": "fredkschott", - "email": "fkschott@gmail.com" - }, - { - "name": "simov", - "email": "simeonvelichkov@gmail.com" - } - ], - "_npmOperationalInternal": { - "host": "packages-12-west.internal.npmjs.com", - "tmp": "tmp/request-2.76.0.tgz_1477385874691_0.41635931469500065" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/request/-/request-2.76.0.tgz" -} diff --git a/node_modules/node-base64-image/node_modules/request/request.js b/node_modules/node-base64-image/node_modules/request/request.js deleted file mode 100644 index 8ed57b7..0000000 --- a/node_modules/node-base64-image/node_modules/request/request.js +++ /dev/null @@ -1,1450 +0,0 @@ -'use strict' - -var http = require('http') - , https = require('https') - , url = require('url') - , util = require('util') - , stream = require('stream') - , zlib = require('zlib') - , hawk = require('hawk') - , aws2 = require('aws-sign2') - , aws4 = require('aws4') - , httpSignature = require('http-signature') - , mime = require('mime-types') - , stringstream = require('stringstream') - , caseless = require('caseless') - , ForeverAgent = require('forever-agent') - , FormData = require('form-data') - , extend = require('extend') - , isstream = require('isstream') - , isTypedArray = require('is-typedarray').strict - , helpers = require('./lib/helpers') - , cookies = require('./lib/cookies') - , getProxyFromURI = require('./lib/getProxyFromURI') - , Querystring = require('./lib/querystring').Querystring - , Har = require('./lib/har').Har - , Auth = require('./lib/auth').Auth - , OAuth = require('./lib/oauth').OAuth - , Multipart = require('./lib/multipart').Multipart - , Redirect = require('./lib/redirect').Redirect - , Tunnel = require('./lib/tunnel').Tunnel - -var safeStringify = helpers.safeStringify - , isReadStream = helpers.isReadStream - , toBase64 = helpers.toBase64 - , defer = helpers.defer - , copy = helpers.copy - , version = helpers.version - , globalCookieJar = cookies.jar() - - -var globalPool = {} - -function filterForNonReserved(reserved, options) { - // Filter out properties that are not reserved. - // Reserved values are passed in at call site. - - var object = {} - for (var i in options) { - var notReserved = (reserved.indexOf(i) === -1) - if (notReserved) { - object[i] = options[i] - } - } - return object -} - -function filterOutReservedFunctions(reserved, options) { - // Filter out properties that are functions and are reserved. - // Reserved values are passed in at call site. - - var object = {} - for (var i in options) { - var isReserved = !(reserved.indexOf(i) === -1) - var isFunction = (typeof options[i] === 'function') - if (!(isReserved && isFunction)) { - object[i] = options[i] - } - } - return object - -} - -// Return a simpler request object to allow serialization -function requestToJSON() { - var self = this - return { - uri: self.uri, - method: self.method, - headers: self.headers - } -} - -// Return a simpler response object to allow serialization -function responseToJSON() { - var self = this - return { - statusCode: self.statusCode, - body: self.body, - headers: self.headers, - request: requestToJSON.call(self.request) - } -} - -function Request (options) { - // if given the method property in options, set property explicitMethod to true - - // extend the Request instance with any non-reserved properties - // remove any reserved functions from the options object - // set Request instance to be readable and writable - // call init - - var self = this - - // start with HAR, then override with additional options - if (options.har) { - self._har = new Har(self) - options = self._har.options(options) - } - - stream.Stream.call(self) - var reserved = Object.keys(Request.prototype) - var nonReserved = filterForNonReserved(reserved, options) - - extend(self, nonReserved) - options = filterOutReservedFunctions(reserved, options) - - self.readable = true - self.writable = true - if (options.method) { - self.explicitMethod = true - } - self._qs = new Querystring(self) - self._auth = new Auth(self) - self._oauth = new OAuth(self) - self._multipart = new Multipart(self) - self._redirect = new Redirect(self) - self._tunnel = new Tunnel(self) - self.init(options) -} - -util.inherits(Request, stream.Stream) - -// Debugging -Request.debug = process.env.NODE_DEBUG && /\brequest\b/.test(process.env.NODE_DEBUG) -function debug() { - if (Request.debug) { - console.error('REQUEST %s', util.format.apply(util, arguments)) - } -} -Request.prototype.debug = debug - -Request.prototype.init = function (options) { - // init() contains all the code to setup the request object. - // the actual outgoing request is not started until start() is called - // this function is called from both the constructor and on redirect. - var self = this - if (!options) { - options = {} - } - self.headers = self.headers ? copy(self.headers) : {} - - // Delete headers with value undefined since they break - // ClientRequest.OutgoingMessage.setHeader in node 0.12 - for (var headerName in self.headers) { - if (typeof self.headers[headerName] === 'undefined') { - delete self.headers[headerName] - } - } - - caseless.httpify(self, self.headers) - - if (!self.method) { - self.method = options.method || 'GET' - } - if (!self.localAddress) { - self.localAddress = options.localAddress - } - - self._qs.init(options) - - debug(options) - if (!self.pool && self.pool !== false) { - self.pool = globalPool - } - self.dests = self.dests || [] - self.__isRequestRequest = true - - // Protect against double callback - if (!self._callback && self.callback) { - self._callback = self.callback - self.callback = function () { - if (self._callbackCalled) { - return // Print a warning maybe? - } - self._callbackCalled = true - self._callback.apply(self, arguments) - } - self.on('error', self.callback.bind()) - self.on('complete', self.callback.bind(self, null)) - } - - // People use this property instead all the time, so support it - if (!self.uri && self.url) { - self.uri = self.url - delete self.url - } - - // If there's a baseUrl, then use it as the base URL (i.e. uri must be - // specified as a relative path and is appended to baseUrl). - if (self.baseUrl) { - if (typeof self.baseUrl !== 'string') { - return self.emit('error', new Error('options.baseUrl must be a string')) - } - - if (typeof self.uri !== 'string') { - return self.emit('error', new Error('options.uri must be a string when using options.baseUrl')) - } - - if (self.uri.indexOf('//') === 0 || self.uri.indexOf('://') !== -1) { - return self.emit('error', new Error('options.uri must be a path when using options.baseUrl')) - } - - // Handle all cases to make sure that there's only one slash between - // baseUrl and uri. - var baseUrlEndsWithSlash = self.baseUrl.lastIndexOf('/') === self.baseUrl.length - 1 - var uriStartsWithSlash = self.uri.indexOf('/') === 0 - - if (baseUrlEndsWithSlash && uriStartsWithSlash) { - self.uri = self.baseUrl + self.uri.slice(1) - } else if (baseUrlEndsWithSlash || uriStartsWithSlash) { - self.uri = self.baseUrl + self.uri - } else if (self.uri === '') { - self.uri = self.baseUrl - } else { - self.uri = self.baseUrl + '/' + self.uri - } - delete self.baseUrl - } - - // A URI is needed by this point, emit error if we haven't been able to get one - if (!self.uri) { - return self.emit('error', new Error('options.uri is a required argument')) - } - - // If a string URI/URL was given, parse it into a URL object - if (typeof self.uri === 'string') { - self.uri = url.parse(self.uri) - } - - // Some URL objects are not from a URL parsed string and need href added - if (!self.uri.href) { - self.uri.href = url.format(self.uri) - } - - // DEPRECATED: Warning for users of the old Unix Sockets URL Scheme - if (self.uri.protocol === 'unix:') { - return self.emit('error', new Error('`unix://` URL scheme is no longer supported. Please use the format `http://unix:SOCKET:PATH`')) - } - - // Support Unix Sockets - if (self.uri.host === 'unix') { - self.enableUnixSocket() - } - - if (self.strictSSL === false) { - self.rejectUnauthorized = false - } - - if (!self.uri.pathname) {self.uri.pathname = '/'} - - if (!(self.uri.host || (self.uri.hostname && self.uri.port)) && !self.uri.isUnix) { - // Invalid URI: it may generate lot of bad errors, like 'TypeError: Cannot call method `indexOf` of undefined' in CookieJar - // Detect and reject it as soon as possible - var faultyUri = url.format(self.uri) - var message = 'Invalid URI "' + faultyUri + '"' - if (Object.keys(options).length === 0) { - // No option ? This can be the sign of a redirect - // As this is a case where the user cannot do anything (they didn't call request directly with this URL) - // they should be warned that it can be caused by a redirection (can save some hair) - message += '. This can be caused by a crappy redirection.' - } - // This error was fatal - self.abort() - return self.emit('error', new Error(message)) - } - - if (!self.hasOwnProperty('proxy')) { - self.proxy = getProxyFromURI(self.uri) - } - - self.tunnel = self._tunnel.isEnabled() - if (self.proxy) { - self._tunnel.setup(options) - } - - self._redirect.onRequest(options) - - self.setHost = false - if (!self.hasHeader('host')) { - var hostHeaderName = self.originalHostHeaderName || 'host' - self.setHeader(hostHeaderName, self.uri.hostname) - if (self.uri.port) { - if ( !(self.uri.port === 80 && self.uri.protocol === 'http:') && - !(self.uri.port === 443 && self.uri.protocol === 'https:') ) { - self.setHeader(hostHeaderName, self.getHeader('host') + (':' + self.uri.port) ) - } - } - self.setHost = true - } - - self.jar(self._jar || options.jar) - - if (!self.uri.port) { - if (self.uri.protocol === 'http:') {self.uri.port = 80} - else if (self.uri.protocol === 'https:') {self.uri.port = 443} - } - - if (self.proxy && !self.tunnel) { - self.port = self.proxy.port - self.host = self.proxy.hostname - } else { - self.port = self.uri.port - self.host = self.uri.hostname - } - - if (options.form) { - self.form(options.form) - } - - if (options.formData) { - var formData = options.formData - var requestForm = self.form() - var appendFormValue = function (key, value) { - if (value && value.hasOwnProperty('value') && value.hasOwnProperty('options')) { - requestForm.append(key, value.value, value.options) - } else { - requestForm.append(key, value) - } - } - for (var formKey in formData) { - if (formData.hasOwnProperty(formKey)) { - var formValue = formData[formKey] - if (formValue instanceof Array) { - for (var j = 0; j < formValue.length; j++) { - appendFormValue(formKey, formValue[j]) - } - } else { - appendFormValue(formKey, formValue) - } - } - } - } - - if (options.qs) { - self.qs(options.qs) - } - - if (self.uri.path) { - self.path = self.uri.path - } else { - self.path = self.uri.pathname + (self.uri.search || '') - } - - if (self.path.length === 0) { - self.path = '/' - } - - // Auth must happen last in case signing is dependent on other headers - if (options.aws) { - self.aws(options.aws) - } - - if (options.hawk) { - self.hawk(options.hawk) - } - - if (options.httpSignature) { - self.httpSignature(options.httpSignature) - } - - if (options.auth) { - if (Object.prototype.hasOwnProperty.call(options.auth, 'username')) { - options.auth.user = options.auth.username - } - if (Object.prototype.hasOwnProperty.call(options.auth, 'password')) { - options.auth.pass = options.auth.password - } - - self.auth( - options.auth.user, - options.auth.pass, - options.auth.sendImmediately, - options.auth.bearer - ) - } - - if (self.gzip && !self.hasHeader('accept-encoding')) { - self.setHeader('accept-encoding', 'gzip, deflate') - } - - if (self.uri.auth && !self.hasHeader('authorization')) { - var uriAuthPieces = self.uri.auth.split(':').map(function(item) {return self._qs.unescape(item)}) - self.auth(uriAuthPieces[0], uriAuthPieces.slice(1).join(':'), true) - } - - if (!self.tunnel && self.proxy && self.proxy.auth && !self.hasHeader('proxy-authorization')) { - var proxyAuthPieces = self.proxy.auth.split(':').map(function(item) {return self._qs.unescape(item)}) - var authHeader = 'Basic ' + toBase64(proxyAuthPieces.join(':')) - self.setHeader('proxy-authorization', authHeader) - } - - if (self.proxy && !self.tunnel) { - self.path = (self.uri.protocol + '//' + self.uri.host + self.path) - } - - if (options.json) { - self.json(options.json) - } - if (options.multipart) { - self.multipart(options.multipart) - } - - if (options.time) { - self.timing = true - self.elapsedTime = self.elapsedTime || 0 - } - - function setContentLength () { - if (isTypedArray(self.body)) { - self.body = new Buffer(self.body) - } - - if (!self.hasHeader('content-length')) { - var length - if (typeof self.body === 'string') { - length = Buffer.byteLength(self.body) - } - else if (Array.isArray(self.body)) { - length = self.body.reduce(function (a, b) {return a + b.length}, 0) - } - else { - length = self.body.length - } - - if (length) { - self.setHeader('content-length', length) - } else { - self.emit('error', new Error('Argument error, options.body.')) - } - } - } - if (self.body && !isstream(self.body)) { - setContentLength() - } - - if (options.oauth) { - self.oauth(options.oauth) - } else if (self._oauth.params && self.hasHeader('authorization')) { - self.oauth(self._oauth.params) - } - - var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol - , defaultModules = {'http:':http, 'https:':https} - , httpModules = self.httpModules || {} - - self.httpModule = httpModules[protocol] || defaultModules[protocol] - - if (!self.httpModule) { - return self.emit('error', new Error('Invalid protocol: ' + protocol)) - } - - if (options.ca) { - self.ca = options.ca - } - - if (!self.agent) { - if (options.agentOptions) { - self.agentOptions = options.agentOptions - } - - if (options.agentClass) { - self.agentClass = options.agentClass - } else if (options.forever) { - var v = version() - // use ForeverAgent in node 0.10- only - if (v.major === 0 && v.minor <= 10) { - self.agentClass = protocol === 'http:' ? ForeverAgent : ForeverAgent.SSL - } else { - self.agentClass = self.httpModule.Agent - self.agentOptions = self.agentOptions || {} - self.agentOptions.keepAlive = true - } - } else { - self.agentClass = self.httpModule.Agent - } - } - - if (self.pool === false) { - self.agent = false - } else { - self.agent = self.agent || self.getNewAgent() - } - - self.on('pipe', function (src) { - if (self.ntick && self._started) { - self.emit('error', new Error('You cannot pipe to this stream after the outbound request has started.')) - } - self.src = src - if (isReadStream(src)) { - if (!self.hasHeader('content-type')) { - self.setHeader('content-type', mime.lookup(src.path)) - } - } else { - if (src.headers) { - for (var i in src.headers) { - if (!self.hasHeader(i)) { - self.setHeader(i, src.headers[i]) - } - } - } - if (self._json && !self.hasHeader('content-type')) { - self.setHeader('content-type', 'application/json') - } - if (src.method && !self.explicitMethod) { - self.method = src.method - } - } - - // self.on('pipe', function () { - // console.error('You have already piped to this stream. Pipeing twice is likely to break the request.') - // }) - }) - - defer(function () { - if (self._aborted) { - return - } - - var end = function () { - if (self._form) { - if (!self._auth.hasAuth) { - self._form.pipe(self) - } - else if (self._auth.hasAuth && self._auth.sentAuth) { - self._form.pipe(self) - } - } - if (self._multipart && self._multipart.chunked) { - self._multipart.body.pipe(self) - } - if (self.body) { - if (isstream(self.body)) { - self.body.pipe(self) - } else { - setContentLength() - if (Array.isArray(self.body)) { - self.body.forEach(function (part) { - self.write(part) - }) - } else { - self.write(self.body) - } - self.end() - } - } else if (self.requestBodyStream) { - console.warn('options.requestBodyStream is deprecated, please pass the request object to stream.pipe.') - self.requestBodyStream.pipe(self) - } else if (!self.src) { - if (self._auth.hasAuth && !self._auth.sentAuth) { - self.end() - return - } - if (self.method !== 'GET' && typeof self.method !== 'undefined') { - self.setHeader('content-length', 0) - } - self.end() - } - } - - if (self._form && !self.hasHeader('content-length')) { - // Before ending the request, we had to compute the length of the whole form, asyncly - self.setHeader(self._form.getHeaders(), true) - self._form.getLength(function (err, length) { - if (!err && !isNaN(length)) { - self.setHeader('content-length', length) - } - end() - }) - } else { - end() - } - - self.ntick = true - }) - -} - -Request.prototype.getNewAgent = function () { - var self = this - var Agent = self.agentClass - var options = {} - if (self.agentOptions) { - for (var i in self.agentOptions) { - options[i] = self.agentOptions[i] - } - } - if (self.ca) { - options.ca = self.ca - } - if (self.ciphers) { - options.ciphers = self.ciphers - } - if (self.secureProtocol) { - options.secureProtocol = self.secureProtocol - } - if (self.secureOptions) { - options.secureOptions = self.secureOptions - } - if (typeof self.rejectUnauthorized !== 'undefined') { - options.rejectUnauthorized = self.rejectUnauthorized - } - - if (self.cert && self.key) { - options.key = self.key - options.cert = self.cert - } - - if (self.pfx) { - options.pfx = self.pfx - } - - if (self.passphrase) { - options.passphrase = self.passphrase - } - - var poolKey = '' - - // different types of agents are in different pools - if (Agent !== self.httpModule.Agent) { - poolKey += Agent.name - } - - // ca option is only relevant if proxy or destination are https - var proxy = self.proxy - if (typeof proxy === 'string') { - proxy = url.parse(proxy) - } - var isHttps = (proxy && proxy.protocol === 'https:') || this.uri.protocol === 'https:' - - if (isHttps) { - if (options.ca) { - if (poolKey) { - poolKey += ':' - } - poolKey += options.ca - } - - if (typeof options.rejectUnauthorized !== 'undefined') { - if (poolKey) { - poolKey += ':' - } - poolKey += options.rejectUnauthorized - } - - if (options.cert) { - if (poolKey) { - poolKey += ':' - } - poolKey += options.cert.toString('ascii') + options.key.toString('ascii') - } - - if (options.pfx) { - if (poolKey) { - poolKey += ':' - } - poolKey += options.pfx.toString('ascii') - } - - if (options.ciphers) { - if (poolKey) { - poolKey += ':' - } - poolKey += options.ciphers - } - - if (options.secureProtocol) { - if (poolKey) { - poolKey += ':' - } - poolKey += options.secureProtocol - } - - if (options.secureOptions) { - if (poolKey) { - poolKey += ':' - } - poolKey += options.secureOptions - } - } - - if (self.pool === globalPool && !poolKey && Object.keys(options).length === 0 && self.httpModule.globalAgent) { - // not doing anything special. Use the globalAgent - return self.httpModule.globalAgent - } - - // we're using a stored agent. Make sure it's protocol-specific - poolKey = self.uri.protocol + poolKey - - // generate a new agent for this setting if none yet exists - if (!self.pool[poolKey]) { - self.pool[poolKey] = new Agent(options) - // properly set maxSockets on new agents - if (self.pool.maxSockets) { - self.pool[poolKey].maxSockets = self.pool.maxSockets - } - } - - return self.pool[poolKey] -} - -Request.prototype.start = function () { - // start() is called once we are ready to send the outgoing HTTP request. - // this is usually called on the first write(), end() or on nextTick() - var self = this - - if (self._aborted) { - return - } - - self._started = true - self.method = self.method || 'GET' - self.href = self.uri.href - - if (self.src && self.src.stat && self.src.stat.size && !self.hasHeader('content-length')) { - self.setHeader('content-length', self.src.stat.size) - } - if (self._aws) { - self.aws(self._aws, true) - } - - // We have a method named auth, which is completely different from the http.request - // auth option. If we don't remove it, we're gonna have a bad time. - var reqOptions = copy(self) - delete reqOptions.auth - - debug('make request', self.uri.href) - - // node v6.8.0 now supports a `timeout` value in `http.request()`, but we - // should delete it for now since we handle timeouts manually for better - // consistency with node versions before v6.8.0 - delete reqOptions.timeout - - try { - self.req = self.httpModule.request(reqOptions) - } catch (err) { - self.emit('error', err) - return - } - - if (self.timing) { - self.startTime = new Date().getTime() - } - - var timeout - if (self.timeout && !self.timeoutTimer) { - if (self.timeout < 0) { - timeout = 0 - } else if (typeof self.timeout === 'number' && isFinite(self.timeout)) { - timeout = self.timeout - } - } - - self.req.on('response', self.onRequestResponse.bind(self)) - self.req.on('error', self.onRequestError.bind(self)) - self.req.on('drain', function() { - self.emit('drain') - }) - self.req.on('socket', function(socket) { - if (timeout !== undefined) { - socket.once('connect', function() { - clearTimeout(self.timeoutTimer) - self.timeoutTimer = null - // Set an additional timeout on the socket, via the `setsockopt` syscall. - // This timeout sets the amount of time to wait *between* bytes sent - // from the server once connected. - // - // In particular, it's useful for erroring if the server fails to send - // data halfway through streaming a response. - self.req.setTimeout(timeout, function () { - if (self.req) { - self.abort() - var e = new Error('ESOCKETTIMEDOUT') - e.code = 'ESOCKETTIMEDOUT' - e.connect = false - self.emit('error', e) - } - }) - }) - - // Set a timeout in memory - this block will throw if the server takes more - // than `timeout` to write the HTTP status and headers (corresponding to - // the on('response') event on the client). NB: this measures wall-clock - // time, not the time between bytes sent by the server. - self.timeoutTimer = setTimeout(function () { - self.abort() - var e = new Error('ETIMEDOUT') - e.code = 'ETIMEDOUT' - e.connect = true - self.emit('error', e) - }, timeout) - } - self.emit('socket', socket) - }) - - self.emit('request', self.req) -} - -Request.prototype.onRequestError = function (error) { - var self = this - if (self._aborted) { - return - } - if (self.req && self.req._reusedSocket && error.code === 'ECONNRESET' - && self.agent.addRequestNoreuse) { - self.agent = { addRequest: self.agent.addRequestNoreuse.bind(self.agent) } - self.start() - self.req.end() - return - } - if (self.timeout && self.timeoutTimer) { - clearTimeout(self.timeoutTimer) - self.timeoutTimer = null - } - self.emit('error', error) -} - -Request.prototype.onRequestResponse = function (response) { - var self = this - debug('onRequestResponse', self.uri.href, response.statusCode, response.headers) - response.on('end', function() { - if (self.timing) { - self.elapsedTime += (new Date().getTime() - self.startTime) - debug('elapsed time', self.elapsedTime) - response.elapsedTime = self.elapsedTime - } - debug('response end', self.uri.href, response.statusCode, response.headers) - }) - - if (self._aborted) { - debug('aborted', self.uri.href) - response.resume() - return - } - - self.response = response - response.request = self - response.toJSON = responseToJSON - - // XXX This is different on 0.10, because SSL is strict by default - if (self.httpModule === https && - self.strictSSL && (!response.hasOwnProperty('socket') || - !response.socket.authorized)) { - debug('strict ssl error', self.uri.href) - var sslErr = response.hasOwnProperty('socket') ? response.socket.authorizationError : self.uri.href + ' does not support SSL' - self.emit('error', new Error('SSL Error: ' + sslErr)) - return - } - - // Save the original host before any redirect (if it changes, we need to - // remove any authorization headers). Also remember the case of the header - // name because lots of broken servers expect Host instead of host and we - // want the caller to be able to specify this. - self.originalHost = self.getHeader('host') - if (!self.originalHostHeaderName) { - self.originalHostHeaderName = self.hasHeader('host') - } - if (self.setHost) { - self.removeHeader('host') - } - if (self.timeout && self.timeoutTimer) { - clearTimeout(self.timeoutTimer) - self.timeoutTimer = null - } - - var targetCookieJar = (self._jar && self._jar.setCookie) ? self._jar : globalCookieJar - var addCookie = function (cookie) { - //set the cookie if it's domain in the href's domain. - try { - targetCookieJar.setCookie(cookie, self.uri.href, {ignoreError: true}) - } catch (e) { - self.emit('error', e) - } - } - - response.caseless = caseless(response.headers) - - if (response.caseless.has('set-cookie') && (!self._disableCookies)) { - var headerName = response.caseless.has('set-cookie') - if (Array.isArray(response.headers[headerName])) { - response.headers[headerName].forEach(addCookie) - } else { - addCookie(response.headers[headerName]) - } - } - - if (self._redirect.onResponse(response)) { - return // Ignore the rest of the response - } else { - // Be a good stream and emit end when the response is finished. - // Hack to emit end on close because of a core bug that never fires end - response.on('close', function () { - if (!self._ended) { - self.response.emit('end') - } - }) - - response.once('end', function () { - self._ended = true - }) - - var noBody = function (code) { - return ( - self.method === 'HEAD' - // Informational - || (code >= 100 && code < 200) - // No Content - || code === 204 - // Not Modified - || code === 304 - ) - } - - var responseContent - if (self.gzip && !noBody(response.statusCode)) { - var contentEncoding = response.headers['content-encoding'] || 'identity' - contentEncoding = contentEncoding.trim().toLowerCase() - - if (contentEncoding === 'gzip') { - responseContent = zlib.createGunzip() - response.pipe(responseContent) - } else if (contentEncoding === 'deflate') { - responseContent = zlib.createInflate() - response.pipe(responseContent) - } else { - // Since previous versions didn't check for Content-Encoding header, - // ignore any invalid values to preserve backwards-compatibility - if (contentEncoding !== 'identity') { - debug('ignoring unrecognized Content-Encoding ' + contentEncoding) - } - responseContent = response - } - } else { - responseContent = response - } - - if (self.encoding) { - if (self.dests.length !== 0) { - console.error('Ignoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.') - } else if (responseContent.setEncoding) { - responseContent.setEncoding(self.encoding) - } else { - // Should only occur on node pre-v0.9.4 (joyent/node@9b5abe5) with - // zlib streams. - // If/When support for 0.9.4 is dropped, this should be unnecessary. - responseContent = responseContent.pipe(stringstream(self.encoding)) - } - } - - if (self._paused) { - responseContent.pause() - } - - self.responseContent = responseContent - - self.emit('response', response) - - self.dests.forEach(function (dest) { - self.pipeDest(dest) - }) - - responseContent.on('data', function (chunk) { - if (self.timing && !self.responseStarted) { - self.responseStartTime = (new Date()).getTime() - response.responseStartTime = self.responseStartTime - } - self._destdata = true - self.emit('data', chunk) - }) - responseContent.once('end', function (chunk) { - self.emit('end', chunk) - }) - responseContent.on('error', function (error) { - self.emit('error', error) - }) - responseContent.on('close', function () {self.emit('close')}) - - if (self.callback) { - self.readResponseBody(response) - } - //if no callback - else { - self.on('end', function () { - if (self._aborted) { - debug('aborted', self.uri.href) - return - } - self.emit('complete', response) - }) - } - } - debug('finish init function', self.uri.href) -} - -Request.prototype.readResponseBody = function (response) { - var self = this - debug('reading response\'s body') - var buffers = [] - , bufferLength = 0 - , strings = [] - - self.on('data', function (chunk) { - if (!Buffer.isBuffer(chunk)) { - strings.push(chunk) - } else if (chunk.length) { - bufferLength += chunk.length - buffers.push(chunk) - } - }) - self.on('end', function () { - debug('end event', self.uri.href) - if (self._aborted) { - debug('aborted', self.uri.href) - // `buffer` is defined in the parent scope and used in a closure it exists for the life of the request. - // This can lead to leaky behavior if the user retains a reference to the request object. - buffers = [] - bufferLength = 0 - return - } - - if (bufferLength) { - debug('has body', self.uri.href, bufferLength) - response.body = Buffer.concat(buffers, bufferLength) - if (self.encoding !== null) { - response.body = response.body.toString(self.encoding) - } - // `buffer` is defined in the parent scope and used in a closure it exists for the life of the Request. - // This can lead to leaky behavior if the user retains a reference to the request object. - buffers = [] - bufferLength = 0 - } else if (strings.length) { - // The UTF8 BOM [0xEF,0xBB,0xBF] is converted to [0xFE,0xFF] in the JS UTC16/UCS2 representation. - // Strip this value out when the encoding is set to 'utf8', as upstream consumers won't expect it and it breaks JSON.parse(). - if (self.encoding === 'utf8' && strings[0].length > 0 && strings[0][0] === '\uFEFF') { - strings[0] = strings[0].substring(1) - } - response.body = strings.join('') - } - - if (self._json) { - try { - response.body = JSON.parse(response.body, self._jsonReviver) - } catch (e) { - debug('invalid JSON received', self.uri.href) - } - } - debug('emitting complete', self.uri.href) - if (typeof response.body === 'undefined' && !self._json) { - response.body = self.encoding === null ? new Buffer(0) : '' - } - self.emit('complete', response, response.body) - }) -} - -Request.prototype.abort = function () { - var self = this - self._aborted = true - - if (self.req) { - self.req.abort() - } - else if (self.response) { - self.response.destroy() - } - - self.emit('abort') -} - -Request.prototype.pipeDest = function (dest) { - var self = this - var response = self.response - // Called after the response is received - if (dest.headers && !dest.headersSent) { - if (response.caseless.has('content-type')) { - var ctname = response.caseless.has('content-type') - if (dest.setHeader) { - dest.setHeader(ctname, response.headers[ctname]) - } - else { - dest.headers[ctname] = response.headers[ctname] - } - } - - if (response.caseless.has('content-length')) { - var clname = response.caseless.has('content-length') - if (dest.setHeader) { - dest.setHeader(clname, response.headers[clname]) - } else { - dest.headers[clname] = response.headers[clname] - } - } - } - if (dest.setHeader && !dest.headersSent) { - for (var i in response.headers) { - // If the response content is being decoded, the Content-Encoding header - // of the response doesn't represent the piped content, so don't pass it. - if (!self.gzip || i !== 'content-encoding') { - dest.setHeader(i, response.headers[i]) - } - } - dest.statusCode = response.statusCode - } - if (self.pipefilter) { - self.pipefilter(response, dest) - } -} - -Request.prototype.qs = function (q, clobber) { - var self = this - var base - if (!clobber && self.uri.query) { - base = self._qs.parse(self.uri.query) - } else { - base = {} - } - - for (var i in q) { - base[i] = q[i] - } - - var qs = self._qs.stringify(base) - - if (qs === '') { - return self - } - - self.uri = url.parse(self.uri.href.split('?')[0] + '?' + qs) - self.url = self.uri - self.path = self.uri.path - - if (self.uri.host === 'unix') { - self.enableUnixSocket() - } - - return self -} -Request.prototype.form = function (form) { - var self = this - if (form) { - if (!/^application\/x-www-form-urlencoded\b/.test(self.getHeader('content-type'))) { - self.setHeader('content-type', 'application/x-www-form-urlencoded') - } - self.body = (typeof form === 'string') - ? self._qs.rfc3986(form.toString('utf8')) - : self._qs.stringify(form).toString('utf8') - return self - } - // create form-data object - self._form = new FormData() - self._form.on('error', function(err) { - err.message = 'form-data: ' + err.message - self.emit('error', err) - self.abort() - }) - return self._form -} -Request.prototype.multipart = function (multipart) { - var self = this - - self._multipart.onRequest(multipart) - - if (!self._multipart.chunked) { - self.body = self._multipart.body - } - - return self -} -Request.prototype.json = function (val) { - var self = this - - if (!self.hasHeader('accept')) { - self.setHeader('accept', 'application/json') - } - - if (typeof self.jsonReplacer === 'function') { - self._jsonReplacer = self.jsonReplacer - } - - self._json = true - if (typeof val === 'boolean') { - if (self.body !== undefined) { - if (!/^application\/x-www-form-urlencoded\b/.test(self.getHeader('content-type'))) { - self.body = safeStringify(self.body, self._jsonReplacer) - } else { - self.body = self._qs.rfc3986(self.body) - } - if (!self.hasHeader('content-type')) { - self.setHeader('content-type', 'application/json') - } - } - } else { - self.body = safeStringify(val, self._jsonReplacer) - if (!self.hasHeader('content-type')) { - self.setHeader('content-type', 'application/json') - } - } - - if (typeof self.jsonReviver === 'function') { - self._jsonReviver = self.jsonReviver - } - - return self -} -Request.prototype.getHeader = function (name, headers) { - var self = this - var result, re, match - if (!headers) { - headers = self.headers - } - Object.keys(headers).forEach(function (key) { - if (key.length !== name.length) { - return - } - re = new RegExp(name, 'i') - match = key.match(re) - if (match) { - result = headers[key] - } - }) - return result -} -Request.prototype.enableUnixSocket = function () { - // Get the socket & request paths from the URL - var unixParts = this.uri.path.split(':') - , host = unixParts[0] - , path = unixParts[1] - // Apply unix properties to request - this.socketPath = host - this.uri.pathname = path - this.uri.path = path - this.uri.host = host - this.uri.hostname = host - this.uri.isUnix = true -} - - -Request.prototype.auth = function (user, pass, sendImmediately, bearer) { - var self = this - - self._auth.onRequest(user, pass, sendImmediately, bearer) - - return self -} -Request.prototype.aws = function (opts, now) { - var self = this - - if (!now) { - self._aws = opts - return self - } - - if (opts.sign_version == 4 || opts.sign_version == '4') { - // use aws4 - var options = { - host: self.uri.host, - path: self.uri.path, - method: self.method, - headers: { - 'content-type': self.getHeader('content-type') || '' - }, - body: self.body - } - var signRes = aws4.sign(options, { - accessKeyId: opts.key, - secretAccessKey: opts.secret - }) - self.setHeader('authorization', signRes.headers.Authorization) - self.setHeader('x-amz-date', signRes.headers['X-Amz-Date']) - } - else { - // default: use aws-sign2 - var date = new Date() - self.setHeader('date', date.toUTCString()) - var auth = - { key: opts.key - , secret: opts.secret - , verb: self.method.toUpperCase() - , date: date - , contentType: self.getHeader('content-type') || '' - , md5: self.getHeader('content-md5') || '' - , amazonHeaders: aws2.canonicalizeHeaders(self.headers) - } - var path = self.uri.path - if (opts.bucket && path) { - auth.resource = '/' + opts.bucket + path - } else if (opts.bucket && !path) { - auth.resource = '/' + opts.bucket - } else if (!opts.bucket && path) { - auth.resource = path - } else if (!opts.bucket && !path) { - auth.resource = '/' - } - auth.resource = aws2.canonicalizeResource(auth.resource) - self.setHeader('authorization', aws2.authorization(auth)) - } - - return self -} -Request.prototype.httpSignature = function (opts) { - var self = this - httpSignature.signRequest({ - getHeader: function(header) { - return self.getHeader(header, self.headers) - }, - setHeader: function(header, value) { - self.setHeader(header, value) - }, - method: self.method, - path: self.path - }, opts) - debug('httpSignature authorization', self.getHeader('authorization')) - - return self -} -Request.prototype.hawk = function (opts) { - var self = this - self.setHeader('Authorization', hawk.client.header(self.uri, self.method, opts).field) -} -Request.prototype.oauth = function (_oauth) { - var self = this - - self._oauth.onRequest(_oauth) - - return self -} - -Request.prototype.jar = function (jar) { - var self = this - var cookies - - if (self._redirect.redirectsFollowed === 0) { - self.originalCookieHeader = self.getHeader('cookie') - } - - if (!jar) { - // disable cookies - cookies = false - self._disableCookies = true - } else { - var targetCookieJar = (jar && jar.getCookieString) ? jar : globalCookieJar - var urihref = self.uri.href - //fetch cookie in the Specified host - if (targetCookieJar) { - cookies = targetCookieJar.getCookieString(urihref) - } - } - - //if need cookie and cookie is not empty - if (cookies && cookies.length) { - if (self.originalCookieHeader) { - // Don't overwrite existing Cookie header - self.setHeader('cookie', self.originalCookieHeader + '; ' + cookies) - } else { - self.setHeader('cookie', cookies) - } - } - self._jar = jar - return self -} - - -// Stream API -Request.prototype.pipe = function (dest, opts) { - var self = this - - if (self.response) { - if (self._destdata) { - self.emit('error', new Error('You cannot pipe after data has been emitted from the response.')) - } else if (self._ended) { - self.emit('error', new Error('You cannot pipe after the response has been ended.')) - } else { - stream.Stream.prototype.pipe.call(self, dest, opts) - self.pipeDest(dest) - return dest - } - } else { - self.dests.push(dest) - stream.Stream.prototype.pipe.call(self, dest, opts) - return dest - } -} -Request.prototype.write = function () { - var self = this - if (self._aborted) {return} - - if (!self._started) { - self.start() - } - if (self.req) { - return self.req.write.apply(self.req, arguments) - } -} -Request.prototype.end = function (chunk) { - var self = this - if (self._aborted) {return} - - if (chunk) { - self.write(chunk) - } - if (!self._started) { - self.start() - } - if (self.req) { - self.req.end() - } -} -Request.prototype.pause = function () { - var self = this - if (!self.responseContent) { - self._paused = true - } else { - self.responseContent.pause.apply(self.responseContent, arguments) - } -} -Request.prototype.resume = function () { - var self = this - if (!self.responseContent) { - self._paused = false - } else { - self.responseContent.resume.apply(self.responseContent, arguments) - } -} -Request.prototype.destroy = function () { - var self = this - if (!self._ended) { - self.end() - } else if (self.response) { - self.response.destroy() - } -} - -Request.defaultProxyHeaderWhiteList = - Tunnel.defaultProxyHeaderWhiteList.slice() - -Request.defaultProxyHeaderExclusiveList = - Tunnel.defaultProxyHeaderExclusiveList.slice() - -// Exports - -Request.prototype.toJSON = requestToJSON -module.exports = Request diff --git a/node_modules/node-base64-image/package.json b/node_modules/node-base64-image/package.json deleted file mode 100644 index 69494ee..0000000 --- a/node_modules/node-base64-image/package.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "name": "node-base64-image", - "version": "0.1.2", - "description": "Download images from remote URLs and encode/decode them to base64", - "main": "index.js", - "scripts": { - "test": "mocha test/tests.js" - }, - "engines": { - "node": ">=0.10" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/riyadhalnur/node-base64-image.git" - }, - "homepage": "http://riyadhalnur.github.io/node-base64-image/", - "keywords": [ - "image", - "download", - "base64", - "encode", - "decode", - "javascript", - "node" - ], - "bugs": { - "url": "https://github.com/riyadhalnur/node-base64-image/issuess" - }, - "author": { - "name": "Riyadh Al Nur", - "email": "riyadhalnur@verticalaxisbd.com", - "url": "http://blog.verticalaxisbd.com" - }, - "license": "MIT", - "dependencies": { - "request": "^2.51.x" - }, - "devDependencies": { - "mocha": "^2.0.x", - "should": "^4.3.x" - }, - "gitHead": "0c204e65686be9a9947d4da4aa1f31e968b10dcc", - "_id": "node-base64-image@0.1.2", - "_shasum": "fb9e5c0c83a8291562fdfe9eddd8e9f5b4b2be40", - "_from": "node-base64-image@>=0.1.0 <0.2.0", - "_npmVersion": "2.14.15", - "_nodeVersion": "0.10.40", - "_npmUser": { - "name": "riyadhalnur", - "email": "riyadhalnur@verticalaxisbd.com" - }, - "dist": { - "shasum": "fb9e5c0c83a8291562fdfe9eddd8e9f5b4b2be40", - "tarball": "https://registry.npmjs.org/node-base64-image/-/node-base64-image-0.1.2.tgz" - }, - "maintainers": [ - { - "name": "riyadhalnur", - "email": "riyadhalnur@verticalaxisbd.com" - } - ], - "_npmOperationalInternal": { - "host": "packages-9-west.internal.npmjs.com", - "tmp": "tmp/node-base64-image-0.1.2.tgz_1456557923352_0.22925470885820687" - }, - "deprecated": "More robust and includes more options. See package on NPM for more details.", - "directories": {}, - "_resolved": "https://registry.npmjs.org/node-base64-image/-/node-base64-image-0.1.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/node-base64-image/test/test.jpg b/node_modules/node-base64-image/test/test.jpg deleted file mode 100644 index fac43c0..0000000 Binary files a/node_modules/node-base64-image/test/test.jpg and /dev/null differ diff --git a/node_modules/node-base64-image/test/tests.js b/node_modules/node-base64-image/test/tests.js deleted file mode 100644 index d341890..0000000 --- a/node_modules/node-base64-image/test/tests.js +++ /dev/null @@ -1,129 +0,0 @@ -'use strict'; - -var should = require('should'); -var base64Image = require('../index'); - -describe('Image download and encode/decode to Base64', function () { - describe('Base64 Encoder', function () { - it('should throw an error if callback is not a function', function (done) { - var url, options, callback; - - var helperFunc = function () { - base64Image.base64encoder(url, options, callback); - }; - - helperFunc.should.throw(Error); - helperFunc.should.throw('Callback needs to be a function!'); - - done(); - }); - - it('should throw an error if url is null or undefined', function (done) { - var url = undefined, options; - - var helperFunc = function () { - base64Image.base64encoder(url, options, function (err, image) { - err.should.exist; - image.should.not.exist; - }); - }; - - helperFunc.should.throw(Error); - helperFunc.should.throw('URL cannot be empty!'); - - done(); - }); - - it('should report if image could not be loaded', function (done) { - var url = 'http://www.pctools.com/security-news/wp-content/uploads/2011/09/nonExisting404.jpg', options; - - base64Image.base64encoder(url, options, function (err, image) { - err.should.exist; - should.not.exist(image); - - done(); - }); - - }); - - it('should download an image and return base64 encoded Buffer', function (done) { - this.timeout(15000); - - var url = 'http://www.pctools.com/security-news/wp-content/uploads/2011/09/code.jpg', options = {}; - - base64Image.base64encoder(url, options, function (err, image) { - should.not.exist(err); - - image.should.exist; - image.should.be.an.instanceOf(Buffer); - - done(); - }); - }); - - - it('should download an image and return base64 encoded string', function (done) { - this.timeout(15000); - - var url = 'http://www.pctools.com/security-news/wp-content/uploads/2011/09/code.jpg', options = {string: true}; - - base64Image.base64encoder(url, options, function (err, image) { - should.not.exist(err); - - image.should.exist; - image.should.match(/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/); - - done(); - }); - }); - - it('should use a local image and return base64 encoded Buffer', function (done) { - this.timeout(15000); - - var path = __dirname + '/test.jpg', - options = {localFile: true}; - - base64Image.base64encoder(path, options, function (err, image) { - should.not.exist(err); - - image.should.exist; - image.should.be.an.instanceOf(Buffer); - - done(); - }); - }); - - it('should use a local image and return base64 encoded string', function (done) { - this.timeout(15000); - - var path = __dirname + '/test.jpg', - options = {localFile: true, string: true}; - - base64Image.base64encoder(path, options, function (err, image) { - should.not.exist(err); - - image.should.exist; - image.should.match(/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/); - - done(); - }); - }); - - }); - - describe('Base64 Decoder', function () { - it('should decode a base64 image and save to disk', function (done) { - var options = {filename: 'test'}; - var imageData = new Buffer('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', 'base64'); - - base64Image.base64decoder(imageData, options, function (err, saved) { - should.not.exist(err); - - saved.should.exist; - saved.should.equal('Image saved successfully to disk!'); - - done(); - }); - }); - }); -}); \ No newline at end of file diff --git a/node_modules/node-mendix-modeler-path/.npmignore b/node_modules/node-mendix-modeler-path/.npmignore deleted file mode 100644 index 1b6e223..0000000 --- a/node_modules/node-mendix-modeler-path/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules/ -*DS_Store* \ No newline at end of file diff --git a/node_modules/node-mendix-modeler-path/LICENSE b/node_modules/node-mendix-modeler-path/LICENSE deleted file mode 100644 index 5c304d1..0000000 --- a/node_modules/node-mendix-modeler-path/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/node_modules/node-mendix-modeler-path/README.md b/node_modules/node-mendix-modeler-path/README.md deleted file mode 100644 index 7586d75..0000000 --- a/node_modules/node-mendix-modeler-path/README.md +++ /dev/null @@ -1,7 +0,0 @@ -## About - -This is a small module that will check where the Mendix Modeler is located on the system. This is currently used for the Grunt file that is located in the Yeoman Mendix Generator. This module is not published on the NPM registry but directly embedded in another package. - -## License - -Apache 2 \ No newline at end of file diff --git a/node_modules/node-mendix-modeler-path/index.js b/node_modules/node-mendix-modeler-path/index.js deleted file mode 100644 index 7544a9e..0000000 --- a/node_modules/node-mendix-modeler-path/index.js +++ /dev/null @@ -1,77 +0,0 @@ -var shell = require('shelljs'), - os = require('os'); - -var exe = { - err: null, - output: null -}; - -function getShellOutput (cmd, replace) { - var output = shell.exec(cmd, {silent:true}).output.trim(); - return replace ? output.replace(/[\n\r]/g,'') : output; -} - -function getFtypeArguments (line) { - var ftypeRegEx = /(["'])(?:(?=(\\?))\2.)*?\1/g; - var regExMatch = line.match(ftypeRegEx); - if (regExMatch.length === 2) { - // Found cmd + input arg - return { - cmd : regExMatch[0].replace(/\"/g,''), - arg : regExMatch[1].replace(/\"/g,'').replace('%1','{path}') - }; - } else { - return null; - } -} - -function findModeler () { - var findGeneric = true, - assoc = getShellOutput('assoc .mpr', true); - // Find association - - if (assoc.indexOf('not found') !== -1) { - exe.err = 'No file association found for .mpr, are you sure you installed Mendix?'; - } else if (assoc.indexOf('.mpr=') === 0) { - // Found association, getting the Version Selector - var association = assoc.split('=')[1], - ftype = getShellOutput('ftype', false).split('\n').filter(function (line) { - return line.indexOf(association) !== -1; - }); - - if (ftype.length === 1) { - // ftype found, getting arguments - var ftypeArgs = getFtypeArguments(ftype[0]); - if (ftypeArgs !== null) { - exe.output = ftypeArgs; - findGeneric = false; - } - } - } else { - exe.err = 'Unknown error, cannot find the association for .MPR (Mendix Project) files. Are you on Windows?'; - findGeneric = false; - } - - if (findGeneric) { - var ftypeMendix = getShellOutput('ftype mendix', true); - if (ftypeMendix.indexOf('not found') !== -1) { - exe.err = 'No file association found for .mpr, are you sure you installed Mendix?'; - } else { - // ftype found, getting arguments - var ftypeArgs = getFtypeArguments(ftypeMendix); - if (ftypeArgs !== null) { - exe.output = ftypeArgs; - } else { - exe.err = 'No file association found for .mpr, are you sure you installed Mendix?'; - } - } - } -} - -if (os.platform() !== 'win32') { - exe.err = 'Unfortunately this feature only works in Windows...'; -} else { - findModeler(); -} - -module.exports = exe; \ No newline at end of file diff --git a/node_modules/node-mendix-modeler-path/node_modules/.bin/shjs b/node_modules/node-mendix-modeler-path/node_modules/.bin/shjs deleted file mode 100644 index 1d45691..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/.bin/shjs +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*) basedir=`cygpath -w "$basedir"`;; -esac - -if [ -x "$basedir/node" ]; then - "$basedir/node" "$basedir/../shelljs/bin/shjs" "$@" - ret=$? -else - node "$basedir/../shelljs/bin/shjs" "$@" - ret=$? -fi -exit $ret diff --git a/node_modules/node-mendix-modeler-path/node_modules/.bin/shjs.cmd b/node_modules/node-mendix-modeler-path/node_modules/.bin/shjs.cmd deleted file mode 100644 index 3d98b0b..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/.bin/shjs.cmd +++ /dev/null @@ -1,7 +0,0 @@ -@IF EXIST "%~dp0\node.exe" ( - "%~dp0\node.exe" "%~dp0\..\shelljs\bin\shjs" %* -) ELSE ( - @SETLOCAL - @SET PATHEXT=%PATHEXT:;.JS;=;% - node "%~dp0\..\shelljs\bin\shjs" %* -) \ No newline at end of file diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/.documentup.json b/node_modules/node-mendix-modeler-path/node_modules/shelljs/.documentup.json deleted file mode 100644 index 57fe301..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/.documentup.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "ShellJS", - "twitter": [ - "r2r" - ] -} diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/.jshintrc b/node_modules/node-mendix-modeler-path/node_modules/shelljs/.jshintrc deleted file mode 100644 index a80c559..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/.jshintrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "loopfunc": true, - "sub": true, - "undef": true, - "unused": true, - "node": true -} \ No newline at end of file diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/.npmignore b/node_modules/node-mendix-modeler-path/node_modules/shelljs/.npmignore deleted file mode 100644 index 6b20c38..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -test/ -tmp/ \ No newline at end of file diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/.travis.yml b/node_modules/node-mendix-modeler-path/node_modules/shelljs/.travis.yml deleted file mode 100644 index 1b3280a..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: node_js -node_js: - - "0.10" - - "0.11" - - "0.12" - diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/LICENSE b/node_modules/node-mendix-modeler-path/node_modules/shelljs/LICENSE deleted file mode 100644 index 1b35ee9..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/LICENSE +++ /dev/null @@ -1,26 +0,0 @@ -Copyright (c) 2012, Artur Adib -All rights reserved. - -You may use this project under the terms of the New BSD license as follows: - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Artur Adib nor the - names of the 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 ARTUR ADIB BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/README.md b/node_modules/node-mendix-modeler-path/node_modules/shelljs/README.md deleted file mode 100644 index d08d13e..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/README.md +++ /dev/null @@ -1,579 +0,0 @@ -# ShellJS - Unix shell commands for Node.js [![Build Status](https://secure.travis-ci.org/arturadib/shelljs.png)](http://travis-ci.org/arturadib/shelljs) - -ShellJS is a portable **(Windows/Linux/OS X)** implementation of Unix shell commands on top of the Node.js API. You can use it to eliminate your shell script's dependency on Unix while still keeping its familiar and powerful commands. You can also install it globally so you can run it from outside Node projects - say goodbye to those gnarly Bash scripts! - -The project is [unit-tested](http://travis-ci.org/arturadib/shelljs) and battled-tested in projects like: - -+ [PDF.js](http://github.com/mozilla/pdf.js) - Firefox's next-gen PDF reader -+ [Firebug](http://getfirebug.com/) - Firefox's infamous debugger -+ [JSHint](http://jshint.com) - Most popular JavaScript linter -+ [Zepto](http://zeptojs.com) - jQuery-compatible JavaScript library for modern browsers -+ [Yeoman](http://yeoman.io/) - Web application stack and development tool -+ [Deployd.com](http://deployd.com) - Open source PaaS for quick API backend generation - -and [many more](https://npmjs.org/browse/depended/shelljs). - -Connect with [@r2r](http://twitter.com/r2r) on Twitter for questions, suggestions, etc. - -## Installing - -Via npm: - -```bash -$ npm install [-g] shelljs -``` - -If the global option `-g` is specified, the binary `shjs` will be installed. This makes it possible to -run ShellJS scripts much like any shell script from the command line, i.e. without requiring a `node_modules` folder: - -```bash -$ shjs my_script -``` - -You can also just copy `shell.js` into your project's directory, and `require()` accordingly. - - -## Examples - -### JavaScript - -```javascript -require('shelljs/global'); - -if (!which('git')) { - echo('Sorry, this script requires git'); - exit(1); -} - -// Copy files to release dir -mkdir('-p', 'out/Release'); -cp('-R', 'stuff/*', 'out/Release'); - -// Replace macros in each .js file -cd('lib'); -ls('*.js').forEach(function(file) { - sed('-i', 'BUILD_VERSION', 'v0.1.2', file); - sed('-i', /.*REMOVE_THIS_LINE.*\n/, '', file); - sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat('macro.js'), file); -}); -cd('..'); - -// Run external tool synchronously -if (exec('git commit -am "Auto-commit"').code !== 0) { - echo('Error: Git commit failed'); - exit(1); -} -``` - -### CoffeeScript - -```coffeescript -require 'shelljs/global' - -if not which 'git' - echo 'Sorry, this script requires git' - exit 1 - -# Copy files to release dir -mkdir '-p', 'out/Release' -cp '-R', 'stuff/*', 'out/Release' - -# Replace macros in each .js file -cd 'lib' -for file in ls '*.js' - sed '-i', 'BUILD_VERSION', 'v0.1.2', file - sed '-i', /.*REMOVE_THIS_LINE.*\n/, '', file - sed '-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat 'macro.js', file -cd '..' - -# Run external tool synchronously -if (exec 'git commit -am "Auto-commit"').code != 0 - echo 'Error: Git commit failed' - exit 1 -``` - -## Global vs. Local - -The example above uses the convenience script `shelljs/global` to reduce verbosity. If polluting your global namespace is not desirable, simply require `shelljs`. - -Example: - -```javascript -var shell = require('shelljs'); -shell.echo('hello world'); -``` - -## Make tool - -A convenience script `shelljs/make` is also provided to mimic the behavior of a Unix Makefile. In this case all shell objects are global, and command line arguments will cause the script to execute only the corresponding function in the global `target` object. To avoid redundant calls, target functions are executed only once per script. - -Example (CoffeeScript): - -```coffeescript -require 'shelljs/make' - -target.all = -> - target.bundle() - target.docs() - -target.bundle = -> - cd __dirname - mkdir 'build' - cd 'lib' - (cat '*.js').to '../build/output.js' - -target.docs = -> - cd __dirname - mkdir 'docs' - cd 'lib' - for file in ls '*.js' - text = grep '//@', file # extract special comments - text.replace '//@', '' # remove comment tags - text.to 'docs/my_docs.md' -``` - -To run the target `all`, call the above script without arguments: `$ node make`. To run the target `docs`: `$ node make docs`. - -You can also pass arguments to your targets by using the `--` separator. For example, to pass `arg1` and `arg2` to a target `bundle`, do `$ node make bundle -- arg1 arg2`: - -```javascript -require('shelljs/make'); - -target.bundle = function(argsArray) { - // argsArray = ['arg1', 'arg2'] - /* ... */ -} -``` - - - - - -## Command reference - - -All commands run synchronously, unless otherwise stated. - - -### cd('dir') -Changes to directory `dir` for the duration of the script - - -### pwd() -Returns the current directory. - - -### ls([options ,] path [,path ...]) -### ls([options ,] path_array) -Available options: - -+ `-R`: recursive -+ `-A`: all files (include files beginning with `.`, except for `.` and `..`) - -Examples: - -```javascript -ls('projs/*.js'); -ls('-R', '/users/me', '/tmp'); -ls('-R', ['/users/me', '/tmp']); // same as above -``` - -Returns array of files in the given path, or in current directory if no path provided. - - -### find(path [,path ...]) -### find(path_array) -Examples: - -```javascript -find('src', 'lib'); -find(['src', 'lib']); // same as above -find('.').filter(function(file) { return file.match(/\.js$/); }); -``` - -Returns array of all files (however deep) in the given paths. - -The main difference from `ls('-R', path)` is that the resulting file names -include the base directories, e.g. `lib/resources/file1` instead of just `file1`. - - -### cp([options ,] source [,source ...], dest) -### cp([options ,] source_array, dest) -Available options: - -+ `-f`: force -+ `-r, -R`: recursive - -Examples: - -```javascript -cp('file1', 'dir1'); -cp('-Rf', '/tmp/*', '/usr/local/*', '/home/tmp'); -cp('-Rf', ['/tmp/*', '/usr/local/*'], '/home/tmp'); // same as above -``` - -Copies files. The wildcard `*` is accepted. - - -### rm([options ,] file [, file ...]) -### rm([options ,] file_array) -Available options: - -+ `-f`: force -+ `-r, -R`: recursive - -Examples: - -```javascript -rm('-rf', '/tmp/*'); -rm('some_file.txt', 'another_file.txt'); -rm(['some_file.txt', 'another_file.txt']); // same as above -``` - -Removes files. The wildcard `*` is accepted. - - -### mv(source [, source ...], dest') -### mv(source_array, dest') -Available options: - -+ `f`: force - -Examples: - -```javascript -mv('-f', 'file', 'dir/'); -mv('file1', 'file2', 'dir/'); -mv(['file1', 'file2'], 'dir/'); // same as above -``` - -Moves files. The wildcard `*` is accepted. - - -### mkdir([options ,] dir [, dir ...]) -### mkdir([options ,] dir_array) -Available options: - -+ `p`: full path (will create intermediate dirs if necessary) - -Examples: - -```javascript -mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g'); -mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above -``` - -Creates directories. - - -### test(expression) -Available expression primaries: - -+ `'-b', 'path'`: true if path is a block device -+ `'-c', 'path'`: true if path is a character device -+ `'-d', 'path'`: true if path is a directory -+ `'-e', 'path'`: true if path exists -+ `'-f', 'path'`: true if path is a regular file -+ `'-L', 'path'`: true if path is a symbolic link -+ `'-p', 'path'`: true if path is a pipe (FIFO) -+ `'-S', 'path'`: true if path is a socket - -Examples: - -```javascript -if (test('-d', path)) { /* do something with dir */ }; -if (!test('-f', path)) continue; // skip if it's a regular file -``` - -Evaluates expression using the available primaries and returns corresponding value. - - -### cat(file [, file ...]) -### cat(file_array) - -Examples: - -```javascript -var str = cat('file*.txt'); -var str = cat('file1', 'file2'); -var str = cat(['file1', 'file2']); // same as above -``` - -Returns a string containing the given file, or a concatenated string -containing the files if more than one file is given (a new line character is -introduced between each file). Wildcard `*` accepted. - - -### 'string'.to(file) - -Examples: - -```javascript -cat('input.txt').to('output.txt'); -``` - -Analogous to the redirection operator `>` in Unix, but works with JavaScript strings (such as -those returned by `cat`, `grep`, etc). _Like Unix redirections, `to()` will overwrite any existing file!_ - - -### 'string'.toEnd(file) - -Examples: - -```javascript -cat('input.txt').toEnd('output.txt'); -``` - -Analogous to the redirect-and-append operator `>>` in Unix, but works with JavaScript strings (such as -those returned by `cat`, `grep`, etc). - - -### sed([options ,] search_regex, replacement, file) -Available options: - -+ `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_ - -Examples: - -```javascript -sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js'); -sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js'); -``` - -Reads an input string from `file` and performs a JavaScript `replace()` on the input -using the given search regex and replacement string or function. Returns the new string after replacement. - - -### grep([options ,] regex_filter, file [, file ...]) -### grep([options ,] regex_filter, file_array) -Available options: - -+ `-v`: Inverse the sense of the regex and print the lines not matching the criteria. - -Examples: - -```javascript -grep('-v', 'GLOBAL_VARIABLE', '*.js'); -grep('GLOBAL_VARIABLE', '*.js'); -``` - -Reads input string from given files and returns a string containing all lines of the -file that match the given `regex_filter`. Wildcard `*` accepted. - - -### which(command) - -Examples: - -```javascript -var nodeExec = which('node'); -``` - -Searches for `command` in the system's PATH. On Windows looks for `.exe`, `.cmd`, and `.bat` extensions. -Returns string containing the absolute path to the command. - - -### echo(string [,string ...]) - -Examples: - -```javascript -echo('hello world'); -var str = echo('hello world'); -``` - -Prints string to stdout, and returns string with additional utility methods -like `.to()`. - - -### pushd([options,] [dir | '-N' | '+N']) - -Available options: - -+ `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated. - -Arguments: - -+ `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`. -+ `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. -+ `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. - -Examples: - -```javascript -// process.cwd() === '/usr' -pushd('/etc'); // Returns /etc /usr -pushd('+1'); // Returns /usr /etc -``` - -Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack. - -### popd([options,] ['-N' | '+N']) - -Available options: - -+ `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated. - -Arguments: - -+ `+N`: Removes the Nth directory (counting from the left of the list printed by dirs), starting with zero. -+ `-N`: Removes the Nth directory (counting from the right of the list printed by dirs), starting with zero. - -Examples: - -```javascript -echo(process.cwd()); // '/usr' -pushd('/etc'); // '/etc /usr' -echo(process.cwd()); // '/etc' -popd(); // '/usr' -echo(process.cwd()); // '/usr' -``` - -When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack. - -### dirs([options | '+N' | '-N']) - -Available options: - -+ `-c`: Clears the directory stack by deleting all of the elements. - -Arguments: - -+ `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero. -+ `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero. - -Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified. - -See also: pushd, popd - - -### ln(options, source, dest) -### ln(source, dest) -Available options: - -+ `s`: symlink -+ `f`: force - -Examples: - -```javascript -ln('file', 'newlink'); -ln('-sf', 'file', 'existing'); -``` - -Links source to dest. Use -f to force the link, should dest already exist. - - -### exit(code) -Exits the current process with the given exit code. - -### env['VAR_NAME'] -Object containing environment variables (both getter and setter). Shortcut to process.env. - -### exec(command [, options] [, callback]) -Available options (all `false` by default): - -+ `async`: Asynchronous execution. Defaults to true if a callback is provided. -+ `silent`: Do not echo program output to console. - -Examples: - -```javascript -var version = exec('node --version', {silent:true}).output; - -var child = exec('some_long_running_process', {async:true}); -child.stdout.on('data', function(data) { - /* ... do something with data ... */ -}); - -exec('some_long_running_process', function(code, output) { - console.log('Exit code:', code); - console.log('Program output:', output); -}); -``` - -Executes the given `command` _synchronously_, unless otherwise specified. -When in synchronous mode returns the object `{ code:..., output:... }`, containing the program's -`output` (stdout + stderr) and its exit `code`. Otherwise returns the child process object, and -the `callback` gets the arguments `(code, output)`. - -**Note:** For long-lived processes, it's best to run `exec()` asynchronously as -the current synchronous implementation uses a lot of CPU. This should be getting -fixed soon. - - -### chmod(octal_mode || octal_string, file) -### chmod(symbolic_mode, file) - -Available options: - -+ `-v`: output a diagnostic for every file processed -+ `-c`: like verbose but report only when a change is made -+ `-R`: change files and directories recursively - -Examples: - -```javascript -chmod(755, '/Users/brandon'); -chmod('755', '/Users/brandon'); // same as above -chmod('u+x', '/Users/brandon'); -``` - -Alters the permissions of a file or directory by either specifying the -absolute permissions in octal form or expressing the changes in symbols. -This command tries to mimic the POSIX behavior as much as possible. -Notable exceptions: - -+ In symbolic modes, 'a-r' and '-r' are identical. No consideration is - given to the umask. -+ There is no "quiet" option since default behavior is to run silent. - - -## Non-Unix commands - - -### tempdir() - -Examples: - -```javascript -var tmp = tempdir(); // "/tmp" for most *nix platforms -``` - -Searches and returns string containing a writeable, platform-dependent temporary directory. -Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir). - - -### error() -Tests if error occurred in the last command. Returns `null` if no error occurred, -otherwise returns string explaining the error - - -## Configuration - - -### config.silent -Example: - -```javascript -var sh = require('shelljs'); -var silentState = sh.config.silent; // save old silent state -sh.config.silent = true; -/* ... */ -sh.config.silent = silentState; // restore old silent state -``` - -Suppresses all command output if `true`, except for `echo()` calls. -Default is `false`. - -### config.fatal -Example: - -```javascript -require('shelljs/global'); -config.fatal = true; -cp('this_file_does_not_exist', '/dev/null'); // dies here -/* more commands... */ -``` - -If `true` the script will die on errors. Default is `false`. diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/RELEASE.md b/node_modules/node-mendix-modeler-path/node_modules/shelljs/RELEASE.md deleted file mode 100644 index 69ef3fb..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/RELEASE.md +++ /dev/null @@ -1,9 +0,0 @@ -# Release steps - -* Ensure master passes CI tests -* Bump version in package.json. Any breaking change or new feature should bump minor (or even major). Non-breaking changes or fixes can just bump patch. -* Update README manually if the changes are not documented in-code. If so, run `scripts/generate-docs.js` -* Commit -* `$ git tag ` (see `git tag -l` for latest) -* `$ git push origin master --tags` -* `$ npm publish .` diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/bin/shjs b/node_modules/node-mendix-modeler-path/node_modules/shelljs/bin/shjs deleted file mode 100644 index d239a7a..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/bin/shjs +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env node -require('../global'); - -if (process.argv.length < 3) { - console.log('ShellJS: missing argument (script name)'); - console.log(); - process.exit(1); -} - -var args, - scriptName = process.argv[2]; -env['NODE_PATH'] = __dirname + '/../..'; - -if (!scriptName.match(/\.js/) && !scriptName.match(/\.coffee/)) { - if (test('-f', scriptName + '.js')) - scriptName += '.js'; - if (test('-f', scriptName + '.coffee')) - scriptName += '.coffee'; -} - -if (!test('-f', scriptName)) { - console.log('ShellJS: script not found ('+scriptName+')'); - console.log(); - process.exit(1); -} - -args = process.argv.slice(3); - -for (var i = 0, l = args.length; i < l; i++) { - if (args[i][0] !== "-"){ - args[i] = '"' + args[i] + '"'; // fixes arguments with multiple words - } -} - -if (scriptName.match(/\.coffee$/)) { - // - // CoffeeScript - // - if (which('coffee')) { - exec('coffee ' + scriptName + ' ' + args.join(' '), { async: true }); - } else { - console.log('ShellJS: CoffeeScript interpreter not found'); - console.log(); - process.exit(1); - } -} else { - // - // JavaScript - // - exec('node ' + scriptName + ' ' + args.join(' '), { async: true }); -} diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/global.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/global.js deleted file mode 100644 index 97f0033..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/global.js +++ /dev/null @@ -1,3 +0,0 @@ -var shell = require('./shell.js'); -for (var cmd in shell) - global[cmd] = shell[cmd]; diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/make.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/make.js deleted file mode 100644 index f78b4cf..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/make.js +++ /dev/null @@ -1,56 +0,0 @@ -require('./global'); - -global.config.fatal = true; -global.target = {}; - -var args = process.argv.slice(2), - targetArgs, - dashesLoc = args.indexOf('--'); - -// split args, everything after -- if only for targets -if (dashesLoc > -1) { - targetArgs = args.slice(dashesLoc + 1, args.length); - args = args.slice(0, dashesLoc); -} - -// This ensures we only execute the script targets after the entire script has -// been evaluated -setTimeout(function() { - var t; - - if (args.length === 1 && args[0] === '--help') { - console.log('Available targets:'); - for (t in global.target) - console.log(' ' + t); - return; - } - - // Wrap targets to prevent duplicate execution - for (t in global.target) { - (function(t, oldTarget){ - - // Wrap it - global.target[t] = function() { - if (oldTarget.done) - return; - oldTarget.done = true; - return oldTarget.apply(oldTarget, arguments); - }; - - })(t, global.target[t]); - } - - // Execute desired targets - if (args.length > 0) { - args.forEach(function(arg) { - if (arg in global.target) - global.target[arg](targetArgs); - else { - console.log('no such target: ' + arg); - } - }); - } else if ('all' in global.target) { - global.target.all(targetArgs); - } - -}, 0); diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/package.json b/node_modules/node-mendix-modeler-path/node_modules/shelljs/package.json deleted file mode 100644 index eaa3c66..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/package.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "name": "shelljs", - "version": "0.5.3", - "author": { - "name": "Artur Adib", - "email": "arturadib@gmail.com" - }, - "description": "Portable Unix shell commands for Node.js", - "keywords": [ - "unix", - "shell", - "makefile", - "make", - "jake", - "synchronous" - ], - "repository": { - "type": "git", - "url": "git://github.com/arturadib/shelljs.git" - }, - "license": "BSD*", - "homepage": "http://github.com/arturadib/shelljs", - "main": "./shell.js", - "scripts": { - "test": "node scripts/run-tests" - }, - "bin": { - "shjs": "./bin/shjs" - }, - "dependencies": {}, - "devDependencies": { - "jshint": "~2.1.11" - }, - "optionalDependencies": {}, - "engines": { - "node": ">=0.8.0" - }, - "gitHead": "22d0975040b9b8234755dc6e692d6869436e8485", - "bugs": { - "url": "https://github.com/arturadib/shelljs/issues" - }, - "_id": "shelljs@0.5.3", - "_shasum": "c54982b996c76ef0c1e6b59fbdc5825f5b713113", - "_from": "shelljs@>=0.5.3 <0.6.0", - "_npmVersion": "2.5.1", - "_nodeVersion": "1.2.0", - "_npmUser": { - "name": "artur", - "email": "arturadib@gmail.com" - }, - "maintainers": [ - { - "name": "artur", - "email": "arturadib@gmail.com" - } - ], - "dist": { - "shasum": "c54982b996c76ef0c1e6b59fbdc5825f5b713113", - "tarball": "https://registry.npmjs.org/shelljs/-/shelljs-0.5.3.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.5.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/scripts/generate-docs.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/scripts/generate-docs.js deleted file mode 100644 index 532fed9..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/scripts/generate-docs.js +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env node -require('../global'); - -echo('Appending docs to README.md'); - -cd(__dirname + '/..'); - -// Extract docs from shell.js -var docs = grep('//@', 'shell.js'); - -docs = docs.replace(/\/\/\@include (.+)/g, function(match, path) { - var file = path.match('.js$') ? path : path+'.js'; - return grep('//@', file); -}); - -// Remove '//@' -docs = docs.replace(/\/\/\@ ?/g, ''); -// Append docs to README -sed('-i', /## Command reference(.|\n)*/, '## Command reference\n\n' + docs, 'README.md'); - -echo('All done.'); diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/scripts/run-tests.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/scripts/run-tests.js deleted file mode 100644 index f9d31e0..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/scripts/run-tests.js +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env node -require('../global'); - -var path = require('path'); - -var failed = false; - -// -// Lint -// -JSHINT_BIN = './node_modules/jshint/bin/jshint'; -cd(__dirname + '/..'); - -if (!test('-f', JSHINT_BIN)) { - echo('JSHint not found. Run `npm install` in the root dir first.'); - exit(1); -} - -if (exec(JSHINT_BIN + ' *.js test/*.js').code !== 0) { - failed = true; - echo('*** JSHINT FAILED! (return code != 0)'); - echo(); -} else { - echo('All JSHint tests passed'); - echo(); -} - -// -// Unit tests -// -cd(__dirname + '/../test'); -ls('*.js').forEach(function(file) { - echo('Running test:', file); - if (exec('node ' + file).code !== 123) { // 123 avoids false positives (e.g. premature exit) - failed = true; - echo('*** TEST FAILED! (missing exit code "123")'); - echo(); - } -}); - -if (failed) { - echo(); - echo('*******************************************************'); - echo('WARNING: Some tests did not pass!'); - echo('*******************************************************'); - exit(1); -} else { - echo(); - echo('All tests passed.'); -} diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/shell.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/shell.js deleted file mode 100644 index bdeb559..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/shell.js +++ /dev/null @@ -1,159 +0,0 @@ -// -// ShellJS -// Unix shell commands on top of Node's API -// -// Copyright (c) 2012 Artur Adib -// http://github.com/arturadib/shelljs -// - -var common = require('./src/common'); - - -//@ -//@ All commands run synchronously, unless otherwise stated. -//@ - -//@include ./src/cd -var _cd = require('./src/cd'); -exports.cd = common.wrap('cd', _cd); - -//@include ./src/pwd -var _pwd = require('./src/pwd'); -exports.pwd = common.wrap('pwd', _pwd); - -//@include ./src/ls -var _ls = require('./src/ls'); -exports.ls = common.wrap('ls', _ls); - -//@include ./src/find -var _find = require('./src/find'); -exports.find = common.wrap('find', _find); - -//@include ./src/cp -var _cp = require('./src/cp'); -exports.cp = common.wrap('cp', _cp); - -//@include ./src/rm -var _rm = require('./src/rm'); -exports.rm = common.wrap('rm', _rm); - -//@include ./src/mv -var _mv = require('./src/mv'); -exports.mv = common.wrap('mv', _mv); - -//@include ./src/mkdir -var _mkdir = require('./src/mkdir'); -exports.mkdir = common.wrap('mkdir', _mkdir); - -//@include ./src/test -var _test = require('./src/test'); -exports.test = common.wrap('test', _test); - -//@include ./src/cat -var _cat = require('./src/cat'); -exports.cat = common.wrap('cat', _cat); - -//@include ./src/to -var _to = require('./src/to'); -String.prototype.to = common.wrap('to', _to); - -//@include ./src/toEnd -var _toEnd = require('./src/toEnd'); -String.prototype.toEnd = common.wrap('toEnd', _toEnd); - -//@include ./src/sed -var _sed = require('./src/sed'); -exports.sed = common.wrap('sed', _sed); - -//@include ./src/grep -var _grep = require('./src/grep'); -exports.grep = common.wrap('grep', _grep); - -//@include ./src/which -var _which = require('./src/which'); -exports.which = common.wrap('which', _which); - -//@include ./src/echo -var _echo = require('./src/echo'); -exports.echo = _echo; // don't common.wrap() as it could parse '-options' - -//@include ./src/dirs -var _dirs = require('./src/dirs').dirs; -exports.dirs = common.wrap("dirs", _dirs); -var _pushd = require('./src/dirs').pushd; -exports.pushd = common.wrap('pushd', _pushd); -var _popd = require('./src/dirs').popd; -exports.popd = common.wrap("popd", _popd); - -//@include ./src/ln -var _ln = require('./src/ln'); -exports.ln = common.wrap('ln', _ln); - -//@ -//@ ### exit(code) -//@ Exits the current process with the given exit code. -exports.exit = process.exit; - -//@ -//@ ### env['VAR_NAME'] -//@ Object containing environment variables (both getter and setter). Shortcut to process.env. -exports.env = process.env; - -//@include ./src/exec -var _exec = require('./src/exec'); -exports.exec = common.wrap('exec', _exec, {notUnix:true}); - -//@include ./src/chmod -var _chmod = require('./src/chmod'); -exports.chmod = common.wrap('chmod', _chmod); - - - -//@ -//@ ## Non-Unix commands -//@ - -//@include ./src/tempdir -var _tempDir = require('./src/tempdir'); -exports.tempdir = common.wrap('tempdir', _tempDir); - - -//@include ./src/error -var _error = require('./src/error'); -exports.error = _error; - - - -//@ -//@ ## Configuration -//@ - -exports.config = common.config; - -//@ -//@ ### config.silent -//@ Example: -//@ -//@ ```javascript -//@ var sh = require('shelljs'); -//@ var silentState = sh.config.silent; // save old silent state -//@ sh.config.silent = true; -//@ /* ... */ -//@ sh.config.silent = silentState; // restore old silent state -//@ ``` -//@ -//@ Suppresses all command output if `true`, except for `echo()` calls. -//@ Default is `false`. - -//@ -//@ ### config.fatal -//@ Example: -//@ -//@ ```javascript -//@ require('shelljs/global'); -//@ config.fatal = true; -//@ cp('this_file_does_not_exist', '/dev/null'); // dies here -//@ /* more commands... */ -//@ ``` -//@ -//@ If `true` the script will die on errors. Default is `false`. diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/cat.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/cat.js deleted file mode 100644 index f6f4d25..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/cat.js +++ /dev/null @@ -1,43 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); - -//@ -//@ ### cat(file [, file ...]) -//@ ### cat(file_array) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ var str = cat('file*.txt'); -//@ var str = cat('file1', 'file2'); -//@ var str = cat(['file1', 'file2']); // same as above -//@ ``` -//@ -//@ Returns a string containing the given file, or a concatenated string -//@ containing the files if more than one file is given (a new line character is -//@ introduced between each file). Wildcard `*` accepted. -function _cat(options, files) { - var cat = ''; - - if (!files) - common.error('no paths given'); - - if (typeof files === 'string') - files = [].slice.call(arguments, 1); - // if it's array leave it as it is - - files = common.expand(files); - - files.forEach(function(file) { - if (!fs.existsSync(file)) - common.error('no such file or directory: ' + file); - - cat += fs.readFileSync(file, 'utf8') + '\n'; - }); - - if (cat[cat.length-1] === '\n') - cat = cat.substring(0, cat.length-1); - - return common.ShellString(cat); -} -module.exports = _cat; diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/cd.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/cd.js deleted file mode 100644 index 230f432..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/cd.js +++ /dev/null @@ -1,19 +0,0 @@ -var fs = require('fs'); -var common = require('./common'); - -//@ -//@ ### cd('dir') -//@ Changes to directory `dir` for the duration of the script -function _cd(options, dir) { - if (!dir) - common.error('directory not specified'); - - if (!fs.existsSync(dir)) - common.error('no such file or directory: ' + dir); - - if (!fs.statSync(dir).isDirectory()) - common.error('not a directory: ' + dir); - - process.chdir(dir); -} -module.exports = _cd; diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/chmod.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/chmod.js deleted file mode 100644 index f288893..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/chmod.js +++ /dev/null @@ -1,208 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); -var path = require('path'); - -var PERMS = (function (base) { - return { - OTHER_EXEC : base.EXEC, - OTHER_WRITE : base.WRITE, - OTHER_READ : base.READ, - - GROUP_EXEC : base.EXEC << 3, - GROUP_WRITE : base.WRITE << 3, - GROUP_READ : base.READ << 3, - - OWNER_EXEC : base.EXEC << 6, - OWNER_WRITE : base.WRITE << 6, - OWNER_READ : base.READ << 6, - - // Literal octal numbers are apparently not allowed in "strict" javascript. Using parseInt is - // the preferred way, else a jshint warning is thrown. - STICKY : parseInt('01000', 8), - SETGID : parseInt('02000', 8), - SETUID : parseInt('04000', 8), - - TYPE_MASK : parseInt('0770000', 8) - }; -})({ - EXEC : 1, - WRITE : 2, - READ : 4 -}); - -//@ -//@ ### chmod(octal_mode || octal_string, file) -//@ ### chmod(symbolic_mode, file) -//@ -//@ Available options: -//@ -//@ + `-v`: output a diagnostic for every file processed//@ -//@ + `-c`: like verbose but report only when a change is made//@ -//@ + `-R`: change files and directories recursively//@ -//@ -//@ Examples: -//@ -//@ ```javascript -//@ chmod(755, '/Users/brandon'); -//@ chmod('755', '/Users/brandon'); // same as above -//@ chmod('u+x', '/Users/brandon'); -//@ ``` -//@ -//@ Alters the permissions of a file or directory by either specifying the -//@ absolute permissions in octal form or expressing the changes in symbols. -//@ This command tries to mimic the POSIX behavior as much as possible. -//@ Notable exceptions: -//@ -//@ + In symbolic modes, 'a-r' and '-r' are identical. No consideration is -//@ given to the umask. -//@ + There is no "quiet" option since default behavior is to run silent. -function _chmod(options, mode, filePattern) { - if (!filePattern) { - if (options.length > 0 && options.charAt(0) === '-') { - // Special case where the specified file permissions started with - to subtract perms, which - // get picked up by the option parser as command flags. - // If we are down by one argument and options starts with -, shift everything over. - filePattern = mode; - mode = options; - options = ''; - } - else { - common.error('You must specify a file.'); - } - } - - options = common.parseOptions(options, { - 'R': 'recursive', - 'c': 'changes', - 'v': 'verbose' - }); - - if (typeof filePattern === 'string') { - filePattern = [ filePattern ]; - } - - var files; - - if (options.recursive) { - files = []; - common.expand(filePattern).forEach(function addFile(expandedFile) { - var stat = fs.lstatSync(expandedFile); - - if (!stat.isSymbolicLink()) { - files.push(expandedFile); - - if (stat.isDirectory()) { // intentionally does not follow symlinks. - fs.readdirSync(expandedFile).forEach(function (child) { - addFile(expandedFile + '/' + child); - }); - } - } - }); - } - else { - files = common.expand(filePattern); - } - - files.forEach(function innerChmod(file) { - file = path.resolve(file); - if (!fs.existsSync(file)) { - common.error('File not found: ' + file); - } - - // When recursing, don't follow symlinks. - if (options.recursive && fs.lstatSync(file).isSymbolicLink()) { - return; - } - - var perms = fs.statSync(file).mode; - var type = perms & PERMS.TYPE_MASK; - - var newPerms = perms; - - if (isNaN(parseInt(mode, 8))) { - // parse options - mode.split(',').forEach(function (symbolicMode) { - /*jshint regexdash:true */ - var pattern = /([ugoa]*)([=\+-])([rwxXst]*)/i; - var matches = pattern.exec(symbolicMode); - - if (matches) { - var applyTo = matches[1]; - var operator = matches[2]; - var change = matches[3]; - - var changeOwner = applyTo.indexOf('u') != -1 || applyTo === 'a' || applyTo === ''; - var changeGroup = applyTo.indexOf('g') != -1 || applyTo === 'a' || applyTo === ''; - var changeOther = applyTo.indexOf('o') != -1 || applyTo === 'a' || applyTo === ''; - - var changeRead = change.indexOf('r') != -1; - var changeWrite = change.indexOf('w') != -1; - var changeExec = change.indexOf('x') != -1; - var changeSticky = change.indexOf('t') != -1; - var changeSetuid = change.indexOf('s') != -1; - - var mask = 0; - if (changeOwner) { - mask |= (changeRead ? PERMS.OWNER_READ : 0) + (changeWrite ? PERMS.OWNER_WRITE : 0) + (changeExec ? PERMS.OWNER_EXEC : 0) + (changeSetuid ? PERMS.SETUID : 0); - } - if (changeGroup) { - mask |= (changeRead ? PERMS.GROUP_READ : 0) + (changeWrite ? PERMS.GROUP_WRITE : 0) + (changeExec ? PERMS.GROUP_EXEC : 0) + (changeSetuid ? PERMS.SETGID : 0); - } - if (changeOther) { - mask |= (changeRead ? PERMS.OTHER_READ : 0) + (changeWrite ? PERMS.OTHER_WRITE : 0) + (changeExec ? PERMS.OTHER_EXEC : 0); - } - - // Sticky bit is special - it's not tied to user, group or other. - if (changeSticky) { - mask |= PERMS.STICKY; - } - - switch (operator) { - case '+': - newPerms |= mask; - break; - - case '-': - newPerms &= ~mask; - break; - - case '=': - newPerms = type + mask; - - // According to POSIX, when using = to explicitly set the permissions, setuid and setgid can never be cleared. - if (fs.statSync(file).isDirectory()) { - newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms; - } - break; - } - - if (options.verbose) { - log(file + ' -> ' + newPerms.toString(8)); - } - - if (perms != newPerms) { - if (!options.verbose && options.changes) { - log(file + ' -> ' + newPerms.toString(8)); - } - fs.chmodSync(file, newPerms); - } - } - else { - common.error('Invalid symbolic mode change: ' + symbolicMode); - } - }); - } - else { - // they gave us a full number - newPerms = type + parseInt(mode, 8); - - // POSIX rules are that setuid and setgid can only be added using numeric form, but not cleared. - if (fs.statSync(file).isDirectory()) { - newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms; - } - - fs.chmodSync(file, newPerms); - } - }); -} -module.exports = _chmod; diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/common.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/common.js deleted file mode 100644 index d8c2312..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/common.js +++ /dev/null @@ -1,203 +0,0 @@ -var os = require('os'); -var fs = require('fs'); -var _ls = require('./ls'); - -// Module globals -var config = { - silent: false, - fatal: false -}; -exports.config = config; - -var state = { - error: null, - currentCmd: 'shell.js', - tempDir: null -}; -exports.state = state; - -var platform = os.type().match(/^Win/) ? 'win' : 'unix'; -exports.platform = platform; - -function log() { - if (!config.silent) - console.log.apply(this, arguments); -} -exports.log = log; - -// Shows error message. Throws unless _continue or config.fatal are true -function error(msg, _continue) { - if (state.error === null) - state.error = ''; - state.error += state.currentCmd + ': ' + msg + '\n'; - - if (msg.length > 0) - log(state.error); - - if (config.fatal) - process.exit(1); - - if (!_continue) - throw ''; -} -exports.error = error; - -// In the future, when Proxies are default, we can add methods like `.to()` to primitive strings. -// For now, this is a dummy function to bookmark places we need such strings -function ShellString(str) { - return str; -} -exports.ShellString = ShellString; - -// Returns {'alice': true, 'bob': false} when passed a dictionary, e.g.: -// parseOptions('-a', {'a':'alice', 'b':'bob'}); -function parseOptions(str, map) { - if (!map) - error('parseOptions() internal error: no map given'); - - // All options are false by default - var options = {}; - for (var letter in map) - options[map[letter]] = false; - - if (!str) - return options; // defaults - - if (typeof str !== 'string') - error('parseOptions() internal error: wrong str'); - - // e.g. match[1] = 'Rf' for str = '-Rf' - var match = str.match(/^\-(.+)/); - if (!match) - return options; - - // e.g. chars = ['R', 'f'] - var chars = match[1].split(''); - - chars.forEach(function(c) { - if (c in map) - options[map[c]] = true; - else - error('option not recognized: '+c); - }); - - return options; -} -exports.parseOptions = parseOptions; - -// Expands wildcards with matching (ie. existing) file names. -// For example: -// expand(['file*.js']) = ['file1.js', 'file2.js', ...] -// (if the files 'file1.js', 'file2.js', etc, exist in the current dir) -function expand(list) { - var expanded = []; - list.forEach(function(listEl) { - // Wildcard present on directory names ? - if(listEl.search(/\*[^\/]*\//) > -1 || listEl.search(/\*\*[^\/]*\//) > -1) { - var match = listEl.match(/^([^*]+\/|)(.*)/); - var root = match[1]; - var rest = match[2]; - var restRegex = rest.replace(/\*\*/g, ".*").replace(/\*/g, "[^\\/]*"); - restRegex = new RegExp(restRegex); - - _ls('-R', root).filter(function (e) { - return restRegex.test(e); - }).forEach(function(file) { - expanded.push(file); - }); - } - // Wildcard present on file names ? - else if (listEl.search(/\*/) > -1) { - _ls('', listEl).forEach(function(file) { - expanded.push(file); - }); - } else { - expanded.push(listEl); - } - }); - return expanded; -} -exports.expand = expand; - -// Normalizes _unlinkSync() across platforms to match Unix behavior, i.e. -// file can be unlinked even if it's read-only, see https://github.com/joyent/node/issues/3006 -function unlinkSync(file) { - try { - fs.unlinkSync(file); - } catch(e) { - // Try to override file permission - if (e.code === 'EPERM') { - fs.chmodSync(file, '0666'); - fs.unlinkSync(file); - } else { - throw e; - } - } -} -exports.unlinkSync = unlinkSync; - -// e.g. 'shelljs_a5f185d0443ca...' -function randomFileName() { - function randomHash(count) { - if (count === 1) - return parseInt(16*Math.random(), 10).toString(16); - else { - var hash = ''; - for (var i=0; i and/or '); - } else if (arguments.length > 3) { - sources = [].slice.call(arguments, 1, arguments.length - 1); - dest = arguments[arguments.length - 1]; - } else if (typeof sources === 'string') { - sources = [sources]; - } else if ('length' in sources) { - sources = sources; // no-op for array - } else { - common.error('invalid arguments'); - } - - var exists = fs.existsSync(dest), - stats = exists && fs.statSync(dest); - - // Dest is not existing dir, but multiple sources given - if ((!exists || !stats.isDirectory()) && sources.length > 1) - common.error('dest is not a directory (too many sources)'); - - // Dest is an existing file, but no -f given - if (exists && stats.isFile() && !options.force) - common.error('dest file already exists: ' + dest); - - if (options.recursive) { - // Recursive allows the shortcut syntax "sourcedir/" for "sourcedir/*" - // (see Github issue #15) - sources.forEach(function(src, i) { - if (src[src.length - 1] === '/') - sources[i] += '*'; - }); - - // Create dest - try { - fs.mkdirSync(dest, parseInt('0777', 8)); - } catch (e) { - // like Unix's cp, keep going even if we can't create dest dir - } - } - - sources = common.expand(sources); - - sources.forEach(function(src) { - if (!fs.existsSync(src)) { - common.error('no such file or directory: '+src, true); - return; // skip file - } - - // If here, src exists - if (fs.statSync(src).isDirectory()) { - if (!options.recursive) { - // Non-Recursive - common.log(src + ' is a directory (not copied)'); - } else { - // Recursive - // 'cp /a/source dest' should create 'source' in 'dest' - var newDest = path.join(dest, path.basename(src)), - checkDir = fs.statSync(src); - try { - fs.mkdirSync(newDest, checkDir.mode); - } catch (e) { - //if the directory already exists, that's okay - if (e.code !== 'EEXIST') { - common.error('dest file no such file or directory: ' + newDest, true); - throw e; - } - } - - cpdirSyncRecursive(src, newDest, {force: options.force}); - } - return; // done with dir - } - - // If here, src is a file - - // When copying to '/path/dir': - // thisDest = '/path/dir/file1' - var thisDest = dest; - if (fs.existsSync(dest) && fs.statSync(dest).isDirectory()) - thisDest = path.normalize(dest + '/' + path.basename(src)); - - if (fs.existsSync(thisDest) && !options.force) { - common.error('dest file already exists: ' + thisDest, true); - return; // skip file - } - - copyFileSync(src, thisDest); - }); // forEach(src) -} -module.exports = _cp; diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/dirs.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/dirs.js deleted file mode 100644 index 58fae8b..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/dirs.js +++ /dev/null @@ -1,191 +0,0 @@ -var common = require('./common'); -var _cd = require('./cd'); -var path = require('path'); - -// Pushd/popd/dirs internals -var _dirStack = []; - -function _isStackIndex(index) { - return (/^[\-+]\d+$/).test(index); -} - -function _parseStackIndex(index) { - if (_isStackIndex(index)) { - if (Math.abs(index) < _dirStack.length + 1) { // +1 for pwd - return (/^-/).test(index) ? Number(index) - 1 : Number(index); - } else { - common.error(index + ': directory stack index out of range'); - } - } else { - common.error(index + ': invalid number'); - } -} - -function _actualDirStack() { - return [process.cwd()].concat(_dirStack); -} - -//@ -//@ ### pushd([options,] [dir | '-N' | '+N']) -//@ -//@ Available options: -//@ -//@ + `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated. -//@ -//@ Arguments: -//@ -//@ + `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`. -//@ + `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. -//@ + `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. -//@ -//@ Examples: -//@ -//@ ```javascript -//@ // process.cwd() === '/usr' -//@ pushd('/etc'); // Returns /etc /usr -//@ pushd('+1'); // Returns /usr /etc -//@ ``` -//@ -//@ Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack. -function _pushd(options, dir) { - if (_isStackIndex(options)) { - dir = options; - options = ''; - } - - options = common.parseOptions(options, { - 'n' : 'no-cd' - }); - - var dirs = _actualDirStack(); - - if (dir === '+0') { - return dirs; // +0 is a noop - } else if (!dir) { - if (dirs.length > 1) { - dirs = dirs.splice(1, 1).concat(dirs); - } else { - return common.error('no other directory'); - } - } else if (_isStackIndex(dir)) { - var n = _parseStackIndex(dir); - dirs = dirs.slice(n).concat(dirs.slice(0, n)); - } else { - if (options['no-cd']) { - dirs.splice(1, 0, dir); - } else { - dirs.unshift(dir); - } - } - - if (options['no-cd']) { - dirs = dirs.slice(1); - } else { - dir = path.resolve(dirs.shift()); - _cd('', dir); - } - - _dirStack = dirs; - return _dirs(''); -} -exports.pushd = _pushd; - -//@ -//@ ### popd([options,] ['-N' | '+N']) -//@ -//@ Available options: -//@ -//@ + `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated. -//@ -//@ Arguments: -//@ -//@ + `+N`: Removes the Nth directory (counting from the left of the list printed by dirs), starting with zero. -//@ + `-N`: Removes the Nth directory (counting from the right of the list printed by dirs), starting with zero. -//@ -//@ Examples: -//@ -//@ ```javascript -//@ echo(process.cwd()); // '/usr' -//@ pushd('/etc'); // '/etc /usr' -//@ echo(process.cwd()); // '/etc' -//@ popd(); // '/usr' -//@ echo(process.cwd()); // '/usr' -//@ ``` -//@ -//@ When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack. -function _popd(options, index) { - if (_isStackIndex(options)) { - index = options; - options = ''; - } - - options = common.parseOptions(options, { - 'n' : 'no-cd' - }); - - if (!_dirStack.length) { - return common.error('directory stack empty'); - } - - index = _parseStackIndex(index || '+0'); - - if (options['no-cd'] || index > 0 || _dirStack.length + index === 0) { - index = index > 0 ? index - 1 : index; - _dirStack.splice(index, 1); - } else { - var dir = path.resolve(_dirStack.shift()); - _cd('', dir); - } - - return _dirs(''); -} -exports.popd = _popd; - -//@ -//@ ### dirs([options | '+N' | '-N']) -//@ -//@ Available options: -//@ -//@ + `-c`: Clears the directory stack by deleting all of the elements. -//@ -//@ Arguments: -//@ -//@ + `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero. -//@ + `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero. -//@ -//@ Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified. -//@ -//@ See also: pushd, popd -function _dirs(options, index) { - if (_isStackIndex(options)) { - index = options; - options = ''; - } - - options = common.parseOptions(options, { - 'c' : 'clear' - }); - - if (options['clear']) { - _dirStack = []; - return _dirStack; - } - - var stack = _actualDirStack(); - - if (index) { - index = _parseStackIndex(index); - - if (index < 0) { - index = stack.length + index; - } - - common.log(stack[index]); - return stack[index]; - } - - common.log(stack.join(' ')); - - return stack; -} -exports.dirs = _dirs; diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/echo.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/echo.js deleted file mode 100644 index 760ea84..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/echo.js +++ /dev/null @@ -1,20 +0,0 @@ -var common = require('./common'); - -//@ -//@ ### echo(string [,string ...]) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ echo('hello world'); -//@ var str = echo('hello world'); -//@ ``` -//@ -//@ Prints string to stdout, and returns string with additional utility methods -//@ like `.to()`. -function _echo() { - var messages = [].slice.call(arguments, 0); - console.log.apply(this, messages); - return common.ShellString(messages.join(' ')); -} -module.exports = _echo; diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/error.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/error.js deleted file mode 100644 index cca3efb..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/error.js +++ /dev/null @@ -1,10 +0,0 @@ -var common = require('./common'); - -//@ -//@ ### error() -//@ Tests if error occurred in the last command. Returns `null` if no error occurred, -//@ otherwise returns string explaining the error -function error() { - return common.state.error; -}; -module.exports = error; diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/exec.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/exec.js deleted file mode 100644 index d259a9f..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/exec.js +++ /dev/null @@ -1,216 +0,0 @@ -var common = require('./common'); -var _tempDir = require('./tempdir'); -var _pwd = require('./pwd'); -var path = require('path'); -var fs = require('fs'); -var child = require('child_process'); - -// Hack to run child_process.exec() synchronously (sync avoids callback hell) -// Uses a custom wait loop that checks for a flag file, created when the child process is done. -// (Can't do a wait loop that checks for internal Node variables/messages as -// Node is single-threaded; callbacks and other internal state changes are done in the -// event loop). -function execSync(cmd, opts) { - var tempDir = _tempDir(); - var stdoutFile = path.resolve(tempDir+'/'+common.randomFileName()), - codeFile = path.resolve(tempDir+'/'+common.randomFileName()), - scriptFile = path.resolve(tempDir+'/'+common.randomFileName()), - sleepFile = path.resolve(tempDir+'/'+common.randomFileName()); - - var options = common.extend({ - silent: common.config.silent - }, opts); - - var previousStdoutContent = ''; - // Echoes stdout changes from running process, if not silent - function updateStdout() { - if (options.silent || !fs.existsSync(stdoutFile)) - return; - - var stdoutContent = fs.readFileSync(stdoutFile, 'utf8'); - // No changes since last time? - if (stdoutContent.length <= previousStdoutContent.length) - return; - - process.stdout.write(stdoutContent.substr(previousStdoutContent.length)); - previousStdoutContent = stdoutContent; - } - - function escape(str) { - return (str+'').replace(/([\\"'])/g, "\\$1").replace(/\0/g, "\\0"); - } - - if (fs.existsSync(scriptFile)) common.unlinkSync(scriptFile); - if (fs.existsSync(stdoutFile)) common.unlinkSync(stdoutFile); - if (fs.existsSync(codeFile)) common.unlinkSync(codeFile); - - var execCommand = '"'+process.execPath+'" '+scriptFile; - var execOptions = { - env: process.env, - cwd: _pwd(), - maxBuffer: 20*1024*1024 - }; - - if (typeof child.execSync === 'function') { - var script = [ - "var child = require('child_process')", - " , fs = require('fs');", - "var childProcess = child.exec('"+escape(cmd)+"', {env: process.env, maxBuffer: 20*1024*1024}, function(err) {", - " fs.writeFileSync('"+escape(codeFile)+"', err ? err.code.toString() : '0');", - "});", - "var stdoutStream = fs.createWriteStream('"+escape(stdoutFile)+"');", - "childProcess.stdout.pipe(stdoutStream, {end: false});", - "childProcess.stderr.pipe(stdoutStream, {end: false});", - "childProcess.stdout.pipe(process.stdout);", - "childProcess.stderr.pipe(process.stderr);", - "var stdoutEnded = false, stderrEnded = false;", - "function tryClosing(){ if(stdoutEnded && stderrEnded){ stdoutStream.end(); } }", - "childProcess.stdout.on('end', function(){ stdoutEnded = true; tryClosing(); });", - "childProcess.stderr.on('end', function(){ stderrEnded = true; tryClosing(); });" - ].join('\n'); - - fs.writeFileSync(scriptFile, script); - - if (options.silent) { - execOptions.stdio = 'ignore'; - } else { - execOptions.stdio = [0, 1, 2]; - } - - // Welcome to the future - child.execSync(execCommand, execOptions); - } else { - cmd += ' > '+stdoutFile+' 2>&1'; // works on both win/unix - - var script = [ - "var child = require('child_process')", - " , fs = require('fs');", - "var childProcess = child.exec('"+escape(cmd)+"', {env: process.env, maxBuffer: 20*1024*1024}, function(err) {", - " fs.writeFileSync('"+escape(codeFile)+"', err ? err.code.toString() : '0');", - "});" - ].join('\n'); - - fs.writeFileSync(scriptFile, script); - - child.exec(execCommand, execOptions); - - // The wait loop - // sleepFile is used as a dummy I/O op to mitigate unnecessary CPU usage - // (tried many I/O sync ops, writeFileSync() seems to be only one that is effective in reducing - // CPU usage, though apparently not so much on Windows) - while (!fs.existsSync(codeFile)) { updateStdout(); fs.writeFileSync(sleepFile, 'a'); } - while (!fs.existsSync(stdoutFile)) { updateStdout(); fs.writeFileSync(sleepFile, 'a'); } - } - - // At this point codeFile exists, but it's not necessarily flushed yet. - // Keep reading it until it is. - var code = parseInt('', 10); - while (isNaN(code)) { - code = parseInt(fs.readFileSync(codeFile, 'utf8'), 10); - } - - var stdout = fs.readFileSync(stdoutFile, 'utf8'); - - // No biggie if we can't erase the files now -- they're in a temp dir anyway - try { common.unlinkSync(scriptFile); } catch(e) {} - try { common.unlinkSync(stdoutFile); } catch(e) {} - try { common.unlinkSync(codeFile); } catch(e) {} - try { common.unlinkSync(sleepFile); } catch(e) {} - - // some shell return codes are defined as errors, per http://tldp.org/LDP/abs/html/exitcodes.html - if (code === 1 || code === 2 || code >= 126) { - common.error('', true); // unix/shell doesn't really give an error message after non-zero exit codes - } - // True if successful, false if not - var obj = { - code: code, - output: stdout - }; - return obj; -} // execSync() - -// Wrapper around exec() to enable echoing output to console in real time -function execAsync(cmd, opts, callback) { - var output = ''; - - var options = common.extend({ - silent: common.config.silent - }, opts); - - var c = child.exec(cmd, {env: process.env, maxBuffer: 20*1024*1024}, function(err) { - if (callback) - callback(err ? err.code : 0, output); - }); - - c.stdout.on('data', function(data) { - output += data; - if (!options.silent) - process.stdout.write(data); - }); - - c.stderr.on('data', function(data) { - output += data; - if (!options.silent) - process.stdout.write(data); - }); - - return c; -} - -//@ -//@ ### exec(command [, options] [, callback]) -//@ Available options (all `false` by default): -//@ -//@ + `async`: Asynchronous execution. Defaults to true if a callback is provided. -//@ + `silent`: Do not echo program output to console. -//@ -//@ Examples: -//@ -//@ ```javascript -//@ var version = exec('node --version', {silent:true}).output; -//@ -//@ var child = exec('some_long_running_process', {async:true}); -//@ child.stdout.on('data', function(data) { -//@ /* ... do something with data ... */ -//@ }); -//@ -//@ exec('some_long_running_process', function(code, output) { -//@ console.log('Exit code:', code); -//@ console.log('Program output:', output); -//@ }); -//@ ``` -//@ -//@ Executes the given `command` _synchronously_, unless otherwise specified. -//@ When in synchronous mode returns the object `{ code:..., output:... }`, containing the program's -//@ `output` (stdout + stderr) and its exit `code`. Otherwise returns the child process object, and -//@ the `callback` gets the arguments `(code, output)`. -//@ -//@ **Note:** For long-lived processes, it's best to run `exec()` asynchronously as -//@ the current synchronous implementation uses a lot of CPU. This should be getting -//@ fixed soon. -function _exec(command, options, callback) { - if (!command) - common.error('must specify command'); - - // Callback is defined instead of options. - if (typeof options === 'function') { - callback = options; - options = { async: true }; - } - - // Callback is defined with options. - if (typeof options === 'object' && typeof callback === 'function') { - options.async = true; - } - - options = common.extend({ - silent: common.config.silent, - async: false - }, options); - - if (options.async) - return execAsync(command, options, callback); - else - return execSync(command, options); -} -module.exports = _exec; diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/find.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/find.js deleted file mode 100644 index d9eeec2..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/find.js +++ /dev/null @@ -1,51 +0,0 @@ -var fs = require('fs'); -var common = require('./common'); -var _ls = require('./ls'); - -//@ -//@ ### find(path [,path ...]) -//@ ### find(path_array) -//@ Examples: -//@ -//@ ```javascript -//@ find('src', 'lib'); -//@ find(['src', 'lib']); // same as above -//@ find('.').filter(function(file) { return file.match(/\.js$/); }); -//@ ``` -//@ -//@ Returns array of all files (however deep) in the given paths. -//@ -//@ The main difference from `ls('-R', path)` is that the resulting file names -//@ include the base directories, e.g. `lib/resources/file1` instead of just `file1`. -function _find(options, paths) { - if (!paths) - common.error('no path specified'); - else if (typeof paths === 'object') - paths = paths; // assume array - else if (typeof paths === 'string') - paths = [].slice.call(arguments, 1); - - var list = []; - - function pushFile(file) { - if (common.platform === 'win') - file = file.replace(/\\/g, '/'); - list.push(file); - } - - // why not simply do ls('-R', paths)? because the output wouldn't give the base dirs - // to get the base dir in the output, we need instead ls('-R', 'dir/*') for every directory - - paths.forEach(function(file) { - pushFile(file); - - if (fs.statSync(file).isDirectory()) { - _ls('-RA', file+'/*').forEach(function(subfile) { - pushFile(subfile); - }); - } - }); - - return list; -} -module.exports = _find; diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/grep.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/grep.js deleted file mode 100644 index 00c7d6a..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/grep.js +++ /dev/null @@ -1,52 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); - -//@ -//@ ### grep([options ,] regex_filter, file [, file ...]) -//@ ### grep([options ,] regex_filter, file_array) -//@ Available options: -//@ -//@ + `-v`: Inverse the sense of the regex and print the lines not matching the criteria. -//@ -//@ Examples: -//@ -//@ ```javascript -//@ grep('-v', 'GLOBAL_VARIABLE', '*.js'); -//@ grep('GLOBAL_VARIABLE', '*.js'); -//@ ``` -//@ -//@ Reads input string from given files and returns a string containing all lines of the -//@ file that match the given `regex_filter`. Wildcard `*` accepted. -function _grep(options, regex, files) { - options = common.parseOptions(options, { - 'v': 'inverse' - }); - - if (!files) - common.error('no paths given'); - - if (typeof files === 'string') - files = [].slice.call(arguments, 2); - // if it's array leave it as it is - - files = common.expand(files); - - var grep = ''; - files.forEach(function(file) { - if (!fs.existsSync(file)) { - common.error('no such file or directory: ' + file, true); - return; - } - - var contents = fs.readFileSync(file, 'utf8'), - lines = contents.split(/\r*\n/); - lines.forEach(function(line) { - var matched = line.match(regex); - if ((options.inverse && !matched) || (!options.inverse && matched)) - grep += line + '\n'; - }); - }); - - return common.ShellString(grep); -} -module.exports = _grep; diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/ln.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/ln.js deleted file mode 100644 index a7b9701..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/ln.js +++ /dev/null @@ -1,53 +0,0 @@ -var fs = require('fs'); -var path = require('path'); -var common = require('./common'); -var os = require('os'); - -//@ -//@ ### ln(options, source, dest) -//@ ### ln(source, dest) -//@ Available options: -//@ -//@ + `s`: symlink -//@ + `f`: force -//@ -//@ Examples: -//@ -//@ ```javascript -//@ ln('file', 'newlink'); -//@ ln('-sf', 'file', 'existing'); -//@ ``` -//@ -//@ Links source to dest. Use -f to force the link, should dest already exist. -function _ln(options, source, dest) { - options = common.parseOptions(options, { - 's': 'symlink', - 'f': 'force' - }); - - if (!source || !dest) { - common.error('Missing and/or '); - } - - source = path.resolve(process.cwd(), String(source)); - dest = path.resolve(process.cwd(), String(dest)); - - if (!fs.existsSync(source)) { - common.error('Source file does not exist', true); - } - - if (fs.existsSync(dest)) { - if (!options.force) { - common.error('Destination file exists', true); - } - - fs.unlinkSync(dest); - } - - if (options.symlink) { - fs.symlinkSync(source, dest, os.platform() === "win32" ? "junction" : null); - } else { - fs.linkSync(source, dest, os.platform() === "win32" ? "junction" : null); - } -} -module.exports = _ln; diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/ls.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/ls.js deleted file mode 100644 index 3345db4..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/ls.js +++ /dev/null @@ -1,126 +0,0 @@ -var path = require('path'); -var fs = require('fs'); -var common = require('./common'); -var _cd = require('./cd'); -var _pwd = require('./pwd'); - -//@ -//@ ### ls([options ,] path [,path ...]) -//@ ### ls([options ,] path_array) -//@ Available options: -//@ -//@ + `-R`: recursive -//@ + `-A`: all files (include files beginning with `.`, except for `.` and `..`) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ ls('projs/*.js'); -//@ ls('-R', '/users/me', '/tmp'); -//@ ls('-R', ['/users/me', '/tmp']); // same as above -//@ ``` -//@ -//@ Returns array of files in the given path, or in current directory if no path provided. -function _ls(options, paths) { - options = common.parseOptions(options, { - 'R': 'recursive', - 'A': 'all', - 'a': 'all_deprecated' - }); - - if (options.all_deprecated) { - // We won't support the -a option as it's hard to image why it's useful - // (it includes '.' and '..' in addition to '.*' files) - // For backwards compatibility we'll dump a deprecated message and proceed as before - common.log('ls: Option -a is deprecated. Use -A instead'); - options.all = true; - } - - if (!paths) - paths = ['.']; - else if (typeof paths === 'object') - paths = paths; // assume array - else if (typeof paths === 'string') - paths = [].slice.call(arguments, 1); - - var list = []; - - // Conditionally pushes file to list - returns true if pushed, false otherwise - // (e.g. prevents hidden files to be included unless explicitly told so) - function pushFile(file, query) { - // hidden file? - if (path.basename(file)[0] === '.') { - // not explicitly asking for hidden files? - if (!options.all && !(path.basename(query)[0] === '.' && path.basename(query).length > 1)) - return false; - } - - if (common.platform === 'win') - file = file.replace(/\\/g, '/'); - - list.push(file); - return true; - } - - paths.forEach(function(p) { - if (fs.existsSync(p)) { - var stats = fs.statSync(p); - // Simple file? - if (stats.isFile()) { - pushFile(p, p); - return; // continue - } - - // Simple dir? - if (stats.isDirectory()) { - // Iterate over p contents - fs.readdirSync(p).forEach(function(file) { - if (!pushFile(file, p)) - return; - - // Recursive? - if (options.recursive) { - var oldDir = _pwd(); - _cd('', p); - if (fs.statSync(file).isDirectory()) - list = list.concat(_ls('-R'+(options.all?'A':''), file+'/*')); - _cd('', oldDir); - } - }); - return; // continue - } - } - - // p does not exist - possible wildcard present - - var basename = path.basename(p); - var dirname = path.dirname(p); - // Wildcard present on an existing dir? (e.g. '/tmp/*.js') - if (basename.search(/\*/) > -1 && fs.existsSync(dirname) && fs.statSync(dirname).isDirectory) { - // Escape special regular expression chars - var regexp = basename.replace(/(\^|\$|\(|\)|<|>|\[|\]|\{|\}|\.|\+|\?)/g, '\\$1'); - // Translates wildcard into regex - regexp = '^' + regexp.replace(/\*/g, '.*') + '$'; - // Iterate over directory contents - fs.readdirSync(dirname).forEach(function(file) { - if (file.match(new RegExp(regexp))) { - if (!pushFile(path.normalize(dirname+'/'+file), basename)) - return; - - // Recursive? - if (options.recursive) { - var pp = dirname + '/' + file; - if (fs.lstatSync(pp).isDirectory()) - list = list.concat(_ls('-R'+(options.all?'A':''), pp+'/*')); - } // recursive - } // if file matches - }); // forEach - return; - } - - common.error('no such file or directory: ' + p, true); - }); - - return list; -} -module.exports = _ls; diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/mkdir.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/mkdir.js deleted file mode 100644 index 5a7088f..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/mkdir.js +++ /dev/null @@ -1,68 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); -var path = require('path'); - -// Recursively creates 'dir' -function mkdirSyncRecursive(dir) { - var baseDir = path.dirname(dir); - - // Base dir exists, no recursion necessary - if (fs.existsSync(baseDir)) { - fs.mkdirSync(dir, parseInt('0777', 8)); - return; - } - - // Base dir does not exist, go recursive - mkdirSyncRecursive(baseDir); - - // Base dir created, can create dir - fs.mkdirSync(dir, parseInt('0777', 8)); -} - -//@ -//@ ### mkdir([options ,] dir [, dir ...]) -//@ ### mkdir([options ,] dir_array) -//@ Available options: -//@ -//@ + `p`: full path (will create intermediate dirs if necessary) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g'); -//@ mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above -//@ ``` -//@ -//@ Creates directories. -function _mkdir(options, dirs) { - options = common.parseOptions(options, { - 'p': 'fullpath' - }); - if (!dirs) - common.error('no paths given'); - - if (typeof dirs === 'string') - dirs = [].slice.call(arguments, 1); - // if it's array leave it as it is - - dirs.forEach(function(dir) { - if (fs.existsSync(dir)) { - if (!options.fullpath) - common.error('path already exists: ' + dir, true); - return; // skip dir - } - - // Base dir does not exist, and no -p option given - var baseDir = path.dirname(dir); - if (!fs.existsSync(baseDir) && !options.fullpath) { - common.error('no such file or directory: ' + baseDir, true); - return; // skip dir - } - - if (options.fullpath) - mkdirSyncRecursive(dir); - else - fs.mkdirSync(dir, parseInt('0777', 8)); - }); -} // mkdir -module.exports = _mkdir; diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/mv.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/mv.js deleted file mode 100644 index 11f9607..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/mv.js +++ /dev/null @@ -1,80 +0,0 @@ -var fs = require('fs'); -var path = require('path'); -var common = require('./common'); - -//@ -//@ ### mv(source [, source ...], dest') -//@ ### mv(source_array, dest') -//@ Available options: -//@ -//@ + `f`: force -//@ -//@ Examples: -//@ -//@ ```javascript -//@ mv('-f', 'file', 'dir/'); -//@ mv('file1', 'file2', 'dir/'); -//@ mv(['file1', 'file2'], 'dir/'); // same as above -//@ ``` -//@ -//@ Moves files. The wildcard `*` is accepted. -function _mv(options, sources, dest) { - options = common.parseOptions(options, { - 'f': 'force' - }); - - // Get sources, dest - if (arguments.length < 3) { - common.error('missing and/or '); - } else if (arguments.length > 3) { - sources = [].slice.call(arguments, 1, arguments.length - 1); - dest = arguments[arguments.length - 1]; - } else if (typeof sources === 'string') { - sources = [sources]; - } else if ('length' in sources) { - sources = sources; // no-op for array - } else { - common.error('invalid arguments'); - } - - sources = common.expand(sources); - - var exists = fs.existsSync(dest), - stats = exists && fs.statSync(dest); - - // Dest is not existing dir, but multiple sources given - if ((!exists || !stats.isDirectory()) && sources.length > 1) - common.error('dest is not a directory (too many sources)'); - - // Dest is an existing file, but no -f given - if (exists && stats.isFile() && !options.force) - common.error('dest file already exists: ' + dest); - - sources.forEach(function(src) { - if (!fs.existsSync(src)) { - common.error('no such file or directory: '+src, true); - return; // skip file - } - - // If here, src exists - - // When copying to '/path/dir': - // thisDest = '/path/dir/file1' - var thisDest = dest; - if (fs.existsSync(dest) && fs.statSync(dest).isDirectory()) - thisDest = path.normalize(dest + '/' + path.basename(src)); - - if (fs.existsSync(thisDest) && !options.force) { - common.error('dest file already exists: ' + thisDest, true); - return; // skip file - } - - if (path.resolve(src) === path.dirname(path.resolve(thisDest))) { - common.error('cannot move to self: '+src, true); - return; // skip file - } - - fs.renameSync(src, thisDest); - }); // forEach(src) -} // mv -module.exports = _mv; diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/popd.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/popd.js deleted file mode 100644 index 11ea24f..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/popd.js +++ /dev/null @@ -1 +0,0 @@ -// see dirs.js \ No newline at end of file diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/pushd.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/pushd.js deleted file mode 100644 index 11ea24f..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/pushd.js +++ /dev/null @@ -1 +0,0 @@ -// see dirs.js \ No newline at end of file diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/pwd.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/pwd.js deleted file mode 100644 index 41727bb..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/pwd.js +++ /dev/null @@ -1,11 +0,0 @@ -var path = require('path'); -var common = require('./common'); - -//@ -//@ ### pwd() -//@ Returns the current directory. -function _pwd(options) { - var pwd = path.resolve(process.cwd()); - return common.ShellString(pwd); -} -module.exports = _pwd; diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/rm.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/rm.js deleted file mode 100644 index bd608cb..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/rm.js +++ /dev/null @@ -1,163 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); - -// Recursively removes 'dir' -// Adapted from https://github.com/ryanmcgrath/wrench-js -// -// Copyright (c) 2010 Ryan McGrath -// Copyright (c) 2012 Artur Adib -// -// Licensed under the MIT License -// http://www.opensource.org/licenses/mit-license.php -function rmdirSyncRecursive(dir, force) { - var files; - - files = fs.readdirSync(dir); - - // Loop through and delete everything in the sub-tree after checking it - for(var i = 0; i < files.length; i++) { - var file = dir + "/" + files[i], - currFile = fs.lstatSync(file); - - if(currFile.isDirectory()) { // Recursive function back to the beginning - rmdirSyncRecursive(file, force); - } - - else if(currFile.isSymbolicLink()) { // Unlink symlinks - if (force || isWriteable(file)) { - try { - common.unlinkSync(file); - } catch (e) { - common.error('could not remove file (code '+e.code+'): ' + file, true); - } - } - } - - else // Assume it's a file - perhaps a try/catch belongs here? - if (force || isWriteable(file)) { - try { - common.unlinkSync(file); - } catch (e) { - common.error('could not remove file (code '+e.code+'): ' + file, true); - } - } - } - - // Now that we know everything in the sub-tree has been deleted, we can delete the main directory. - // Huzzah for the shopkeep. - - var result; - try { - // Retry on windows, sometimes it takes a little time before all the files in the directory are gone - var start = Date.now(); - while (true) { - try { - result = fs.rmdirSync(dir); - if (fs.existsSync(dir)) throw { code: "EAGAIN" } - break; - } catch(er) { - // In addition to error codes, also check if the directory still exists and loop again if true - if (process.platform === "win32" && (er.code === "ENOTEMPTY" || er.code === "EBUSY" || er.code === "EPERM" || er.code === "EAGAIN")) { - if (Date.now() - start > 1000) throw er; - } else if (er.code === "ENOENT") { - // Directory did not exist, deletion was successful - break; - } else { - throw er; - } - } - } - } catch(e) { - common.error('could not remove directory (code '+e.code+'): ' + dir, true); - } - - return result; -} // rmdirSyncRecursive - -// Hack to determine if file has write permissions for current user -// Avoids having to check user, group, etc, but it's probably slow -function isWriteable(file) { - var writePermission = true; - try { - var __fd = fs.openSync(file, 'a'); - fs.closeSync(__fd); - } catch(e) { - writePermission = false; - } - - return writePermission; -} - -//@ -//@ ### rm([options ,] file [, file ...]) -//@ ### rm([options ,] file_array) -//@ Available options: -//@ -//@ + `-f`: force -//@ + `-r, -R`: recursive -//@ -//@ Examples: -//@ -//@ ```javascript -//@ rm('-rf', '/tmp/*'); -//@ rm('some_file.txt', 'another_file.txt'); -//@ rm(['some_file.txt', 'another_file.txt']); // same as above -//@ ``` -//@ -//@ Removes files. The wildcard `*` is accepted. -function _rm(options, files) { - options = common.parseOptions(options, { - 'f': 'force', - 'r': 'recursive', - 'R': 'recursive' - }); - if (!files) - common.error('no paths given'); - - if (typeof files === 'string') - files = [].slice.call(arguments, 1); - // if it's array leave it as it is - - files = common.expand(files); - - files.forEach(function(file) { - if (!fs.existsSync(file)) { - // Path does not exist, no force flag given - if (!options.force) - common.error('no such file or directory: '+file, true); - - return; // skip file - } - - // If here, path exists - - var stats = fs.lstatSync(file); - if (stats.isFile() || stats.isSymbolicLink()) { - - // Do not check for file writing permissions - if (options.force) { - common.unlinkSync(file); - return; - } - - if (isWriteable(file)) - common.unlinkSync(file); - else - common.error('permission denied: '+file, true); - - return; - } // simple file - - // Path is an existing directory, but no -r flag given - if (stats.isDirectory() && !options.recursive) { - common.error('path is a directory', true); - return; // skip path - } - - // Recursively remove existing directory - if (stats.isDirectory() && options.recursive) { - rmdirSyncRecursive(file, options.force); - } - }); // forEach(file) -} // rm -module.exports = _rm; diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/sed.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/sed.js deleted file mode 100644 index 65f7cb4..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/sed.js +++ /dev/null @@ -1,43 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); - -//@ -//@ ### sed([options ,] search_regex, replacement, file) -//@ Available options: -//@ -//@ + `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_ -//@ -//@ Examples: -//@ -//@ ```javascript -//@ sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js'); -//@ sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js'); -//@ ``` -//@ -//@ Reads an input string from `file` and performs a JavaScript `replace()` on the input -//@ using the given search regex and replacement string or function. Returns the new string after replacement. -function _sed(options, regex, replacement, file) { - options = common.parseOptions(options, { - 'i': 'inplace' - }); - - if (typeof replacement === 'string' || typeof replacement === 'function') - replacement = replacement; // no-op - else if (typeof replacement === 'number') - replacement = replacement.toString(); // fallback - else - common.error('invalid replacement string'); - - if (!file) - common.error('no file given'); - - if (!fs.existsSync(file)) - common.error('no such file or directory: ' + file); - - var result = fs.readFileSync(file, 'utf8').replace(regex, replacement); - if (options.inplace) - fs.writeFileSync(file, result, 'utf8'); - - return common.ShellString(result); -} -module.exports = _sed; diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/tempdir.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/tempdir.js deleted file mode 100644 index 45953c2..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/tempdir.js +++ /dev/null @@ -1,56 +0,0 @@ -var common = require('./common'); -var os = require('os'); -var fs = require('fs'); - -// Returns false if 'dir' is not a writeable directory, 'dir' otherwise -function writeableDir(dir) { - if (!dir || !fs.existsSync(dir)) - return false; - - if (!fs.statSync(dir).isDirectory()) - return false; - - var testFile = dir+'/'+common.randomFileName(); - try { - fs.writeFileSync(testFile, ' '); - common.unlinkSync(testFile); - return dir; - } catch (e) { - return false; - } -} - - -//@ -//@ ### tempdir() -//@ -//@ Examples: -//@ -//@ ```javascript -//@ var tmp = tempdir(); // "/tmp" for most *nix platforms -//@ ``` -//@ -//@ Searches and returns string containing a writeable, platform-dependent temporary directory. -//@ Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir). -function _tempDir() { - var state = common.state; - if (state.tempDir) - return state.tempDir; // from cache - - state.tempDir = writeableDir(os.tempDir && os.tempDir()) || // node 0.8+ - writeableDir(process.env['TMPDIR']) || - writeableDir(process.env['TEMP']) || - writeableDir(process.env['TMP']) || - writeableDir(process.env['Wimp$ScrapDir']) || // RiscOS - writeableDir('C:\\TEMP') || // Windows - writeableDir('C:\\TMP') || // Windows - writeableDir('\\TEMP') || // Windows - writeableDir('\\TMP') || // Windows - writeableDir('/tmp') || - writeableDir('/var/tmp') || - writeableDir('/usr/tmp') || - writeableDir('.'); // last resort - - return state.tempDir; -} -module.exports = _tempDir; diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/test.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/test.js deleted file mode 100644 index 8a4ac7d..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/test.js +++ /dev/null @@ -1,85 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); - -//@ -//@ ### test(expression) -//@ Available expression primaries: -//@ -//@ + `'-b', 'path'`: true if path is a block device -//@ + `'-c', 'path'`: true if path is a character device -//@ + `'-d', 'path'`: true if path is a directory -//@ + `'-e', 'path'`: true if path exists -//@ + `'-f', 'path'`: true if path is a regular file -//@ + `'-L', 'path'`: true if path is a symboilc link -//@ + `'-p', 'path'`: true if path is a pipe (FIFO) -//@ + `'-S', 'path'`: true if path is a socket -//@ -//@ Examples: -//@ -//@ ```javascript -//@ if (test('-d', path)) { /* do something with dir */ }; -//@ if (!test('-f', path)) continue; // skip if it's a regular file -//@ ``` -//@ -//@ Evaluates expression using the available primaries and returns corresponding value. -function _test(options, path) { - if (!path) - common.error('no path given'); - - // hack - only works with unary primaries - options = common.parseOptions(options, { - 'b': 'block', - 'c': 'character', - 'd': 'directory', - 'e': 'exists', - 'f': 'file', - 'L': 'link', - 'p': 'pipe', - 'S': 'socket' - }); - - var canInterpret = false; - for (var key in options) - if (options[key] === true) { - canInterpret = true; - break; - } - - if (!canInterpret) - common.error('could not interpret expression'); - - if (options.link) { - try { - return fs.lstatSync(path).isSymbolicLink(); - } catch(e) { - return false; - } - } - - if (!fs.existsSync(path)) - return false; - - if (options.exists) - return true; - - var stats = fs.statSync(path); - - if (options.block) - return stats.isBlockDevice(); - - if (options.character) - return stats.isCharacterDevice(); - - if (options.directory) - return stats.isDirectory(); - - if (options.file) - return stats.isFile(); - - if (options.pipe) - return stats.isFIFO(); - - if (options.socket) - return stats.isSocket(); -} // test -module.exports = _test; diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/to.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/to.js deleted file mode 100644 index f029999..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/to.js +++ /dev/null @@ -1,29 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); -var path = require('path'); - -//@ -//@ ### 'string'.to(file) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ cat('input.txt').to('output.txt'); -//@ ``` -//@ -//@ Analogous to the redirection operator `>` in Unix, but works with JavaScript strings (such as -//@ those returned by `cat`, `grep`, etc). _Like Unix redirections, `to()` will overwrite any existing file!_ -function _to(options, file) { - if (!file) - common.error('wrong arguments'); - - if (!fs.existsSync( path.dirname(file) )) - common.error('no such file or directory: ' + path.dirname(file)); - - try { - fs.writeFileSync(file, this.toString(), 'utf8'); - } catch(e) { - common.error('could not write to file (code '+e.code+'): '+file, true); - } -} -module.exports = _to; diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/toEnd.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/toEnd.js deleted file mode 100644 index f6d099d..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/toEnd.js +++ /dev/null @@ -1,29 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); -var path = require('path'); - -//@ -//@ ### 'string'.toEnd(file) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ cat('input.txt').toEnd('output.txt'); -//@ ``` -//@ -//@ Analogous to the redirect-and-append operator `>>` in Unix, but works with JavaScript strings (such as -//@ those returned by `cat`, `grep`, etc). -function _toEnd(options, file) { - if (!file) - common.error('wrong arguments'); - - if (!fs.existsSync( path.dirname(file) )) - common.error('no such file or directory: ' + path.dirname(file)); - - try { - fs.appendFileSync(file, this.toString(), 'utf8'); - } catch(e) { - common.error('could not append to file (code '+e.code+'): '+file, true); - } -} -module.exports = _toEnd; diff --git a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/which.js b/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/which.js deleted file mode 100644 index 2822ecf..0000000 --- a/node_modules/node-mendix-modeler-path/node_modules/shelljs/src/which.js +++ /dev/null @@ -1,83 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); -var path = require('path'); - -// Cross-platform method for splitting environment PATH variables -function splitPath(p) { - for (i=1;i<2;i++) {} - - if (!p) - return []; - - if (common.platform === 'win') - return p.split(';'); - else - return p.split(':'); -} - -function checkPath(path) { - return fs.existsSync(path) && fs.statSync(path).isDirectory() == false; -} - -//@ -//@ ### which(command) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ var nodeExec = which('node'); -//@ ``` -//@ -//@ Searches for `command` in the system's PATH. On Windows looks for `.exe`, `.cmd`, and `.bat` extensions. -//@ Returns string containing the absolute path to the command. -function _which(options, cmd) { - if (!cmd) - common.error('must specify command'); - - var pathEnv = process.env.path || process.env.Path || process.env.PATH, - pathArray = splitPath(pathEnv), - where = null; - - // No relative/absolute paths provided? - if (cmd.search(/\//) === -1) { - // Search for command in PATH - pathArray.forEach(function(dir) { - if (where) - return; // already found it - - var attempt = path.resolve(dir + '/' + cmd); - if (checkPath(attempt)) { - where = attempt; - return; - } - - if (common.platform === 'win') { - var baseAttempt = attempt; - attempt = baseAttempt + '.exe'; - if (checkPath(attempt)) { - where = attempt; - return; - } - attempt = baseAttempt + '.cmd'; - if (checkPath(attempt)) { - where = attempt; - return; - } - attempt = baseAttempt + '.bat'; - if (checkPath(attempt)) { - where = attempt; - return; - } - } // if 'win' - }); - } - - // Command not found anywhere? - if (!checkPath(cmd) && !where) - return null; - - where = where || path.resolve(cmd); - - return common.ShellString(where); -} -module.exports = _which; diff --git a/node_modules/node-mendix-modeler-path/package.json b/node_modules/node-mendix-modeler-path/package.json deleted file mode 100644 index aef27bb..0000000 --- a/node_modules/node-mendix-modeler-path/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "node-mendix-modeler-path", - "version": "1.0.0", - "description": "Checks Windows where the Mendix Modeler (Version Selector) is and outputs a path and argument format", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/JelteMX/node-mendix-modeler-path.git" - }, - "keywords": [ - "mendix" - ], - "author": { - "name": "J.W. Lagendijk" - }, - "license": "Apache 2", - "private": true, - "bugs": { - "url": "https://github.com/JelteMX/node-mendix-modeler-path/issues" - }, - "homepage": "https://github.com/JelteMX/node-mendix-modeler-path#readme", - "dependencies": { - "shelljs": "^0.5.3" - }, - "readme": "## About\n\nThis is a small module that will check where the Mendix Modeler is located on the system. This is currently used for the Grunt file that is located in the Yeoman Mendix Generator. This module is not published on the NPM registry but directly embedded in another package.\n\n## License\n\nApache 2", - "readmeFilename": "README.md", - "_id": "node-mendix-modeler-path@1.0.0", - "_shasum": "cb8918ec60ff73743373f85d0f41ff70ec55015f", - "_resolved": "https://github.com/JelteMX/node-mendix-modeler-path/archive/v1.0.0.tar.gz", - "_from": "https://github.com/JelteMX/node-mendix-modeler-path/archive/v1.0.0.tar.gz" -} diff --git a/node_modules/semver/LICENSE b/node_modules/semver/LICENSE deleted file mode 100644 index 19129e3..0000000 --- a/node_modules/semver/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/semver/README.md b/node_modules/semver/README.md deleted file mode 100644 index cbd9565..0000000 --- a/node_modules/semver/README.md +++ /dev/null @@ -1,350 +0,0 @@ -semver(1) -- The semantic versioner for npm -=========================================== - -## Usage - - $ npm install semver - $ node - var semver = require('semver') - - semver.valid('1.2.3') // '1.2.3' - semver.valid('a.b.c') // null - semver.clean(' =v1.2.3 ') // '1.2.3' - semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true - semver.gt('1.2.3', '9.8.7') // false - semver.lt('1.2.3', '9.8.7') // true - -As a command-line utility: - - $ semver -h - - SemVer 5.1.0 - - A JavaScript implementation of the http://semver.org/ specification - Copyright Isaac Z. Schlueter - - Usage: semver [options] [ [...]] - Prints valid versions sorted by SemVer precedence - - Options: - -r --range - Print versions that match the specified range. - - -i --increment [] - Increment a version by the specified level. Level can - be one of: major, minor, patch, premajor, preminor, - prepatch, or prerelease. Default level is 'patch'. - Only one version may be specified. - - --preid - Identifier to be used to prefix premajor, preminor, - prepatch or prerelease version increments. - - -l --loose - Interpret versions and ranges loosely - - Program exits successfully if any valid version satisfies - all supplied ranges, and prints all satisfying versions. - - If no satisfying versions are found, then exits failure. - - Versions are printed in ascending order, so supplying - multiple versions to the utility will just sort them. - -## Versions - -A "version" is described by the `v2.0.0` specification found at -. - -A leading `"="` or `"v"` character is stripped off and ignored. - -## Ranges - -A `version range` is a set of `comparators` which specify versions -that satisfy the range. - -A `comparator` is composed of an `operator` and a `version`. The set -of primitive `operators` is: - -* `<` Less than -* `<=` Less than or equal to -* `>` Greater than -* `>=` Greater than or equal to -* `=` Equal. If no operator is specified, then equality is assumed, - so this operator is optional, but MAY be included. - -For example, the comparator `>=1.2.7` would match the versions -`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6` -or `1.1.0`. - -Comparators can be joined by whitespace to form a `comparator set`, -which is satisfied by the **intersection** of all of the comparators -it includes. - -A range is composed of one or more comparator sets, joined by `||`. A -version matches a range if and only if every comparator in at least -one of the `||`-separated comparator sets is satisfied by the version. - -For example, the range `>=1.2.7 <1.3.0` would match the versions -`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`, -or `1.1.0`. - -The range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`, -`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`. - -### Prerelease Tags - -If a version has a prerelease tag (for example, `1.2.3-alpha.3`) then -it will only be allowed to satisfy comparator sets if at least one -comparator with the same `[major, minor, patch]` tuple also has a -prerelease tag. - -For example, the range `>1.2.3-alpha.3` would be allowed to match the -version `1.2.3-alpha.7`, but it would *not* be satisfied by -`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically "greater -than" `1.2.3-alpha.3` according to the SemVer sort rules. The version -range only accepts prerelease tags on the `1.2.3` version. The -version `3.4.5` *would* satisfy the range, because it does not have a -prerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`. - -The purpose for this behavior is twofold. First, prerelease versions -frequently are updated very quickly, and contain many breaking changes -that are (by the author's design) not yet fit for public consumption. -Therefore, by default, they are excluded from range matching -semantics. - -Second, a user who has opted into using a prerelease version has -clearly indicated the intent to use *that specific* set of -alpha/beta/rc versions. By including a prerelease tag in the range, -the user is indicating that they are aware of the risk. However, it -is still not appropriate to assume that they have opted into taking a -similar risk on the *next* set of prerelease versions. - -#### Prerelease Identifiers - -The method `.inc` takes an additional `identifier` string argument that -will append the value of the string as a prerelease identifier: - -```javascript -> semver.inc('1.2.3', 'prerelease', 'beta') -'1.2.4-beta.0' -``` - -command-line example: - -```shell -$ semver 1.2.3 -i prerelease --preid beta -1.2.4-beta.0 -``` - -Which then can be used to increment further: - -```shell -$ semver 1.2.4-beta.0 -i prerelease -1.2.4-beta.1 -``` - -### Advanced Range Syntax - -Advanced range syntax desugars to primitive comparators in -deterministic ways. - -Advanced ranges may be combined in the same way as primitive -comparators using white space or `||`. - -#### Hyphen Ranges `X.Y.Z - A.B.C` - -Specifies an inclusive set. - -* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4` - -If a partial version is provided as the first version in the inclusive -range, then the missing pieces are replaced with zeroes. - -* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4` - -If a partial version is provided as the second version in the -inclusive range, then all versions that start with the supplied parts -of the tuple are accepted, but nothing that would be greater than the -provided tuple parts. - -* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0` -* `1.2.3 - 2` := `>=1.2.3 <3.0.0` - -#### X-Ranges `1.2.x` `1.X` `1.2.*` `*` - -Any of `X`, `x`, or `*` may be used to "stand in" for one of the -numeric values in the `[major, minor, patch]` tuple. - -* `*` := `>=0.0.0` (Any version satisfies) -* `1.x` := `>=1.0.0 <2.0.0` (Matching major version) -* `1.2.x` := `>=1.2.0 <1.3.0` (Matching major and minor versions) - -A partial version range is treated as an X-Range, so the special -character is in fact optional. - -* `""` (empty string) := `*` := `>=0.0.0` -* `1` := `1.x.x` := `>=1.0.0 <2.0.0` -* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0` - -#### Tilde Ranges `~1.2.3` `~1.2` `~1` - -Allows patch-level changes if a minor version is specified on the -comparator. Allows minor-level changes if not. - -* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0` -* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0` (Same as `1.2.x`) -* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0` (Same as `1.x`) -* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0` -* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0` (Same as `0.2.x`) -* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0` (Same as `0.x`) -* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0` Note that prereleases in - the `1.2.3` version will be allowed, if they are greater than or - equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but - `1.2.4-beta.2` would not, because it is a prerelease of a - different `[major, minor, patch]` tuple. - -#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4` - -Allows changes that do not modify the left-most non-zero digit in the -`[major, minor, patch]` tuple. In other words, this allows patch and -minor updates for versions `1.0.0` and above, patch updates for -versions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`. - -Many authors treat a `0.x` version as if the `x` were the major -"breaking-change" indicator. - -Caret ranges are ideal when an author may make breaking changes -between `0.2.4` and `0.3.0` releases, which is a common practice. -However, it presumes that there will *not* be breaking changes between -`0.2.4` and `0.2.5`. It allows for changes that are presumed to be -additive (but non-breaking), according to commonly observed practices. - -* `^1.2.3` := `>=1.2.3 <2.0.0` -* `^0.2.3` := `>=0.2.3 <0.3.0` -* `^0.0.3` := `>=0.0.3 <0.0.4` -* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0` Note that prereleases in - the `1.2.3` version will be allowed, if they are greater than or - equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but - `1.2.4-beta.2` would not, because it is a prerelease of a - different `[major, minor, patch]` tuple. -* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4` Note that prereleases in the - `0.0.3` version *only* will be allowed, if they are greater than or - equal to `beta`. So, `0.0.3-pr.2` would be allowed. - -When parsing caret ranges, a missing `patch` value desugars to the -number `0`, but will allow flexibility within that value, even if the -major and minor versions are both `0`. - -* `^1.2.x` := `>=1.2.0 <2.0.0` -* `^0.0.x` := `>=0.0.0 <0.1.0` -* `^0.0` := `>=0.0.0 <0.1.0` - -A missing `minor` and `patch` values will desugar to zero, but also -allow flexibility within those values, even if the major version is -zero. - -* `^1.x` := `>=1.0.0 <2.0.0` -* `^0.x` := `>=0.0.0 <1.0.0` - -### Range Grammar - -Putting all this together, here is a Backus-Naur grammar for ranges, -for the benefit of parser authors: - -```bnf -range-set ::= range ( logical-or range ) * -logical-or ::= ( ' ' ) * '||' ( ' ' ) * -range ::= hyphen | simple ( ' ' simple ) * | '' -hyphen ::= partial ' - ' partial -simple ::= primitive | partial | tilde | caret -primitive ::= ( '<' | '>' | '>=' | '<=' | '=' | ) partial -partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )? -xr ::= 'x' | 'X' | '*' | nr -nr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) * -tilde ::= '~' partial -caret ::= '^' partial -qualifier ::= ( '-' pre )? ( '+' build )? -pre ::= parts -build ::= parts -parts ::= part ( '.' part ) * -part ::= nr | [-0-9A-Za-z]+ -``` - -## Functions - -All methods and classes take a final `loose` boolean argument that, if -true, will be more forgiving about not-quite-valid semver strings. -The resulting output will always be 100% strict, of course. - -Strict-mode Comparators and Ranges will be strict about the SemVer -strings that they parse. - -* `valid(v)`: Return the parsed version, or null if it's not valid. -* `inc(v, release)`: Return the version incremented by the release - type (`major`, `premajor`, `minor`, `preminor`, `patch`, - `prepatch`, or `prerelease`), or null if it's not valid - * `premajor` in one call will bump the version up to the next major - version and down to a prerelease of that major version. - `preminor`, and `prepatch` work the same way. - * If called from a non-prerelease version, the `prerelease` will work the - same as `prepatch`. It increments the patch version, then makes a - prerelease. If the input version is already a prerelease it simply - increments it. -* `prerelease(v)`: Returns an array of prerelease components, or null - if none exist. Example: `prerelease('1.2.3-alpha.1') -> ['alpha', 1]` -* `major(v)`: Return the major version number. -* `minor(v)`: Return the minor version number. -* `patch(v)`: Return the patch version number. - -### Comparison - -* `gt(v1, v2)`: `v1 > v2` -* `gte(v1, v2)`: `v1 >= v2` -* `lt(v1, v2)`: `v1 < v2` -* `lte(v1, v2)`: `v1 <= v2` -* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent, - even if they're not the exact same string. You already know how to - compare strings. -* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`. -* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call - the corresponding function above. `"==="` and `"!=="` do simple - string comparison, but are included for completeness. Throws if an - invalid comparison string is provided. -* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if - `v2` is greater. Sorts in ascending order if passed to `Array.sort()`. -* `rcompare(v1, v2)`: The reverse of compare. Sorts an array of versions - in descending order when passed to `Array.sort()`. -* `diff(v1, v2)`: Returns difference between two versions by the release type - (`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`), - or null if the versions are the same. - - -### Ranges - -* `validRange(range)`: Return the valid range or null if it's not valid -* `satisfies(version, range)`: Return true if the version satisfies the - range. -* `maxSatisfying(versions, range)`: Return the highest version in the list - that satisfies the range, or `null` if none of them do. -* `minSatisfying(versions, range)`: Return the lowest version in the list - that satisfies the range, or `null` if none of them do. -* `gtr(version, range)`: Return `true` if version is greater than all the - versions possible in the range. -* `ltr(version, range)`: Return `true` if version is less than all the - versions possible in the range. -* `outside(version, range, hilo)`: Return true if the version is outside - the bounds of the range in either the high or low direction. The - `hilo` argument must be either the string `'>'` or `'<'`. (This is - the function called by `gtr` and `ltr`.) - -Note that, since ranges may be non-contiguous, a version might not be -greater than a range, less than a range, *or* satisfy a range! For -example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9` -until `2.0.0`, so the version `1.2.10` would not be greater than the -range (because `2.0.1` satisfies, which is higher), nor less than the -range (since `1.2.8` satisfies, which is lower), and it also does not -satisfy the range. - -If you want to know if a version satisfies or does not satisfy a -range, use the `satisfies(version, range)` function. diff --git a/node_modules/semver/bin/semver b/node_modules/semver/bin/semver deleted file mode 100644 index c5f2e85..0000000 --- a/node_modules/semver/bin/semver +++ /dev/null @@ -1,133 +0,0 @@ -#!/usr/bin/env node -// Standalone semver comparison program. -// Exits successfully and prints matching version(s) if -// any supplied version is valid and passes all tests. - -var argv = process.argv.slice(2) - , versions = [] - , range = [] - , gt = [] - , lt = [] - , eq = [] - , inc = null - , version = require("../package.json").version - , loose = false - , identifier = undefined - , semver = require("../semver") - , reverse = false - -main() - -function main () { - if (!argv.length) return help() - while (argv.length) { - var a = argv.shift() - var i = a.indexOf('=') - if (i !== -1) { - a = a.slice(0, i) - argv.unshift(a.slice(i + 1)) - } - switch (a) { - case "-rv": case "-rev": case "--rev": case "--reverse": - reverse = true - break - case "-l": case "--loose": - loose = true - break - case "-v": case "--version": - versions.push(argv.shift()) - break - case "-i": case "--inc": case "--increment": - switch (argv[0]) { - case "major": case "minor": case "patch": case "prerelease": - case "premajor": case "preminor": case "prepatch": - inc = argv.shift() - break - default: - inc = "patch" - break - } - break - case "--preid": - identifier = argv.shift() - break - case "-r": case "--range": - range.push(argv.shift()) - break - case "-h": case "--help": case "-?": - return help() - default: - versions.push(a) - break - } - } - - versions = versions.filter(function (v) { - return semver.valid(v, loose) - }) - if (!versions.length) return fail() - if (inc && (versions.length !== 1 || range.length)) - return failInc() - - for (var i = 0, l = range.length; i < l ; i ++) { - versions = versions.filter(function (v) { - return semver.satisfies(v, range[i], loose) - }) - if (!versions.length) return fail() - } - return success(versions) -} - -function failInc () { - console.error("--inc can only be used on a single version with no range") - fail() -} - -function fail () { process.exit(1) } - -function success () { - var compare = reverse ? "rcompare" : "compare" - versions.sort(function (a, b) { - return semver[compare](a, b, loose) - }).map(function (v) { - return semver.clean(v, loose) - }).map(function (v) { - return inc ? semver.inc(v, inc, loose, identifier) : v - }).forEach(function (v,i,_) { console.log(v) }) -} - -function help () { - console.log(["SemVer " + version - ,"" - ,"A JavaScript implementation of the http://semver.org/ specification" - ,"Copyright Isaac Z. Schlueter" - ,"" - ,"Usage: semver [options] [ [...]]" - ,"Prints valid versions sorted by SemVer precedence" - ,"" - ,"Options:" - ,"-r --range " - ," Print versions that match the specified range." - ,"" - ,"-i --increment []" - ," Increment a version by the specified level. Level can" - ," be one of: major, minor, patch, premajor, preminor," - ," prepatch, or prerelease. Default level is 'patch'." - ," Only one version may be specified." - ,"" - ,"--preid " - ," Identifier to be used to prefix premajor, preminor," - ," prepatch or prerelease version increments." - ,"" - ,"-l --loose" - ," Interpret versions and ranges loosely" - ,"" - ,"Program exits successfully if any valid version satisfies" - ,"all supplied ranges, and prints all satisfying versions." - ,"" - ,"If no satisfying versions are found, then exits failure." - ,"" - ,"Versions are printed in ascending order, so supplying" - ,"multiple versions to the utility will just sort them." - ].join("\n")) -} diff --git a/node_modules/semver/package.json b/node_modules/semver/package.json deleted file mode 100644 index d99bbf6..0000000 --- a/node_modules/semver/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "semver", - "version": "5.3.0", - "description": "The semantic version parser used by npm.", - "main": "semver.js", - "scripts": { - "test": "tap test/*.js" - }, - "devDependencies": { - "tap": "^2.0.0" - }, - "license": "ISC", - "repository": { - "type": "git", - "url": "git+https://github.com/npm/node-semver.git" - }, - "bin": { - "semver": "./bin/semver" - }, - "files": [ - "bin", - "range.bnf", - "semver.js" - ], - "gitHead": "d21444a0658224b152ce54965d02dbe0856afb84", - "bugs": { - "url": "https://github.com/npm/node-semver/issues" - }, - "homepage": "https://github.com/npm/node-semver#readme", - "_id": "semver@5.3.0", - "_shasum": "9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f", - "_from": "semver@>=5.1.0 <6.0.0", - "_npmVersion": "3.10.6", - "_nodeVersion": "4.4.4", - "_npmUser": { - "name": "isaacs", - "email": "i@izs.me" - }, - "dist": { - "shasum": "9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f", - "tarball": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "isaacs@npmjs.com" - }, - { - "name": "othiym23", - "email": "ogd@aoaioxxysz.net" - } - ], - "_npmOperationalInternal": { - "host": "packages-12-west.internal.npmjs.com", - "tmp": "tmp/semver-5.3.0.tgz_1468515166602_0.9155273644719273" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/semver/range.bnf b/node_modules/semver/range.bnf deleted file mode 100644 index 25ebd5c..0000000 --- a/node_modules/semver/range.bnf +++ /dev/null @@ -1,16 +0,0 @@ -range-set ::= range ( logical-or range ) * -logical-or ::= ( ' ' ) * '||' ( ' ' ) * -range ::= hyphen | simple ( ' ' simple ) * | '' -hyphen ::= partial ' - ' partial -simple ::= primitive | partial | tilde | caret -primitive ::= ( '<' | '>' | '>=' | '<=' | '=' | ) partial -partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )? -xr ::= 'x' | 'X' | '*' | nr -nr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) * -tilde ::= '~' partial -caret ::= '^' partial -qualifier ::= ( '-' pre )? ( '+' build )? -pre ::= parts -build ::= parts -parts ::= part ( '.' part ) * -part ::= nr | [-0-9A-Za-z]+ diff --git a/node_modules/semver/semver.js b/node_modules/semver/semver.js deleted file mode 100644 index 5f1a3c5..0000000 --- a/node_modules/semver/semver.js +++ /dev/null @@ -1,1203 +0,0 @@ -exports = module.exports = SemVer; - -// The debug function is excluded entirely from the minified version. -/* nomin */ var debug; -/* nomin */ if (typeof process === 'object' && - /* nomin */ process.env && - /* nomin */ process.env.NODE_DEBUG && - /* nomin */ /\bsemver\b/i.test(process.env.NODE_DEBUG)) - /* nomin */ debug = function() { - /* nomin */ var args = Array.prototype.slice.call(arguments, 0); - /* nomin */ args.unshift('SEMVER'); - /* nomin */ console.log.apply(console, args); - /* nomin */ }; -/* nomin */ else - /* nomin */ debug = function() {}; - -// Note: this is the semver.org version of the spec that it implements -// Not necessarily the package version of this code. -exports.SEMVER_SPEC_VERSION = '2.0.0'; - -var MAX_LENGTH = 256; -var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; - -// The actual regexps go on exports.re -var re = exports.re = []; -var src = exports.src = []; -var R = 0; - -// The following Regular Expressions can be used for tokenizing, -// validating, and parsing SemVer version strings. - -// ## Numeric Identifier -// A single `0`, or a non-zero digit followed by zero or more digits. - -var NUMERICIDENTIFIER = R++; -src[NUMERICIDENTIFIER] = '0|[1-9]\\d*'; -var NUMERICIDENTIFIERLOOSE = R++; -src[NUMERICIDENTIFIERLOOSE] = '[0-9]+'; - - -// ## Non-numeric Identifier -// Zero or more digits, followed by a letter or hyphen, and then zero or -// more letters, digits, or hyphens. - -var NONNUMERICIDENTIFIER = R++; -src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'; - - -// ## Main Version -// Three dot-separated numeric identifiers. - -var MAINVERSION = R++; -src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + - '(' + src[NUMERICIDENTIFIER] + ')\\.' + - '(' + src[NUMERICIDENTIFIER] + ')'; - -var MAINVERSIONLOOSE = R++; -src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + - '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + - '(' + src[NUMERICIDENTIFIERLOOSE] + ')'; - -// ## Pre-release Version Identifier -// A numeric identifier, or a non-numeric identifier. - -var PRERELEASEIDENTIFIER = R++; -src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + - '|' + src[NONNUMERICIDENTIFIER] + ')'; - -var PRERELEASEIDENTIFIERLOOSE = R++; -src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + - '|' + src[NONNUMERICIDENTIFIER] + ')'; - - -// ## Pre-release Version -// Hyphen, followed by one or more dot-separated pre-release version -// identifiers. - -var PRERELEASE = R++; -src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + - '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))'; - -var PRERELEASELOOSE = R++; -src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + - '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))'; - -// ## Build Metadata Identifier -// Any combination of digits, letters, or hyphens. - -var BUILDIDENTIFIER = R++; -src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+'; - -// ## Build Metadata -// Plus sign, followed by one or more period-separated build metadata -// identifiers. - -var BUILD = R++; -src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + - '(?:\\.' + src[BUILDIDENTIFIER] + ')*))'; - - -// ## Full Version String -// A main version, followed optionally by a pre-release version and -// build metadata. - -// Note that the only major, minor, patch, and pre-release sections of -// the version string are capturing groups. The build metadata is not a -// capturing group, because it should not ever be used in version -// comparison. - -var FULL = R++; -var FULLPLAIN = 'v?' + src[MAINVERSION] + - src[PRERELEASE] + '?' + - src[BUILD] + '?'; - -src[FULL] = '^' + FULLPLAIN + '$'; - -// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. -// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty -// common in the npm registry. -var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + - src[PRERELEASELOOSE] + '?' + - src[BUILD] + '?'; - -var LOOSE = R++; -src[LOOSE] = '^' + LOOSEPLAIN + '$'; - -var GTLT = R++; -src[GTLT] = '((?:<|>)?=?)'; - -// Something like "2.*" or "1.2.x". -// Note that "x.x" is a valid xRange identifer, meaning "any version" -// Only the first item is strictly required. -var XRANGEIDENTIFIERLOOSE = R++; -src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'; -var XRANGEIDENTIFIER = R++; -src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*'; - -var XRANGEPLAIN = R++; -src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + - '(?:' + src[PRERELEASE] + ')?' + - src[BUILD] + '?' + - ')?)?'; - -var XRANGEPLAINLOOSE = R++; -src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:' + src[PRERELEASELOOSE] + ')?' + - src[BUILD] + '?' + - ')?)?'; - -var XRANGE = R++; -src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'; -var XRANGELOOSE = R++; -src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$'; - -// Tilde ranges. -// Meaning is "reasonably at or greater than" -var LONETILDE = R++; -src[LONETILDE] = '(?:~>?)'; - -var TILDETRIM = R++; -src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+'; -re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g'); -var tildeTrimReplace = '$1~'; - -var TILDE = R++; -src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'; -var TILDELOOSE = R++; -src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$'; - -// Caret ranges. -// Meaning is "at least and backwards compatible with" -var LONECARET = R++; -src[LONECARET] = '(?:\\^)'; - -var CARETTRIM = R++; -src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+'; -re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g'); -var caretTrimReplace = '$1^'; - -var CARET = R++; -src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'; -var CARETLOOSE = R++; -src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$'; - -// A simple gt/lt/eq thing, or just "" to indicate "any version" -var COMPARATORLOOSE = R++; -src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$'; -var COMPARATOR = R++; -src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$'; - - -// An expression to strip any whitespace between the gtlt and the thing -// it modifies, so that `> 1.2.3` ==> `>1.2.3` -var COMPARATORTRIM = R++; -src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + - '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')'; - -// this one has to use the /g flag -re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g'); -var comparatorTrimReplace = '$1$2$3'; - - -// Something like `1.2.3 - 1.2.4` -// Note that these all use the loose form, because they'll be -// checked against either the strict or loose comparator form -// later. -var HYPHENRANGE = R++; -src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + - '\\s+-\\s+' + - '(' + src[XRANGEPLAIN] + ')' + - '\\s*$'; - -var HYPHENRANGELOOSE = R++; -src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + - '\\s+-\\s+' + - '(' + src[XRANGEPLAINLOOSE] + ')' + - '\\s*$'; - -// Star ranges basically just allow anything at all. -var STAR = R++; -src[STAR] = '(<|>)?=?\\s*\\*'; - -// Compile to actual regexp objects. -// All are flag-free, unless they were created above with a flag. -for (var i = 0; i < R; i++) { - debug(i, src[i]); - if (!re[i]) - re[i] = new RegExp(src[i]); -} - -exports.parse = parse; -function parse(version, loose) { - if (version instanceof SemVer) - return version; - - if (typeof version !== 'string') - return null; - - if (version.length > MAX_LENGTH) - return null; - - var r = loose ? re[LOOSE] : re[FULL]; - if (!r.test(version)) - return null; - - try { - return new SemVer(version, loose); - } catch (er) { - return null; - } -} - -exports.valid = valid; -function valid(version, loose) { - var v = parse(version, loose); - return v ? v.version : null; -} - - -exports.clean = clean; -function clean(version, loose) { - var s = parse(version.trim().replace(/^[=v]+/, ''), loose); - return s ? s.version : null; -} - -exports.SemVer = SemVer; - -function SemVer(version, loose) { - if (version instanceof SemVer) { - if (version.loose === loose) - return version; - else - version = version.version; - } else if (typeof version !== 'string') { - throw new TypeError('Invalid Version: ' + version); - } - - if (version.length > MAX_LENGTH) - throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') - - if (!(this instanceof SemVer)) - return new SemVer(version, loose); - - debug('SemVer', version, loose); - this.loose = loose; - var m = version.trim().match(loose ? re[LOOSE] : re[FULL]); - - if (!m) - throw new TypeError('Invalid Version: ' + version); - - this.raw = version; - - // these are actually numbers - this.major = +m[1]; - this.minor = +m[2]; - this.patch = +m[3]; - - if (this.major > MAX_SAFE_INTEGER || this.major < 0) - throw new TypeError('Invalid major version') - - if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) - throw new TypeError('Invalid minor version') - - if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) - throw new TypeError('Invalid patch version') - - // numberify any prerelease numeric ids - if (!m[4]) - this.prerelease = []; - else - this.prerelease = m[4].split('.').map(function(id) { - if (/^[0-9]+$/.test(id)) { - var num = +id; - if (num >= 0 && num < MAX_SAFE_INTEGER) - return num; - } - return id; - }); - - this.build = m[5] ? m[5].split('.') : []; - this.format(); -} - -SemVer.prototype.format = function() { - this.version = this.major + '.' + this.minor + '.' + this.patch; - if (this.prerelease.length) - this.version += '-' + this.prerelease.join('.'); - return this.version; -}; - -SemVer.prototype.toString = function() { - return this.version; -}; - -SemVer.prototype.compare = function(other) { - debug('SemVer.compare', this.version, this.loose, other); - if (!(other instanceof SemVer)) - other = new SemVer(other, this.loose); - - return this.compareMain(other) || this.comparePre(other); -}; - -SemVer.prototype.compareMain = function(other) { - if (!(other instanceof SemVer)) - other = new SemVer(other, this.loose); - - return compareIdentifiers(this.major, other.major) || - compareIdentifiers(this.minor, other.minor) || - compareIdentifiers(this.patch, other.patch); -}; - -SemVer.prototype.comparePre = function(other) { - if (!(other instanceof SemVer)) - other = new SemVer(other, this.loose); - - // NOT having a prerelease is > having one - if (this.prerelease.length && !other.prerelease.length) - return -1; - else if (!this.prerelease.length && other.prerelease.length) - return 1; - else if (!this.prerelease.length && !other.prerelease.length) - return 0; - - var i = 0; - do { - var a = this.prerelease[i]; - var b = other.prerelease[i]; - debug('prerelease compare', i, a, b); - if (a === undefined && b === undefined) - return 0; - else if (b === undefined) - return 1; - else if (a === undefined) - return -1; - else if (a === b) - continue; - else - return compareIdentifiers(a, b); - } while (++i); -}; - -// preminor will bump the version up to the next minor release, and immediately -// down to pre-release. premajor and prepatch work the same way. -SemVer.prototype.inc = function(release, identifier) { - switch (release) { - case 'premajor': - this.prerelease.length = 0; - this.patch = 0; - this.minor = 0; - this.major++; - this.inc('pre', identifier); - break; - case 'preminor': - this.prerelease.length = 0; - this.patch = 0; - this.minor++; - this.inc('pre', identifier); - break; - case 'prepatch': - // If this is already a prerelease, it will bump to the next version - // drop any prereleases that might already exist, since they are not - // relevant at this point. - this.prerelease.length = 0; - this.inc('patch', identifier); - this.inc('pre', identifier); - break; - // If the input is a non-prerelease version, this acts the same as - // prepatch. - case 'prerelease': - if (this.prerelease.length === 0) - this.inc('patch', identifier); - this.inc('pre', identifier); - break; - - case 'major': - // If this is a pre-major version, bump up to the same major version. - // Otherwise increment major. - // 1.0.0-5 bumps to 1.0.0 - // 1.1.0 bumps to 2.0.0 - if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) - this.major++; - this.minor = 0; - this.patch = 0; - this.prerelease = []; - break; - case 'minor': - // If this is a pre-minor version, bump up to the same minor version. - // Otherwise increment minor. - // 1.2.0-5 bumps to 1.2.0 - // 1.2.1 bumps to 1.3.0 - if (this.patch !== 0 || this.prerelease.length === 0) - this.minor++; - this.patch = 0; - this.prerelease = []; - break; - case 'patch': - // If this is not a pre-release version, it will increment the patch. - // If it is a pre-release it will bump up to the same patch version. - // 1.2.0-5 patches to 1.2.0 - // 1.2.0 patches to 1.2.1 - if (this.prerelease.length === 0) - this.patch++; - this.prerelease = []; - break; - // This probably shouldn't be used publicly. - // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. - case 'pre': - if (this.prerelease.length === 0) - this.prerelease = [0]; - else { - var i = this.prerelease.length; - while (--i >= 0) { - if (typeof this.prerelease[i] === 'number') { - this.prerelease[i]++; - i = -2; - } - } - if (i === -1) // didn't increment anything - this.prerelease.push(0); - } - if (identifier) { - // 1.2.0-beta.1 bumps to 1.2.0-beta.2, - // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 - if (this.prerelease[0] === identifier) { - if (isNaN(this.prerelease[1])) - this.prerelease = [identifier, 0]; - } else - this.prerelease = [identifier, 0]; - } - break; - - default: - throw new Error('invalid increment argument: ' + release); - } - this.format(); - this.raw = this.version; - return this; -}; - -exports.inc = inc; -function inc(version, release, loose, identifier) { - if (typeof(loose) === 'string') { - identifier = loose; - loose = undefined; - } - - try { - return new SemVer(version, loose).inc(release, identifier).version; - } catch (er) { - return null; - } -} - -exports.diff = diff; -function diff(version1, version2) { - if (eq(version1, version2)) { - return null; - } else { - var v1 = parse(version1); - var v2 = parse(version2); - if (v1.prerelease.length || v2.prerelease.length) { - for (var key in v1) { - if (key === 'major' || key === 'minor' || key === 'patch') { - if (v1[key] !== v2[key]) { - return 'pre'+key; - } - } - } - return 'prerelease'; - } - for (var key in v1) { - if (key === 'major' || key === 'minor' || key === 'patch') { - if (v1[key] !== v2[key]) { - return key; - } - } - } - } -} - -exports.compareIdentifiers = compareIdentifiers; - -var numeric = /^[0-9]+$/; -function compareIdentifiers(a, b) { - var anum = numeric.test(a); - var bnum = numeric.test(b); - - if (anum && bnum) { - a = +a; - b = +b; - } - - return (anum && !bnum) ? -1 : - (bnum && !anum) ? 1 : - a < b ? -1 : - a > b ? 1 : - 0; -} - -exports.rcompareIdentifiers = rcompareIdentifiers; -function rcompareIdentifiers(a, b) { - return compareIdentifiers(b, a); -} - -exports.major = major; -function major(a, loose) { - return new SemVer(a, loose).major; -} - -exports.minor = minor; -function minor(a, loose) { - return new SemVer(a, loose).minor; -} - -exports.patch = patch; -function patch(a, loose) { - return new SemVer(a, loose).patch; -} - -exports.compare = compare; -function compare(a, b, loose) { - return new SemVer(a, loose).compare(b); -} - -exports.compareLoose = compareLoose; -function compareLoose(a, b) { - return compare(a, b, true); -} - -exports.rcompare = rcompare; -function rcompare(a, b, loose) { - return compare(b, a, loose); -} - -exports.sort = sort; -function sort(list, loose) { - return list.sort(function(a, b) { - return exports.compare(a, b, loose); - }); -} - -exports.rsort = rsort; -function rsort(list, loose) { - return list.sort(function(a, b) { - return exports.rcompare(a, b, loose); - }); -} - -exports.gt = gt; -function gt(a, b, loose) { - return compare(a, b, loose) > 0; -} - -exports.lt = lt; -function lt(a, b, loose) { - return compare(a, b, loose) < 0; -} - -exports.eq = eq; -function eq(a, b, loose) { - return compare(a, b, loose) === 0; -} - -exports.neq = neq; -function neq(a, b, loose) { - return compare(a, b, loose) !== 0; -} - -exports.gte = gte; -function gte(a, b, loose) { - return compare(a, b, loose) >= 0; -} - -exports.lte = lte; -function lte(a, b, loose) { - return compare(a, b, loose) <= 0; -} - -exports.cmp = cmp; -function cmp(a, op, b, loose) { - var ret; - switch (op) { - case '===': - if (typeof a === 'object') a = a.version; - if (typeof b === 'object') b = b.version; - ret = a === b; - break; - case '!==': - if (typeof a === 'object') a = a.version; - if (typeof b === 'object') b = b.version; - ret = a !== b; - break; - case '': case '=': case '==': ret = eq(a, b, loose); break; - case '!=': ret = neq(a, b, loose); break; - case '>': ret = gt(a, b, loose); break; - case '>=': ret = gte(a, b, loose); break; - case '<': ret = lt(a, b, loose); break; - case '<=': ret = lte(a, b, loose); break; - default: throw new TypeError('Invalid operator: ' + op); - } - return ret; -} - -exports.Comparator = Comparator; -function Comparator(comp, loose) { - if (comp instanceof Comparator) { - if (comp.loose === loose) - return comp; - else - comp = comp.value; - } - - if (!(this instanceof Comparator)) - return new Comparator(comp, loose); - - debug('comparator', comp, loose); - this.loose = loose; - this.parse(comp); - - if (this.semver === ANY) - this.value = ''; - else - this.value = this.operator + this.semver.version; - - debug('comp', this); -} - -var ANY = {}; -Comparator.prototype.parse = function(comp) { - var r = this.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; - var m = comp.match(r); - - if (!m) - throw new TypeError('Invalid comparator: ' + comp); - - this.operator = m[1]; - if (this.operator === '=') - this.operator = ''; - - // if it literally is just '>' or '' then allow anything. - if (!m[2]) - this.semver = ANY; - else - this.semver = new SemVer(m[2], this.loose); -}; - -Comparator.prototype.toString = function() { - return this.value; -}; - -Comparator.prototype.test = function(version) { - debug('Comparator.test', version, this.loose); - - if (this.semver === ANY) - return true; - - if (typeof version === 'string') - version = new SemVer(version, this.loose); - - return cmp(version, this.operator, this.semver, this.loose); -}; - - -exports.Range = Range; -function Range(range, loose) { - if ((range instanceof Range) && range.loose === loose) - return range; - - if (!(this instanceof Range)) - return new Range(range, loose); - - this.loose = loose; - - // First, split based on boolean or || - this.raw = range; - this.set = range.split(/\s*\|\|\s*/).map(function(range) { - return this.parseRange(range.trim()); - }, this).filter(function(c) { - // throw out any that are not relevant for whatever reason - return c.length; - }); - - if (!this.set.length) { - throw new TypeError('Invalid SemVer Range: ' + range); - } - - this.format(); -} - -Range.prototype.format = function() { - this.range = this.set.map(function(comps) { - return comps.join(' ').trim(); - }).join('||').trim(); - return this.range; -}; - -Range.prototype.toString = function() { - return this.range; -}; - -Range.prototype.parseRange = function(range) { - var loose = this.loose; - range = range.trim(); - debug('range', range, loose); - // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` - var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]; - range = range.replace(hr, hyphenReplace); - debug('hyphen replace', range); - // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` - range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace); - debug('comparator trim', range, re[COMPARATORTRIM]); - - // `~ 1.2.3` => `~1.2.3` - range = range.replace(re[TILDETRIM], tildeTrimReplace); - - // `^ 1.2.3` => `^1.2.3` - range = range.replace(re[CARETTRIM], caretTrimReplace); - - // normalize spaces - range = range.split(/\s+/).join(' '); - - // At this point, the range is completely trimmed and - // ready to be split into comparators. - - var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; - var set = range.split(' ').map(function(comp) { - return parseComparator(comp, loose); - }).join(' ').split(/\s+/); - if (this.loose) { - // in loose mode, throw out any that are not valid comparators - set = set.filter(function(comp) { - return !!comp.match(compRe); - }); - } - set = set.map(function(comp) { - return new Comparator(comp, loose); - }); - - return set; -}; - -// Mostly just for testing and legacy API reasons -exports.toComparators = toComparators; -function toComparators(range, loose) { - return new Range(range, loose).set.map(function(comp) { - return comp.map(function(c) { - return c.value; - }).join(' ').trim().split(' '); - }); -} - -// comprised of xranges, tildes, stars, and gtlt's at this point. -// already replaced the hyphen ranges -// turn into a set of JUST comparators. -function parseComparator(comp, loose) { - debug('comp', comp); - comp = replaceCarets(comp, loose); - debug('caret', comp); - comp = replaceTildes(comp, loose); - debug('tildes', comp); - comp = replaceXRanges(comp, loose); - debug('xrange', comp); - comp = replaceStars(comp, loose); - debug('stars', comp); - return comp; -} - -function isX(id) { - return !id || id.toLowerCase() === 'x' || id === '*'; -} - -// ~, ~> --> * (any, kinda silly) -// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 -// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 -// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 -// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 -// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 -function replaceTildes(comp, loose) { - return comp.trim().split(/\s+/).map(function(comp) { - return replaceTilde(comp, loose); - }).join(' '); -} - -function replaceTilde(comp, loose) { - var r = loose ? re[TILDELOOSE] : re[TILDE]; - return comp.replace(r, function(_, M, m, p, pr) { - debug('tilde', comp, _, M, m, p, pr); - var ret; - - if (isX(M)) - ret = ''; - else if (isX(m)) - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; - else if (isX(p)) - // ~1.2 == >=1.2.0 <1.3.0 - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; - else if (pr) { - debug('replaceTilde pr', pr); - if (pr.charAt(0) !== '-') - pr = '-' + pr; - ret = '>=' + M + '.' + m + '.' + p + pr + - ' <' + M + '.' + (+m + 1) + '.0'; - } else - // ~1.2.3 == >=1.2.3 <1.3.0 - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + (+m + 1) + '.0'; - - debug('tilde return', ret); - return ret; - }); -} - -// ^ --> * (any, kinda silly) -// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 -// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 -// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 -// ^1.2.3 --> >=1.2.3 <2.0.0 -// ^1.2.0 --> >=1.2.0 <2.0.0 -function replaceCarets(comp, loose) { - return comp.trim().split(/\s+/).map(function(comp) { - return replaceCaret(comp, loose); - }).join(' '); -} - -function replaceCaret(comp, loose) { - debug('caret', comp, loose); - var r = loose ? re[CARETLOOSE] : re[CARET]; - return comp.replace(r, function(_, M, m, p, pr) { - debug('caret', comp, _, M, m, p, pr); - var ret; - - if (isX(M)) - ret = ''; - else if (isX(m)) - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; - else if (isX(p)) { - if (M === '0') - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; - else - ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'; - } else if (pr) { - debug('replaceCaret pr', pr); - if (pr.charAt(0) !== '-') - pr = '-' + pr; - if (M === '0') { - if (m === '0') - ret = '>=' + M + '.' + m + '.' + p + pr + - ' <' + M + '.' + m + '.' + (+p + 1); - else - ret = '>=' + M + '.' + m + '.' + p + pr + - ' <' + M + '.' + (+m + 1) + '.0'; - } else - ret = '>=' + M + '.' + m + '.' + p + pr + - ' <' + (+M + 1) + '.0.0'; - } else { - debug('no pr'); - if (M === '0') { - if (m === '0') - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + m + '.' + (+p + 1); - else - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + (+m + 1) + '.0'; - } else - ret = '>=' + M + '.' + m + '.' + p + - ' <' + (+M + 1) + '.0.0'; - } - - debug('caret return', ret); - return ret; - }); -} - -function replaceXRanges(comp, loose) { - debug('replaceXRanges', comp, loose); - return comp.split(/\s+/).map(function(comp) { - return replaceXRange(comp, loose); - }).join(' '); -} - -function replaceXRange(comp, loose) { - comp = comp.trim(); - var r = loose ? re[XRANGELOOSE] : re[XRANGE]; - return comp.replace(r, function(ret, gtlt, M, m, p, pr) { - debug('xRange', comp, ret, gtlt, M, m, p, pr); - var xM = isX(M); - var xm = xM || isX(m); - var xp = xm || isX(p); - var anyX = xp; - - if (gtlt === '=' && anyX) - gtlt = ''; - - if (xM) { - if (gtlt === '>' || gtlt === '<') { - // nothing is allowed - ret = '<0.0.0'; - } else { - // nothing is forbidden - ret = '*'; - } - } else if (gtlt && anyX) { - // replace X with 0 - if (xm) - m = 0; - if (xp) - p = 0; - - if (gtlt === '>') { - // >1 => >=2.0.0 - // >1.2 => >=1.3.0 - // >1.2.3 => >= 1.2.4 - gtlt = '>='; - if (xm) { - M = +M + 1; - m = 0; - p = 0; - } else if (xp) { - m = +m + 1; - p = 0; - } - } else if (gtlt === '<=') { - // <=0.7.x is actually <0.8.0, since any 0.7.x should - // pass. Similarly, <=7.x is actually <8.0.0, etc. - gtlt = '<'; - if (xm) - M = +M + 1; - else - m = +m + 1; - } - - ret = gtlt + M + '.' + m + '.' + p; - } else if (xm) { - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; - } else if (xp) { - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; - } - - debug('xRange return', ret); - - return ret; - }); -} - -// Because * is AND-ed with everything else in the comparator, -// and '' means "any version", just remove the *s entirely. -function replaceStars(comp, loose) { - debug('replaceStars', comp, loose); - // Looseness is ignored here. star is always as loose as it gets! - return comp.trim().replace(re[STAR], ''); -} - -// This function is passed to string.replace(re[HYPHENRANGE]) -// M, m, patch, prerelease, build -// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 -// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do -// 1.2 - 3.4 => >=1.2.0 <3.5.0 -function hyphenReplace($0, - from, fM, fm, fp, fpr, fb, - to, tM, tm, tp, tpr, tb) { - - if (isX(fM)) - from = ''; - else if (isX(fm)) - from = '>=' + fM + '.0.0'; - else if (isX(fp)) - from = '>=' + fM + '.' + fm + '.0'; - else - from = '>=' + from; - - if (isX(tM)) - to = ''; - else if (isX(tm)) - to = '<' + (+tM + 1) + '.0.0'; - else if (isX(tp)) - to = '<' + tM + '.' + (+tm + 1) + '.0'; - else if (tpr) - to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr; - else - to = '<=' + to; - - return (from + ' ' + to).trim(); -} - - -// if ANY of the sets match ALL of its comparators, then pass -Range.prototype.test = function(version) { - if (!version) - return false; - - if (typeof version === 'string') - version = new SemVer(version, this.loose); - - for (var i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version)) - return true; - } - return false; -}; - -function testSet(set, version) { - for (var i = 0; i < set.length; i++) { - if (!set[i].test(version)) - return false; - } - - if (version.prerelease.length) { - // Find the set of versions that are allowed to have prereleases - // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 - // That should allow `1.2.3-pr.2` to pass. - // However, `1.2.4-alpha.notready` should NOT be allowed, - // even though it's within the range set by the comparators. - for (var i = 0; i < set.length; i++) { - debug(set[i].semver); - if (set[i].semver === ANY) - continue; - - if (set[i].semver.prerelease.length > 0) { - var allowed = set[i].semver; - if (allowed.major === version.major && - allowed.minor === version.minor && - allowed.patch === version.patch) - return true; - } - } - - // Version has a -pre, but it's not one of the ones we like. - return false; - } - - return true; -} - -exports.satisfies = satisfies; -function satisfies(version, range, loose) { - try { - range = new Range(range, loose); - } catch (er) { - return false; - } - return range.test(version); -} - -exports.maxSatisfying = maxSatisfying; -function maxSatisfying(versions, range, loose) { - return versions.filter(function(version) { - return satisfies(version, range, loose); - }).sort(function(a, b) { - return rcompare(a, b, loose); - })[0] || null; -} - -exports.minSatisfying = minSatisfying; -function minSatisfying(versions, range, loose) { - return versions.filter(function(version) { - return satisfies(version, range, loose); - }).sort(function(a, b) { - return compare(a, b, loose); - })[0] || null; -} - -exports.validRange = validRange; -function validRange(range, loose) { - try { - // Return '*' instead of '' so that truthiness works. - // This will throw if it's invalid anyway - return new Range(range, loose).range || '*'; - } catch (er) { - return null; - } -} - -// Determine if version is less than all the versions possible in the range -exports.ltr = ltr; -function ltr(version, range, loose) { - return outside(version, range, '<', loose); -} - -// Determine if version is greater than all the versions possible in the range. -exports.gtr = gtr; -function gtr(version, range, loose) { - return outside(version, range, '>', loose); -} - -exports.outside = outside; -function outside(version, range, hilo, loose) { - version = new SemVer(version, loose); - range = new Range(range, loose); - - var gtfn, ltefn, ltfn, comp, ecomp; - switch (hilo) { - case '>': - gtfn = gt; - ltefn = lte; - ltfn = lt; - comp = '>'; - ecomp = '>='; - break; - case '<': - gtfn = lt; - ltefn = gte; - ltfn = gt; - comp = '<'; - ecomp = '<='; - break; - default: - throw new TypeError('Must provide a hilo val of "<" or ">"'); - } - - // If it satisifes the range it is not outside - if (satisfies(version, range, loose)) { - return false; - } - - // From now on, variable terms are as if we're in "gtr" mode. - // but note that everything is flipped for the "ltr" function. - - for (var i = 0; i < range.set.length; ++i) { - var comparators = range.set[i]; - - var high = null; - var low = null; - - comparators.forEach(function(comparator) { - if (comparator.semver === ANY) { - comparator = new Comparator('>=0.0.0') - } - high = high || comparator; - low = low || comparator; - if (gtfn(comparator.semver, high.semver, loose)) { - high = comparator; - } else if (ltfn(comparator.semver, low.semver, loose)) { - low = comparator; - } - }); - - // If the edge version comparator has a operator then our version - // isn't outside it - if (high.operator === comp || high.operator === ecomp) { - return false; - } - - // If the lowest version comparator has an operator and our version - // is less than it then it isn't higher than the range - if ((!low.operator || low.operator === comp) && - ltefn(version, low.semver)) { - return false; - } else if (low.operator === ecomp && ltfn(version, low.semver)) { - return false; - } - } - return true; -} - -exports.prerelease = prerelease; -function prerelease(version, loose) { - var parsed = parse(version, loose); - return (parsed && parsed.prerelease.length) ? parsed.prerelease : null; -} diff --git a/node_modules/shelljs/.editorconfig b/node_modules/shelljs/.editorconfig deleted file mode 100644 index a35cd0d..0000000 --- a/node_modules/shelljs/.editorconfig +++ /dev/null @@ -1,14 +0,0 @@ -# editorconfig.org - -root = true - -[*] -charset = utf-8 -end_of_line = lf -indent_size = 2 -indent_style = space -insert_final_newline = true -trim_trailing_whitespace = true - -[*.{md,markdown}] -trim_trailing_whitespace = false diff --git a/node_modules/shelljs/.eslintrc.json b/node_modules/shelljs/.eslintrc.json deleted file mode 100644 index 4f98ed0..0000000 --- a/node_modules/shelljs/.eslintrc.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "env": { - "node": true - }, - "extends": "airbnb-base/legacy", - "rules": { - "comma-dangle": 0, - "global-require": 0, - "vars-on-top": 0, - "spaced-comment": [2, "always", { "markers": ["@", "@include"], "exceptions": ["@"] }], - "no-param-reassign": 0, - "no-console": 0, - "curly": [2, "multi-line"], - "func-names": 0, - "quote-props": 0, - "no-underscore-dangle": 0, - "max-len": 0, - "no-use-before-define": 0, - "no-empty": 0, - "no-else-return": 0, - "no-throw-literal": 0, - "newline-per-chained-call": 0, - "consistent-return": 0, - "no-mixed-operators": 0, - "no-prototype-builtins": 0, - "new-cap": [2, { - "capIsNewExceptions": [ - "ShellString" - ]} - ] - } -} diff --git a/node_modules/shelljs/.npmignore b/node_modules/shelljs/.npmignore deleted file mode 100644 index e5c8da9..0000000 --- a/node_modules/shelljs/.npmignore +++ /dev/null @@ -1,13 +0,0 @@ -test/ -tmp/ -.github/ -.documentup.json -.gitignore -.eslintrc -.eslintignore -.lgtm -.travis.yml -.gitattributes -appveyor.yml -RELEASE.md -CONTRIBUTING.md diff --git a/node_modules/shelljs/CHANGELOG.md b/node_modules/shelljs/CHANGELOG.md deleted file mode 100644 index e37880f..0000000 --- a/node_modules/shelljs/CHANGELOG.md +++ /dev/null @@ -1,599 +0,0 @@ -# Change Log - -## [Unreleased](https://github.com/shelljs/shelljs/tree/HEAD) - -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.4...HEAD) - -**Closed issues:** - -- Project objectives: there is some higher goal to achieve? [\#533](https://github.com/shelljs/shelljs/issues/533) -- fs.existsSync is un-deprecated [\#531](https://github.com/shelljs/shelljs/issues/531) -- Inadvertent breaking change to shell.test\(\) [\#529](https://github.com/shelljs/shelljs/issues/529) -- Add -u flag support for cp [\#526](https://github.com/shelljs/shelljs/issues/526) -- API request: allow `plugin.error\(\)` to take an options parameter [\#522](https://github.com/shelljs/shelljs/issues/522) -- FS Real Path error thrown when requiring shelljs [\#521](https://github.com/shelljs/shelljs/issues/521) -- Question: passing code via pipe? [\#520](https://github.com/shelljs/shelljs/issues/520) -- The performance in `cp` is different between `0.6.0` and `0.7.4` [\#517](https://github.com/shelljs/shelljs/issues/517) -- ShellJS in Electron package don't find ffmpeg anymore [\#516](https://github.com/shelljs/shelljs/issues/516) -- Exec issues with string option introduced in 0.7.4 [\#515](https://github.com/shelljs/shelljs/issues/515) -- \[ Feature \] SSH command [\#435](https://github.com/shelljs/shelljs/issues/435) -- Synchronous exec stalls permenantly when there is an error/w the shell [\#7](https://github.com/shelljs/shelljs/issues/7) - -**Merged pull requests:** - -- feat: plugin.error\(\) takes an options parameter [\#535](https://github.com/shelljs/shelljs/pull/535) ([nfischer](https://github.com/nfischer)) -- Revert "refactor: replace fs.existsSync" fixes\(\#531\) [\#532](https://github.com/shelljs/shelljs/pull/532) ([gyandeeps](https://github.com/gyandeeps)) -- Fix: Remove default glob from shell.test \(fixes \#529\) [\#530](https://github.com/shelljs/shelljs/pull/530) ([gyandeeps](https://github.com/gyandeeps)) -- feat: cp -u option [\#527](https://github.com/shelljs/shelljs/pull/527) ([nfischer](https://github.com/nfischer)) -- chore: add downloads per month on README [\#513](https://github.com/shelljs/shelljs/pull/513) ([nfischer](https://github.com/nfischer)) - -## [v0.7.4](https://github.com/shelljs/shelljs/tree/v0.7.4) (2016-08-26) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.3...v0.7.4) - -**Closed issues:** - -- fix: echo -e should not print "-e" [\#510](https://github.com/shelljs/shelljs/issues/510) -- Wrong method signature in doc [\#498](https://github.com/shelljs/shelljs/issues/498) -- readFromPipe should be a function with no arguments [\#485](https://github.com/shelljs/shelljs/issues/485) -- TypeError: Cannot read property 'toString' of undefined [\#471](https://github.com/shelljs/shelljs/issues/471) - -**Merged pull requests:** - -- fix: echo supports -e option properly [\#511](https://github.com/shelljs/shelljs/pull/511) ([nfischer](https://github.com/nfischer)) -- refactor: replace fs.existsSync [\#509](https://github.com/shelljs/shelljs/pull/509) ([nfischer](https://github.com/nfischer)) -- refactor: readFromPipe\(\) requires no arguments [\#506](https://github.com/shelljs/shelljs/pull/506) ([nfischer](https://github.com/nfischer)) -- chore: switch to eslint [\#504](https://github.com/shelljs/shelljs/pull/504) ([nfischer](https://github.com/nfischer)) -- feat: add overWrite option for commands [\#503](https://github.com/shelljs/shelljs/pull/503) ([nfischer](https://github.com/nfischer)) -- chore: update issue template [\#502](https://github.com/shelljs/shelljs/pull/502) ([nfischer](https://github.com/nfischer)) -- fixed head/tail readme [\#499](https://github.com/shelljs/shelljs/pull/499) ([charlesread](https://github.com/charlesread)) - -## [v0.7.3](https://github.com/shelljs/shelljs/tree/v0.7.3) (2016-07-27) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.2...v0.7.3) - -**Closed issues:** - -- expose execSync [\#494](https://github.com/shelljs/shelljs/issues/494) -- Add a way to create commands that can receive from a pipe without being standalone commands [\#487](https://github.com/shelljs/shelljs/issues/487) -- cp -r breaks when the directory contains a softlink [\#193](https://github.com/shelljs/shelljs/issues/193) -- Redirect output to file fails [\#60](https://github.com/shelljs/shelljs/issues/60) -- We need sed -n ? [\#38](https://github.com/shelljs/shelljs/issues/38) - -**Merged pull requests:** - -- refactor: allow pipeOnly commands \(methods on ShellStrings\) [\#493](https://github.com/shelljs/shelljs/pull/493) ([nfischer](https://github.com/nfischer)) -- refactor: glob by default for commands [\#492](https://github.com/shelljs/shelljs/pull/492) ([nfischer](https://github.com/nfischer)) -- refactor: switch from notUnix to unix in wrap\(\) [\#491](https://github.com/shelljs/shelljs/pull/491) ([nfischer](https://github.com/nfischer)) -- refactor: switch common.extend\(\) to Object.assign ponyfill [\#490](https://github.com/shelljs/shelljs/pull/490) ([nfischer](https://github.com/nfischer)) -- fix: conflicting options now properly override each other [\#489](https://github.com/shelljs/shelljs/pull/489) ([nfischer](https://github.com/nfischer)) -- refactor: expose plugin utils & add initial tests [\#484](https://github.com/shelljs/shelljs/pull/484) ([nfischer](https://github.com/nfischer)) - -## [v0.7.2](https://github.com/shelljs/shelljs/tree/v0.7.2) (2016-07-25) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.1...v0.7.2) - -**Closed issues:** - -- shelljs should not kill process if node call throws exception [\#473](https://github.com/shelljs/shelljs/issues/473) -- `cp` work incorrectly when folder name contains '@' [\#463](https://github.com/shelljs/shelljs/issues/463) -- Something went wrong [\#158](https://github.com/shelljs/shelljs/issues/158) - -**Merged pull requests:** - -- fix: resolve a cylcic-dependency problem [\#482](https://github.com/shelljs/shelljs/pull/482) ([nfischer](https://github.com/nfischer)) -- refactor: add wrapOutput option to auto-ShellString-ify command output [\#481](https://github.com/shelljs/shelljs/pull/481) ([nfischer](https://github.com/nfischer)) -- refactor: move option parsing into common.wrap\(\) [\#479](https://github.com/shelljs/shelljs/pull/479) ([nfischer](https://github.com/nfischer)) -- refactor: hook new uniq\(\) command using new format [\#478](https://github.com/shelljs/shelljs/pull/478) ([nfischer](https://github.com/nfischer)) -- Fix mkdir malformed path [\#477](https://github.com/shelljs/shelljs/pull/477) ([nfischer](https://github.com/nfischer)) -- fix: mkdir for invalid perms does not kill process [\#474](https://github.com/shelljs/shelljs/pull/474) ([nfischer](https://github.com/nfischer)) -- feat\(command\): new command: uniq\(\) [\#453](https://github.com/shelljs/shelljs/pull/453) ([joshi-sh](https://github.com/joshi-sh)) - -## [v0.7.1](https://github.com/shelljs/shelljs/tree/v0.7.1) (2016-07-22) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.7.0...v0.7.1) - -**Closed issues:** - -- cp -n doesn't work correctly [\#465](https://github.com/shelljs/shelljs/issues/465) -- how can i run sudo apt-get install xtodotool by your plugin? [\#448](https://github.com/shelljs/shelljs/issues/448) -- shell.js grep: internal error, Invalid regular expression [\#447](https://github.com/shelljs/shelljs/issues/447) -- Stdout is empty on Git log command [\#439](https://github.com/shelljs/shelljs/issues/439) -- Cannot read toString of null when using execSync [\#415](https://github.com/shelljs/shelljs/issues/415) -- cp -R dir/ target fails to copy hidden files in dir [\#140](https://github.com/shelljs/shelljs/issues/140) -- Adding callback to basic commands [\#102](https://github.com/shelljs/shelljs/issues/102) -- \#mv Won't Work Across Disks [\#1](https://github.com/shelljs/shelljs/issues/1) - -**Merged pull requests:** - -- refactor: commands now register themselves [\#475](https://github.com/shelljs/shelljs/pull/475) ([nfischer](https://github.com/nfischer)) -- chore: switch to shields.io, and add npm badge [\#470](https://github.com/shelljs/shelljs/pull/470) ([nfischer](https://github.com/nfischer)) -- fix\(cp\): -n option no longer raises error [\#466](https://github.com/shelljs/shelljs/pull/466) ([nfischer](https://github.com/nfischer)) -- refactor: expose pipe-ability to command configuration [\#464](https://github.com/shelljs/shelljs/pull/464) ([nfischer](https://github.com/nfischer)) -- fix\(mv\): works across partitions [\#461](https://github.com/shelljs/shelljs/pull/461) ([nfischer](https://github.com/nfischer)) -- chore: switch to shelljs-changelog [\#460](https://github.com/shelljs/shelljs/pull/460) ([nfischer](https://github.com/nfischer)) -- chore: update release process [\#459](https://github.com/shelljs/shelljs/pull/459) ([nfischer](https://github.com/nfischer)) -- chore: revert depreciate shelljs/make \(\#431\) [\#458](https://github.com/shelljs/shelljs/pull/458) ([zephraph](https://github.com/zephraph)) -- chore: clarify message for when docs are not generated [\#457](https://github.com/shelljs/shelljs/pull/457) ([nfischer](https://github.com/nfischer)) -- chore\(gendocs\): add `npm run gendocs` command [\#455](https://github.com/shelljs/shelljs/pull/455) ([nfischer](https://github.com/nfischer)) -- chore: update jshint and move it to an npm script [\#454](https://github.com/shelljs/shelljs/pull/454) ([nfischer](https://github.com/nfischer)) -- test\(ls\): add case for trailing slash on dir name [\#450](https://github.com/shelljs/shelljs/pull/450) ([nfischer](https://github.com/nfischer)) -- docs\(exec\): explicitly mention the `shell` option [\#449](https://github.com/shelljs/shelljs/pull/449) ([nfischer](https://github.com/nfischer)) -- chore: setup changelog [\#443](https://github.com/shelljs/shelljs/pull/443) ([levithomason](https://github.com/levithomason)) -- docs: comment code better to help contributors [\#437](https://github.com/shelljs/shelljs/pull/437) ([nfischer](https://github.com/nfischer)) -- chore\(CI\): update appveyor [\#436](https://github.com/shelljs/shelljs/pull/436) ([nfischer](https://github.com/nfischer)) -- chore: test against node v6 [\#433](https://github.com/shelljs/shelljs/pull/433) ([nfischer](https://github.com/nfischer)) -- chore\(make\): depreciate shelljs/make [\#431](https://github.com/shelljs/shelljs/pull/431) ([ariporad](https://github.com/ariporad)) -- docs: warn that README contains newest features [\#410](https://github.com/shelljs/shelljs/pull/410) ([nfischer](https://github.com/nfischer)) - -## [v0.7.0](https://github.com/shelljs/shelljs/tree/v0.7.0) (2016-04-25) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.6.0...v0.7.0) - -**Closed issues:** - -- exec\('nohup node some.js &'\) [\#426](https://github.com/shelljs/shelljs/issues/426) -- cp copy to symlinked folder [\#414](https://github.com/shelljs/shelljs/issues/414) -- Invalid version number \(0.0.1alpha1\) [\#399](https://github.com/shelljs/shelljs/issues/399) -- shelljs Breaks SemVer for Alpha and Pre-Release Versions [\#390](https://github.com/shelljs/shelljs/issues/390) -- Copy not accepting source end with wildcards \* when using -r on v0.6.0 [\#389](https://github.com/shelljs/shelljs/issues/389) -- Support globbing in `shjs` [\#388](https://github.com/shelljs/shelljs/issues/388) -- Refactor more commands to return ShellString [\#373](https://github.com/shelljs/shelljs/issues/373) -- ln\('-sf', './', '\'\) is not linking the right folder [\#363](https://github.com/shelljs/shelljs/issues/363) -- v0.6.0 - shell.cp\('r', '/foo/\*, '/bar'\) fails with /foo/\* no such file or directory [\#342](https://github.com/shelljs/shelljs/issues/342) -- Add documentup as a webhook [\#327](https://github.com/shelljs/shelljs/issues/327) -- Dir glob breaks when in the middle of path [\#245](https://github.com/shelljs/shelljs/issues/245) -- could you switch off wiki page? [\#233](https://github.com/shelljs/shelljs/issues/233) -- ls globbing does not behave like shell, consider using glob.sync [\#225](https://github.com/shelljs/shelljs/issues/225) -- Cannot run shell.exec\('heroku config:push'\) -- just hangs [\#218](https://github.com/shelljs/shelljs/issues/218) -- `cp` does not overwrite files by default [\#210](https://github.com/shelljs/shelljs/issues/210) -- exec failed to return [\#208](https://github.com/shelljs/shelljs/issues/208) -- CLI Version [\#202](https://github.com/shelljs/shelljs/issues/202) -- Bracket expansion not working [\#176](https://github.com/shelljs/shelljs/issues/176) -- "exec" causes LiveScript interpreter \(lsc\) to hang [\#160](https://github.com/shelljs/shelljs/issues/160) -- Don't modify string prototype [\#159](https://github.com/shelljs/shelljs/issues/159) -- `exec\(...\).to\(file\)` should work [\#154](https://github.com/shelljs/shelljs/issues/154) -- Would like to see more async variants for cp/rm etc [\#144](https://github.com/shelljs/shelljs/issues/144) -- Can't install shelljs locally instead of globally [\#136](https://github.com/shelljs/shelljs/issues/136) -- shelljs and node 0.10.28 [\#125](https://github.com/shelljs/shelljs/issues/125) -- Use case for global installed shelljs [\#123](https://github.com/shelljs/shelljs/issues/123) -- Only get stdout from `exec` [\#92](https://github.com/shelljs/shelljs/issues/92) -- What about other commands? [\#90](https://github.com/shelljs/shelljs/issues/90) -- Flesh out example of exit\(\) [\#73](https://github.com/shelljs/shelljs/issues/73) -- exec doesn't work with qualified paths on windows [\#41](https://github.com/shelljs/shelljs/issues/41) -- exec does not working in mingw bash in windows [\#17](https://github.com/shelljs/shelljs/issues/17) -- Add support for cp -P option [\#413](https://github.com/shelljs/shelljs/issues/413) -- cp -L: Incorrect behavior for symlinks to regular files [\#407](https://github.com/shelljs/shelljs/issues/407) -- Edit the docs to emphasize ShellStrings and Pipes [\#398](https://github.com/shelljs/shelljs/issues/398) -- Error message isn't always printed [\#372](https://github.com/shelljs/shelljs/issues/372) -- Standardize command output [\#356](https://github.com/shelljs/shelljs/issues/356) -- exec\(\) doesn't clean up all temp files [\#353](https://github.com/shelljs/shelljs/issues/353) -- Document that exec\(\) options don't work on early versions of node [\#350](https://github.com/shelljs/shelljs/issues/350) -- Add -f option to set\(\) [\#344](https://github.com/shelljs/shelljs/issues/344) -- Glob commands by default [\#343](https://github.com/shelljs/shelljs/issues/343) -- rm -rf incorrect behaviour [\#332](https://github.com/shelljs/shelljs/issues/332) -- Switch `exec\(\)` to use bash by default [\#281](https://github.com/shelljs/shelljs/issues/281) -- pipe to proc [\#148](https://github.com/shelljs/shelljs/issues/148) -- shell builtin [\#138](https://github.com/shelljs/shelljs/issues/138) -- add timeout option for exec [\#132](https://github.com/shelljs/shelljs/issues/132) -- shelljs cp handling symlinks badly [\#69](https://github.com/shelljs/shelljs/issues/69) - -**Merged pull requests:** - -- chore: add "Team" section to README [\#423](https://github.com/shelljs/shelljs/pull/423) ([nfischer](https://github.com/nfischer)) -- Contributing guidelines [\#422](https://github.com/shelljs/shelljs/pull/422) ([nfischer](https://github.com/nfischer)) -- feat\(glob\): expose config.globOptions. [\#400](https://github.com/shelljs/shelljs/pull/400) ([nfischer](https://github.com/nfischer)) -- Add shelljs as a keyword in package.json [\#393](https://github.com/shelljs/shelljs/pull/393) ([nfischer](https://github.com/nfischer)) -- docs: add link to wiki page [\#392](https://github.com/shelljs/shelljs/pull/392) ([nfischer](https://github.com/nfischer)) -- refactor\(cd\): use process.env.OLDPWD to store previous dir [\#383](https://github.com/shelljs/shelljs/pull/383) ([nfischer](https://github.com/nfischer)) -- chore\(appveyor\): add in node 4 for appveyor [\#381](https://github.com/shelljs/shelljs/pull/381) ([nfischer](https://github.com/nfischer)) -- Add Cash cross-reference [\#375](https://github.com/shelljs/shelljs/pull/375) ([dthree](https://github.com/dthree)) -- Ignore gitattributes from npm package [\#361](https://github.com/shelljs/shelljs/pull/361) ([nfischer](https://github.com/nfischer)) -- Consistently use LF line endings [\#355](https://github.com/shelljs/shelljs/pull/355) ([TimothyGu](https://github.com/TimothyGu)) -- Release v0.7.0 [\#429](https://github.com/shelljs/shelljs/pull/429) ([nfischer](https://github.com/nfischer)) -- fix: null is no longer confused for an object [\#428](https://github.com/shelljs/shelljs/pull/428) ([nfischer](https://github.com/nfischer)) -- fix\(ls\): no trailing newline for empty directories [\#425](https://github.com/shelljs/shelljs/pull/425) ([nfischer](https://github.com/nfischer)) -- feat\(cp\): -P option, plus better handling of symlinks [\#421](https://github.com/shelljs/shelljs/pull/421) ([nfischer](https://github.com/nfischer)) -- docs\(exec\): fix docs about exec return type [\#419](https://github.com/shelljs/shelljs/pull/419) ([nfischer](https://github.com/nfischer)) -- docs\(error\): deprecate relying on string value [\#418](https://github.com/shelljs/shelljs/pull/418) ([nfischer](https://github.com/nfischer)) -- fix: error message now printed for fatal failures [\#417](https://github.com/shelljs/shelljs/pull/417) ([nfischer](https://github.com/nfischer)) -- issue-407: Add regular files unit tests and fix symlink copy behavior [\#409](https://github.com/shelljs/shelljs/pull/409) ([charlesverge](https://github.com/charlesverge)) -- refactor\(rm\): Remove duplicate code [\#408](https://github.com/shelljs/shelljs/pull/408) ([nfischer](https://github.com/nfischer)) -- docs: wildcards for all commands, other docs cleanups [\#404](https://github.com/shelljs/shelljs/pull/404) ([nfischer](https://github.com/nfischer)) -- test\(rm\): add tests to prevent a future regression [\#403](https://github.com/shelljs/shelljs/pull/403) ([nfischer](https://github.com/nfischer)) -- refactor\(string\): modify string protoype, but only for shelljs/global [\#401](https://github.com/shelljs/shelljs/pull/401) ([nfischer](https://github.com/nfischer)) -- feat: adding error codes to ShellJS [\#394](https://github.com/shelljs/shelljs/pull/394) ([nfischer](https://github.com/nfischer)) -- feature: use rechoir [\#384](https://github.com/shelljs/shelljs/pull/384) ([nfischer](https://github.com/nfischer)) -- refactor\(cp\): clean up code and fix \#376 [\#380](https://github.com/shelljs/shelljs/pull/380) ([nfischer](https://github.com/nfischer)) -- New commands: sort\(\), head\(\), and tail\(\) [\#379](https://github.com/shelljs/shelljs/pull/379) ([nfischer](https://github.com/nfischer)) -- Add unit tests to prevent regression \(see \#376\) [\#378](https://github.com/shelljs/shelljs/pull/378) ([nfischer](https://github.com/nfischer)) -- feat\(pipe\): add support for pipes between commands [\#370](https://github.com/shelljs/shelljs/pull/370) ([nfischer](https://github.com/nfischer)) -- refactor\(ls\): greatly simplify ls implimentation [\#369](https://github.com/shelljs/shelljs/pull/369) ([ariporad](https://github.com/ariporad)) -- chore: drop node v0.10 support [\#368](https://github.com/shelljs/shelljs/pull/368) ([ariporad](https://github.com/ariporad)) -- perf\(cd\): only run `stat` once [\#367](https://github.com/shelljs/shelljs/pull/367) ([ariporad](https://github.com/ariporad)) -- fix\(exec\): properly handles paths with spaces and quotes [\#365](https://github.com/shelljs/shelljs/pull/365) ([nfischer](https://github.com/nfischer)) -- test\(ln\): add tests for linking to cwd [\#364](https://github.com/shelljs/shelljs/pull/364) ([nfischer](https://github.com/nfischer)) -- fix\(verbose\): verbose-style logging is consistent [\#362](https://github.com/shelljs/shelljs/pull/362) ([nfischer](https://github.com/nfischer)) -- Refactor shellstring [\#360](https://github.com/shelljs/shelljs/pull/360) ([nfischer](https://github.com/nfischer)) -- feat\(glob\): use glob module for globbing [\#359](https://github.com/shelljs/shelljs/pull/359) ([nfischer](https://github.com/nfischer)) -- feat\(set\): add -f option to disable globbing [\#358](https://github.com/shelljs/shelljs/pull/358) ([nfischer](https://github.com/nfischer)) -- config.fatal now throws an exception [\#357](https://github.com/shelljs/shelljs/pull/357) ([jrmclaurin](https://github.com/jrmclaurin)) -- fix\(exec\): temp files are now cleaned up [\#354](https://github.com/shelljs/shelljs/pull/354) ([nfischer](https://github.com/nfischer)) -- feat\(glob\): glob support for \(almost\) all commands [\#352](https://github.com/shelljs/shelljs/pull/352) ([nfischer](https://github.com/nfischer)) -- feat\(grep\): add -l option [\#349](https://github.com/shelljs/shelljs/pull/349) ([nfischer](https://github.com/nfischer)) -- fix\(exec\): now actually supports shell option [\#348](https://github.com/shelljs/shelljs/pull/348) ([nfischer](https://github.com/nfischer)) -- feat\(touch\): supports multiple files [\#346](https://github.com/shelljs/shelljs/pull/346) ([nfischer](https://github.com/nfischer)) - -## [v0.6.0](https://github.com/shelljs/shelljs/tree/v0.6.0) (2016-02-05) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.5.3...v0.6.0) - -**Closed issues:** - -- option not recognized [\#334](https://github.com/shelljs/shelljs/issues/334) -- Feature request: Metadata with `ls` [\#323](https://github.com/shelljs/shelljs/issues/323) -- Gen-docs is broken [\#309](https://github.com/shelljs/shelljs/issues/309) -- `link -s` is broken for files on Windows [\#301](https://github.com/shelljs/shelljs/issues/301) -- Shelljs quits unexpectedly: [\#300](https://github.com/shelljs/shelljs/issues/300) -- Failing tests on Windows [\#296](https://github.com/shelljs/shelljs/issues/296) -- run-tests.js is broken for cmd.exe [\#294](https://github.com/shelljs/shelljs/issues/294) -- Support echo-ing environment variables [\#291](https://github.com/shelljs/shelljs/issues/291) -- Add Windows CI [\#287](https://github.com/shelljs/shelljs/issues/287) -- Add tests for the shjs utility [\#280](https://github.com/shelljs/shelljs/issues/280) -- Allow shjs utility to infer the extension for "filename." [\#278](https://github.com/shelljs/shelljs/issues/278) -- Ability to read the stdout buffer line-by-line [\#277](https://github.com/shelljs/shelljs/issues/277) -- Poor output for commands with multiple errors [\#267](https://github.com/shelljs/shelljs/issues/267) -- Travis ci build status says "unknown" [\#266](https://github.com/shelljs/shelljs/issues/266) -- wild card characters in filename not working as expected [\#262](https://github.com/shelljs/shelljs/issues/262) -- shell.exec - read internal variable [\#260](https://github.com/shelljs/shelljs/issues/260) -- cp and rename directory with -r doesn't match unix behavior [\#256](https://github.com/shelljs/shelljs/issues/256) -- console.log.apply throwing TypeError: Illegal Invocation [\#255](https://github.com/shelljs/shelljs/issues/255) -- How to exit on first error [\#253](https://github.com/shelljs/shelljs/issues/253) -- why not support set 'cwd' when invoke execAsync ? [\#250](https://github.com/shelljs/shelljs/issues/250) -- Not possible to check the failure of cd? [\#247](https://github.com/shelljs/shelljs/issues/247) -- By default shelljs runs command in root [\#246](https://github.com/shelljs/shelljs/issues/246) -- /usr/bin/env: node: No such file or directory [\#243](https://github.com/shelljs/shelljs/issues/243) -- "Which" command not working properly on Windows Platform. [\#238](https://github.com/shelljs/shelljs/issues/238) -- Arguments [\#237](https://github.com/shelljs/shelljs/issues/237) -- sed\(\) should accept multiple file arguments [\#231](https://github.com/shelljs/shelljs/issues/231) -- shelljs.exec\('aaa && bbb'\) blocks [\#229](https://github.com/shelljs/shelljs/issues/229) -- Consider creating a GitHub Organization with more maintainers [\#223](https://github.com/shelljs/shelljs/issues/223) -- Doesn't work inside Electron [\#220](https://github.com/shelljs/shelljs/issues/220) -- \[idea\] Add chmodr function. [\#219](https://github.com/shelljs/shelljs/issues/219) -- Execute a file [\#211](https://github.com/shelljs/shelljs/issues/211) -- Where is standard error going to? [\#209](https://github.com/shelljs/shelljs/issues/209) -- boolean return value for string.to\(\) [\#205](https://github.com/shelljs/shelljs/issues/205) -- `common.error` doesn't throw [\#199](https://github.com/shelljs/shelljs/issues/199) -- Problems with exec \(sync\) on 0.12/io.js [\#197](https://github.com/shelljs/shelljs/issues/197) -- cp --update flag [\#172](https://github.com/shelljs/shelljs/issues/172) -- Is there a way to suppress pushd/popd output? [\#171](https://github.com/shelljs/shelljs/issues/171) -- Cannot recursively list all \*.js files [\#162](https://github.com/shelljs/shelljs/issues/162) -- exec\(\) breaks if executed in a deleted directory [\#157](https://github.com/shelljs/shelljs/issues/157) -- shjs command always exits with zero code [\#133](https://github.com/shelljs/shelljs/issues/133) -- Windows failing tests [\#127](https://github.com/shelljs/shelljs/issues/127) -- touch command [\#122](https://github.com/shelljs/shelljs/issues/122) -- Symbolic links are broken! [\#100](https://github.com/shelljs/shelljs/issues/100) -- interpret `--` as stdin [\#55](https://github.com/shelljs/shelljs/issues/55) -- Error ENOTEMPTY when deleting a directory recursively. [\#49](https://github.com/shelljs/shelljs/issues/49) -- Cross-platform way to add to PATH [\#32](https://github.com/shelljs/shelljs/issues/32) -- `mv` fails on block, character, fifo [\#25](https://github.com/shelljs/shelljs/issues/25) -- ls -l [\#22](https://github.com/shelljs/shelljs/issues/22) - -**Merged pull requests:** - -- feat\(set\): add new set\(\) command [\#329](https://github.com/shelljs/shelljs/pull/329) ([nfischer](https://github.com/nfischer)) -- Fix symlinking on Windows [\#322](https://github.com/shelljs/shelljs/pull/322) ([BYK](https://github.com/BYK)) -- Rewrite .gitignore to be more comprehensive [\#321](https://github.com/shelljs/shelljs/pull/321) ([BYK](https://github.com/BYK)) -- chore\(gitter/travis\): add gitter webhook to travis [\#313](https://github.com/shelljs/shelljs/pull/313) ([ariporad](https://github.com/ariporad)) -- chore\(LGTM\): add LGTM config files [\#312](https://github.com/shelljs/shelljs/pull/312) ([ariporad](https://github.com/ariporad)) -- feat\(ls\): add -d flag to ls\(\) [\#311](https://github.com/shelljs/shelljs/pull/311) ([nfischer](https://github.com/nfischer)) -- fix\(gen-docs\): fix issue where docs are generated wrong [\#310](https://github.com/shelljs/shelljs/pull/310) ([nfischer](https://github.com/nfischer)) -- chore\(package\): remove v0.8 from engines list [\#308](https://github.com/shelljs/shelljs/pull/308) ([nfischer](https://github.com/nfischer)) -- travis: Mark as not using `sudo` and do not test 0.11 [\#307](https://github.com/shelljs/shelljs/pull/307) ([TimothyGu](https://github.com/TimothyGu)) -- fix: jshint works on Windows [\#295](https://github.com/shelljs/shelljs/pull/295) ([nfischer](https://github.com/nfischer)) -- feat: add tilde expansion to expand\(\) [\#293](https://github.com/shelljs/shelljs/pull/293) ([nfischer](https://github.com/nfischer)) -- style: make docs more consistent [\#292](https://github.com/shelljs/shelljs/pull/292) ([nfischer](https://github.com/nfischer)) -- update `exec` docs to match implemented behaviour [\#289](https://github.com/shelljs/shelljs/pull/289) ([vise890](https://github.com/vise890)) -- chore: update github URL in package.json [\#288](https://github.com/shelljs/shelljs/pull/288) ([nfischer](https://github.com/nfischer)) -- docs\(spelling\): fix typo in source comment [\#285](https://github.com/shelljs/shelljs/pull/285) ([nfischer](https://github.com/nfischer)) -- chore\(travis\): add OS X to Travis CI [\#283](https://github.com/shelljs/shelljs/pull/283) ([nfischer](https://github.com/nfischer)) -- Don't do `console.log.apply\(this, ...\)`. [\#274](https://github.com/shelljs/shelljs/pull/274) ([ariporad](https://github.com/ariporad)) -- Implementing cd\('-'\) to behave like Bash's "cd -" [\#273](https://github.com/shelljs/shelljs/pull/273) ([nfischer](https://github.com/nfischer)) -- Fix cp to match unix behavior [\#271](https://github.com/shelljs/shelljs/pull/271) ([freitagbr](https://github.com/freitagbr)) -- Commands that have multiple errors now produce cleaner log output [\#268](https://github.com/shelljs/shelljs/pull/268) ([nfischer](https://github.com/nfischer)) -- Support exit code in shjs. [\#252](https://github.com/shelljs/shelljs/pull/252) ([bryce-gibson](https://github.com/bryce-gibson)) -- add touch\(1\) [\#249](https://github.com/shelljs/shelljs/pull/249) ([blockloop](https://github.com/blockloop)) -- Fix `os.tmpdir` bug [\#240](https://github.com/shelljs/shelljs/pull/240) ([BYK](https://github.com/BYK)) -- Make sure Which\(\) on Windows platform always return the command with … [\#239](https://github.com/shelljs/shelljs/pull/239) ([TingluoHuang](https://github.com/TingluoHuang)) -- Add target node.js \(iojs v1, v2, v3\) [\#230](https://github.com/shelljs/shelljs/pull/230) ([sanemat](https://github.com/sanemat)) -- feat-multisymbolic + Support for directory entry \(capital X in chmod terms\) [\#228](https://github.com/shelljs/shelljs/pull/228) ([rezonant](https://github.com/rezonant)) -- Fixes an issue with multi-symbolic mode specification \(ie a-rwx,u+rw\) [\#227](https://github.com/shelljs/shelljs/pull/227) ([rezonant](https://github.com/rezonant)) -- Memoized the result of target invocation [\#216](https://github.com/shelljs/shelljs/pull/216) ([rizowski](https://github.com/rizowski)) -- remove empty for loop and leaked i var [\#166](https://github.com/shelljs/shelljs/pull/166) ([ratbeard](https://github.com/ratbeard)) -- Wrap script name in double quotes [\#135](https://github.com/shelljs/shelljs/pull/135) ([ndelitski](https://github.com/ndelitski)) -- Fixed coffeescript syntax in top example [\#99](https://github.com/shelljs/shelljs/pull/99) ([maxnordlund](https://github.com/maxnordlund)) -- fix\(touch\): enhance parseOptions and fix touch's -r flag [\#341](https://github.com/shelljs/shelljs/pull/341) ([nfischer](https://github.com/nfischer)) -- chore\(.npmignore\): update npmignore [\#339](https://github.com/shelljs/shelljs/pull/339) ([ariporad](https://github.com/ariporad)) -- Release v0.6.0 [\#338](https://github.com/shelljs/shelljs/pull/338) ([ariporad](https://github.com/ariporad)) -- docs\(README\): remove coffeescript from README [\#337](https://github.com/shelljs/shelljs/pull/337) ([ariporad](https://github.com/ariporad)) -- fix\(cp\): add -n option, make -f default behavior [\#336](https://github.com/shelljs/shelljs/pull/336) ([nfischer](https://github.com/nfischer)) -- feat\(exec\): allow all exec options to pass through [\#335](https://github.com/shelljs/shelljs/pull/335) ([nfischer](https://github.com/nfischer)) -- fix\(mv\): add -n option, make -f default behavior [\#328](https://github.com/shelljs/shelljs/pull/328) ([nfischer](https://github.com/nfischer)) -- fix\(cat\): make behavior more like unix [\#326](https://github.com/shelljs/shelljs/pull/326) ([nfischer](https://github.com/nfischer)) -- feat\(ls\): add -l option [\#324](https://github.com/shelljs/shelljs/pull/324) ([nfischer](https://github.com/nfischer)) -- style\(test/which\): make test/which.js conform to the style guidelines [\#320](https://github.com/shelljs/shelljs/pull/320) ([ariporad](https://github.com/ariporad)) -- chore\(appveyor\): add badge [\#316](https://github.com/shelljs/shelljs/pull/316) ([nfischer](https://github.com/nfischer)) -- fix\(windows\): fix shjs commands for windows [\#315](https://github.com/shelljs/shelljs/pull/315) ([nfischer](https://github.com/nfischer)) -- feat\(sed\): support multiple file names [\#314](https://github.com/shelljs/shelljs/pull/314) ([nfischer](https://github.com/nfischer)) -- feat\(cd\): cd\(\) \(no args\) changes to home directory [\#306](https://github.com/shelljs/shelljs/pull/306) ([nfischer](https://github.com/nfischer)) -- test\(shjs\): add tests for shjs [\#304](https://github.com/shelljs/shelljs/pull/304) ([ariporad](https://github.com/ariporad)) -- fix: regexes are more consistent with sed and grep [\#303](https://github.com/shelljs/shelljs/pull/303) ([nfischer](https://github.com/nfischer)) -- Add appveyor.yml config file [\#299](https://github.com/shelljs/shelljs/pull/299) ([nfischer](https://github.com/nfischer)) -- Fix tests on Windows [\#297](https://github.com/shelljs/shelljs/pull/297) ([BYK](https://github.com/BYK)) -- Search PATHEXT instead of 3 hardcoded values [\#290](https://github.com/shelljs/shelljs/pull/290) ([isiahmeadows](https://github.com/isiahmeadows)) -- Fix relative symlinks [\#282](https://github.com/shelljs/shelljs/pull/282) ([freitagbr](https://github.com/freitagbr)) -- Make to and toEnd chainable [\#276](https://github.com/shelljs/shelljs/pull/276) ([TimothyGu](https://github.com/TimothyGu)) - -## [v0.5.3](https://github.com/shelljs/shelljs/tree/v0.5.3) (2015-08-11) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.5.2...v0.5.3) - -**Merged pull requests:** - -- Manually closing streams [\#222](https://github.com/shelljs/shelljs/pull/222) ([JulianLaval](https://github.com/JulianLaval)) - -## [v0.5.2](https://github.com/shelljs/shelljs/tree/v0.5.2) (2015-08-10) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.5.1...v0.5.2) - -**Closed issues:** - -- Cannot run shell.exec [\#217](https://github.com/shelljs/shelljs/issues/217) -- write after end: internal error [\#206](https://github.com/shelljs/shelljs/issues/206) - -**Merged pull requests:** - -- Update README.md [\#221](https://github.com/shelljs/shelljs/pull/221) ([giosh94mhz](https://github.com/giosh94mhz)) -- prevent internal error: write after end [\#214](https://github.com/shelljs/shelljs/pull/214) ([charlierudolph](https://github.com/charlierudolph)) - -## [v0.5.1](https://github.com/shelljs/shelljs/tree/v0.5.1) (2015-06-05) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.5.0...v0.5.1) - -**Closed issues:** - -- cd into home directory [\#9](https://github.com/shelljs/shelljs/issues/9) - -**Merged pull requests:** - -- Fix issue \#49: Retry rmdirSync on Windows for up to 1 second if files still exist. [\#179](https://github.com/shelljs/shelljs/pull/179) ([andreialecu](https://github.com/andreialecu)) - -## [v0.5.0](https://github.com/shelljs/shelljs/tree/v0.5.0) (2015-05-19) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.3.0...v0.5.0) - -**Closed issues:** - -- Enter text to prompt [\#203](https://github.com/shelljs/shelljs/issues/203) -- Find which shell is being used [\#195](https://github.com/shelljs/shelljs/issues/195) -- Pass command line params to the make tool [\#188](https://github.com/shelljs/shelljs/issues/188) -- Is it possible to call exec with a command containing new lines ? [\#177](https://github.com/shelljs/shelljs/issues/177) -- The installation would break on Windows 7 [\#161](https://github.com/shelljs/shelljs/issues/161) -- Q.ninvoke\(\) returns undefined [\#153](https://github.com/shelljs/shelljs/issues/153) -- installed shelljs on osx but reported error: npm ERR! 404 '%5B-g%5D' is not in the npm registry. [\#124](https://github.com/shelljs/shelljs/issues/124) -- "ln" not found \(OS X\) [\#106](https://github.com/shelljs/shelljs/issues/106) -- Using shelljs in a CLI app. [\#91](https://github.com/shelljs/shelljs/issues/91) - -**Merged pull requests:** - -- Breaking: Allow -- as args separators \(fixes \#188\) [\#207](https://github.com/shelljs/shelljs/pull/207) ([nzakas](https://github.com/nzakas)) -- Update .travis.yml [\#190](https://github.com/shelljs/shelljs/pull/190) ([arturadib](https://github.com/arturadib)) -- Use new child\_process.execSync instead of busywaiting [\#189](https://github.com/shelljs/shelljs/pull/189) ([devTristan](https://github.com/devTristan)) -- Update README.md: explains how to access "config" [\#145](https://github.com/shelljs/shelljs/pull/145) ([kerphi](https://github.com/kerphi)) -- Fix to set state.error before throw the exception [\#120](https://github.com/shelljs/shelljs/pull/120) ([abdul-martinez](https://github.com/abdul-martinez)) -- Add -l and -s support to grep. [\#116](https://github.com/shelljs/shelljs/pull/116) ([idearat](https://github.com/idearat)) - -## [v0.3.0](https://github.com/shelljs/shelljs/tree/v0.3.0) (2014-05-08) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.2.6...v0.3.0) - -**Closed issues:** - -- grep\(\) should fully support globing [\#118](https://github.com/shelljs/shelljs/issues/118) -- sed\(\) could support replacement function [\#115](https://github.com/shelljs/shelljs/issues/115) -- How would you close an exec process that runs indefinitely? [\#113](https://github.com/shelljs/shelljs/issues/113) -- listen for intermittent output of a long-running child process [\#111](https://github.com/shelljs/shelljs/issues/111) -- Cannot find module 'shelljs' after installing shelljs with npm [\#109](https://github.com/shelljs/shelljs/issues/109) -- Massive CPU usage on exec\(\) windows [\#108](https://github.com/shelljs/shelljs/issues/108) -- cp skipping dot files? [\#79](https://github.com/shelljs/shelljs/issues/79) -- $variables in exec\(\) aren't handled correctly [\#11](https://github.com/shelljs/shelljs/issues/11) -- debug flag that prints commands instead of executing [\#8](https://github.com/shelljs/shelljs/issues/8) - -**Merged pull requests:** - -- grep\(\) support for globing, fixes \#118 [\#119](https://github.com/shelljs/shelljs/pull/119) ([utensil](https://github.com/utensil)) -- make sed\(\) support replacement function, fixes \#115 [\#117](https://github.com/shelljs/shelljs/pull/117) ([utensil](https://github.com/utensil)) -- which\(\) should only find files, not directories [\#110](https://github.com/shelljs/shelljs/pull/110) ([panrafal](https://github.com/panrafal)) -- Added the New BSD license to the package.json. [\#105](https://github.com/shelljs/shelljs/pull/105) ([keskival](https://github.com/keskival)) -- Added win32 support to ln [\#104](https://github.com/shelljs/shelljs/pull/104) ([jamon](https://github.com/jamon)) -- Fix ln using bad paths when given abspaths. [\#89](https://github.com/shelljs/shelljs/pull/89) ([Schoonology](https://github.com/Schoonology)) -- Add ln support, including both -s and -f options. [\#88](https://github.com/shelljs/shelljs/pull/88) ([Schoonology](https://github.com/Schoonology)) -- add support for symlinking \(junctions\) on win32 [\#87](https://github.com/shelljs/shelljs/pull/87) ([jamon](https://github.com/jamon)) - -## [v0.2.6](https://github.com/shelljs/shelljs/tree/v0.2.6) (2013-09-22) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.2.5...v0.2.6) - -**Closed issues:** - -- Versions 0.2.4 and 0.2.3 keep throwing strange errors [\#82](https://github.com/shelljs/shelljs/issues/82) -- Add global pollution tests [\#33](https://github.com/shelljs/shelljs/issues/33) - -## [v0.2.5](https://github.com/shelljs/shelljs/tree/v0.2.5) (2013-09-11) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.2.4...v0.2.5) - -**Closed issues:** - -- shelljs.exec stalls on Red Hat when script is invoked with 'sudo -u username' [\#72](https://github.com/shelljs/shelljs/issues/72) - -## [v0.2.4](https://github.com/shelljs/shelljs/tree/v0.2.4) (2013-09-11) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.2.3...v0.2.4) - -## [v0.2.3](https://github.com/shelljs/shelljs/tree/v0.2.3) (2013-09-09) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.2.2...v0.2.3) - -**Merged pull requests:** - -- Make shell.exec\(\) treat process error return codes as shelljs errors [\#80](https://github.com/shelljs/shelljs/pull/80) ([nilsbunger](https://github.com/nilsbunger)) - -## [v0.2.2](https://github.com/shelljs/shelljs/tree/v0.2.2) (2013-09-02) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.1.4...v0.2.2) - -**Closed issues:** - -- which and node\_modules [\#63](https://github.com/shelljs/shelljs/issues/63) -- cannot install with nodejs 0.10.2 [\#57](https://github.com/shelljs/shelljs/issues/57) - -**Merged pull requests:** - -- Addition of a toEnd\(\) function modeled after the Unix \>\> pipe. [\#78](https://github.com/shelljs/shelljs/pull/78) ([andreweduffy](https://github.com/andreweduffy)) -- Added appendTo\(\) function to imitate '\>\>' redirect-and-append pipe. [\#75](https://github.com/shelljs/shelljs/pull/75) ([andreweduffy](https://github.com/andreweduffy)) -- Fix a small typo in README.md [\#71](https://github.com/shelljs/shelljs/pull/71) ([asmblah](https://github.com/asmblah)) -- adding an `.npmignore` file [\#70](https://github.com/shelljs/shelljs/pull/70) ([stephenmathieson](https://github.com/stephenmathieson)) -- tempdir: use `os.tmpDir` when possible [\#67](https://github.com/shelljs/shelljs/pull/67) ([stephenmathieson](https://github.com/stephenmathieson)) - -## [v0.1.4](https://github.com/shelljs/shelljs/tree/v0.1.4) (2013-05-10) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.1.3...v0.1.4) - -**Merged pull requests:** - -- removing extra fs calls [\#62](https://github.com/shelljs/shelljs/pull/62) ([stephenmathieson](https://github.com/stephenmathieson)) -- moving \_jshint\_ to a development dependency [\#61](https://github.com/shelljs/shelljs/pull/61) ([stephenmathieson](https://github.com/stephenmathieson)) -- Make the maximum buffersize 20 MB. [\#59](https://github.com/shelljs/shelljs/pull/59) ([waddlesplash](https://github.com/waddlesplash)) - -## [v0.1.3](https://github.com/shelljs/shelljs/tree/v0.1.3) (2013-04-21) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.1.2...v0.1.3) - -**Merged pull requests:** - -- test\('-L', badlink\) should return true [\#56](https://github.com/shelljs/shelljs/pull/56) ([lge88](https://github.com/lge88)) -- exec options now allows `silent:true` with callback. [\#54](https://github.com/shelljs/shelljs/pull/54) ([iapain](https://github.com/iapain)) -- Add Zepto to README [\#53](https://github.com/shelljs/shelljs/pull/53) ([madrobby](https://github.com/madrobby)) - -## [v0.1.2](https://github.com/shelljs/shelljs/tree/v0.1.2) (2013-01-08) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.1.1...v0.1.2) - -**Closed issues:** - -- pushd/popd [\#24](https://github.com/shelljs/shelljs/issues/24) - -**Merged pull requests:** - -- Implemented chmod command. Github issue 35 [\#48](https://github.com/shelljs/shelljs/pull/48) ([brandonramirez](https://github.com/brandonramirez)) - -## [v0.1.1](https://github.com/shelljs/shelljs/tree/v0.1.1) (2013-01-01) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.1.0...v0.1.1) - -**Merged pull requests:** - -- Work in progress: pushd/popd/dirs [\#47](https://github.com/shelljs/shelljs/pull/47) ([mstade](https://github.com/mstade)) - -## [v0.1.0](https://github.com/shelljs/shelljs/tree/v0.1.0) (2012-12-26) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.9...v0.1.0) - -**Closed issues:** - -- test\(\) for binary file? [\#45](https://github.com/shelljs/shelljs/issues/45) -- Inconsistent behaviour of cp command with directories. [\#44](https://github.com/shelljs/shelljs/issues/44) -- Executing SSH with ShellJs [\#43](https://github.com/shelljs/shelljs/issues/43) - -**Merged pull requests:** - -- Fix for \#44 [\#46](https://github.com/shelljs/shelljs/pull/46) ([mstade](https://github.com/mstade)) -- Fix single/double quotes in exec [\#42](https://github.com/shelljs/shelljs/pull/42) ([danielepolencic](https://github.com/danielepolencic)) - -## [v0.0.9](https://github.com/shelljs/shelljs/tree/v0.0.9) (2012-12-01) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.8...v0.0.9) - -**Closed issues:** - -- silent output [\#40](https://github.com/shelljs/shelljs/issues/40) -- asynchronous exec [\#34](https://github.com/shelljs/shelljs/issues/34) - -**Merged pull requests:** - -- Passed process arguments to executable script [\#36](https://github.com/shelljs/shelljs/pull/36) ([Zanisimo](https://github.com/Zanisimo)) - -## [v0.0.8](https://github.com/shelljs/shelljs/tree/v0.0.8) (2012-10-11) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.7...v0.0.8) - -**Closed issues:** - -- exec with callback should automatically be async [\#31](https://github.com/shelljs/shelljs/issues/31) -- Exporting variables. [\#30](https://github.com/shelljs/shelljs/issues/30) -- Detecting shelljs/node [\#27](https://github.com/shelljs/shelljs/issues/27) - -**Merged pull requests:** - -- fix: global leak 'stats' [\#29](https://github.com/shelljs/shelljs/pull/29) ([ando-takahiro](https://github.com/ando-takahiro)) -- -a includes . and ..; -A does not [\#28](https://github.com/shelljs/shelljs/pull/28) ([aeosynth](https://github.com/aeosynth)) - -## [v0.0.7](https://github.com/shelljs/shelljs/tree/v0.0.7) (2012-09-23) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.6...v0.0.7) - -**Closed issues:** - -- gh-pages: clicking 'fork me' just reloads the page [\#26](https://github.com/shelljs/shelljs/issues/26) -- Not declared local var implies possible memory leak [\#21](https://github.com/shelljs/shelljs/issues/21) -- Cannot echo a string that starts with - [\#20](https://github.com/shelljs/shelljs/issues/20) -- Unexpected cp behaviour with directories [\#15](https://github.com/shelljs/shelljs/issues/15) - -**Merged pull requests:** - -- add primaries to \_test [\#23](https://github.com/shelljs/shelljs/pull/23) ([aeosynth](https://github.com/aeosynth)) - -## [v0.0.6](https://github.com/shelljs/shelljs/tree/v0.0.6) (2012-08-07) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.6pre2...v0.0.6) - -**Merged pull requests:** - -- Fixed a global variable leak [\#16](https://github.com/shelljs/shelljs/pull/16) ([dallonf](https://github.com/dallonf)) - -## [v0.0.6pre2](https://github.com/shelljs/shelljs/tree/v0.0.6pre2) (2012-05-25) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.6pre1...v0.0.6pre2) - -## [v0.0.6pre1](https://github.com/shelljs/shelljs/tree/v0.0.6pre1) (2012-05-25) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.5...v0.0.6pre1) - -## [v0.0.5](https://github.com/shelljs/shelljs/tree/v0.0.5) (2012-05-24) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.5pre4...v0.0.5) - -**Closed issues:** - -- global.key assigned value 'async' as a result of shell.exec\(...\) [\#12](https://github.com/shelljs/shelljs/issues/12) - -**Merged pull requests:** - -- Add support for grep option -v. [\#13](https://github.com/shelljs/shelljs/pull/13) ([kkujala](https://github.com/kkujala)) - -## [v0.0.5pre4](https://github.com/shelljs/shelljs/tree/v0.0.5pre4) (2012-03-27) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.5pre3...v0.0.5pre4) - -## [v0.0.5pre3](https://github.com/shelljs/shelljs/tree/v0.0.5pre3) (2012-03-27) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.5pre2...v0.0.5pre3) - -## [v0.0.5pre2](https://github.com/shelljs/shelljs/tree/v0.0.5pre2) (2012-03-26) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.5pre1...v0.0.5pre2) - -## [v0.0.5pre1](https://github.com/shelljs/shelljs/tree/v0.0.5pre1) (2012-03-26) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.4...v0.0.5pre1) - -**Closed issues:** - -- rm\(\) does not respect read/write modes [\#6](https://github.com/shelljs/shelljs/issues/6) - -## [v0.0.4](https://github.com/shelljs/shelljs/tree/v0.0.4) (2012-03-22) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.3...v0.0.4) - -**Closed issues:** - -- "For convenient iteration via `for in`, ..."? [\#4](https://github.com/shelljs/shelljs/issues/4) - -## [v0.0.3](https://github.com/shelljs/shelljs/tree/v0.0.3) (2012-03-21) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.2...v0.0.3) - -## [v0.0.2](https://github.com/shelljs/shelljs/tree/v0.0.2) (2012-03-15) -[Full Changelog](https://github.com/shelljs/shelljs/compare/v0.0.2pre1...v0.0.2) - -## [v0.0.2pre1](https://github.com/shelljs/shelljs/tree/v0.0.2pre1) (2012-03-03) - - -\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* \ No newline at end of file diff --git a/node_modules/shelljs/LICENSE b/node_modules/shelljs/LICENSE deleted file mode 100644 index 0f0f119..0000000 --- a/node_modules/shelljs/LICENSE +++ /dev/null @@ -1,26 +0,0 @@ -Copyright (c) 2012, Artur Adib -All rights reserved. - -You may use this project under the terms of the New BSD license as follows: - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Artur Adib nor the - names of the 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 ARTUR ADIB BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/shelljs/MAINTAINERS b/node_modules/shelljs/MAINTAINERS deleted file mode 100644 index 3f94761..0000000 --- a/node_modules/shelljs/MAINTAINERS +++ /dev/null @@ -1,3 +0,0 @@ -Ari Porad (@ariporad) -Nate Fischer (@nfischer) -Artur Adib (@arturadib) diff --git a/node_modules/shelljs/README.md b/node_modules/shelljs/README.md deleted file mode 100644 index f18c41c..0000000 --- a/node_modules/shelljs/README.md +++ /dev/null @@ -1,784 +0,0 @@ -# ShellJS - Unix shell commands for Node.js - -[![Gitter](https://img.shields.io/gitter/room/nwjs/nw.js.svg?style=flat-square)](https://gitter.im/shelljs/shelljs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![Travis](https://img.shields.io/travis/shelljs/shelljs/master.svg?style=flat-square&label=unix)](https://travis-ci.org/shelljs/shelljs) -[![AppVeyor](https://img.shields.io/appveyor/ci/shelljs/shelljs/master.svg?style=flat-square&label=windows)](https://ci.appveyor.com/project/shelljs/shelljs/branch/master) -[![npm version](https://img.shields.io/npm/v/shelljs.svg?style=flat-square)](https://www.npmjs.com/package/shelljs) -[![npm downloads](https://img.shields.io/npm/dm/shelljs.svg?style=flat-square)](https://www.npmjs.com/package/shelljs) - -ShellJS is a portable **(Windows/Linux/OS X)** implementation of Unix shell commands on top of the -Node.js API. You can use it to eliminate your shell script's dependency on Unix while still keeping -its familiar and powerful commands. You can also install it globally so you can run it from outside -Node projects - say goodbye to those gnarly Bash scripts! - -ShellJS supports node `v0.11`, `v0.12`, `v4`, `v5`, `v6`, and all releases of iojs. - -The project is [unit-tested](http://travis-ci.org/shelljs/shelljs) and battled-tested in projects like: - -+ [PDF.js](http://github.com/mozilla/pdf.js) - Firefox's next-gen PDF reader -+ [Firebug](http://getfirebug.com/) - Firefox's infamous debugger -+ [JSHint](http://jshint.com) - Most popular JavaScript linter -+ [Zepto](http://zeptojs.com) - jQuery-compatible JavaScript library for modern browsers -+ [Yeoman](http://yeoman.io/) - Web application stack and development tool -+ [Deployd.com](http://deployd.com) - Open source PaaS for quick API backend generation -+ And [many more](https://npmjs.org/browse/depended/shelljs). - -If you have feedback, suggestions, or need help, feel free to post in our [issue tracker](https://github.com/shelljs/shelljs/issues). - -Think ShellJS is cool? Check out some related projects (like -[cash](https://github.com/dthree/cash)--a javascript-based POSIX shell) -in our [Wiki page](https://github.com/shelljs/shelljs/wiki)! - -Upgrading from an older version? Check out our [breaking -changes](https://github.com/shelljs/shelljs/wiki/Breaking-Changes) page to see -what changes to watch out for while upgrading. - -## Command line use - -If you just want cross platform UNIX commands, checkout our new project -[shelljs/shx](https://github.com/shelljs/shx), a utility to expose `shelljs` to -the command line. - -For example: - -``` -$ shx mkdir -p foo -$ shx touch foo/bar.txt -$ shx rm -rf foo -``` - -## A quick note about the docs - -For documentation on all the latest features, check out our -[README](https://github.com/shelljs/shelljs). To read docs that are consistent -with the latest release, check out [the npm -page](https://www.npmjs.com/package/shelljs) or -[shelljs.org](http://documentup.com/shelljs/shelljs). - -## Installing - -Via npm: - -```bash -$ npm install [-g] shelljs -``` - -If the global option `-g` is specified, the binary `shjs` will be installed. This makes it possible to -run ShellJS scripts much like any shell script from the command line, i.e. without requiring a `node_modules` folder: - -```bash -$ shjs my_script -``` - -## Examples - -### JavaScript - -```javascript -require('shelljs/global'); - -if (!which('git')) { - echo('Sorry, this script requires git'); - exit(1); -} - -// Copy files to release dir -rm('-rf', 'out/Release'); -cp('-R', 'stuff/', 'out/Release'); - -// Replace macros in each .js file -cd('lib'); -ls('*.js').forEach(function(file) { - sed('-i', 'BUILD_VERSION', 'v0.1.2', file); - sed('-i', /^.*REMOVE_THIS_LINE.*$/, '', file); - sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat('macro.js'), file); -}); -cd('..'); - -// Run external tool synchronously -if (exec('git commit -am "Auto-commit"').code !== 0) { - echo('Error: Git commit failed'); - exit(1); -} -``` - -### CoffeeScript - -CoffeeScript is also supported automatically: - -```coffeescript -require 'shelljs/global' - -if not which 'git' - echo 'Sorry, this script requires git' - exit 1 - -# Copy files to release dir -rm '-rf', 'out/Release' -cp '-R', 'stuff/', 'out/Release' - -# Replace macros in each .js file -cd 'lib' -for file in ls '*.js' - sed '-i', 'BUILD_VERSION', 'v0.1.2', file - sed '-i', /^.*REMOVE_THIS_LINE.*$/, '', file - sed '-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat('macro.js'), file -cd '..' - -# Run external tool synchronously -if (exec 'git commit -am "Auto-commit"').code != 0 - echo 'Error: Git commit failed' - exit 1 -``` - -## Global vs. Local - -The example above uses the convenience script `shelljs/global` to reduce verbosity. If polluting your global namespace is not desirable, simply require `shelljs`. - -Example: - -```javascript -var shell = require('shelljs'); -shell.echo('hello world'); -``` - - - - -## Command reference - - -All commands run synchronously, unless otherwise stated. -All commands accept standard bash globbing characters (`*`, `?`, etc.), -compatible with the [node glob module](https://github.com/isaacs/node-glob). - -For less-commonly used commands and features, please check out our [wiki -page](https://github.com/shelljs/shelljs/wiki). - - -### cd([dir]) -Changes to directory `dir` for the duration of the script. Changes to home -directory if no argument is supplied. - - -### pwd() -Returns the current directory. - - -### ls([options,] [path, ...]) -### ls([options,] path_array) -Available options: - -+ `-R`: recursive -+ `-A`: all files (include files beginning with `.`, except for `.` and `..`) -+ `-d`: list directories themselves, not their contents -+ `-l`: list objects representing each file, each with fields containing `ls - -l` output fields. See - [fs.Stats](https://nodejs.org/api/fs.html#fs_class_fs_stats) - for more info - -Examples: - -```javascript -ls('projs/*.js'); -ls('-R', '/users/me', '/tmp'); -ls('-R', ['/users/me', '/tmp']); // same as above -ls('-l', 'file.txt'); // { name: 'file.txt', mode: 33188, nlink: 1, ...} -``` - -Returns array of files in the given path, or in current directory if no path provided. - - -### find(path [, path ...]) -### find(path_array) -Examples: - -```javascript -find('src', 'lib'); -find(['src', 'lib']); // same as above -find('.').filter(function(file) { return file.match(/\.js$/); }); -``` - -Returns array of all files (however deep) in the given paths. - -The main difference from `ls('-R', path)` is that the resulting file names -include the base directories, e.g. `lib/resources/file1` instead of just `file1`. - - -### cp([options,] source [, source ...], dest) -### cp([options,] source_array, dest) -Available options: - -+ `-f`: force (default behavior) -+ `-n`: no-clobber -+ `-u`: only copy if source is newer than dest -+ `-r`, `-R`: recursive -+ `-L`: follow symlinks -+ `-P`: don't follow symlinks - -Examples: - -```javascript -cp('file1', 'dir1'); -cp('-R', 'path/to/dir/', '~/newCopy/'); -cp('-Rf', '/tmp/*', '/usr/local/*', '/home/tmp'); -cp('-Rf', ['/tmp/*', '/usr/local/*'], '/home/tmp'); // same as above -``` - -Copies files. - - -### rm([options,] file [, file ...]) -### rm([options,] file_array) -Available options: - -+ `-f`: force -+ `-r, -R`: recursive - -Examples: - -```javascript -rm('-rf', '/tmp/*'); -rm('some_file.txt', 'another_file.txt'); -rm(['some_file.txt', 'another_file.txt']); // same as above -``` - -Removes files. - - -### mv([options ,] source [, source ...], dest') -### mv([options ,] source_array, dest') -Available options: - -+ `-f`: force (default behavior) -+ `-n`: no-clobber - -Examples: - -```javascript -mv('-n', 'file', 'dir/'); -mv('file1', 'file2', 'dir/'); -mv(['file1', 'file2'], 'dir/'); // same as above -``` - -Moves files. - - -### mkdir([options,] dir [, dir ...]) -### mkdir([options,] dir_array) -Available options: - -+ `-p`: full path (will create intermediate dirs if necessary) - -Examples: - -```javascript -mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g'); -mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above -``` - -Creates directories. - - -### test(expression) -Available expression primaries: - -+ `'-b', 'path'`: true if path is a block device -+ `'-c', 'path'`: true if path is a character device -+ `'-d', 'path'`: true if path is a directory -+ `'-e', 'path'`: true if path exists -+ `'-f', 'path'`: true if path is a regular file -+ `'-L', 'path'`: true if path is a symbolic link -+ `'-p', 'path'`: true if path is a pipe (FIFO) -+ `'-S', 'path'`: true if path is a socket - -Examples: - -```javascript -if (test('-d', path)) { /* do something with dir */ }; -if (!test('-f', path)) continue; // skip if it's a regular file -``` - -Evaluates expression using the available primaries and returns corresponding value. - - -### cat(file [, file ...]) -### cat(file_array) - -Examples: - -```javascript -var str = cat('file*.txt'); -var str = cat('file1', 'file2'); -var str = cat(['file1', 'file2']); // same as above -``` - -Returns a string containing the given file, or a concatenated string -containing the files if more than one file is given (a new line character is -introduced between each file). - - -### head([{'-n': \},] file [, file ...]) -### head([{'-n': \},] file_array) -Available options: - -+ `-n `: Show the first `` lines of the files - -Examples: - -```javascript -var str = head({'-n': 1}, 'file*.txt'); -var str = head('file1', 'file2'); -var str = head(['file1', 'file2']); // same as above -``` - -Read the start of a file. - - -### tail([{'-n': \},] file [, file ...]) -### tail([{'-n': \},] file_array) -Available options: - -+ `-n `: Show the last `` lines of the files - -Examples: - -```javascript -var str = tail({'-n': 1}, 'file*.txt'); -var str = tail('file1', 'file2'); -var str = tail(['file1', 'file2']); // same as above -``` - -Read the end of a file. - - -### ShellString.prototype.to(file) - -Examples: - -```javascript -cat('input.txt').to('output.txt'); -``` - -Analogous to the redirection operator `>` in Unix, but works with -ShellStrings (such as those returned by `cat`, `grep`, etc). _Like Unix -redirections, `to()` will overwrite any existing file!_ - - -### ShellString.prototype.toEnd(file) - -Examples: - -```javascript -cat('input.txt').toEnd('output.txt'); -``` - -Analogous to the redirect-and-append operator `>>` in Unix, but works with -ShellStrings (such as those returned by `cat`, `grep`, etc). - - -### sed([options,] search_regex, replacement, file [, file ...]) -### sed([options,] search_regex, replacement, file_array) -Available options: - -+ `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_ - -Examples: - -```javascript -sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js'); -sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js'); -``` - -Reads an input string from `files` and performs a JavaScript `replace()` on the input -using the given search regex and replacement string or function. Returns the new string after replacement. - - -### sort([options,] file [, file ...]) -### sort([options,] file_array) -Available options: - -+ `-r`: Reverse the result of comparisons -+ `-n`: Compare according to numerical value - -Examples: - -```javascript -sort('foo.txt', 'bar.txt'); -sort('-r', 'foo.txt'); -``` - -Return the contents of the files, sorted line-by-line. Sorting multiple -files mixes their content, just like unix sort does. - - -### uniq([options,] [input, [output]]) -Available options: - -+ `-i`: Ignore case while comparing -+ `-c`: Prefix lines by the number of occurrences -+ `-d`: Only print duplicate lines, one for each group of identical lines - -Examples: - -```javascript -uniq('foo.txt'); -uniq('-i', 'foo.txt'); -uniq('-cd', 'foo.txt', 'bar.txt'); -``` - -Filter adjacent matching lines from input - - -### grep([options,] regex_filter, file [, file ...]) -### grep([options,] regex_filter, file_array) -Available options: - -+ `-v`: Inverse the sense of the regex and print the lines not matching the criteria. -+ `-l`: Print only filenames of matching files - -Examples: - -```javascript -grep('-v', 'GLOBAL_VARIABLE', '*.js'); -grep('GLOBAL_VARIABLE', '*.js'); -``` - -Reads input string from given files and returns a string containing all lines of the -file that match the given `regex_filter`. - - -### which(command) - -Examples: - -```javascript -var nodeExec = which('node'); -``` - -Searches for `command` in the system's PATH. On Windows, this uses the -`PATHEXT` variable to append the extension if it's not already executable. -Returns string containing the absolute path to the command. - - -### echo([options,] string [, string ...]) -Available options: - -+ `-e`: interpret backslash escapes (default) - -Examples: - -```javascript -echo('hello world'); -var str = echo('hello world'); -``` - -Prints string to stdout, and returns string with additional utility methods -like `.to()`. - - -### pushd([options,] [dir | '-N' | '+N']) - -Available options: - -+ `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated. - -Arguments: - -+ `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`. -+ `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. -+ `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. - -Examples: - -```javascript -// process.cwd() === '/usr' -pushd('/etc'); // Returns /etc /usr -pushd('+1'); // Returns /usr /etc -``` - -Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack. - -### popd([options,] ['-N' | '+N']) - -Available options: - -+ `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated. - -Arguments: - -+ `+N`: Removes the Nth directory (counting from the left of the list printed by dirs), starting with zero. -+ `-N`: Removes the Nth directory (counting from the right of the list printed by dirs), starting with zero. - -Examples: - -```javascript -echo(process.cwd()); // '/usr' -pushd('/etc'); // '/etc /usr' -echo(process.cwd()); // '/etc' -popd(); // '/usr' -echo(process.cwd()); // '/usr' -``` - -When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack. - -### dirs([options | '+N' | '-N']) - -Available options: - -+ `-c`: Clears the directory stack by deleting all of the elements. - -Arguments: - -+ `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero. -+ `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero. - -Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified. - -See also: pushd, popd - - -### ln([options,] source, dest) -Available options: - -+ `-s`: symlink -+ `-f`: force - -Examples: - -```javascript -ln('file', 'newlink'); -ln('-sf', 'file', 'existing'); -``` - -Links source to dest. Use -f to force the link, should dest already exist. - - -### exit(code) -Exits the current process with the given exit code. - -### env['VAR_NAME'] -Object containing environment variables (both getter and setter). Shortcut to process.env. - -### exec(command [, options] [, callback]) -Available options (all `false` by default): - -+ `async`: Asynchronous execution. If a callback is provided, it will be set to - `true`, regardless of the passed value. -+ `silent`: Do not echo program output to console. -+ and any option available to NodeJS's - [child_process.exec()](https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback) - -Examples: - -```javascript -var version = exec('node --version', {silent:true}).stdout; - -var child = exec('some_long_running_process', {async:true}); -child.stdout.on('data', function(data) { - /* ... do something with data ... */ -}); - -exec('some_long_running_process', function(code, stdout, stderr) { - console.log('Exit code:', code); - console.log('Program output:', stdout); - console.log('Program stderr:', stderr); -}); -``` - -Executes the given `command` _synchronously_, unless otherwise specified. When in synchronous -mode, this returns a ShellString (compatible with ShellJS v0.6.x, which returns an object -of the form `{ code:..., stdout:... , stderr:... }`). Otherwise, this returns the child process -object, and the `callback` gets the arguments `(code, stdout, stderr)`. - -Not seeing the behavior you want? `exec()` runs everything through `sh` -by default (or `cmd.exe` on Windows), which differs from `bash`. If you -need bash-specific behavior, try out the `{shell: 'path/to/bash'}` option. - -**Note:** For long-lived processes, it's best to run `exec()` asynchronously as -the current synchronous implementation uses a lot of CPU. This should be getting -fixed soon. - - -### chmod(octal_mode || octal_string, file) -### chmod(symbolic_mode, file) - -Available options: - -+ `-v`: output a diagnostic for every file processed -+ `-c`: like verbose but report only when a change is made -+ `-R`: change files and directories recursively - -Examples: - -```javascript -chmod(755, '/Users/brandon'); -chmod('755', '/Users/brandon'); // same as above -chmod('u+x', '/Users/brandon'); -``` - -Alters the permissions of a file or directory by either specifying the -absolute permissions in octal form or expressing the changes in symbols. -This command tries to mimic the POSIX behavior as much as possible. -Notable exceptions: - -+ In symbolic modes, 'a-r' and '-r' are identical. No consideration is - given to the umask. -+ There is no "quiet" option since default behavior is to run silent. - - -### touch([options,] file [, file ...]) -### touch([options,] file_array) -Available options: - -+ `-a`: Change only the access time -+ `-c`: Do not create any files -+ `-m`: Change only the modification time -+ `-d DATE`: Parse DATE and use it instead of current time -+ `-r FILE`: Use FILE's times instead of current time - -Examples: - -```javascript -touch('source.js'); -touch('-c', '/path/to/some/dir/source.js'); -touch({ '-r': FILE }, '/path/to/some/dir/source.js'); -``` - -Update the access and modification times of each FILE to the current time. -A FILE argument that does not exist is created empty, unless -c is supplied. -This is a partial implementation of *[touch(1)](http://linux.die.net/man/1/touch)*. - - -### set(options) -Available options: - -+ `+/-e`: exit upon error (`config.fatal`) -+ `+/-v`: verbose: show all commands (`config.verbose`) -+ `+/-f`: disable filename expansion (globbing) - -Examples: - -```javascript -set('-e'); // exit upon first error -set('+e'); // this undoes a "set('-e')" -``` - -Sets global configuration variables - - -## Non-Unix commands - - -### tempdir() - -Examples: - -```javascript -var tmp = tempdir(); // "/tmp" for most *nix platforms -``` - -Searches and returns string containing a writeable, platform-dependent temporary directory. -Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir). - - -### error() -Tests if error occurred in the last command. Returns a truthy value if an -error returned and a falsy value otherwise. - -**Note**: do not rely on the -return value to be an error message. If you need the last error message, use -the `.stderr` attribute from the last command's return value instead. - - -### ShellString(str) - -Examples: - -```javascript -var foo = ShellString('hello world'); -``` - -Turns a regular string into a string-like object similar to what each -command returns. This has special methods, like `.to()` and `.toEnd()` - - -### Pipes - -Examples: - -```javascript -grep('foo', 'file1.txt', 'file2.txt').sed(/o/g, 'a').to('output.txt'); -echo('files with o\'s in the name:\n' + ls().grep('o')); -cat('test.js').exec('node'); // pipe to exec() call -``` - -Commands can send their output to another command in a pipe-like fashion. -`sed`, `grep`, `cat`, `exec`, `to`, and `toEnd` can appear on the right-hand -side of a pipe. Pipes can be chained. - -## Configuration - - -### config.silent - -Example: - -```javascript -var sh = require('shelljs'); -var silentState = sh.config.silent; // save old silent state -sh.config.silent = true; -/* ... */ -sh.config.silent = silentState; // restore old silent state -``` - -Suppresses all command output if `true`, except for `echo()` calls. -Default is `false`. - -### config.fatal - -Example: - -```javascript -require('shelljs/global'); -config.fatal = true; // or set('-e'); -cp('this_file_does_not_exist', '/dev/null'); // throws Error here -/* more commands... */ -``` - -If `true` the script will throw a Javascript error when any shell.js -command encounters an error. Default is `false`. This is analogous to -Bash's `set -e` - -### config.verbose - -Example: - -```javascript -config.verbose = true; // or set('-v'); -cd('dir/'); -ls('subdir/'); -``` - -Will print each command as follows: - -``` -cd dir/ -ls subdir/ -``` - -### config.globOptions - -Example: - -```javascript -config.globOptions = {nodir: true}; -``` - -Use this value for calls to `glob.sync()` instead of the default options. - -## Team - -| [![Nate Fischer](https://avatars.githubusercontent.com/u/5801521?s=130)](https://github.com/nfischer) | [![Ari Porad](https://avatars1.githubusercontent.com/u/1817508?v=3&s=130)](http://github.com/ariporad) | -|:---:|:---:| -| [Nate Fischer](https://github.com/nfischer) | [Ari Porad](http://github.com/ariporad) | diff --git a/node_modules/shelljs/bin/shjs b/node_modules/shelljs/bin/shjs deleted file mode 100644 index 75ca58b..0000000 --- a/node_modules/shelljs/bin/shjs +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env node -require('../global'); - -if (process.argv.length < 3) { - console.log('ShellJS: missing argument (script name)'); - console.log(); - process.exit(1); -} - -var args, - scriptName = process.argv[2]; -env['NODE_PATH'] = __dirname + '/../..'; - -if (!scriptName.match(/\.js/) && !scriptName.match(/\.coffee/)) { - if (test('-f', scriptName + '.js')) - scriptName += '.js'; - if (test('-f', scriptName + '.coffee')) - scriptName += '.coffee'; -} - -if (!test('-f', scriptName)) { - console.log('ShellJS: script not found ('+scriptName+')'); - console.log(); - process.exit(1); -} - -args = process.argv.slice(3); - -for (var i = 0, l = args.length; i < l; i++) { - if (args[i][0] !== "-"){ - args[i] = '"' + args[i] + '"'; // fixes arguments with multiple words - } -} - -var path = require('path'); -var extensions = require('interpret').extensions; -var rechoir = require('rechoir'); -rechoir.prepare(extensions, scriptName); -require(require.resolve(path.resolve(process.cwd(), scriptName))); diff --git a/node_modules/shelljs/global.js b/node_modules/shelljs/global.js deleted file mode 100644 index b232e66..0000000 --- a/node_modules/shelljs/global.js +++ /dev/null @@ -1,12 +0,0 @@ -/* eslint no-extend-native: 0 */ -var shell = require('./shell.js'); -var common = require('./src/common'); -Object.keys(shell).forEach(function (cmd) { - global[cmd] = shell[cmd]; -}); - -var _to = require('./src/to'); -String.prototype.to = common.wrap('to', _to); - -var _toEnd = require('./src/toEnd'); -String.prototype.toEnd = common.wrap('toEnd', _toEnd); diff --git a/node_modules/shelljs/make.js b/node_modules/shelljs/make.js deleted file mode 100644 index a8438c8..0000000 --- a/node_modules/shelljs/make.js +++ /dev/null @@ -1,57 +0,0 @@ -require('./global'); - -global.config.fatal = true; -global.target = {}; - -var args = process.argv.slice(2), - targetArgs, - dashesLoc = args.indexOf('--'); - -// split args, everything after -- if only for targets -if (dashesLoc > -1) { - targetArgs = args.slice(dashesLoc + 1, args.length); - args = args.slice(0, dashesLoc); -} - -// This ensures we only execute the script targets after the entire script has -// been evaluated -setTimeout(function() { - var t; - - if (args.length === 1 && args[0] === '--help') { - console.log('Available targets:'); - for (t in global.target) - console.log(' ' + t); - return; - } - - // Wrap targets to prevent duplicate execution - for (t in global.target) { - (function(t, oldTarget){ - - // Wrap it - global.target[t] = function() { - if (!oldTarget.done){ - oldTarget.done = true; - oldTarget.result = oldTarget.apply(oldTarget, arguments); - } - return oldTarget.result; - }; - - })(t, global.target[t]); - } - - // Execute desired targets - if (args.length > 0) { - args.forEach(function(arg) { - if (arg in global.target) - global.target[arg](targetArgs); - else { - console.log('no such target: ' + arg); - } - }); - } else if ('all' in global.target) { - global.target.all(targetArgs); - } - -}, 0); diff --git a/node_modules/shelljs/node_modules/glob/LICENSE b/node_modules/shelljs/node_modules/glob/LICENSE deleted file mode 100644 index 19129e3..0000000 --- a/node_modules/shelljs/node_modules/glob/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/shelljs/node_modules/glob/README.md b/node_modules/shelljs/node_modules/glob/README.md deleted file mode 100644 index baa1d1b..0000000 --- a/node_modules/shelljs/node_modules/glob/README.md +++ /dev/null @@ -1,368 +0,0 @@ -# Glob - -Match files using the patterns the shell uses, like stars and stuff. - -[![Build Status](https://travis-ci.org/isaacs/node-glob.svg?branch=master)](https://travis-ci.org/isaacs/node-glob/) [![Build Status](https://ci.appveyor.com/api/projects/status/kd7f3yftf7unxlsx?svg=true)](https://ci.appveyor.com/project/isaacs/node-glob) [![Coverage Status](https://coveralls.io/repos/isaacs/node-glob/badge.svg?branch=master&service=github)](https://coveralls.io/github/isaacs/node-glob?branch=master) - -This is a glob implementation in JavaScript. It uses the `minimatch` -library to do its matching. - -![](oh-my-glob.gif) - -## Usage - -Install with npm - -``` -npm i glob -``` - -```javascript -var glob = require("glob") - -// options is optional -glob("**/*.js", options, function (er, files) { - // files is an array of filenames. - // If the `nonull` option is set, and nothing - // was found, then files is ["**/*.js"] - // er is an error object or null. -}) -``` - -## Glob Primer - -"Globs" are the patterns you type when you do stuff like `ls *.js` on -the command line, or put `build/*` in a `.gitignore` file. - -Before parsing the path part patterns, braced sections are expanded -into a set. Braced sections start with `{` and end with `}`, with any -number of comma-delimited sections within. Braced sections may contain -slash characters, so `a{/b/c,bcd}` would expand into `a/b/c` and `abcd`. - -The following characters have special magic meaning when used in a -path portion: - -* `*` Matches 0 or more characters in a single path portion -* `?` Matches 1 character -* `[...]` Matches a range of characters, similar to a RegExp range. - If the first character of the range is `!` or `^` then it matches - any character not in the range. -* `!(pattern|pattern|pattern)` Matches anything that does not match - any of the patterns provided. -* `?(pattern|pattern|pattern)` Matches zero or one occurrence of the - patterns provided. -* `+(pattern|pattern|pattern)` Matches one or more occurrences of the - patterns provided. -* `*(a|b|c)` Matches zero or more occurrences of the patterns provided -* `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns - provided -* `**` If a "globstar" is alone in a path portion, then it matches - zero or more directories and subdirectories searching for matches. - It does not crawl symlinked directories. - -### Dots - -If a file or directory path portion has a `.` as the first character, -then it will not match any glob pattern unless that pattern's -corresponding path part also has a `.` as its first character. - -For example, the pattern `a/.*/c` would match the file at `a/.b/c`. -However the pattern `a/*/c` would not, because `*` does not start with -a dot character. - -You can make glob treat dots as normal characters by setting -`dot:true` in the options. - -### Basename Matching - -If you set `matchBase:true` in the options, and the pattern has no -slashes in it, then it will seek for any file anywhere in the tree -with a matching basename. For example, `*.js` would match -`test/simple/basic.js`. - -### Empty Sets - -If no matching files are found, then an empty array is returned. This -differs from the shell, where the pattern itself is returned. For -example: - - $ echo a*s*d*f - a*s*d*f - -To get the bash-style behavior, set the `nonull:true` in the options. - -### See Also: - -* `man sh` -* `man bash` (Search for "Pattern Matching") -* `man 3 fnmatch` -* `man 5 gitignore` -* [minimatch documentation](https://github.com/isaacs/minimatch) - -## glob.hasMagic(pattern, [options]) - -Returns `true` if there are any special characters in the pattern, and -`false` otherwise. - -Note that the options affect the results. If `noext:true` is set in -the options object, then `+(a|b)` will not be considered a magic -pattern. If the pattern has a brace expansion, like `a/{b/c,x/y}` -then that is considered magical, unless `nobrace:true` is set in the -options. - -## glob(pattern, [options], cb) - -* `pattern` `{String}` Pattern to be matched -* `options` `{Object}` -* `cb` `{Function}` - * `err` `{Error | null}` - * `matches` `{Array}` filenames found matching the pattern - -Perform an asynchronous glob search. - -## glob.sync(pattern, [options]) - -* `pattern` `{String}` Pattern to be matched -* `options` `{Object}` -* return: `{Array}` filenames found matching the pattern - -Perform a synchronous glob search. - -## Class: glob.Glob - -Create a Glob object by instantiating the `glob.Glob` class. - -```javascript -var Glob = require("glob").Glob -var mg = new Glob(pattern, options, cb) -``` - -It's an EventEmitter, and starts walking the filesystem to find matches -immediately. - -### new glob.Glob(pattern, [options], [cb]) - -* `pattern` `{String}` pattern to search for -* `options` `{Object}` -* `cb` `{Function}` Called when an error occurs, or matches are found - * `err` `{Error | null}` - * `matches` `{Array}` filenames found matching the pattern - -Note that if the `sync` flag is set in the options, then matches will -be immediately available on the `g.found` member. - -### Properties - -* `minimatch` The minimatch object that the glob uses. -* `options` The options object passed in. -* `aborted` Boolean which is set to true when calling `abort()`. There - is no way at this time to continue a glob search after aborting, but - you can re-use the statCache to avoid having to duplicate syscalls. -* `cache` Convenience object. Each field has the following possible - values: - * `false` - Path does not exist - * `true` - Path exists - * `'FILE'` - Path exists, and is not a directory - * `'DIR'` - Path exists, and is a directory - * `[file, entries, ...]` - Path exists, is a directory, and the - array value is the results of `fs.readdir` -* `statCache` Cache of `fs.stat` results, to prevent statting the same - path multiple times. -* `symlinks` A record of which paths are symbolic links, which is - relevant in resolving `**` patterns. -* `realpathCache` An optional object which is passed to `fs.realpath` - to minimize unnecessary syscalls. It is stored on the instantiated - Glob object, and may be re-used. - -### Events - -* `end` When the matching is finished, this is emitted with all the - matches found. If the `nonull` option is set, and no match was found, - then the `matches` list contains the original pattern. The matches - are sorted, unless the `nosort` flag is set. -* `match` Every time a match is found, this is emitted with the specific - thing that matched. It is not deduplicated or resolved to a realpath. -* `error` Emitted when an unexpected error is encountered, or whenever - any fs error occurs if `options.strict` is set. -* `abort` When `abort()` is called, this event is raised. - -### Methods - -* `pause` Temporarily stop the search -* `resume` Resume the search -* `abort` Stop the search forever - -### Options - -All the options that can be passed to Minimatch can also be passed to -Glob to change pattern matching behavior. Also, some have been added, -or have glob-specific ramifications. - -All options are false by default, unless otherwise noted. - -All options are added to the Glob object, as well. - -If you are running many `glob` operations, you can pass a Glob object -as the `options` argument to a subsequent operation to shortcut some -`stat` and `readdir` calls. At the very least, you may pass in shared -`symlinks`, `statCache`, `realpathCache`, and `cache` options, so that -parallel glob operations will be sped up by sharing information about -the filesystem. - -* `cwd` The current working directory in which to search. Defaults - to `process.cwd()`. -* `root` The place where patterns starting with `/` will be mounted - onto. Defaults to `path.resolve(options.cwd, "/")` (`/` on Unix - systems, and `C:\` or some such on Windows.) -* `dot` Include `.dot` files in normal matches and `globstar` matches. - Note that an explicit dot in a portion of the pattern will always - match dot files. -* `nomount` By default, a pattern starting with a forward-slash will be - "mounted" onto the root setting, so that a valid filesystem path is - returned. Set this flag to disable that behavior. -* `mark` Add a `/` character to directory matches. Note that this - requires additional stat calls. -* `nosort` Don't sort the results. -* `stat` Set to true to stat *all* results. This reduces performance - somewhat, and is completely unnecessary, unless `readdir` is presumed - to be an untrustworthy indicator of file existence. -* `silent` When an unusual error is encountered when attempting to - read a directory, a warning will be printed to stderr. Set the - `silent` option to true to suppress these warnings. -* `strict` When an unusual error is encountered when attempting to - read a directory, the process will just continue on in search of - other matches. Set the `strict` option to raise an error in these - cases. -* `cache` See `cache` property above. Pass in a previously generated - cache object to save some fs calls. -* `statCache` A cache of results of filesystem information, to prevent - unnecessary stat calls. While it should not normally be necessary - to set this, you may pass the statCache from one glob() call to the - options object of another, if you know that the filesystem will not - change between calls. (See "Race Conditions" below.) -* `symlinks` A cache of known symbolic links. You may pass in a - previously generated `symlinks` object to save `lstat` calls when - resolving `**` matches. -* `sync` DEPRECATED: use `glob.sync(pattern, opts)` instead. -* `nounique` In some cases, brace-expanded patterns can result in the - same file showing up multiple times in the result set. By default, - this implementation prevents duplicates in the result set. Set this - flag to disable that behavior. -* `nonull` Set to never return an empty set, instead returning a set - containing the pattern itself. This is the default in glob(3). -* `debug` Set to enable debug logging in minimatch and glob. -* `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets. -* `noglobstar` Do not match `**` against multiple filenames. (Ie, - treat it as a normal `*` instead.) -* `noext` Do not match `+(a|b)` "extglob" patterns. -* `nocase` Perform a case-insensitive match. Note: on - case-insensitive filesystems, non-magic patterns will match by - default, since `stat` and `readdir` will not raise errors. -* `matchBase` Perform a basename-only match if the pattern does not - contain any slash characters. That is, `*.js` would be treated as - equivalent to `**/*.js`, matching all js files in all directories. -* `nodir` Do not match directories, only files. (Note: to match - *only* directories, simply put a `/` at the end of the pattern.) -* `ignore` Add a pattern or an array of glob patterns to exclude matches. - Note: `ignore` patterns are *always* in `dot:true` mode, regardless - of any other settings. -* `follow` Follow symlinked directories when expanding `**` patterns. - Note that this can result in a lot of duplicate references in the - presence of cyclic links. -* `realpath` Set to true to call `fs.realpath` on all of the results. - In the case of a symlink that cannot be resolved, the full absolute - path to the matched entry is returned (though it will usually be a - broken symlink) -* `absolute` Set to true to always receive absolute paths for matched - files. Unlike `realpath`, this also affects the values returned in - the `match` event. - -## Comparisons to other fnmatch/glob implementations - -While strict compliance with the existing standards is a worthwhile -goal, some discrepancies exist between node-glob and other -implementations, and are intentional. - -The double-star character `**` is supported by default, unless the -`noglobstar` flag is set. This is supported in the manner of bsdglob -and bash 4.3, where `**` only has special significance if it is the only -thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but -`a/**b` will not. - -Note that symlinked directories are not crawled as part of a `**`, -though their contents may match against subsequent portions of the -pattern. This prevents infinite loops and duplicates and the like. - -If an escaped pattern has no matches, and the `nonull` flag is set, -then glob returns the pattern as-provided, rather than -interpreting the character escapes. For example, -`glob.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than -`"*a?"`. This is akin to setting the `nullglob` option in bash, except -that it does not resolve escaped pattern characters. - -If brace expansion is not disabled, then it is performed before any -other interpretation of the glob pattern. Thus, a pattern like -`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded -**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are -checked for validity. Since those two are valid, matching proceeds. - -### Comments and Negation - -Previously, this module let you mark a pattern as a "comment" if it -started with a `#` character, or a "negated" pattern if it started -with a `!` character. - -These options were deprecated in version 5, and removed in version 6. - -To specify things that should not match, use the `ignore` option. - -## Windows - -**Please only use forward-slashes in glob expressions.** - -Though windows uses either `/` or `\` as its path separator, only `/` -characters are used by this glob implementation. You must use -forward-slashes **only** in glob expressions. Back-slashes will always -be interpreted as escape characters, not path separators. - -Results from absolute patterns such as `/foo/*` are mounted onto the -root setting using `path.join`. On windows, this will by default result -in `/foo/*` matching `C:\foo\bar.txt`. - -## Race Conditions - -Glob searching, by its very nature, is susceptible to race conditions, -since it relies on directory walking and such. - -As a result, it is possible that a file that exists when glob looks for -it may have been deleted or modified by the time it returns the result. - -As part of its internal implementation, this program caches all stat -and readdir calls that it makes, in order to cut down on system -overhead. However, this also makes it even more susceptible to races, -especially if the cache or statCache objects are reused between glob -calls. - -Users are thus advised not to use a glob result as a guarantee of -filesystem state in the face of rapid changes. For the vast majority -of operations, this is never a problem. - -## Contributing - -Any change to behavior (including bugfixes) must come with a test. - -Patches that fail tests or reduce performance will be rejected. - -``` -# to run tests -npm test - -# to re-generate test fixtures -npm run test-regen - -# to benchmark against bash/zsh -npm run bench - -# to profile javascript -npm run prof -``` diff --git a/node_modules/shelljs/node_modules/glob/changelog.md b/node_modules/shelljs/node_modules/glob/changelog.md deleted file mode 100644 index 4163677..0000000 --- a/node_modules/shelljs/node_modules/glob/changelog.md +++ /dev/null @@ -1,67 +0,0 @@ -## 7.0 - -- Raise error if `options.cwd` is specified, and not a directory - -## 6.0 - -- Remove comment and negation pattern support -- Ignore patterns are always in `dot:true` mode - -## 5.0 - -- Deprecate comment and negation patterns -- Fix regression in `mark` and `nodir` options from making all cache - keys absolute path. -- Abort if `fs.readdir` returns an error that's unexpected -- Don't emit `match` events for ignored items -- Treat ENOTSUP like ENOTDIR in readdir - -## 4.5 - -- Add `options.follow` to always follow directory symlinks in globstar -- Add `options.realpath` to call `fs.realpath` on all results -- Always cache based on absolute path - -## 4.4 - -- Add `options.ignore` -- Fix handling of broken symlinks - -## 4.3 - -- Bump minimatch to 2.x -- Pass all tests on Windows - -## 4.2 - -- Add `glob.hasMagic` function -- Add `options.nodir` flag - -## 4.1 - -- Refactor sync and async implementations for performance -- Throw if callback provided to sync glob function -- Treat symbolic links in globstar results the same as Bash 4.3 - -## 4.0 - -- Use `^` for dependency versions (bumped major because this breaks - older npm versions) -- Ensure callbacks are only ever called once -- switch to ISC license - -## 3.x - -- Rewrite in JavaScript -- Add support for setting root, cwd, and windows support -- Cache many fs calls -- Add globstar support -- emit match events - -## 2.x - -- Use `glob.h` and `fnmatch.h` from NetBSD - -## 1.x - -- `glob.h` static binding. diff --git a/node_modules/shelljs/node_modules/glob/common.js b/node_modules/shelljs/node_modules/glob/common.js deleted file mode 100644 index 66651bb..0000000 --- a/node_modules/shelljs/node_modules/glob/common.js +++ /dev/null @@ -1,240 +0,0 @@ -exports.alphasort = alphasort -exports.alphasorti = alphasorti -exports.setopts = setopts -exports.ownProp = ownProp -exports.makeAbs = makeAbs -exports.finish = finish -exports.mark = mark -exports.isIgnored = isIgnored -exports.childrenIgnored = childrenIgnored - -function ownProp (obj, field) { - return Object.prototype.hasOwnProperty.call(obj, field) -} - -var path = require("path") -var minimatch = require("minimatch") -var isAbsolute = require("path-is-absolute") -var Minimatch = minimatch.Minimatch - -function alphasorti (a, b) { - return a.toLowerCase().localeCompare(b.toLowerCase()) -} - -function alphasort (a, b) { - return a.localeCompare(b) -} - -function setupIgnores (self, options) { - self.ignore = options.ignore || [] - - if (!Array.isArray(self.ignore)) - self.ignore = [self.ignore] - - if (self.ignore.length) { - self.ignore = self.ignore.map(ignoreMap) - } -} - -// ignore patterns are always in dot:true mode. -function ignoreMap (pattern) { - var gmatcher = null - if (pattern.slice(-3) === '/**') { - var gpattern = pattern.replace(/(\/\*\*)+$/, '') - gmatcher = new Minimatch(gpattern, { dot: true }) - } - - return { - matcher: new Minimatch(pattern, { dot: true }), - gmatcher: gmatcher - } -} - -function setopts (self, pattern, options) { - if (!options) - options = {} - - // base-matching: just use globstar for that. - if (options.matchBase && -1 === pattern.indexOf("/")) { - if (options.noglobstar) { - throw new Error("base matching requires globstar") - } - pattern = "**/" + pattern - } - - self.silent = !!options.silent - self.pattern = pattern - self.strict = options.strict !== false - self.realpath = !!options.realpath - self.realpathCache = options.realpathCache || Object.create(null) - self.follow = !!options.follow - self.dot = !!options.dot - self.mark = !!options.mark - self.nodir = !!options.nodir - if (self.nodir) - self.mark = true - self.sync = !!options.sync - self.nounique = !!options.nounique - self.nonull = !!options.nonull - self.nosort = !!options.nosort - self.nocase = !!options.nocase - self.stat = !!options.stat - self.noprocess = !!options.noprocess - self.absolute = !!options.absolute - - self.maxLength = options.maxLength || Infinity - self.cache = options.cache || Object.create(null) - self.statCache = options.statCache || Object.create(null) - self.symlinks = options.symlinks || Object.create(null) - - setupIgnores(self, options) - - self.changedCwd = false - var cwd = process.cwd() - if (!ownProp(options, "cwd")) - self.cwd = cwd - else { - self.cwd = path.resolve(options.cwd) - self.changedCwd = self.cwd !== cwd - } - - self.root = options.root || path.resolve(self.cwd, "/") - self.root = path.resolve(self.root) - if (process.platform === "win32") - self.root = self.root.replace(/\\/g, "/") - - // TODO: is an absolute `cwd` supposed to be resolved against `root`? - // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test') - self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd) - if (process.platform === "win32") - self.cwdAbs = self.cwdAbs.replace(/\\/g, "/") - self.nomount = !!options.nomount - - // disable comments and negation in Minimatch. - // Note that they are not supported in Glob itself anyway. - options.nonegate = true - options.nocomment = true - - self.minimatch = new Minimatch(pattern, options) - self.options = self.minimatch.options -} - -function finish (self) { - var nou = self.nounique - var all = nou ? [] : Object.create(null) - - for (var i = 0, l = self.matches.length; i < l; i ++) { - var matches = self.matches[i] - if (!matches || Object.keys(matches).length === 0) { - if (self.nonull) { - // do like the shell, and spit out the literal glob - var literal = self.minimatch.globSet[i] - if (nou) - all.push(literal) - else - all[literal] = true - } - } else { - // had matches - var m = Object.keys(matches) - if (nou) - all.push.apply(all, m) - else - m.forEach(function (m) { - all[m] = true - }) - } - } - - if (!nou) - all = Object.keys(all) - - if (!self.nosort) - all = all.sort(self.nocase ? alphasorti : alphasort) - - // at *some* point we statted all of these - if (self.mark) { - for (var i = 0; i < all.length; i++) { - all[i] = self._mark(all[i]) - } - if (self.nodir) { - all = all.filter(function (e) { - var notDir = !(/\/$/.test(e)) - var c = self.cache[e] || self.cache[makeAbs(self, e)] - if (notDir && c) - notDir = c !== 'DIR' && !Array.isArray(c) - return notDir - }) - } - } - - if (self.ignore.length) - all = all.filter(function(m) { - return !isIgnored(self, m) - }) - - self.found = all -} - -function mark (self, p) { - var abs = makeAbs(self, p) - var c = self.cache[abs] - var m = p - if (c) { - var isDir = c === 'DIR' || Array.isArray(c) - var slash = p.slice(-1) === '/' - - if (isDir && !slash) - m += '/' - else if (!isDir && slash) - m = m.slice(0, -1) - - if (m !== p) { - var mabs = makeAbs(self, m) - self.statCache[mabs] = self.statCache[abs] - self.cache[mabs] = self.cache[abs] - } - } - - return m -} - -// lotta situps... -function makeAbs (self, f) { - var abs = f - if (f.charAt(0) === '/') { - abs = path.join(self.root, f) - } else if (isAbsolute(f) || f === '') { - abs = f - } else if (self.changedCwd) { - abs = path.resolve(self.cwd, f) - } else { - abs = path.resolve(f) - } - - if (process.platform === 'win32') - abs = abs.replace(/\\/g, '/') - - return abs -} - - -// Return true, if pattern ends with globstar '**', for the accompanying parent directory. -// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents -function isIgnored (self, path) { - if (!self.ignore.length) - return false - - return self.ignore.some(function(item) { - return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) - }) -} - -function childrenIgnored (self, path) { - if (!self.ignore.length) - return false - - return self.ignore.some(function(item) { - return !!(item.gmatcher && item.gmatcher.match(path)) - }) -} diff --git a/node_modules/shelljs/node_modules/glob/glob.js b/node_modules/shelljs/node_modules/glob/glob.js deleted file mode 100644 index bfdd7a1..0000000 --- a/node_modules/shelljs/node_modules/glob/glob.js +++ /dev/null @@ -1,792 +0,0 @@ -// Approach: -// -// 1. Get the minimatch set -// 2. For each pattern in the set, PROCESS(pattern, false) -// 3. Store matches per-set, then uniq them -// -// PROCESS(pattern, inGlobStar) -// Get the first [n] items from pattern that are all strings -// Join these together. This is PREFIX. -// If there is no more remaining, then stat(PREFIX) and -// add to matches if it succeeds. END. -// -// If inGlobStar and PREFIX is symlink and points to dir -// set ENTRIES = [] -// else readdir(PREFIX) as ENTRIES -// If fail, END -// -// with ENTRIES -// If pattern[n] is GLOBSTAR -// // handle the case where the globstar match is empty -// // by pruning it out, and testing the resulting pattern -// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) -// // handle other cases. -// for ENTRY in ENTRIES (not dotfiles) -// // attach globstar + tail onto the entry -// // Mark that this entry is a globstar match -// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) -// -// else // not globstar -// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) -// Test ENTRY against pattern[n] -// If fails, continue -// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) -// -// Caveat: -// Cache all stats and readdirs results to minimize syscall. Since all -// we ever care about is existence and directory-ness, we can just keep -// `true` for files, and [children,...] for directories, or `false` for -// things that don't exist. - -module.exports = glob - -var fs = require('fs') -var rp = require('fs.realpath') -var minimatch = require('minimatch') -var Minimatch = minimatch.Minimatch -var inherits = require('inherits') -var EE = require('events').EventEmitter -var path = require('path') -var assert = require('assert') -var isAbsolute = require('path-is-absolute') -var globSync = require('./sync.js') -var common = require('./common.js') -var alphasort = common.alphasort -var alphasorti = common.alphasorti -var setopts = common.setopts -var ownProp = common.ownProp -var inflight = require('inflight') -var util = require('util') -var childrenIgnored = common.childrenIgnored -var isIgnored = common.isIgnored - -var once = require('once') - -function glob (pattern, options, cb) { - if (typeof options === 'function') cb = options, options = {} - if (!options) options = {} - - if (options.sync) { - if (cb) - throw new TypeError('callback provided to sync glob') - return globSync(pattern, options) - } - - return new Glob(pattern, options, cb) -} - -glob.sync = globSync -var GlobSync = glob.GlobSync = globSync.GlobSync - -// old api surface -glob.glob = glob - -function extend (origin, add) { - if (add === null || typeof add !== 'object') { - return origin - } - - var keys = Object.keys(add) - var i = keys.length - while (i--) { - origin[keys[i]] = add[keys[i]] - } - return origin -} - -glob.hasMagic = function (pattern, options_) { - var options = extend({}, options_) - options.noprocess = true - - var g = new Glob(pattern, options) - var set = g.minimatch.set - - if (!pattern) - return false - - if (set.length > 1) - return true - - for (var j = 0; j < set[0].length; j++) { - if (typeof set[0][j] !== 'string') - return true - } - - return false -} - -glob.Glob = Glob -inherits(Glob, EE) -function Glob (pattern, options, cb) { - if (typeof options === 'function') { - cb = options - options = null - } - - if (options && options.sync) { - if (cb) - throw new TypeError('callback provided to sync glob') - return new GlobSync(pattern, options) - } - - if (!(this instanceof Glob)) - return new Glob(pattern, options, cb) - - setopts(this, pattern, options) - this._didRealPath = false - - // process each pattern in the minimatch set - var n = this.minimatch.set.length - - // The matches are stored as {: true,...} so that - // duplicates are automagically pruned. - // Later, we do an Object.keys() on these. - // Keep them as a list so we can fill in when nonull is set. - this.matches = new Array(n) - - if (typeof cb === 'function') { - cb = once(cb) - this.on('error', cb) - this.on('end', function (matches) { - cb(null, matches) - }) - } - - var self = this - var n = this.minimatch.set.length - this._processing = 0 - this.matches = new Array(n) - - this._emitQueue = [] - this._processQueue = [] - this.paused = false - - if (this.noprocess) - return this - - if (n === 0) - return done() - - var sync = true - for (var i = 0; i < n; i ++) { - this._process(this.minimatch.set[i], i, false, done) - } - sync = false - - function done () { - --self._processing - if (self._processing <= 0) { - if (sync) { - process.nextTick(function () { - self._finish() - }) - } else { - self._finish() - } - } - } -} - -Glob.prototype._finish = function () { - assert(this instanceof Glob) - if (this.aborted) - return - - if (this.realpath && !this._didRealpath) - return this._realpath() - - common.finish(this) - this.emit('end', this.found) -} - -Glob.prototype._realpath = function () { - if (this._didRealpath) - return - - this._didRealpath = true - - var n = this.matches.length - if (n === 0) - return this._finish() - - var self = this - for (var i = 0; i < this.matches.length; i++) - this._realpathSet(i, next) - - function next () { - if (--n === 0) - self._finish() - } -} - -Glob.prototype._realpathSet = function (index, cb) { - var matchset = this.matches[index] - if (!matchset) - return cb() - - var found = Object.keys(matchset) - var self = this - var n = found.length - - if (n === 0) - return cb() - - var set = this.matches[index] = Object.create(null) - found.forEach(function (p, i) { - // If there's a problem with the stat, then it means that - // one or more of the links in the realpath couldn't be - // resolved. just return the abs value in that case. - p = self._makeAbs(p) - rp.realpath(p, self.realpathCache, function (er, real) { - if (!er) - set[real] = true - else if (er.syscall === 'stat') - set[p] = true - else - self.emit('error', er) // srsly wtf right here - - if (--n === 0) { - self.matches[index] = set - cb() - } - }) - }) -} - -Glob.prototype._mark = function (p) { - return common.mark(this, p) -} - -Glob.prototype._makeAbs = function (f) { - return common.makeAbs(this, f) -} - -Glob.prototype.abort = function () { - this.aborted = true - this.emit('abort') -} - -Glob.prototype.pause = function () { - if (!this.paused) { - this.paused = true - this.emit('pause') - } -} - -Glob.prototype.resume = function () { - if (this.paused) { - this.emit('resume') - this.paused = false - if (this._emitQueue.length) { - var eq = this._emitQueue.slice(0) - this._emitQueue.length = 0 - for (var i = 0; i < eq.length; i ++) { - var e = eq[i] - this._emitMatch(e[0], e[1]) - } - } - if (this._processQueue.length) { - var pq = this._processQueue.slice(0) - this._processQueue.length = 0 - for (var i = 0; i < pq.length; i ++) { - var p = pq[i] - this._processing-- - this._process(p[0], p[1], p[2], p[3]) - } - } - } -} - -Glob.prototype._process = function (pattern, index, inGlobStar, cb) { - assert(this instanceof Glob) - assert(typeof cb === 'function') - - if (this.aborted) - return - - this._processing++ - if (this.paused) { - this._processQueue.push([pattern, index, inGlobStar, cb]) - return - } - - //console.error('PROCESS %d', this._processing, pattern) - - // Get the first [n] parts of pattern that are all strings. - var n = 0 - while (typeof pattern[n] === 'string') { - n ++ - } - // now n is the index of the first one that is *not* a string. - - // see if there's anything else - var prefix - switch (n) { - // if not, then this is rather simple - case pattern.length: - this._processSimple(pattern.join('/'), index, cb) - return - - case 0: - // pattern *starts* with some non-trivial item. - // going to readdir(cwd), but not include the prefix in matches. - prefix = null - break - - default: - // pattern has some string bits in the front. - // whatever it starts with, whether that's 'absolute' like /foo/bar, - // or 'relative' like '../baz' - prefix = pattern.slice(0, n).join('/') - break - } - - var remain = pattern.slice(n) - - // get the list of entries. - var read - if (prefix === null) - read = '.' - else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { - if (!prefix || !isAbsolute(prefix)) - prefix = '/' + prefix - read = prefix - } else - read = prefix - - var abs = this._makeAbs(read) - - //if ignored, skip _processing - if (childrenIgnored(this, read)) - return cb() - - var isGlobStar = remain[0] === minimatch.GLOBSTAR - if (isGlobStar) - this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) - else - this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) -} - -Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { - var self = this - this._readdir(abs, inGlobStar, function (er, entries) { - return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) - }) -} - -Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { - - // if the abs isn't a dir, then nothing can match! - if (!entries) - return cb() - - // It will only match dot entries if it starts with a dot, or if - // dot is set. Stuff like @(.foo|.bar) isn't allowed. - var pn = remain[0] - var negate = !!this.minimatch.negate - var rawGlob = pn._glob - var dotOk = this.dot || rawGlob.charAt(0) === '.' - - var matchedEntries = [] - for (var i = 0; i < entries.length; i++) { - var e = entries[i] - if (e.charAt(0) !== '.' || dotOk) { - var m - if (negate && !prefix) { - m = !e.match(pn) - } else { - m = e.match(pn) - } - if (m) - matchedEntries.push(e) - } - } - - //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) - - var len = matchedEntries.length - // If there are no matched entries, then nothing matches. - if (len === 0) - return cb() - - // if this is the last remaining pattern bit, then no need for - // an additional stat *unless* the user has specified mark or - // stat explicitly. We know they exist, since readdir returned - // them. - - if (remain.length === 1 && !this.mark && !this.stat) { - if (!this.matches[index]) - this.matches[index] = Object.create(null) - - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - if (prefix) { - if (prefix !== '/') - e = prefix + '/' + e - else - e = prefix + e - } - - if (e.charAt(0) === '/' && !this.nomount) { - e = path.join(this.root, e) - } - this._emitMatch(index, e) - } - // This was the last one, and no stats were needed - return cb() - } - - // now test all matched entries as stand-ins for that part - // of the pattern. - remain.shift() - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - var newPattern - if (prefix) { - if (prefix !== '/') - e = prefix + '/' + e - else - e = prefix + e - } - this._process([e].concat(remain), index, inGlobStar, cb) - } - cb() -} - -Glob.prototype._emitMatch = function (index, e) { - if (this.aborted) - return - - if (isIgnored(this, e)) - return - - if (this.paused) { - this._emitQueue.push([index, e]) - return - } - - var abs = isAbsolute(e) ? e : this._makeAbs(e) - - if (this.mark) - e = this._mark(e) - - if (this.absolute) - e = abs - - if (this.matches[index][e]) - return - - if (this.nodir) { - var c = this.cache[abs] - if (c === 'DIR' || Array.isArray(c)) - return - } - - this.matches[index][e] = true - - var st = this.statCache[abs] - if (st) - this.emit('stat', e, st) - - this.emit('match', e) -} - -Glob.prototype._readdirInGlobStar = function (abs, cb) { - if (this.aborted) - return - - // follow all symlinked directories forever - // just proceed as if this is a non-globstar situation - if (this.follow) - return this._readdir(abs, false, cb) - - var lstatkey = 'lstat\0' + abs - var self = this - var lstatcb = inflight(lstatkey, lstatcb_) - - if (lstatcb) - fs.lstat(abs, lstatcb) - - function lstatcb_ (er, lstat) { - if (er && er.code === 'ENOENT') - return cb() - - var isSym = lstat && lstat.isSymbolicLink() - self.symlinks[abs] = isSym - - // If it's not a symlink or a dir, then it's definitely a regular file. - // don't bother doing a readdir in that case. - if (!isSym && lstat && !lstat.isDirectory()) { - self.cache[abs] = 'FILE' - cb() - } else - self._readdir(abs, false, cb) - } -} - -Glob.prototype._readdir = function (abs, inGlobStar, cb) { - if (this.aborted) - return - - cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) - if (!cb) - return - - //console.error('RD %j %j', +inGlobStar, abs) - if (inGlobStar && !ownProp(this.symlinks, abs)) - return this._readdirInGlobStar(abs, cb) - - if (ownProp(this.cache, abs)) { - var c = this.cache[abs] - if (!c || c === 'FILE') - return cb() - - if (Array.isArray(c)) - return cb(null, c) - } - - var self = this - fs.readdir(abs, readdirCb(this, abs, cb)) -} - -function readdirCb (self, abs, cb) { - return function (er, entries) { - if (er) - self._readdirError(abs, er, cb) - else - self._readdirEntries(abs, entries, cb) - } -} - -Glob.prototype._readdirEntries = function (abs, entries, cb) { - if (this.aborted) - return - - // if we haven't asked to stat everything, then just - // assume that everything in there exists, so we can avoid - // having to stat it a second time. - if (!this.mark && !this.stat) { - for (var i = 0; i < entries.length; i ++) { - var e = entries[i] - if (abs === '/') - e = abs + e - else - e = abs + '/' + e - this.cache[e] = true - } - } - - this.cache[abs] = entries - return cb(null, entries) -} - -Glob.prototype._readdirError = function (f, er, cb) { - if (this.aborted) - return - - // handle errors, and cache the information - switch (er.code) { - case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 - case 'ENOTDIR': // totally normal. means it *does* exist. - var abs = this._makeAbs(f) - this.cache[abs] = 'FILE' - if (abs === this.cwdAbs) { - var error = new Error(er.code + ' invalid cwd ' + this.cwd) - error.path = this.cwd - error.code = er.code - this.emit('error', error) - this.abort() - } - break - - case 'ENOENT': // not terribly unusual - case 'ELOOP': - case 'ENAMETOOLONG': - case 'UNKNOWN': - this.cache[this._makeAbs(f)] = false - break - - default: // some unusual error. Treat as failure. - this.cache[this._makeAbs(f)] = false - if (this.strict) { - this.emit('error', er) - // If the error is handled, then we abort - // if not, we threw out of here - this.abort() - } - if (!this.silent) - console.error('glob error', er) - break - } - - return cb() -} - -Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { - var self = this - this._readdir(abs, inGlobStar, function (er, entries) { - self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) - }) -} - - -Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { - //console.error('pgs2', prefix, remain[0], entries) - - // no entries means not a dir, so it can never have matches - // foo.txt/** doesn't match foo.txt - if (!entries) - return cb() - - // test without the globstar, and with every child both below - // and replacing the globstar. - var remainWithoutGlobStar = remain.slice(1) - var gspref = prefix ? [ prefix ] : [] - var noGlobStar = gspref.concat(remainWithoutGlobStar) - - // the noGlobStar pattern exits the inGlobStar state - this._process(noGlobStar, index, false, cb) - - var isSym = this.symlinks[abs] - var len = entries.length - - // If it's a symlink, and we're in a globstar, then stop - if (isSym && inGlobStar) - return cb() - - for (var i = 0; i < len; i++) { - var e = entries[i] - if (e.charAt(0) === '.' && !this.dot) - continue - - // these two cases enter the inGlobStar state - var instead = gspref.concat(entries[i], remainWithoutGlobStar) - this._process(instead, index, true, cb) - - var below = gspref.concat(entries[i], remain) - this._process(below, index, true, cb) - } - - cb() -} - -Glob.prototype._processSimple = function (prefix, index, cb) { - // XXX review this. Shouldn't it be doing the mounting etc - // before doing stat? kinda weird? - var self = this - this._stat(prefix, function (er, exists) { - self._processSimple2(prefix, index, er, exists, cb) - }) -} -Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { - - //console.error('ps2', prefix, exists) - - if (!this.matches[index]) - this.matches[index] = Object.create(null) - - // If it doesn't exist, then just mark the lack of results - if (!exists) - return cb() - - if (prefix && isAbsolute(prefix) && !this.nomount) { - var trail = /[\/\\]$/.test(prefix) - if (prefix.charAt(0) === '/') { - prefix = path.join(this.root, prefix) - } else { - prefix = path.resolve(this.root, prefix) - if (trail) - prefix += '/' - } - } - - if (process.platform === 'win32') - prefix = prefix.replace(/\\/g, '/') - - // Mark this as a match - this._emitMatch(index, prefix) - cb() -} - -// Returns either 'DIR', 'FILE', or false -Glob.prototype._stat = function (f, cb) { - var abs = this._makeAbs(f) - var needDir = f.slice(-1) === '/' - - if (f.length > this.maxLength) - return cb() - - if (!this.stat && ownProp(this.cache, abs)) { - var c = this.cache[abs] - - if (Array.isArray(c)) - c = 'DIR' - - // It exists, but maybe not how we need it - if (!needDir || c === 'DIR') - return cb(null, c) - - if (needDir && c === 'FILE') - return cb() - - // otherwise we have to stat, because maybe c=true - // if we know it exists, but not what it is. - } - - var exists - var stat = this.statCache[abs] - if (stat !== undefined) { - if (stat === false) - return cb(null, stat) - else { - var type = stat.isDirectory() ? 'DIR' : 'FILE' - if (needDir && type === 'FILE') - return cb() - else - return cb(null, type, stat) - } - } - - var self = this - var statcb = inflight('stat\0' + abs, lstatcb_) - if (statcb) - fs.lstat(abs, statcb) - - function lstatcb_ (er, lstat) { - if (lstat && lstat.isSymbolicLink()) { - // If it's a symlink, then treat it as the target, unless - // the target does not exist, then treat it as a file. - return fs.stat(abs, function (er, stat) { - if (er) - self._stat2(f, abs, null, lstat, cb) - else - self._stat2(f, abs, er, stat, cb) - }) - } else { - self._stat2(f, abs, er, lstat, cb) - } - } -} - -Glob.prototype._stat2 = function (f, abs, er, stat, cb) { - if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { - this.statCache[abs] = false - return cb() - } - - var needDir = f.slice(-1) === '/' - this.statCache[abs] = stat - - if (abs.slice(-1) === '/' && stat && !stat.isDirectory()) - return cb(null, false, stat) - - var c = true - if (stat) - c = stat.isDirectory() ? 'DIR' : 'FILE' - this.cache[abs] = this.cache[abs] || c - - if (needDir && c === 'FILE') - return cb() - - return cb(null, c, stat) -} diff --git a/node_modules/shelljs/node_modules/glob/node_modules/fs.realpath/LICENSE b/node_modules/shelljs/node_modules/glob/node_modules/fs.realpath/LICENSE deleted file mode 100644 index 5bd884c..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/fs.realpath/LICENSE +++ /dev/null @@ -1,43 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ----- - -This library bundles a version of the `fs.realpath` and `fs.realpathSync` -methods from Node.js v0.10 under the terms of the Node.js MIT license. - -Node's license follows, also included at the header of `old.js` which contains -the licensed code: - - Copyright Joyent, Inc. and other Node contributors. - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. diff --git a/node_modules/shelljs/node_modules/glob/node_modules/fs.realpath/README.md b/node_modules/shelljs/node_modules/glob/node_modules/fs.realpath/README.md deleted file mode 100644 index a42ceac..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/fs.realpath/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# fs.realpath - -A backwards-compatible fs.realpath for Node v6 and above - -In Node v6, the JavaScript implementation of fs.realpath was replaced -with a faster (but less resilient) native implementation. That raises -new and platform-specific errors and cannot handle long or excessively -symlink-looping paths. - -This module handles those cases by detecting the new errors and -falling back to the JavaScript implementation. On versions of Node -prior to v6, it has no effect. - -## USAGE - -```js -var rp = require('fs.realpath') - -// async version -rp.realpath(someLongAndLoopingPath, function (er, real) { - // the ELOOP was handled, but it was a bit slower -}) - -// sync version -var real = rp.realpathSync(someLongAndLoopingPath) - -// monkeypatch at your own risk! -// This replaces the fs.realpath/fs.realpathSync builtins -rp.monkeypatch() - -// un-do the monkeypatching -rp.unmonkeypatch() -``` diff --git a/node_modules/shelljs/node_modules/glob/node_modules/fs.realpath/index.js b/node_modules/shelljs/node_modules/glob/node_modules/fs.realpath/index.js deleted file mode 100644 index b09c7c7..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/fs.realpath/index.js +++ /dev/null @@ -1,66 +0,0 @@ -module.exports = realpath -realpath.realpath = realpath -realpath.sync = realpathSync -realpath.realpathSync = realpathSync -realpath.monkeypatch = monkeypatch -realpath.unmonkeypatch = unmonkeypatch - -var fs = require('fs') -var origRealpath = fs.realpath -var origRealpathSync = fs.realpathSync - -var version = process.version -var ok = /^v[0-5]\./.test(version) -var old = require('./old.js') - -function newError (er) { - return er && er.syscall === 'realpath' && ( - er.code === 'ELOOP' || - er.code === 'ENOMEM' || - er.code === 'ENAMETOOLONG' - ) -} - -function realpath (p, cache, cb) { - if (ok) { - return origRealpath(p, cache, cb) - } - - if (typeof cache === 'function') { - cb = cache - cache = null - } - origRealpath(p, cache, function (er, result) { - if (newError(er)) { - old.realpath(p, cache, cb) - } else { - cb(er, result) - } - }) -} - -function realpathSync (p, cache) { - if (ok) { - return origRealpathSync(p, cache) - } - - try { - return origRealpathSync(p, cache) - } catch (er) { - if (newError(er)) { - return old.realpathSync(p, cache) - } else { - throw er - } - } -} - -function monkeypatch () { - fs.realpath = realpath - fs.realpathSync = realpathSync -} - -function unmonkeypatch () { - fs.realpath = origRealpath - fs.realpathSync = origRealpathSync -} diff --git a/node_modules/shelljs/node_modules/glob/node_modules/fs.realpath/old.js b/node_modules/shelljs/node_modules/glob/node_modules/fs.realpath/old.js deleted file mode 100644 index b40305e..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/fs.realpath/old.js +++ /dev/null @@ -1,303 +0,0 @@ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -var pathModule = require('path'); -var isWindows = process.platform === 'win32'; -var fs = require('fs'); - -// JavaScript implementation of realpath, ported from node pre-v6 - -var DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG); - -function rethrow() { - // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and - // is fairly slow to generate. - var callback; - if (DEBUG) { - var backtrace = new Error; - callback = debugCallback; - } else - callback = missingCallback; - - return callback; - - function debugCallback(err) { - if (err) { - backtrace.message = err.message; - err = backtrace; - missingCallback(err); - } - } - - function missingCallback(err) { - if (err) { - if (process.throwDeprecation) - throw err; // Forgot a callback but don't know where? Use NODE_DEBUG=fs - else if (!process.noDeprecation) { - var msg = 'fs: missing callback ' + (err.stack || err.message); - if (process.traceDeprecation) - console.trace(msg); - else - console.error(msg); - } - } - } -} - -function maybeCallback(cb) { - return typeof cb === 'function' ? cb : rethrow(); -} - -var normalize = pathModule.normalize; - -// Regexp that finds the next partion of a (partial) path -// result is [base_with_slash, base], e.g. ['somedir/', 'somedir'] -if (isWindows) { - var nextPartRe = /(.*?)(?:[\/\\]+|$)/g; -} else { - var nextPartRe = /(.*?)(?:[\/]+|$)/g; -} - -// Regex to find the device root, including trailing slash. E.g. 'c:\\'. -if (isWindows) { - var splitRootRe = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/; -} else { - var splitRootRe = /^[\/]*/; -} - -exports.realpathSync = function realpathSync(p, cache) { - // make p is absolute - p = pathModule.resolve(p); - - if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { - return cache[p]; - } - - var original = p, - seenLinks = {}, - knownHard = {}; - - // current character position in p - var pos; - // the partial path so far, including a trailing slash if any - var current; - // the partial path without a trailing slash (except when pointing at a root) - var base; - // the partial path scanned in the previous round, with slash - var previous; - - start(); - - function start() { - // Skip over roots - var m = splitRootRe.exec(p); - pos = m[0].length; - current = m[0]; - base = m[0]; - previous = ''; - - // On windows, check that the root exists. On unix there is no need. - if (isWindows && !knownHard[base]) { - fs.lstatSync(base); - knownHard[base] = true; - } - } - - // walk down the path, swapping out linked pathparts for their real - // values - // NB: p.length changes. - while (pos < p.length) { - // find the next part - nextPartRe.lastIndex = pos; - var result = nextPartRe.exec(p); - previous = current; - current += result[0]; - base = previous + result[1]; - pos = nextPartRe.lastIndex; - - // continue if not a symlink - if (knownHard[base] || (cache && cache[base] === base)) { - continue; - } - - var resolvedLink; - if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { - // some known symbolic link. no need to stat again. - resolvedLink = cache[base]; - } else { - var stat = fs.lstatSync(base); - if (!stat.isSymbolicLink()) { - knownHard[base] = true; - if (cache) cache[base] = base; - continue; - } - - // read the link if it wasn't read before - // dev/ino always return 0 on windows, so skip the check. - var linkTarget = null; - if (!isWindows) { - var id = stat.dev.toString(32) + ':' + stat.ino.toString(32); - if (seenLinks.hasOwnProperty(id)) { - linkTarget = seenLinks[id]; - } - } - if (linkTarget === null) { - fs.statSync(base); - linkTarget = fs.readlinkSync(base); - } - resolvedLink = pathModule.resolve(previous, linkTarget); - // track this, if given a cache. - if (cache) cache[base] = resolvedLink; - if (!isWindows) seenLinks[id] = linkTarget; - } - - // resolve the link, then start over - p = pathModule.resolve(resolvedLink, p.slice(pos)); - start(); - } - - if (cache) cache[original] = p; - - return p; -}; - - -exports.realpath = function realpath(p, cache, cb) { - if (typeof cb !== 'function') { - cb = maybeCallback(cache); - cache = null; - } - - // make p is absolute - p = pathModule.resolve(p); - - if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { - return process.nextTick(cb.bind(null, null, cache[p])); - } - - var original = p, - seenLinks = {}, - knownHard = {}; - - // current character position in p - var pos; - // the partial path so far, including a trailing slash if any - var current; - // the partial path without a trailing slash (except when pointing at a root) - var base; - // the partial path scanned in the previous round, with slash - var previous; - - start(); - - function start() { - // Skip over roots - var m = splitRootRe.exec(p); - pos = m[0].length; - current = m[0]; - base = m[0]; - previous = ''; - - // On windows, check that the root exists. On unix there is no need. - if (isWindows && !knownHard[base]) { - fs.lstat(base, function(err) { - if (err) return cb(err); - knownHard[base] = true; - LOOP(); - }); - } else { - process.nextTick(LOOP); - } - } - - // walk down the path, swapping out linked pathparts for their real - // values - function LOOP() { - // stop if scanned past end of path - if (pos >= p.length) { - if (cache) cache[original] = p; - return cb(null, p); - } - - // find the next part - nextPartRe.lastIndex = pos; - var result = nextPartRe.exec(p); - previous = current; - current += result[0]; - base = previous + result[1]; - pos = nextPartRe.lastIndex; - - // continue if not a symlink - if (knownHard[base] || (cache && cache[base] === base)) { - return process.nextTick(LOOP); - } - - if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { - // known symbolic link. no need to stat again. - return gotResolvedLink(cache[base]); - } - - return fs.lstat(base, gotStat); - } - - function gotStat(err, stat) { - if (err) return cb(err); - - // if not a symlink, skip to the next path part - if (!stat.isSymbolicLink()) { - knownHard[base] = true; - if (cache) cache[base] = base; - return process.nextTick(LOOP); - } - - // stat & read the link if not read before - // call gotTarget as soon as the link target is known - // dev/ino always return 0 on windows, so skip the check. - if (!isWindows) { - var id = stat.dev.toString(32) + ':' + stat.ino.toString(32); - if (seenLinks.hasOwnProperty(id)) { - return gotTarget(null, seenLinks[id], base); - } - } - fs.stat(base, function(err) { - if (err) return cb(err); - - fs.readlink(base, function(err, target) { - if (!isWindows) seenLinks[id] = target; - gotTarget(err, target); - }); - }); - } - - function gotTarget(err, target, base) { - if (err) return cb(err); - - var resolvedLink = pathModule.resolve(previous, target); - if (cache) cache[base] = resolvedLink; - gotResolvedLink(resolvedLink); - } - - function gotResolvedLink(resolvedLink) { - // resolve the link, then start over - p = pathModule.resolve(resolvedLink, p.slice(pos)); - start(); - } -}; diff --git a/node_modules/shelljs/node_modules/glob/node_modules/fs.realpath/package.json b/node_modules/shelljs/node_modules/glob/node_modules/fs.realpath/package.json deleted file mode 100644 index 7db7462..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/fs.realpath/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "fs.realpath", - "version": "1.0.0", - "description": "Use node's fs.realpath, but fall back to the JS implementation if the native one fails", - "main": "index.js", - "dependencies": {}, - "devDependencies": {}, - "scripts": { - "test": "tap test/*.js --cov" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/isaacs/fs.realpath.git" - }, - "keywords": [ - "realpath", - "fs", - "polyfill" - ], - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "license": "ISC", - "files": [ - "old.js", - "index.js" - ], - "gitHead": "03e7c884431fe185dfebbc9b771aeca339c1807a", - "bugs": { - "url": "https://github.com/isaacs/fs.realpath/issues" - }, - "homepage": "https://github.com/isaacs/fs.realpath#readme", - "_id": "fs.realpath@1.0.0", - "_shasum": "1504ad2523158caa40db4a2787cb01411994ea4f", - "_from": "fs.realpath@>=1.0.0 <2.0.0", - "_npmVersion": "3.9.1", - "_nodeVersion": "4.4.4", - "_npmUser": { - "name": "isaacs", - "email": "i@izs.me" - }, - "dist": { - "shasum": "1504ad2523158caa40db4a2787cb01411994ea4f", - "tarball": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "_npmOperationalInternal": { - "host": "packages-16-east.internal.npmjs.com", - "tmp": "tmp/fs.realpath-1.0.0.tgz_1466015941059_0.3332864767871797" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/shelljs/node_modules/glob/node_modules/inflight/LICENSE b/node_modules/shelljs/node_modules/glob/node_modules/inflight/LICENSE deleted file mode 100644 index 05eeeb8..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/inflight/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/shelljs/node_modules/glob/node_modules/inflight/README.md b/node_modules/shelljs/node_modules/glob/node_modules/inflight/README.md deleted file mode 100644 index 6dc8929..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/inflight/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# inflight - -Add callbacks to requests in flight to avoid async duplication - -## USAGE - -```javascript -var inflight = require('inflight') - -// some request that does some stuff -function req(key, callback) { - // key is any random string. like a url or filename or whatever. - // - // will return either a falsey value, indicating that the - // request for this key is already in flight, or a new callback - // which when called will call all callbacks passed to inflightk - // with the same key - callback = inflight(key, callback) - - // If we got a falsey value back, then there's already a req going - if (!callback) return - - // this is where you'd fetch the url or whatever - // callback is also once()-ified, so it can safely be assigned - // to multiple events etc. First call wins. - setTimeout(function() { - callback(null, key) - }, 100) -} - -// only assigns a single setTimeout -// when it dings, all cbs get called -req('foo', cb1) -req('foo', cb2) -req('foo', cb3) -req('foo', cb4) -``` diff --git a/node_modules/shelljs/node_modules/glob/node_modules/inflight/inflight.js b/node_modules/shelljs/node_modules/glob/node_modules/inflight/inflight.js deleted file mode 100644 index 48202b3..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/inflight/inflight.js +++ /dev/null @@ -1,54 +0,0 @@ -var wrappy = require('wrappy') -var reqs = Object.create(null) -var once = require('once') - -module.exports = wrappy(inflight) - -function inflight (key, cb) { - if (reqs[key]) { - reqs[key].push(cb) - return null - } else { - reqs[key] = [cb] - return makeres(key) - } -} - -function makeres (key) { - return once(function RES () { - var cbs = reqs[key] - var len = cbs.length - var args = slice(arguments) - - // XXX It's somewhat ambiguous whether a new callback added in this - // pass should be queued for later execution if something in the - // list of callbacks throws, or if it should just be discarded. - // However, it's such an edge case that it hardly matters, and either - // choice is likely as surprising as the other. - // As it happens, we do go ahead and schedule it for later execution. - try { - for (var i = 0; i < len; i++) { - cbs[i].apply(null, args) - } - } finally { - if (cbs.length > len) { - // added more in the interim. - // de-zalgo, just in case, but don't call again. - cbs.splice(0, len) - process.nextTick(function () { - RES.apply(null, args) - }) - } else { - delete reqs[key] - } - } - }) -} - -function slice (args) { - var length = args.length - var array = [] - - for (var i = 0; i < length; i++) array[i] = args[i] - return array -} diff --git a/node_modules/shelljs/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE b/node_modules/shelljs/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE deleted file mode 100644 index 19129e3..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/shelljs/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md b/node_modules/shelljs/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md deleted file mode 100644 index 98eab25..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# wrappy - -Callback wrapping utility - -## USAGE - -```javascript -var wrappy = require("wrappy") - -// var wrapper = wrappy(wrapperFunction) - -// make sure a cb is called only once -// See also: http://npm.im/once for this specific use case -var once = wrappy(function (cb) { - var called = false - return function () { - if (called) return - called = true - return cb.apply(this, arguments) - } -}) - -function printBoo () { - console.log('boo') -} -// has some rando property -printBoo.iAmBooPrinter = true - -var onlyPrintOnce = once(printBoo) - -onlyPrintOnce() // prints 'boo' -onlyPrintOnce() // does nothing - -// random property is retained! -assert.equal(onlyPrintOnce.iAmBooPrinter, true) -``` diff --git a/node_modules/shelljs/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json b/node_modules/shelljs/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json deleted file mode 100644 index de3bfd5..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "name": "wrappy", - "version": "1.0.2", - "description": "Callback wrapping utility", - "main": "wrappy.js", - "files": [ - "wrappy.js" - ], - "directories": { - "test": "test" - }, - "dependencies": {}, - "devDependencies": { - "tap": "^2.3.1" - }, - "scripts": { - "test": "tap --coverage test/*.js" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/npm/wrappy.git" - }, - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "license": "ISC", - "bugs": { - "url": "https://github.com/npm/wrappy/issues" - }, - "homepage": "https://github.com/npm/wrappy", - "gitHead": "71d91b6dc5bdeac37e218c2cf03f9ab55b60d214", - "_id": "wrappy@1.0.2", - "_shasum": "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f", - "_from": "wrappy@>=1.0.0 <2.0.0", - "_npmVersion": "3.9.1", - "_nodeVersion": "5.10.1", - "_npmUser": { - "name": "zkat", - "email": "kat@sykosomatic.org" - }, - "dist": { - "shasum": "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f", - "tarball": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - }, - { - "name": "zkat", - "email": "kat@sykosomatic.org" - } - ], - "_npmOperationalInternal": { - "host": "packages-16-east.internal.npmjs.com", - "tmp": "tmp/wrappy-1.0.2.tgz_1463527848281_0.037129373755306005" - }, - "_resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/shelljs/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js b/node_modules/shelljs/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js deleted file mode 100644 index bb7e7d6..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js +++ /dev/null @@ -1,33 +0,0 @@ -// Returns a wrapper function that returns a wrapped callback -// The wrapper function should do some stuff, and return a -// presumably different callback function. -// This makes sure that own properties are retained, so that -// decorations and such are not lost along the way. -module.exports = wrappy -function wrappy (fn, cb) { - if (fn && cb) return wrappy(fn)(cb) - - if (typeof fn !== 'function') - throw new TypeError('need wrapper function') - - Object.keys(fn).forEach(function (k) { - wrapper[k] = fn[k] - }) - - return wrapper - - function wrapper() { - var args = new Array(arguments.length) - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - var ret = fn.apply(this, args) - var cb = args[args.length-1] - if (typeof ret === 'function' && ret !== cb) { - Object.keys(cb).forEach(function (k) { - ret[k] = cb[k] - }) - } - return ret - } -} diff --git a/node_modules/shelljs/node_modules/glob/node_modules/inflight/package.json b/node_modules/shelljs/node_modules/glob/node_modules/inflight/package.json deleted file mode 100644 index 60911dc..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/inflight/package.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "name": "inflight", - "version": "1.0.6", - "description": "Add callbacks to requests in flight to avoid async duplication", - "main": "inflight.js", - "files": [ - "inflight.js" - ], - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - }, - "devDependencies": { - "tap": "^7.1.2" - }, - "scripts": { - "test": "tap test.js --100" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/npm/inflight.git" - }, - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "bugs": { - "url": "https://github.com/isaacs/inflight/issues" - }, - "homepage": "https://github.com/isaacs/inflight", - "license": "ISC", - "gitHead": "a547881738c8f57b27795e584071d67cf6ac1a57", - "_id": "inflight@1.0.6", - "_shasum": "49bd6331d7d02d0c09bc910a1075ba8165b56df9", - "_from": "inflight@>=1.0.4 <2.0.0", - "_npmVersion": "3.10.7", - "_nodeVersion": "6.5.0", - "_npmUser": { - "name": "isaacs", - "email": "i@izs.me" - }, - "dist": { - "shasum": "49bd6331d7d02d0c09bc910a1075ba8165b56df9", - "tarball": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - }, - "maintainers": [ - { - "name": "iarna", - "email": "me@re-becca.org" - }, - { - "name": "isaacs", - "email": "i@izs.me" - }, - { - "name": "othiym23", - "email": "ogd@aoaioxxysz.net" - }, - { - "name": "zkat", - "email": "kat@sykosomatic.org" - } - ], - "_npmOperationalInternal": { - "host": "packages-16-east.internal.npmjs.com", - "tmp": "tmp/inflight-1.0.6.tgz_1476330807696_0.10388551792129874" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/shelljs/node_modules/glob/node_modules/inherits/LICENSE b/node_modules/shelljs/node_modules/glob/node_modules/inherits/LICENSE deleted file mode 100644 index dea3013..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/inherits/LICENSE +++ /dev/null @@ -1,16 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - diff --git a/node_modules/shelljs/node_modules/glob/node_modules/inherits/README.md b/node_modules/shelljs/node_modules/glob/node_modules/inherits/README.md deleted file mode 100644 index b1c5665..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/inherits/README.md +++ /dev/null @@ -1,42 +0,0 @@ -Browser-friendly inheritance fully compatible with standard node.js -[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). - -This package exports standard `inherits` from node.js `util` module in -node environment, but also provides alternative browser-friendly -implementation through [browser -field](https://gist.github.com/shtylman/4339901). Alternative -implementation is a literal copy of standard one located in standalone -module to avoid requiring of `util`. It also has a shim for old -browsers with no `Object.create` support. - -While keeping you sure you are using standard `inherits` -implementation in node.js environment, it allows bundlers such as -[browserify](https://github.com/substack/node-browserify) to not -include full `util` package to your client code if all you need is -just `inherits` function. It worth, because browser shim for `util` -package is large and `inherits` is often the single function you need -from it. - -It's recommended to use this package instead of -`require('util').inherits` for any code that has chances to be used -not only in node.js but in browser too. - -## usage - -```js -var inherits = require('inherits'); -// then use exactly as the standard one -``` - -## note on version ~1.0 - -Version ~1.0 had completely different motivation and is not compatible -neither with 2.0 nor with standard node.js `inherits`. - -If you are using version ~1.0 and planning to switch to ~2.0, be -careful: - -* new version uses `super_` instead of `super` for referencing - superclass -* new version overwrites current prototype while old one preserves any - existing fields on it diff --git a/node_modules/shelljs/node_modules/glob/node_modules/inherits/inherits.js b/node_modules/shelljs/node_modules/glob/node_modules/inherits/inherits.js deleted file mode 100644 index 3b94763..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/inherits/inherits.js +++ /dev/null @@ -1,7 +0,0 @@ -try { - var util = require('util'); - if (typeof util.inherits !== 'function') throw ''; - module.exports = util.inherits; -} catch (e) { - module.exports = require('./inherits_browser.js'); -} diff --git a/node_modules/shelljs/node_modules/glob/node_modules/inherits/inherits_browser.js b/node_modules/shelljs/node_modules/glob/node_modules/inherits/inherits_browser.js deleted file mode 100644 index c1e78a7..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/inherits/inherits_browser.js +++ /dev/null @@ -1,23 +0,0 @@ -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } -} diff --git a/node_modules/shelljs/node_modules/glob/node_modules/inherits/package.json b/node_modules/shelljs/node_modules/glob/node_modules/inherits/package.json deleted file mode 100644 index ecb5a35..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/inherits/package.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "name": "inherits", - "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", - "version": "2.0.3", - "keywords": [ - "inheritance", - "class", - "klass", - "oop", - "object-oriented", - "inherits", - "browser", - "browserify" - ], - "main": "./inherits.js", - "browser": "./inherits_browser.js", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/inherits.git" - }, - "license": "ISC", - "scripts": { - "test": "node test" - }, - "devDependencies": { - "tap": "^7.1.0" - }, - "files": [ - "inherits.js", - "inherits_browser.js" - ], - "gitHead": "e05d0fb27c61a3ec687214f0476386b765364d5f", - "bugs": { - "url": "https://github.com/isaacs/inherits/issues" - }, - "homepage": "https://github.com/isaacs/inherits#readme", - "_id": "inherits@2.0.3", - "_shasum": "633c2c83e3da42a502f52466022480f4208261de", - "_from": "inherits@>=2.0.0 <3.0.0", - "_npmVersion": "3.10.7", - "_nodeVersion": "6.5.0", - "_npmUser": { - "name": "isaacs", - "email": "i@izs.me" - }, - "dist": { - "shasum": "633c2c83e3da42a502f52466022480f4208261de", - "tarball": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "_npmOperationalInternal": { - "host": "packages-16-east.internal.npmjs.com", - "tmp": "tmp/inherits-2.0.3.tgz_1473295776489_0.08142363070510328" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/LICENSE b/node_modules/shelljs/node_modules/glob/node_modules/minimatch/LICENSE deleted file mode 100644 index 19129e3..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/README.md b/node_modules/shelljs/node_modules/glob/node_modules/minimatch/README.md deleted file mode 100644 index ad72b81..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/README.md +++ /dev/null @@ -1,209 +0,0 @@ -# minimatch - -A minimal matching utility. - -[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.svg)](http://travis-ci.org/isaacs/minimatch) - - -This is the matching library used internally by npm. - -It works by converting glob expressions into JavaScript `RegExp` -objects. - -## Usage - -```javascript -var minimatch = require("minimatch") - -minimatch("bar.foo", "*.foo") // true! -minimatch("bar.foo", "*.bar") // false! -minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy! -``` - -## Features - -Supports these glob features: - -* Brace Expansion -* Extended glob matching -* "Globstar" `**` matching - -See: - -* `man sh` -* `man bash` -* `man 3 fnmatch` -* `man 5 gitignore` - -## Minimatch Class - -Create a minimatch object by instantiating the `minimatch.Minimatch` class. - -```javascript -var Minimatch = require("minimatch").Minimatch -var mm = new Minimatch(pattern, options) -``` - -### Properties - -* `pattern` The original pattern the minimatch object represents. -* `options` The options supplied to the constructor. -* `set` A 2-dimensional array of regexp or string expressions. - Each row in the - array corresponds to a brace-expanded pattern. Each item in the row - corresponds to a single path-part. For example, the pattern - `{a,b/c}/d` would expand to a set of patterns like: - - [ [ a, d ] - , [ b, c, d ] ] - - If a portion of the pattern doesn't have any "magic" in it - (that is, it's something like `"foo"` rather than `fo*o?`), then it - will be left as a string rather than converted to a regular - expression. - -* `regexp` Created by the `makeRe` method. A single regular expression - expressing the entire pattern. This is useful in cases where you wish - to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled. -* `negate` True if the pattern is negated. -* `comment` True if the pattern is a comment. -* `empty` True if the pattern is `""`. - -### Methods - -* `makeRe` Generate the `regexp` member if necessary, and return it. - Will return `false` if the pattern is invalid. -* `match(fname)` Return true if the filename matches the pattern, or - false otherwise. -* `matchOne(fileArray, patternArray, partial)` Take a `/`-split - filename, and match it against a single row in the `regExpSet`. This - method is mainly for internal use, but is exposed so that it can be - used by a glob-walker that needs to avoid excessive filesystem calls. - -All other methods are internal, and will be called as necessary. - -### minimatch(path, pattern, options) - -Main export. Tests a path against the pattern using the options. - -```javascript -var isJS = minimatch(file, "*.js", { matchBase: true }) -``` - -### minimatch.filter(pattern, options) - -Returns a function that tests its -supplied argument, suitable for use with `Array.filter`. Example: - -```javascript -var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true})) -``` - -### minimatch.match(list, pattern, options) - -Match against the list of -files, in the style of fnmatch or glob. If nothing is matched, and -options.nonull is set, then return a list containing the pattern itself. - -```javascript -var javascripts = minimatch.match(fileList, "*.js", {matchBase: true})) -``` - -### minimatch.makeRe(pattern, options) - -Make a regular expression object from the pattern. - -## Options - -All options are `false` by default. - -### debug - -Dump a ton of stuff to stderr. - -### nobrace - -Do not expand `{a,b}` and `{1..3}` brace sets. - -### noglobstar - -Disable `**` matching against multiple folder names. - -### dot - -Allow patterns to match filenames starting with a period, even if -the pattern does not explicitly have a period in that spot. - -Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot` -is set. - -### noext - -Disable "extglob" style patterns like `+(a|b)`. - -### nocase - -Perform a case-insensitive match. - -### nonull - -When a match is not found by `minimatch.match`, return a list containing -the pattern itself if this option is set. When not set, an empty list -is returned if there are no matches. - -### matchBase - -If set, then patterns without slashes will be matched -against the basename of the path if it contains slashes. For example, -`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. - -### nocomment - -Suppress the behavior of treating `#` at the start of a pattern as a -comment. - -### nonegate - -Suppress the behavior of treating a leading `!` character as negation. - -### flipNegate - -Returns from negate expressions the same as if they were not negated. -(Ie, true on a hit, false on a miss.) - - -## Comparisons to other fnmatch/glob implementations - -While strict compliance with the existing standards is a worthwhile -goal, some discrepancies exist between minimatch and other -implementations, and are intentional. - -If the pattern starts with a `!` character, then it is negated. Set the -`nonegate` flag to suppress this behavior, and treat leading `!` -characters normally. This is perhaps relevant if you wish to start the -pattern with a negative extglob pattern like `!(a|B)`. Multiple `!` -characters at the start of a pattern will negate the pattern multiple -times. - -If a pattern starts with `#`, then it is treated as a comment, and -will not match anything. Use `\#` to match a literal `#` at the -start of a line, or set the `nocomment` flag to suppress this behavior. - -The double-star character `**` is supported by default, unless the -`noglobstar` flag is set. This is supported in the manner of bsdglob -and bash 4.1, where `**` only has special significance if it is the only -thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but -`a/**b` will not. - -If an escaped pattern has no matches, and the `nonull` flag is set, -then minimatch.match returns the pattern as-provided, rather than -interpreting the character escapes. For example, -`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than -`"*a?"`. This is akin to setting the `nullglob` option in bash, except -that it does not resolve escaped pattern characters. - -If brace expansion is not disabled, then it is performed before any -other interpretation of the glob pattern. Thus, a pattern like -`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded -**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are -checked for validity. Since those two are valid, matching proceeds. diff --git a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/minimatch.js b/node_modules/shelljs/node_modules/glob/node_modules/minimatch/minimatch.js deleted file mode 100644 index 5b5f8cf..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/minimatch.js +++ /dev/null @@ -1,923 +0,0 @@ -module.exports = minimatch -minimatch.Minimatch = Minimatch - -var path = { sep: '/' } -try { - path = require('path') -} catch (er) {} - -var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} -var expand = require('brace-expansion') - -var plTypes = { - '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, - '?': { open: '(?:', close: ')?' }, - '+': { open: '(?:', close: ')+' }, - '*': { open: '(?:', close: ')*' }, - '@': { open: '(?:', close: ')' } -} - -// any single thing other than / -// don't need to escape / when using new RegExp() -var qmark = '[^/]' - -// * => any number of characters -var star = qmark + '*?' - -// ** when dots are allowed. Anything goes, except .. and . -// not (^ or / followed by one or two dots followed by $ or /), -// followed by anything, any number of times. -var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' - -// not a ^ or / followed by a dot, -// followed by anything, any number of times. -var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' - -// characters that need to be escaped in RegExp. -var reSpecials = charSet('().*{}+?[]^$\\!') - -// "abc" -> { a:true, b:true, c:true } -function charSet (s) { - return s.split('').reduce(function (set, c) { - set[c] = true - return set - }, {}) -} - -// normalizes slashes. -var slashSplit = /\/+/ - -minimatch.filter = filter -function filter (pattern, options) { - options = options || {} - return function (p, i, list) { - return minimatch(p, pattern, options) - } -} - -function ext (a, b) { - a = a || {} - b = b || {} - var t = {} - Object.keys(b).forEach(function (k) { - t[k] = b[k] - }) - Object.keys(a).forEach(function (k) { - t[k] = a[k] - }) - return t -} - -minimatch.defaults = function (def) { - if (!def || !Object.keys(def).length) return minimatch - - var orig = minimatch - - var m = function minimatch (p, pattern, options) { - return orig.minimatch(p, pattern, ext(def, options)) - } - - m.Minimatch = function Minimatch (pattern, options) { - return new orig.Minimatch(pattern, ext(def, options)) - } - - return m -} - -Minimatch.defaults = function (def) { - if (!def || !Object.keys(def).length) return Minimatch - return minimatch.defaults(def).Minimatch -} - -function minimatch (p, pattern, options) { - if (typeof pattern !== 'string') { - throw new TypeError('glob pattern string required') - } - - if (!options) options = {} - - // shortcut: comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - return false - } - - // "" only matches "" - if (pattern.trim() === '') return p === '' - - return new Minimatch(pattern, options).match(p) -} - -function Minimatch (pattern, options) { - if (!(this instanceof Minimatch)) { - return new Minimatch(pattern, options) - } - - if (typeof pattern !== 'string') { - throw new TypeError('glob pattern string required') - } - - if (!options) options = {} - pattern = pattern.trim() - - // windows support: need to use /, not \ - if (path.sep !== '/') { - pattern = pattern.split(path.sep).join('/') - } - - this.options = options - this.set = [] - this.pattern = pattern - this.regexp = null - this.negate = false - this.comment = false - this.empty = false - - // make the set of regexps etc. - this.make() -} - -Minimatch.prototype.debug = function () {} - -Minimatch.prototype.make = make -function make () { - // don't do it more than once. - if (this._made) return - - var pattern = this.pattern - var options = this.options - - // empty patterns and comments match nothing. - if (!options.nocomment && pattern.charAt(0) === '#') { - this.comment = true - return - } - if (!pattern) { - this.empty = true - return - } - - // step 1: figure out negation, etc. - this.parseNegate() - - // step 2: expand braces - var set = this.globSet = this.braceExpand() - - if (options.debug) this.debug = console.error - - this.debug(this.pattern, set) - - // step 3: now we have a set, so turn each one into a series of path-portion - // matching patterns. - // These will be regexps, except in the case of "**", which is - // set to the GLOBSTAR object for globstar behavior, - // and will not contain any / characters - set = this.globParts = set.map(function (s) { - return s.split(slashSplit) - }) - - this.debug(this.pattern, set) - - // glob --> regexps - set = set.map(function (s, si, set) { - return s.map(this.parse, this) - }, this) - - this.debug(this.pattern, set) - - // filter out everything that didn't compile properly. - set = set.filter(function (s) { - return s.indexOf(false) === -1 - }) - - this.debug(this.pattern, set) - - this.set = set -} - -Minimatch.prototype.parseNegate = parseNegate -function parseNegate () { - var pattern = this.pattern - var negate = false - var options = this.options - var negateOffset = 0 - - if (options.nonegate) return - - for (var i = 0, l = pattern.length - ; i < l && pattern.charAt(i) === '!' - ; i++) { - negate = !negate - negateOffset++ - } - - if (negateOffset) this.pattern = pattern.substr(negateOffset) - this.negate = negate -} - -// Brace expansion: -// a{b,c}d -> abd acd -// a{b,}c -> abc ac -// a{0..3}d -> a0d a1d a2d a3d -// a{b,c{d,e}f}g -> abg acdfg acefg -// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg -// -// Invalid sets are not expanded. -// a{2..}b -> a{2..}b -// a{b}c -> a{b}c -minimatch.braceExpand = function (pattern, options) { - return braceExpand(pattern, options) -} - -Minimatch.prototype.braceExpand = braceExpand - -function braceExpand (pattern, options) { - if (!options) { - if (this instanceof Minimatch) { - options = this.options - } else { - options = {} - } - } - - pattern = typeof pattern === 'undefined' - ? this.pattern : pattern - - if (typeof pattern === 'undefined') { - throw new TypeError('undefined pattern') - } - - if (options.nobrace || - !pattern.match(/\{.*\}/)) { - // shortcut. no need to expand. - return [pattern] - } - - return expand(pattern) -} - -// parse a component of the expanded set. -// At this point, no pattern may contain "/" in it -// so we're going to return a 2d array, where each entry is the full -// pattern, split on '/', and then turned into a regular expression. -// A regexp is made at the end which joins each array with an -// escaped /, and another full one which joins each regexp with |. -// -// Following the lead of Bash 4.1, note that "**" only has special meaning -// when it is the *only* thing in a path portion. Otherwise, any series -// of * is equivalent to a single *. Globstar behavior is enabled by -// default, and can be disabled by setting options.noglobstar. -Minimatch.prototype.parse = parse -var SUBPARSE = {} -function parse (pattern, isSub) { - if (pattern.length > 1024 * 64) { - throw new TypeError('pattern is too long') - } - - var options = this.options - - // shortcuts - if (!options.noglobstar && pattern === '**') return GLOBSTAR - if (pattern === '') return '' - - var re = '' - var hasMagic = !!options.nocase - var escaping = false - // ? => one single character - var patternListStack = [] - var negativeLists = [] - var stateChar - var inClass = false - var reClassStart = -1 - var classStart = -1 - // . and .. never match anything that doesn't start with ., - // even when options.dot is set. - var patternStart = pattern.charAt(0) === '.' ? '' // anything - // not (start or / followed by . or .. followed by / or end) - : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' - : '(?!\\.)' - var self = this - - function clearStateChar () { - if (stateChar) { - // we had some state-tracking character - // that wasn't consumed by this pass. - switch (stateChar) { - case '*': - re += star - hasMagic = true - break - case '?': - re += qmark - hasMagic = true - break - default: - re += '\\' + stateChar - break - } - self.debug('clearStateChar %j %j', stateChar, re) - stateChar = false - } - } - - for (var i = 0, len = pattern.length, c - ; (i < len) && (c = pattern.charAt(i)) - ; i++) { - this.debug('%s\t%s %s %j', pattern, i, re, c) - - // skip over any that are escaped. - if (escaping && reSpecials[c]) { - re += '\\' + c - escaping = false - continue - } - - switch (c) { - case '/': - // completely not allowed, even escaped. - // Should already be path-split by now. - return false - - case '\\': - clearStateChar() - escaping = true - continue - - // the various stateChar values - // for the "extglob" stuff. - case '?': - case '*': - case '+': - case '@': - case '!': - this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) - - // all of those are literals inside a class, except that - // the glob [!a] means [^a] in regexp - if (inClass) { - this.debug(' in class') - if (c === '!' && i === classStart + 1) c = '^' - re += c - continue - } - - // if we already have a stateChar, then it means - // that there was something like ** or +? in there. - // Handle the stateChar, then proceed with this one. - self.debug('call clearStateChar %j', stateChar) - clearStateChar() - stateChar = c - // if extglob is disabled, then +(asdf|foo) isn't a thing. - // just clear the statechar *now*, rather than even diving into - // the patternList stuff. - if (options.noext) clearStateChar() - continue - - case '(': - if (inClass) { - re += '(' - continue - } - - if (!stateChar) { - re += '\\(' - continue - } - - patternListStack.push({ - type: stateChar, - start: i - 1, - reStart: re.length, - open: plTypes[stateChar].open, - close: plTypes[stateChar].close - }) - // negation is (?:(?!js)[^/]*) - re += stateChar === '!' ? '(?:(?!(?:' : '(?:' - this.debug('plType %j %j', stateChar, re) - stateChar = false - continue - - case ')': - if (inClass || !patternListStack.length) { - re += '\\)' - continue - } - - clearStateChar() - hasMagic = true - var pl = patternListStack.pop() - // negation is (?:(?!js)[^/]*) - // The others are (?:) - re += pl.close - if (pl.type === '!') { - negativeLists.push(pl) - } - pl.reEnd = re.length - continue - - case '|': - if (inClass || !patternListStack.length || escaping) { - re += '\\|' - escaping = false - continue - } - - clearStateChar() - re += '|' - continue - - // these are mostly the same in regexp and glob - case '[': - // swallow any state-tracking char before the [ - clearStateChar() - - if (inClass) { - re += '\\' + c - continue - } - - inClass = true - classStart = i - reClassStart = re.length - re += c - continue - - case ']': - // a right bracket shall lose its special - // meaning and represent itself in - // a bracket expression if it occurs - // first in the list. -- POSIX.2 2.8.3.2 - if (i === classStart + 1 || !inClass) { - re += '\\' + c - escaping = false - continue - } - - // handle the case where we left a class open. - // "[z-a]" is valid, equivalent to "\[z-a\]" - if (inClass) { - // split where the last [ was, make sure we don't have - // an invalid re. if so, re-walk the contents of the - // would-be class to re-translate any characters that - // were passed through as-is - // TODO: It would probably be faster to determine this - // without a try/catch and a new RegExp, but it's tricky - // to do safely. For now, this is safe and works. - var cs = pattern.substring(classStart + 1, i) - try { - RegExp('[' + cs + ']') - } catch (er) { - // not a valid class! - var sp = this.parse(cs, SUBPARSE) - re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' - hasMagic = hasMagic || sp[1] - inClass = false - continue - } - } - - // finish up the class. - hasMagic = true - inClass = false - re += c - continue - - default: - // swallow any state char that wasn't consumed - clearStateChar() - - if (escaping) { - // no need - escaping = false - } else if (reSpecials[c] - && !(c === '^' && inClass)) { - re += '\\' - } - - re += c - - } // switch - } // for - - // handle the case where we left a class open. - // "[abc" is valid, equivalent to "\[abc" - if (inClass) { - // split where the last [ was, and escape it - // this is a huge pita. We now have to re-walk - // the contents of the would-be class to re-translate - // any characters that were passed through as-is - cs = pattern.substr(classStart + 1) - sp = this.parse(cs, SUBPARSE) - re = re.substr(0, reClassStart) + '\\[' + sp[0] - hasMagic = hasMagic || sp[1] - } - - // handle the case where we had a +( thing at the *end* - // of the pattern. - // each pattern list stack adds 3 chars, and we need to go through - // and escape any | chars that were passed through as-is for the regexp. - // Go through and escape them, taking care not to double-escape any - // | chars that were already escaped. - for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { - var tail = re.slice(pl.reStart + pl.open.length) - this.debug('setting tail', re, pl) - // maybe some even number of \, then maybe 1 \, followed by a | - tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) { - if (!$2) { - // the | isn't already escaped, so escape it. - $2 = '\\' - } - - // need to escape all those slashes *again*, without escaping the - // one that we need for escaping the | character. As it works out, - // escaping an even number of slashes can be done by simply repeating - // it exactly after itself. That's why this trick works. - // - // I am sorry that you have to see this. - return $1 + $1 + $2 + '|' - }) - - this.debug('tail=%j\n %s', tail, tail, pl, re) - var t = pl.type === '*' ? star - : pl.type === '?' ? qmark - : '\\' + pl.type - - hasMagic = true - re = re.slice(0, pl.reStart) + t + '\\(' + tail - } - - // handle trailing things that only matter at the very end. - clearStateChar() - if (escaping) { - // trailing \\ - re += '\\\\' - } - - // only need to apply the nodot start if the re starts with - // something that could conceivably capture a dot - var addPatternStart = false - switch (re.charAt(0)) { - case '.': - case '[': - case '(': addPatternStart = true - } - - // Hack to work around lack of negative lookbehind in JS - // A pattern like: *.!(x).!(y|z) needs to ensure that a name - // like 'a.xyz.yz' doesn't match. So, the first negative - // lookahead, has to look ALL the way ahead, to the end of - // the pattern. - for (var n = negativeLists.length - 1; n > -1; n--) { - var nl = negativeLists[n] - - var nlBefore = re.slice(0, nl.reStart) - var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) - var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) - var nlAfter = re.slice(nl.reEnd) - - nlLast += nlAfter - - // Handle nested stuff like *(*.js|!(*.json)), where open parens - // mean that we should *not* include the ) in the bit that is considered - // "after" the negated section. - var openParensBefore = nlBefore.split('(').length - 1 - var cleanAfter = nlAfter - for (i = 0; i < openParensBefore; i++) { - cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') - } - nlAfter = cleanAfter - - var dollar = '' - if (nlAfter === '' && isSub !== SUBPARSE) { - dollar = '$' - } - var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast - re = newRe - } - - // if the re is not "" at this point, then we need to make sure - // it doesn't match against an empty path part. - // Otherwise a/* will match a/, which it should not. - if (re !== '' && hasMagic) { - re = '(?=.)' + re - } - - if (addPatternStart) { - re = patternStart + re - } - - // parsing just a piece of a larger pattern. - if (isSub === SUBPARSE) { - return [re, hasMagic] - } - - // skip the regexp for non-magical patterns - // unescape anything in it, though, so that it'll be - // an exact match against a file etc. - if (!hasMagic) { - return globUnescape(pattern) - } - - var flags = options.nocase ? 'i' : '' - try { - var regExp = new RegExp('^' + re + '$', flags) - } catch (er) { - // If it was an invalid regular expression, then it can't match - // anything. This trick looks for a character after the end of - // the string, which is of course impossible, except in multi-line - // mode, but it's not a /m regex. - return new RegExp('$.') - } - - regExp._glob = pattern - regExp._src = re - - return regExp -} - -minimatch.makeRe = function (pattern, options) { - return new Minimatch(pattern, options || {}).makeRe() -} - -Minimatch.prototype.makeRe = makeRe -function makeRe () { - if (this.regexp || this.regexp === false) return this.regexp - - // at this point, this.set is a 2d array of partial - // pattern strings, or "**". - // - // It's better to use .match(). This function shouldn't - // be used, really, but it's pretty convenient sometimes, - // when you just want to work with a regex. - var set = this.set - - if (!set.length) { - this.regexp = false - return this.regexp - } - var options = this.options - - var twoStar = options.noglobstar ? star - : options.dot ? twoStarDot - : twoStarNoDot - var flags = options.nocase ? 'i' : '' - - var re = set.map(function (pattern) { - return pattern.map(function (p) { - return (p === GLOBSTAR) ? twoStar - : (typeof p === 'string') ? regExpEscape(p) - : p._src - }).join('\\\/') - }).join('|') - - // must match entire pattern - // ending in a * or ** will make it less strict. - re = '^(?:' + re + ')$' - - // can match anything, as long as it's not this. - if (this.negate) re = '^(?!' + re + ').*$' - - try { - this.regexp = new RegExp(re, flags) - } catch (ex) { - this.regexp = false - } - return this.regexp -} - -minimatch.match = function (list, pattern, options) { - options = options || {} - var mm = new Minimatch(pattern, options) - list = list.filter(function (f) { - return mm.match(f) - }) - if (mm.options.nonull && !list.length) { - list.push(pattern) - } - return list -} - -Minimatch.prototype.match = match -function match (f, partial) { - this.debug('match', f, this.pattern) - // short-circuit in the case of busted things. - // comments, etc. - if (this.comment) return false - if (this.empty) return f === '' - - if (f === '/' && partial) return true - - var options = this.options - - // windows: need to use /, not \ - if (path.sep !== '/') { - f = f.split(path.sep).join('/') - } - - // treat the test path as a set of pathparts. - f = f.split(slashSplit) - this.debug(this.pattern, 'split', f) - - // just ONE of the pattern sets in this.set needs to match - // in order for it to be valid. If negating, then just one - // match means that we have failed. - // Either way, return on the first hit. - - var set = this.set - this.debug(this.pattern, 'set', set) - - // Find the basename of the path by looking for the last non-empty segment - var filename - var i - for (i = f.length - 1; i >= 0; i--) { - filename = f[i] - if (filename) break - } - - for (i = 0; i < set.length; i++) { - var pattern = set[i] - var file = f - if (options.matchBase && pattern.length === 1) { - file = [filename] - } - var hit = this.matchOne(file, pattern, partial) - if (hit) { - if (options.flipNegate) return true - return !this.negate - } - } - - // didn't get any hits. this is success if it's a negative - // pattern, failure otherwise. - if (options.flipNegate) return false - return this.negate -} - -// set partial to true to test if, for example, -// "/a/b" matches the start of "/*/b/*/d" -// Partial means, if you run out of file before you run -// out of pattern, then that's fine, as long as all -// the parts match. -Minimatch.prototype.matchOne = function (file, pattern, partial) { - var options = this.options - - this.debug('matchOne', - { 'this': this, file: file, pattern: pattern }) - - this.debug('matchOne', file.length, pattern.length) - - for (var fi = 0, - pi = 0, - fl = file.length, - pl = pattern.length - ; (fi < fl) && (pi < pl) - ; fi++, pi++) { - this.debug('matchOne loop') - var p = pattern[pi] - var f = file[fi] - - this.debug(pattern, p, f) - - // should be impossible. - // some invalid regexp stuff in the set. - if (p === false) return false - - if (p === GLOBSTAR) { - this.debug('GLOBSTAR', [pattern, p, f]) - - // "**" - // a/**/b/**/c would match the following: - // a/b/x/y/z/c - // a/x/y/z/b/c - // a/b/x/b/x/c - // a/b/c - // To do this, take the rest of the pattern after - // the **, and see if it would match the file remainder. - // If so, return success. - // If not, the ** "swallows" a segment, and try again. - // This is recursively awful. - // - // a/**/b/**/c matching a/b/x/y/z/c - // - a matches a - // - doublestar - // - matchOne(b/x/y/z/c, b/**/c) - // - b matches b - // - doublestar - // - matchOne(x/y/z/c, c) -> no - // - matchOne(y/z/c, c) -> no - // - matchOne(z/c, c) -> no - // - matchOne(c, c) yes, hit - var fr = fi - var pr = pi + 1 - if (pr === pl) { - this.debug('** at the end') - // a ** at the end will just swallow the rest. - // We have found a match. - // however, it will not swallow /.x, unless - // options.dot is set. - // . and .. are *never* matched by **, for explosively - // exponential reasons. - for (; fi < fl; fi++) { - if (file[fi] === '.' || file[fi] === '..' || - (!options.dot && file[fi].charAt(0) === '.')) return false - } - return true - } - - // ok, let's see if we can swallow whatever we can. - while (fr < fl) { - var swallowee = file[fr] - - this.debug('\nglobstar while', file, fr, pattern, pr, swallowee) - - // XXX remove this slice. Just pass the start index. - if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { - this.debug('globstar found match!', fr, fl, swallowee) - // found a match. - return true - } else { - // can't swallow "." or ".." ever. - // can only swallow ".foo" when explicitly asked. - if (swallowee === '.' || swallowee === '..' || - (!options.dot && swallowee.charAt(0) === '.')) { - this.debug('dot detected!', file, fr, pattern, pr) - break - } - - // ** swallows a segment, and continue. - this.debug('globstar swallow a segment, and continue') - fr++ - } - } - - // no match was found. - // However, in partial mode, we can't say this is necessarily over. - // If there's more *pattern* left, then - if (partial) { - // ran out of file - this.debug('\n>>> no match, partial?', file, fr, pattern, pr) - if (fr === fl) return true - } - return false - } - - // something other than ** - // non-magic patterns just have to match exactly - // patterns with magic have been turned into regexps. - var hit - if (typeof p === 'string') { - if (options.nocase) { - hit = f.toLowerCase() === p.toLowerCase() - } else { - hit = f === p - } - this.debug('string match', p, f, hit) - } else { - hit = f.match(p) - this.debug('pattern match', p, f, hit) - } - - if (!hit) return false - } - - // Note: ending in / means that we'll get a final "" - // at the end of the pattern. This can only match a - // corresponding "" at the end of the file. - // If the file ends in /, then it can only match a - // a pattern that ends in /, unless the pattern just - // doesn't have any more for it. But, a/b/ should *not* - // match "a/b/*", even though "" matches against the - // [^/]*? pattern, except in partial mode, where it might - // simply not be reached yet. - // However, a/b/ should still satisfy a/* - - // now either we fell off the end of the pattern, or we're done. - if (fi === fl && pi === pl) { - // ran out of pattern and filename at the same time. - // an exact hit! - return true - } else if (fi === fl) { - // ran out of file, but still had pattern left. - // this is ok if we're doing the match as part of - // a glob fs traversal. - return partial - } else if (pi === pl) { - // ran out of pattern, still have file left. - // this is only acceptable if we're on the very last - // empty segment of a file with a trailing slash. - // a/* should match a/b/ - var emptyFileEnd = (fi === fl - 1) && (file[fi] === '') - return emptyFileEnd - } - - // should be unreachable. - throw new Error('wtf?') -} - -// replace stuff like \* with * -function globUnescape (s) { - return s.replace(/\\(.)/g, '$1') -} - -function regExpEscape (s) { - return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') -} diff --git a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md b/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md deleted file mode 100644 index 1793929..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md +++ /dev/null @@ -1,122 +0,0 @@ -# brace-expansion - -[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), -as known from sh/bash, in JavaScript. - -[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion) -[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion) - -[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion) - -## Example - -```js -var expand = require('brace-expansion'); - -expand('file-{a,b,c}.jpg') -// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] - -expand('-v{,,}') -// => ['-v', '-v', '-v'] - -expand('file{0..2}.jpg') -// => ['file0.jpg', 'file1.jpg', 'file2.jpg'] - -expand('file-{a..c}.jpg') -// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] - -expand('file{2..0}.jpg') -// => ['file2.jpg', 'file1.jpg', 'file0.jpg'] - -expand('file{0..4..2}.jpg') -// => ['file0.jpg', 'file2.jpg', 'file4.jpg'] - -expand('file-{a..e..2}.jpg') -// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg'] - -expand('file{00..10..5}.jpg') -// => ['file00.jpg', 'file05.jpg', 'file10.jpg'] - -expand('{{A..C},{a..c}}') -// => ['A', 'B', 'C', 'a', 'b', 'c'] - -expand('ppp{,config,oe{,conf}}') -// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf'] -``` - -## API - -```js -var expand = require('brace-expansion'); -``` - -### var expanded = expand(str) - -Return an array of all possible and valid expansions of `str`. If none are -found, `[str]` is returned. - -Valid expansions are: - -```js -/^(.*,)+(.+)?$/ -// {a,b,...} -``` - -A comma seperated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`. - -```js -/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ -// {x..y[..incr]} -``` - -A numeric sequence from `x` to `y` inclusive, with optional increment. -If `x` or `y` start with a leading `0`, all the numbers will be padded -to have equal length. Negative numbers and backwards iteration work too. - -```js -/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ -// {x..y[..incr]} -``` - -An alphabetic sequence from `x` to `y` inclusive, with optional increment. -`x` and `y` must be exactly one character, and if given, `incr` must be a -number. - -For compatibility reasons, the string `${` is not eligible for brace expansion. - -## Installation - -With [npm](https://npmjs.org) do: - -```bash -npm install brace-expansion -``` - -## Contributors - -- [Julian Gruber](https://github.com/juliangruber) -- [Isaac Z. Schlueter](https://github.com/isaacs) - -## License - -(MIT) - -Copyright (c) 2013 Julian Gruber <julian@juliangruber.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. diff --git a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js b/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js deleted file mode 100644 index 955f27c..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js +++ /dev/null @@ -1,201 +0,0 @@ -var concatMap = require('concat-map'); -var balanced = require('balanced-match'); - -module.exports = expandTop; - -var escSlash = '\0SLASH'+Math.random()+'\0'; -var escOpen = '\0OPEN'+Math.random()+'\0'; -var escClose = '\0CLOSE'+Math.random()+'\0'; -var escComma = '\0COMMA'+Math.random()+'\0'; -var escPeriod = '\0PERIOD'+Math.random()+'\0'; - -function numeric(str) { - return parseInt(str, 10) == str - ? parseInt(str, 10) - : str.charCodeAt(0); -} - -function escapeBraces(str) { - return str.split('\\\\').join(escSlash) - .split('\\{').join(escOpen) - .split('\\}').join(escClose) - .split('\\,').join(escComma) - .split('\\.').join(escPeriod); -} - -function unescapeBraces(str) { - return str.split(escSlash).join('\\') - .split(escOpen).join('{') - .split(escClose).join('}') - .split(escComma).join(',') - .split(escPeriod).join('.'); -} - - -// Basically just str.split(","), but handling cases -// where we have nested braced sections, which should be -// treated as individual members, like {a,{b,c},d} -function parseCommaParts(str) { - if (!str) - return ['']; - - var parts = []; - var m = balanced('{', '}', str); - - if (!m) - return str.split(','); - - var pre = m.pre; - var body = m.body; - var post = m.post; - var p = pre.split(','); - - p[p.length-1] += '{' + body + '}'; - var postParts = parseCommaParts(post); - if (post.length) { - p[p.length-1] += postParts.shift(); - p.push.apply(p, postParts); - } - - parts.push.apply(parts, p); - - return parts; -} - -function expandTop(str) { - if (!str) - return []; - - // I don't know why Bash 4.3 does this, but it does. - // Anything starting with {} will have the first two bytes preserved - // but *only* at the top level, so {},a}b will not expand to anything, - // but a{},b}c will be expanded to [a}c,abc]. - // One could argue that this is a bug in Bash, but since the goal of - // this module is to match Bash's rules, we escape a leading {} - if (str.substr(0, 2) === '{}') { - str = '\\{\\}' + str.substr(2); - } - - return expand(escapeBraces(str), true).map(unescapeBraces); -} - -function identity(e) { - return e; -} - -function embrace(str) { - return '{' + str + '}'; -} -function isPadded(el) { - return /^-?0\d/.test(el); -} - -function lte(i, y) { - return i <= y; -} -function gte(i, y) { - return i >= y; -} - -function expand(str, isTop) { - var expansions = []; - - var m = balanced('{', '}', str); - if (!m || /\$$/.test(m.pre)) return [str]; - - var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); - var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); - var isSequence = isNumericSequence || isAlphaSequence; - var isOptions = /^(.*,)+(.+)?$/.test(m.body); - if (!isSequence && !isOptions) { - // {a},b} - if (m.post.match(/,.*\}/)) { - str = m.pre + '{' + m.body + escClose + m.post; - return expand(str); - } - return [str]; - } - - var n; - if (isSequence) { - n = m.body.split(/\.\./); - } else { - n = parseCommaParts(m.body); - if (n.length === 1) { - // x{{a,b}}y ==> x{a}y x{b}y - n = expand(n[0], false).map(embrace); - if (n.length === 1) { - var post = m.post.length - ? expand(m.post, false) - : ['']; - return post.map(function(p) { - return m.pre + n[0] + p; - }); - } - } - } - - // at this point, n is the parts, and we know it's not a comma set - // with a single entry. - - // no need to expand pre, since it is guaranteed to be free of brace-sets - var pre = m.pre; - var post = m.post.length - ? expand(m.post, false) - : ['']; - - var N; - - if (isSequence) { - var x = numeric(n[0]); - var y = numeric(n[1]); - var width = Math.max(n[0].length, n[1].length) - var incr = n.length == 3 - ? Math.abs(numeric(n[2])) - : 1; - var test = lte; - var reverse = y < x; - if (reverse) { - incr *= -1; - test = gte; - } - var pad = n.some(isPadded); - - N = []; - - for (var i = x; test(i, y); i += incr) { - var c; - if (isAlphaSequence) { - c = String.fromCharCode(i); - if (c === '\\') - c = ''; - } else { - c = String(i); - if (pad) { - var need = width - c.length; - if (need > 0) { - var z = new Array(need + 1).join('0'); - if (i < 0) - c = '-' + z + c.slice(1); - else - c = z + c; - } - } - } - N.push(c); - } - } else { - N = concatMap(n, function(el) { return expand(el, false) }); - } - - for (var j = 0; j < N.length; j++) { - for (var k = 0; k < post.length; k++) { - var expansion = pre + N[j] + post[k]; - if (!isTop || isSequence || expansion) - expansions.push(expansion); - } - } - - return expansions; -} - diff --git a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore b/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore deleted file mode 100644 index ae5d8c3..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -test -.gitignore -.travis.yml -Makefile -example.js diff --git a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/LICENSE.md b/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/LICENSE.md deleted file mode 100644 index 2cdc8e4..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -(MIT) - -Copyright (c) 2013 Julian Gruber <julian@juliangruber.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. diff --git a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md b/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md deleted file mode 100644 index 08e918c..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# balanced-match - -Match balanced string pairs, like `{` and `}` or `` and ``. Supports regular expressions as well! - -[![build status](https://secure.travis-ci.org/juliangruber/balanced-match.svg)](http://travis-ci.org/juliangruber/balanced-match) -[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match) - -[![testling badge](https://ci.testling.com/juliangruber/balanced-match.png)](https://ci.testling.com/juliangruber/balanced-match) - -## Example - -Get the first matching pair of braces: - -```js -var balanced = require('balanced-match'); - -console.log(balanced('{', '}', 'pre{in{nested}}post')); -console.log(balanced('{', '}', 'pre{first}between{second}post')); -console.log(balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre { in{nest} } post')); -``` - -The matches are: - -```bash -$ node example.js -{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' } -{ start: 3, - end: 9, - pre: 'pre', - body: 'first', - post: 'between{second}post' } -{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' } -``` - -## API - -### var m = balanced(a, b, str) - -For the first non-nested matching pair of `a` and `b` in `str`, return an -object with those keys: - -* **start** the index of the first match of `a` -* **end** the index of the matching `b` -* **pre** the preamble, `a` and `b` not included -* **body** the match, `a` and `b` not included -* **post** the postscript, `a` and `b` not included - -If there's no match, `undefined` will be returned. - -If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']` and `{a}}` will match `['', 'a', '}']`. - -### var r = balanced.range(a, b, str) - -For the first non-nested matching pair of `a` and `b` in `str`, return an -array with indexes: `[ , ]`. - -If there's no match, `undefined` will be returned. - -If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]` and `{a}}` will match `[0, 2]`. - -## Installation - -With [npm](https://npmjs.org) do: - -```bash -npm install balanced-match -``` - -## License - -(MIT) - -Copyright (c) 2013 Julian Gruber <julian@juliangruber.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. diff --git a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js b/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js deleted file mode 100644 index e8d8587..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js +++ /dev/null @@ -1,58 +0,0 @@ -module.exports = balanced; -function balanced(a, b, str) { - if (a instanceof RegExp) a = maybeMatch(a, str); - if (b instanceof RegExp) b = maybeMatch(b, str); - - var r = range(a, b, str); - - return r && { - start: r[0], - end: r[1], - pre: str.slice(0, r[0]), - body: str.slice(r[0] + a.length, r[1]), - post: str.slice(r[1] + b.length) - }; -} - -function maybeMatch(reg, str) { - var m = str.match(reg); - return m ? m[0] : null; -} - -balanced.range = range; -function range(a, b, str) { - var begs, beg, left, right, result; - var ai = str.indexOf(a); - var bi = str.indexOf(b, ai + 1); - var i = ai; - - if (ai >= 0 && bi > 0) { - begs = []; - left = str.length; - - while (i >= 0 && !result) { - if (i == ai) { - begs.push(i); - ai = str.indexOf(a, i + 1); - } else if (begs.length == 1) { - result = [ begs.pop(), bi ]; - } else { - beg = begs.pop(); - if (beg < left) { - left = beg; - right = bi; - } - - bi = str.indexOf(b, i + 1); - } - - i = ai < bi && ai >= 0 ? ai : bi; - } - - if (begs.length) { - result = [ left, right ]; - } - } - - return result; -} diff --git a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json b/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json deleted file mode 100644 index 2557dda..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "name": "balanced-match", - "description": "Match balanced character pairs, like \"{\" and \"}\"", - "version": "0.4.2", - "repository": { - "type": "git", - "url": "git://github.com/juliangruber/balanced-match.git" - }, - "homepage": "https://github.com/juliangruber/balanced-match", - "main": "index.js", - "scripts": { - "test": "make test" - }, - "dependencies": {}, - "devDependencies": { - "tape": "^4.6.0" - }, - "keywords": [ - "match", - "regexp", - "test", - "balanced", - "parse" - ], - "author": { - "name": "Julian Gruber", - "email": "mail@juliangruber.com", - "url": "http://juliangruber.com" - }, - "license": "MIT", - "testling": { - "files": "test/*.js", - "browsers": [ - "ie/8..latest", - "firefox/20..latest", - "firefox/nightly", - "chrome/25..latest", - "chrome/canary", - "opera/12..latest", - "opera/next", - "safari/5.1..latest", - "ipad/6.0..latest", - "iphone/6.0..latest", - "android-browser/4.2..latest" - ] - }, - "gitHead": "57c2ea29d89a2844ae3bdcc637c6e2cbb73725e2", - "bugs": { - "url": "https://github.com/juliangruber/balanced-match/issues" - }, - "_id": "balanced-match@0.4.2", - "_shasum": "cb3f3e3c732dc0f01ee70b403f302e61d7709838", - "_from": "balanced-match@>=0.4.1 <0.5.0", - "_npmVersion": "2.15.8", - "_nodeVersion": "4.4.7", - "_npmUser": { - "name": "juliangruber", - "email": "julian@juliangruber.com" - }, - "dist": { - "shasum": "cb3f3e3c732dc0f01ee70b403f302e61d7709838", - "tarball": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" - }, - "maintainers": [ - { - "name": "juliangruber", - "email": "julian@juliangruber.com" - } - ], - "_npmOperationalInternal": { - "host": "packages-16-east.internal.npmjs.com", - "tmp": "tmp/balanced-match-0.4.2.tgz_1468834991581_0.6590619895141572" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml b/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml deleted file mode 100644 index f1d0f13..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.4 - - 0.6 diff --git a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE b/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE deleted file mode 100644 index ee27ba4..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -This software is released under the MIT license: - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown b/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown deleted file mode 100644 index 408f70a..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown +++ /dev/null @@ -1,62 +0,0 @@ -concat-map -========== - -Concatenative mapdashery. - -[![browser support](http://ci.testling.com/substack/node-concat-map.png)](http://ci.testling.com/substack/node-concat-map) - -[![build status](https://secure.travis-ci.org/substack/node-concat-map.png)](http://travis-ci.org/substack/node-concat-map) - -example -======= - -``` js -var concatMap = require('concat-map'); -var xs = [ 1, 2, 3, 4, 5, 6 ]; -var ys = concatMap(xs, function (x) { - return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; -}); -console.dir(ys); -``` - -*** - -``` -[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ] -``` - -methods -======= - -``` js -var concatMap = require('concat-map') -``` - -concatMap(xs, fn) ------------------ - -Return an array of concatenated elements by calling `fn(x, i)` for each element -`x` and each index `i` in the array `xs`. - -When `fn(x, i)` returns an array, its result will be concatenated with the -result array. If `fn(x, i)` returns anything else, that value will be pushed -onto the end of the result array. - -install -======= - -With [npm](http://npmjs.org) do: - -``` -npm install concat-map -``` - -license -======= - -MIT - -notes -===== - -This module was written while sitting high above the ground in a tree. diff --git a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js b/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js deleted file mode 100644 index 3365621..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js +++ /dev/null @@ -1,6 +0,0 @@ -var concatMap = require('../'); -var xs = [ 1, 2, 3, 4, 5, 6 ]; -var ys = concatMap(xs, function (x) { - return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; -}); -console.dir(ys); diff --git a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js b/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js deleted file mode 100644 index b29a781..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = function (xs, fn) { - var res = []; - for (var i = 0; i < xs.length; i++) { - var x = fn(xs[i], i); - if (isArray(x)) res.push.apply(res, x); - else res.push(x); - } - return res; -}; - -var isArray = Array.isArray || function (xs) { - return Object.prototype.toString.call(xs) === '[object Array]'; -}; diff --git a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json b/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json deleted file mode 100644 index de8b785..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "concat-map", - "description": "concatenative mapdashery", - "version": "0.0.1", - "repository": { - "type": "git", - "url": "git://github.com/substack/node-concat-map.git" - }, - "main": "index.js", - "keywords": [ - "concat", - "concatMap", - "map", - "functional", - "higher-order" - ], - "directories": { - "example": "example", - "test": "test" - }, - "scripts": { - "test": "tape test/*.js" - }, - "devDependencies": { - "tape": "~2.4.0" - }, - "license": "MIT", - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "testling": { - "files": "test/*.js", - "browsers": { - "ie": [ - 6, - 7, - 8, - 9 - ], - "ff": [ - 3.5, - 10, - 15 - ], - "chrome": [ - 10, - 22 - ], - "safari": [ - 5.1 - ], - "opera": [ - 12 - ] - } - }, - "bugs": { - "url": "https://github.com/substack/node-concat-map/issues" - }, - "homepage": "https://github.com/substack/node-concat-map", - "_id": "concat-map@0.0.1", - "dist": { - "shasum": "d8a96bd77fd68df7793a73036a3ba0d5405d477b", - "tarball": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - }, - "_from": "concat-map@0.0.1", - "_npmVersion": "1.3.21", - "_npmUser": { - "name": "substack", - "email": "mail@substack.net" - }, - "maintainers": [ - { - "name": "substack", - "email": "mail@substack.net" - } - ], - "_shasum": "d8a96bd77fd68df7793a73036a3ba0d5405d477b", - "_resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js b/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js deleted file mode 100644 index fdbd702..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js +++ /dev/null @@ -1,39 +0,0 @@ -var concatMap = require('../'); -var test = require('tape'); - -test('empty or not', function (t) { - var xs = [ 1, 2, 3, 4, 5, 6 ]; - var ixes = []; - var ys = concatMap(xs, function (x, ix) { - ixes.push(ix); - return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; - }); - t.same(ys, [ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]); - t.same(ixes, [ 0, 1, 2, 3, 4, 5 ]); - t.end(); -}); - -test('always something', function (t) { - var xs = [ 'a', 'b', 'c', 'd' ]; - var ys = concatMap(xs, function (x) { - return x === 'b' ? [ 'B', 'B', 'B' ] : [ x ]; - }); - t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]); - t.end(); -}); - -test('scalars', function (t) { - var xs = [ 'a', 'b', 'c', 'd' ]; - var ys = concatMap(xs, function (x) { - return x === 'b' ? [ 'B', 'B', 'B' ] : x; - }); - t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]); - t.end(); -}); - -test('undefs', function (t) { - var xs = [ 'a', 'b', 'c', 'd' ]; - var ys = concatMap(xs, function () {}); - t.same(ys, [ undefined, undefined, undefined, undefined ]); - t.end(); -}); diff --git a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json b/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json deleted file mode 100644 index e00a73a..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "name": "brace-expansion", - "description": "Brace expansion as known from sh/bash", - "version": "1.1.6", - "repository": { - "type": "git", - "url": "git://github.com/juliangruber/brace-expansion.git" - }, - "homepage": "https://github.com/juliangruber/brace-expansion", - "main": "index.js", - "scripts": { - "test": "tape test/*.js", - "gentest": "bash test/generate.sh" - }, - "dependencies": { - "balanced-match": "^0.4.1", - "concat-map": "0.0.1" - }, - "devDependencies": { - "tape": "^4.6.0" - }, - "keywords": [], - "author": { - "name": "Julian Gruber", - "email": "mail@juliangruber.com", - "url": "http://juliangruber.com" - }, - "license": "MIT", - "testling": { - "files": "test/*.js", - "browsers": [ - "ie/8..latest", - "firefox/20..latest", - "firefox/nightly", - "chrome/25..latest", - "chrome/canary", - "opera/12..latest", - "opera/next", - "safari/5.1..latest", - "ipad/6.0..latest", - "iphone/6.0..latest", - "android-browser/4.2..latest" - ] - }, - "gitHead": "791262fa06625e9c5594cde529a21d82086af5f2", - "bugs": { - "url": "https://github.com/juliangruber/brace-expansion/issues" - }, - "_id": "brace-expansion@1.1.6", - "_shasum": "7197d7eaa9b87e648390ea61fc66c84427420df9", - "_from": "brace-expansion@>=1.0.0 <2.0.0", - "_npmVersion": "2.15.8", - "_nodeVersion": "4.4.7", - "_npmUser": { - "name": "juliangruber", - "email": "julian@juliangruber.com" - }, - "dist": { - "shasum": "7197d7eaa9b87e648390ea61fc66c84427420df9", - "tarball": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz" - }, - "maintainers": [ - { - "name": "juliangruber", - "email": "julian@juliangruber.com" - }, - { - "name": "isaacs", - "email": "isaacs@npmjs.com" - } - ], - "_npmOperationalInternal": { - "host": "packages-16-east.internal.npmjs.com", - "tmp": "tmp/brace-expansion-1.1.6.tgz_1469047715600_0.9362958471756428" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/package.json b/node_modules/shelljs/node_modules/glob/node_modules/minimatch/package.json deleted file mode 100644 index 0f48702..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/minimatch/package.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me" - }, - "name": "minimatch", - "description": "a glob matcher in javascript", - "version": "3.0.3", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/minimatch.git" - }, - "main": "minimatch.js", - "scripts": { - "posttest": "standard minimatch.js test/*.js", - "test": "tap test/*.js" - }, - "engines": { - "node": "*" - }, - "dependencies": { - "brace-expansion": "^1.0.0" - }, - "devDependencies": { - "standard": "^3.7.2", - "tap": "^5.6.0" - }, - "license": "ISC", - "files": [ - "minimatch.js" - ], - "gitHead": "eed89491bd4a4e6bc463aac0dfb5c29ef0d1dc13", - "bugs": { - "url": "https://github.com/isaacs/minimatch/issues" - }, - "homepage": "https://github.com/isaacs/minimatch#readme", - "_id": "minimatch@3.0.3", - "_shasum": "2a4e4090b96b2db06a9d7df01055a62a77c9b774", - "_from": "minimatch@>=3.0.2 <4.0.0", - "_npmVersion": "3.10.6", - "_nodeVersion": "4.4.4", - "_npmUser": { - "name": "isaacs", - "email": "i@izs.me" - }, - "dist": { - "shasum": "2a4e4090b96b2db06a9d7df01055a62a77c9b774", - "tarball": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "_npmOperationalInternal": { - "host": "packages-12-west.internal.npmjs.com", - "tmp": "tmp/minimatch-3.0.3.tgz_1470678322731_0.1892083385027945" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/shelljs/node_modules/glob/node_modules/once/LICENSE b/node_modules/shelljs/node_modules/glob/node_modules/once/LICENSE deleted file mode 100644 index 19129e3..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/once/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/shelljs/node_modules/glob/node_modules/once/README.md b/node_modules/shelljs/node_modules/glob/node_modules/once/README.md deleted file mode 100644 index 1f1ffca..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/once/README.md +++ /dev/null @@ -1,79 +0,0 @@ -# once - -Only call a function once. - -## usage - -```javascript -var once = require('once') - -function load (file, cb) { - cb = once(cb) - loader.load('file') - loader.once('load', cb) - loader.once('error', cb) -} -``` - -Or add to the Function.prototype in a responsible way: - -```javascript -// only has to be done once -require('once').proto() - -function load (file, cb) { - cb = cb.once() - loader.load('file') - loader.once('load', cb) - loader.once('error', cb) -} -``` - -Ironically, the prototype feature makes this module twice as -complicated as necessary. - -To check whether you function has been called, use `fn.called`. Once the -function is called for the first time the return value of the original -function is saved in `fn.value` and subsequent calls will continue to -return this value. - -```javascript -var once = require('once') - -function load (cb) { - cb = once(cb) - var stream = createStream() - stream.once('data', cb) - stream.once('end', function () { - if (!cb.called) cb(new Error('not found')) - }) -} -``` - -## `once.strict(func)` - -Throw an error if the function is called twice. - -Some functions are expected to be called only once. Using `once` for them would -potentially hide logical errors. - -In the example below, the `greet` function has to call the callback only once: - -```javascript -function greet (name, cb) { - // return is missing from the if statement - // when no name is passed, the callback is called twice - if (!name) cb('Hello anonymous') - cb('Hello ' + name) -} - -function log (msg) { - console.log(msg) -} - -// this will print 'Hello anonymous' but the logical error will be missed -greet(null, once(msg)) - -// once.strict will print 'Hello anonymous' and throw an error when the callback will be called the second time -greet(null, once.strict(msg)) -``` diff --git a/node_modules/shelljs/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE b/node_modules/shelljs/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE deleted file mode 100644 index 19129e3..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/shelljs/node_modules/glob/node_modules/once/node_modules/wrappy/README.md b/node_modules/shelljs/node_modules/glob/node_modules/once/node_modules/wrappy/README.md deleted file mode 100644 index 98eab25..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/once/node_modules/wrappy/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# wrappy - -Callback wrapping utility - -## USAGE - -```javascript -var wrappy = require("wrappy") - -// var wrapper = wrappy(wrapperFunction) - -// make sure a cb is called only once -// See also: http://npm.im/once for this specific use case -var once = wrappy(function (cb) { - var called = false - return function () { - if (called) return - called = true - return cb.apply(this, arguments) - } -}) - -function printBoo () { - console.log('boo') -} -// has some rando property -printBoo.iAmBooPrinter = true - -var onlyPrintOnce = once(printBoo) - -onlyPrintOnce() // prints 'boo' -onlyPrintOnce() // does nothing - -// random property is retained! -assert.equal(onlyPrintOnce.iAmBooPrinter, true) -``` diff --git a/node_modules/shelljs/node_modules/glob/node_modules/once/node_modules/wrappy/package.json b/node_modules/shelljs/node_modules/glob/node_modules/once/node_modules/wrappy/package.json deleted file mode 100644 index de3bfd5..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/once/node_modules/wrappy/package.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "name": "wrappy", - "version": "1.0.2", - "description": "Callback wrapping utility", - "main": "wrappy.js", - "files": [ - "wrappy.js" - ], - "directories": { - "test": "test" - }, - "dependencies": {}, - "devDependencies": { - "tap": "^2.3.1" - }, - "scripts": { - "test": "tap --coverage test/*.js" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/npm/wrappy.git" - }, - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "license": "ISC", - "bugs": { - "url": "https://github.com/npm/wrappy/issues" - }, - "homepage": "https://github.com/npm/wrappy", - "gitHead": "71d91b6dc5bdeac37e218c2cf03f9ab55b60d214", - "_id": "wrappy@1.0.2", - "_shasum": "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f", - "_from": "wrappy@>=1.0.0 <2.0.0", - "_npmVersion": "3.9.1", - "_nodeVersion": "5.10.1", - "_npmUser": { - "name": "zkat", - "email": "kat@sykosomatic.org" - }, - "dist": { - "shasum": "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f", - "tarball": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - }, - { - "name": "zkat", - "email": "kat@sykosomatic.org" - } - ], - "_npmOperationalInternal": { - "host": "packages-16-east.internal.npmjs.com", - "tmp": "tmp/wrappy-1.0.2.tgz_1463527848281_0.037129373755306005" - }, - "_resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/shelljs/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js b/node_modules/shelljs/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js deleted file mode 100644 index bb7e7d6..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js +++ /dev/null @@ -1,33 +0,0 @@ -// Returns a wrapper function that returns a wrapped callback -// The wrapper function should do some stuff, and return a -// presumably different callback function. -// This makes sure that own properties are retained, so that -// decorations and such are not lost along the way. -module.exports = wrappy -function wrappy (fn, cb) { - if (fn && cb) return wrappy(fn)(cb) - - if (typeof fn !== 'function') - throw new TypeError('need wrapper function') - - Object.keys(fn).forEach(function (k) { - wrapper[k] = fn[k] - }) - - return wrapper - - function wrapper() { - var args = new Array(arguments.length) - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - var ret = fn.apply(this, args) - var cb = args[args.length-1] - if (typeof ret === 'function' && ret !== cb) { - Object.keys(cb).forEach(function (k) { - ret[k] = cb[k] - }) - } - return ret - } -} diff --git a/node_modules/shelljs/node_modules/glob/node_modules/once/once.js b/node_modules/shelljs/node_modules/glob/node_modules/once/once.js deleted file mode 100644 index 2354067..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/once/once.js +++ /dev/null @@ -1,42 +0,0 @@ -var wrappy = require('wrappy') -module.exports = wrappy(once) -module.exports.strict = wrappy(onceStrict) - -once.proto = once(function () { - Object.defineProperty(Function.prototype, 'once', { - value: function () { - return once(this) - }, - configurable: true - }) - - Object.defineProperty(Function.prototype, 'onceStrict', { - value: function () { - return onceStrict(this) - }, - configurable: true - }) -}) - -function once (fn) { - var f = function () { - if (f.called) return f.value - f.called = true - return f.value = fn.apply(this, arguments) - } - f.called = false - return f -} - -function onceStrict (fn) { - var f = function () { - if (f.called) - throw new Error(f.onceError) - f.called = true - return f.value = fn.apply(this, arguments) - } - var name = fn.name || 'Function wrapped with `once`' - f.onceError = name + " shouldn't be called more than once" - f.called = false - return f -} diff --git a/node_modules/shelljs/node_modules/glob/node_modules/once/package.json b/node_modules/shelljs/node_modules/glob/node_modules/once/package.json deleted file mode 100644 index 9800997..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/once/package.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "once", - "version": "1.4.0", - "description": "Run a function exactly one time", - "main": "once.js", - "directories": { - "test": "test" - }, - "dependencies": { - "wrappy": "1" - }, - "devDependencies": { - "tap": "^7.0.1" - }, - "scripts": { - "test": "tap test/*.js" - }, - "files": [ - "once.js" - ], - "repository": { - "type": "git", - "url": "git://github.com/isaacs/once.git" - }, - "keywords": [ - "once", - "function", - "one", - "single" - ], - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "license": "ISC", - "gitHead": "0e614d9f5a7e6f0305c625f6b581f6d80b33b8a6", - "bugs": { - "url": "https://github.com/isaacs/once/issues" - }, - "homepage": "https://github.com/isaacs/once#readme", - "_id": "once@1.4.0", - "_shasum": "583b1aa775961d4b113ac17d9c50baef9dd76bd1", - "_from": "once@>=1.3.0 <2.0.0", - "_npmVersion": "3.10.7", - "_nodeVersion": "6.5.0", - "_npmUser": { - "name": "isaacs", - "email": "i@izs.me" - }, - "dist": { - "shasum": "583b1aa775961d4b113ac17d9c50baef9dd76bd1", - "tarball": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "_npmOperationalInternal": { - "host": "packages-12-west.internal.npmjs.com", - "tmp": "tmp/once-1.4.0.tgz_1473196269128_0.537820661207661" - }, - "_resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/shelljs/node_modules/glob/node_modules/path-is-absolute/index.js b/node_modules/shelljs/node_modules/glob/node_modules/path-is-absolute/index.js deleted file mode 100644 index 22aa6c3..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/path-is-absolute/index.js +++ /dev/null @@ -1,20 +0,0 @@ -'use strict'; - -function posix(path) { - return path.charAt(0) === '/'; -} - -function win32(path) { - // https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56 - var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; - var result = splitDeviceRe.exec(path); - var device = result[1] || ''; - var isUnc = Boolean(device && device.charAt(1) !== ':'); - - // UNC paths are always absolute - return Boolean(result[2] || isUnc); -} - -module.exports = process.platform === 'win32' ? win32 : posix; -module.exports.posix = posix; -module.exports.win32 = win32; diff --git a/node_modules/shelljs/node_modules/glob/node_modules/path-is-absolute/license b/node_modules/shelljs/node_modules/glob/node_modules/path-is-absolute/license deleted file mode 100644 index 654d0bf..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/path-is-absolute/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.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. diff --git a/node_modules/shelljs/node_modules/glob/node_modules/path-is-absolute/package.json b/node_modules/shelljs/node_modules/glob/node_modules/path-is-absolute/package.json deleted file mode 100644 index 851195e..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/path-is-absolute/package.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "name": "path-is-absolute", - "version": "1.0.1", - "description": "Node.js 0.12 path.isAbsolute() ponyfill", - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/sindresorhus/path-is-absolute.git" - }, - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "xo && node test.js" - }, - "files": [ - "index.js" - ], - "keywords": [ - "path", - "paths", - "file", - "dir", - "absolute", - "isabsolute", - "is-absolute", - "built-in", - "util", - "utils", - "core", - "ponyfill", - "polyfill", - "shim", - "is", - "detect", - "check" - ], - "devDependencies": { - "xo": "^0.16.0" - }, - "gitHead": "edc91d348b21dac2ab65ea2fbec2868e2eff5eb6", - "bugs": { - "url": "https://github.com/sindresorhus/path-is-absolute/issues" - }, - "homepage": "https://github.com/sindresorhus/path-is-absolute#readme", - "_id": "path-is-absolute@1.0.1", - "_shasum": "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f", - "_from": "path-is-absolute@>=1.0.0 <2.0.0", - "_npmVersion": "3.10.3", - "_nodeVersion": "6.6.0", - "_npmUser": { - "name": "sindresorhus", - "email": "sindresorhus@gmail.com" - }, - "dist": { - "shasum": "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f", - "tarball": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - }, - "maintainers": [ - { - "name": "sindresorhus", - "email": "sindresorhus@gmail.com" - } - ], - "_npmOperationalInternal": { - "host": "packages-12-west.internal.npmjs.com", - "tmp": "tmp/path-is-absolute-1.0.1.tgz_1475210523565_0.9876507974695414" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/shelljs/node_modules/glob/node_modules/path-is-absolute/readme.md b/node_modules/shelljs/node_modules/glob/node_modules/path-is-absolute/readme.md deleted file mode 100644 index 8dbdf5f..0000000 --- a/node_modules/shelljs/node_modules/glob/node_modules/path-is-absolute/readme.md +++ /dev/null @@ -1,59 +0,0 @@ -# path-is-absolute [![Build Status](https://travis-ci.org/sindresorhus/path-is-absolute.svg?branch=master)](https://travis-ci.org/sindresorhus/path-is-absolute) - -> Node.js 0.12 [`path.isAbsolute()`](http://nodejs.org/api/path.html#path_path_isabsolute_path) [ponyfill](https://ponyfill.com) - - -## Install - -``` -$ npm install --save path-is-absolute -``` - - -## Usage - -```js -const pathIsAbsolute = require('path-is-absolute'); - -// Running on Linux -pathIsAbsolute('/home/foo'); -//=> true -pathIsAbsolute('C:/Users/foo'); -//=> false - -// Running on Windows -pathIsAbsolute('C:/Users/foo'); -//=> true -pathIsAbsolute('/home/foo'); -//=> false - -// Running on any OS -pathIsAbsolute.posix('/home/foo'); -//=> true -pathIsAbsolute.posix('C:/Users/foo'); -//=> false -pathIsAbsolute.win32('C:/Users/foo'); -//=> true -pathIsAbsolute.win32('/home/foo'); -//=> false -``` - - -## API - -See the [`path.isAbsolute()` docs](http://nodejs.org/api/path.html#path_path_isabsolute_path). - -### pathIsAbsolute(path) - -### pathIsAbsolute.posix(path) - -POSIX specific version. - -### pathIsAbsolute.win32(path) - -Windows specific version. - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/shelljs/node_modules/glob/package.json b/node_modules/shelljs/node_modules/glob/package.json deleted file mode 100644 index 25522af..0000000 --- a/node_modules/shelljs/node_modules/glob/package.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "name": "glob", - "description": "a little globber", - "version": "7.1.1", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/node-glob.git" - }, - "main": "glob.js", - "files": [ - "glob.js", - "sync.js", - "common.js" - ], - "engines": { - "node": "*" - }, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "devDependencies": { - "mkdirp": "0", - "rimraf": "^2.2.8", - "tap": "^7.1.2", - "tick": "0.0.6" - }, - "scripts": { - "prepublish": "npm run benchclean", - "profclean": "rm -f v8.log profile.txt", - "test": "tap test/*.js --cov", - "test-regen": "npm run profclean && TEST_REGEN=1 node test/00-setup.js", - "bench": "bash benchmark.sh", - "prof": "bash prof.sh && cat profile.txt", - "benchclean": "node benchclean.js" - }, - "license": "ISC", - "gitHead": "bc8d43b736a98a9e289fdfceee9266cff35e5742", - "bugs": { - "url": "https://github.com/isaacs/node-glob/issues" - }, - "homepage": "https://github.com/isaacs/node-glob#readme", - "_id": "glob@7.1.1", - "_shasum": "805211df04faaf1c63a3600306cdf5ade50b2ec8", - "_from": "glob@>=7.0.0 <8.0.0", - "_npmVersion": "3.10.7", - "_nodeVersion": "6.5.0", - "_npmUser": { - "name": "isaacs", - "email": "i@izs.me" - }, - "dist": { - "shasum": "805211df04faaf1c63a3600306cdf5ade50b2ec8", - "tarball": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz" - }, - "maintainers": [ - { - "name": "isaacs", - "email": "i@izs.me" - } - ], - "_npmOperationalInternal": { - "host": "packages-16-east.internal.npmjs.com", - "tmp": "tmp/glob-7.1.1.tgz_1475876991562_0.924720095237717" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/shelljs/node_modules/glob/sync.js b/node_modules/shelljs/node_modules/glob/sync.js deleted file mode 100644 index c952134..0000000 --- a/node_modules/shelljs/node_modules/glob/sync.js +++ /dev/null @@ -1,486 +0,0 @@ -module.exports = globSync -globSync.GlobSync = GlobSync - -var fs = require('fs') -var rp = require('fs.realpath') -var minimatch = require('minimatch') -var Minimatch = minimatch.Minimatch -var Glob = require('./glob.js').Glob -var util = require('util') -var path = require('path') -var assert = require('assert') -var isAbsolute = require('path-is-absolute') -var common = require('./common.js') -var alphasort = common.alphasort -var alphasorti = common.alphasorti -var setopts = common.setopts -var ownProp = common.ownProp -var childrenIgnored = common.childrenIgnored -var isIgnored = common.isIgnored - -function globSync (pattern, options) { - if (typeof options === 'function' || arguments.length === 3) - throw new TypeError('callback provided to sync glob\n'+ - 'See: https://github.com/isaacs/node-glob/issues/167') - - return new GlobSync(pattern, options).found -} - -function GlobSync (pattern, options) { - if (!pattern) - throw new Error('must provide pattern') - - if (typeof options === 'function' || arguments.length === 3) - throw new TypeError('callback provided to sync glob\n'+ - 'See: https://github.com/isaacs/node-glob/issues/167') - - if (!(this instanceof GlobSync)) - return new GlobSync(pattern, options) - - setopts(this, pattern, options) - - if (this.noprocess) - return this - - var n = this.minimatch.set.length - this.matches = new Array(n) - for (var i = 0; i < n; i ++) { - this._process(this.minimatch.set[i], i, false) - } - this._finish() -} - -GlobSync.prototype._finish = function () { - assert(this instanceof GlobSync) - if (this.realpath) { - var self = this - this.matches.forEach(function (matchset, index) { - var set = self.matches[index] = Object.create(null) - for (var p in matchset) { - try { - p = self._makeAbs(p) - var real = rp.realpathSync(p, self.realpathCache) - set[real] = true - } catch (er) { - if (er.syscall === 'stat') - set[self._makeAbs(p)] = true - else - throw er - } - } - }) - } - common.finish(this) -} - - -GlobSync.prototype._process = function (pattern, index, inGlobStar) { - assert(this instanceof GlobSync) - - // Get the first [n] parts of pattern that are all strings. - var n = 0 - while (typeof pattern[n] === 'string') { - n ++ - } - // now n is the index of the first one that is *not* a string. - - // See if there's anything else - var prefix - switch (n) { - // if not, then this is rather simple - case pattern.length: - this._processSimple(pattern.join('/'), index) - return - - case 0: - // pattern *starts* with some non-trivial item. - // going to readdir(cwd), but not include the prefix in matches. - prefix = null - break - - default: - // pattern has some string bits in the front. - // whatever it starts with, whether that's 'absolute' like /foo/bar, - // or 'relative' like '../baz' - prefix = pattern.slice(0, n).join('/') - break - } - - var remain = pattern.slice(n) - - // get the list of entries. - var read - if (prefix === null) - read = '.' - else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { - if (!prefix || !isAbsolute(prefix)) - prefix = '/' + prefix - read = prefix - } else - read = prefix - - var abs = this._makeAbs(read) - - //if ignored, skip processing - if (childrenIgnored(this, read)) - return - - var isGlobStar = remain[0] === minimatch.GLOBSTAR - if (isGlobStar) - this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) - else - this._processReaddir(prefix, read, abs, remain, index, inGlobStar) -} - - -GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { - var entries = this._readdir(abs, inGlobStar) - - // if the abs isn't a dir, then nothing can match! - if (!entries) - return - - // It will only match dot entries if it starts with a dot, or if - // dot is set. Stuff like @(.foo|.bar) isn't allowed. - var pn = remain[0] - var negate = !!this.minimatch.negate - var rawGlob = pn._glob - var dotOk = this.dot || rawGlob.charAt(0) === '.' - - var matchedEntries = [] - for (var i = 0; i < entries.length; i++) { - var e = entries[i] - if (e.charAt(0) !== '.' || dotOk) { - var m - if (negate && !prefix) { - m = !e.match(pn) - } else { - m = e.match(pn) - } - if (m) - matchedEntries.push(e) - } - } - - var len = matchedEntries.length - // If there are no matched entries, then nothing matches. - if (len === 0) - return - - // if this is the last remaining pattern bit, then no need for - // an additional stat *unless* the user has specified mark or - // stat explicitly. We know they exist, since readdir returned - // them. - - if (remain.length === 1 && !this.mark && !this.stat) { - if (!this.matches[index]) - this.matches[index] = Object.create(null) - - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - if (prefix) { - if (prefix.slice(-1) !== '/') - e = prefix + '/' + e - else - e = prefix + e - } - - if (e.charAt(0) === '/' && !this.nomount) { - e = path.join(this.root, e) - } - this._emitMatch(index, e) - } - // This was the last one, and no stats were needed - return - } - - // now test all matched entries as stand-ins for that part - // of the pattern. - remain.shift() - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - var newPattern - if (prefix) - newPattern = [prefix, e] - else - newPattern = [e] - this._process(newPattern.concat(remain), index, inGlobStar) - } -} - - -GlobSync.prototype._emitMatch = function (index, e) { - if (isIgnored(this, e)) - return - - var abs = this._makeAbs(e) - - if (this.mark) - e = this._mark(e) - - if (this.absolute) { - e = abs - } - - if (this.matches[index][e]) - return - - if (this.nodir) { - var c = this.cache[abs] - if (c === 'DIR' || Array.isArray(c)) - return - } - - this.matches[index][e] = true - - if (this.stat) - this._stat(e) -} - - -GlobSync.prototype._readdirInGlobStar = function (abs) { - // follow all symlinked directories forever - // just proceed as if this is a non-globstar situation - if (this.follow) - return this._readdir(abs, false) - - var entries - var lstat - var stat - try { - lstat = fs.lstatSync(abs) - } catch (er) { - if (er.code === 'ENOENT') { - // lstat failed, doesn't exist - return null - } - } - - var isSym = lstat && lstat.isSymbolicLink() - this.symlinks[abs] = isSym - - // If it's not a symlink or a dir, then it's definitely a regular file. - // don't bother doing a readdir in that case. - if (!isSym && lstat && !lstat.isDirectory()) - this.cache[abs] = 'FILE' - else - entries = this._readdir(abs, false) - - return entries -} - -GlobSync.prototype._readdir = function (abs, inGlobStar) { - var entries - - if (inGlobStar && !ownProp(this.symlinks, abs)) - return this._readdirInGlobStar(abs) - - if (ownProp(this.cache, abs)) { - var c = this.cache[abs] - if (!c || c === 'FILE') - return null - - if (Array.isArray(c)) - return c - } - - try { - return this._readdirEntries(abs, fs.readdirSync(abs)) - } catch (er) { - this._readdirError(abs, er) - return null - } -} - -GlobSync.prototype._readdirEntries = function (abs, entries) { - // if we haven't asked to stat everything, then just - // assume that everything in there exists, so we can avoid - // having to stat it a second time. - if (!this.mark && !this.stat) { - for (var i = 0; i < entries.length; i ++) { - var e = entries[i] - if (abs === '/') - e = abs + e - else - e = abs + '/' + e - this.cache[e] = true - } - } - - this.cache[abs] = entries - - // mark and cache dir-ness - return entries -} - -GlobSync.prototype._readdirError = function (f, er) { - // handle errors, and cache the information - switch (er.code) { - case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 - case 'ENOTDIR': // totally normal. means it *does* exist. - var abs = this._makeAbs(f) - this.cache[abs] = 'FILE' - if (abs === this.cwdAbs) { - var error = new Error(er.code + ' invalid cwd ' + this.cwd) - error.path = this.cwd - error.code = er.code - throw error - } - break - - case 'ENOENT': // not terribly unusual - case 'ELOOP': - case 'ENAMETOOLONG': - case 'UNKNOWN': - this.cache[this._makeAbs(f)] = false - break - - default: // some unusual error. Treat as failure. - this.cache[this._makeAbs(f)] = false - if (this.strict) - throw er - if (!this.silent) - console.error('glob error', er) - break - } -} - -GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { - - var entries = this._readdir(abs, inGlobStar) - - // no entries means not a dir, so it can never have matches - // foo.txt/** doesn't match foo.txt - if (!entries) - return - - // test without the globstar, and with every child both below - // and replacing the globstar. - var remainWithoutGlobStar = remain.slice(1) - var gspref = prefix ? [ prefix ] : [] - var noGlobStar = gspref.concat(remainWithoutGlobStar) - - // the noGlobStar pattern exits the inGlobStar state - this._process(noGlobStar, index, false) - - var len = entries.length - var isSym = this.symlinks[abs] - - // If it's a symlink, and we're in a globstar, then stop - if (isSym && inGlobStar) - return - - for (var i = 0; i < len; i++) { - var e = entries[i] - if (e.charAt(0) === '.' && !this.dot) - continue - - // these two cases enter the inGlobStar state - var instead = gspref.concat(entries[i], remainWithoutGlobStar) - this._process(instead, index, true) - - var below = gspref.concat(entries[i], remain) - this._process(below, index, true) - } -} - -GlobSync.prototype._processSimple = function (prefix, index) { - // XXX review this. Shouldn't it be doing the mounting etc - // before doing stat? kinda weird? - var exists = this._stat(prefix) - - if (!this.matches[index]) - this.matches[index] = Object.create(null) - - // If it doesn't exist, then just mark the lack of results - if (!exists) - return - - if (prefix && isAbsolute(prefix) && !this.nomount) { - var trail = /[\/\\]$/.test(prefix) - if (prefix.charAt(0) === '/') { - prefix = path.join(this.root, prefix) - } else { - prefix = path.resolve(this.root, prefix) - if (trail) - prefix += '/' - } - } - - if (process.platform === 'win32') - prefix = prefix.replace(/\\/g, '/') - - // Mark this as a match - this._emitMatch(index, prefix) -} - -// Returns either 'DIR', 'FILE', or false -GlobSync.prototype._stat = function (f) { - var abs = this._makeAbs(f) - var needDir = f.slice(-1) === '/' - - if (f.length > this.maxLength) - return false - - if (!this.stat && ownProp(this.cache, abs)) { - var c = this.cache[abs] - - if (Array.isArray(c)) - c = 'DIR' - - // It exists, but maybe not how we need it - if (!needDir || c === 'DIR') - return c - - if (needDir && c === 'FILE') - return false - - // otherwise we have to stat, because maybe c=true - // if we know it exists, but not what it is. - } - - var exists - var stat = this.statCache[abs] - if (!stat) { - var lstat - try { - lstat = fs.lstatSync(abs) - } catch (er) { - if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { - this.statCache[abs] = false - return false - } - } - - if (lstat && lstat.isSymbolicLink()) { - try { - stat = fs.statSync(abs) - } catch (er) { - stat = lstat - } - } else { - stat = lstat - } - } - - this.statCache[abs] = stat - - var c = true - if (stat) - c = stat.isDirectory() ? 'DIR' : 'FILE' - - this.cache[abs] = this.cache[abs] || c - - if (needDir && c === 'FILE') - return false - - return c -} - -GlobSync.prototype._mark = function (p) { - return common.mark(this, p) -} - -GlobSync.prototype._makeAbs = function (f) { - return common.makeAbs(this, f) -} diff --git a/node_modules/shelljs/node_modules/interpret/CHANGELOG b/node_modules/shelljs/node_modules/interpret/CHANGELOG deleted file mode 100644 index eeaee86..0000000 --- a/node_modules/shelljs/node_modules/interpret/CHANGELOG +++ /dev/null @@ -1,103 +0,0 @@ -v1.0.0: - date: 2015-11-18 - changes: - - add support for babel-register - - go stable! -v0.6.6: - date: 2015-09-21 - changes: - - add support for ts-node (formerly typescript-node) -v0.6.5: - date: 2015-07-22 - changes: - - add support for typescript 1.5 via typescript-node -v0.6.4: - date: 2015-07-07 - changes: - - add support for earlgrey -v0.6.3: - date: 2015-07-03 - changes: - - prefer babel/core to babel -v0.6.2: - date: 2015-05-20 - changes: - - update module list for iced coffee-script -v0.6.1: - date: 2015-05-20 - changes: - - Fix toml loader. -v0.6.0: - date: 2015-05-19 - changes: - - Combine fallbacks and loaders into `extensions`. - - Provide implementation guidance. -v0.5.1: - date: 2015-03-01 - changes: - - Add support for CirruScript. -v0.5.0: - date: 2015-02-27 - changes: - - Refactor es6 support via Babel (formerly 6to5) -v0.4.3: - date: 2015-02-09 - changes: - - Switch support from typescript-require to typescript-register. -v0.4.2: - date: 2015-01-16 - changes: - - Add support for wisp. -v0.4.1: - date: 2015-01-10 - changes: - - Add support for 6to5 (es6) -v0.4.0: - date: 2014-01-09 - changes: - - Add support for fallback (legacy) modules - - Add support for module configurations -v0.3.10: - date: 2014-12-17 - changes: - - Add support for json5. -v0.3.9: - date: 2014-12-08 - changes: - - Add support for literate iced coffee. -v0.3.8: - date: 2014-11-20 - changes: - - Add support for [cjsx](https://github.com/jsdf/coffee-react). -v0.3.7: - date: 2014-09-08 - changes: - - Add support for [TypeScript](http://www.typescriptlang.org/). -v0.3.6: - date: 2014-08-25 - changes: - - Add support for coffee.md. -v0.3.5: - date: 2014-07-03 - changes: - - Add support for jsx. -v0.3.4: - date: 2014-06-27 - changes: - - Make .js first jsVariant entry. -v0.3.3: - date: 2014-06-02 - changes: - - Fix casing on livescript dependency. -v0.3.0: - date: 2014-04-20 - changes: - - Simplify loading of coffee-script and iced-coffee-script. -v0.2.0: - date: 2014-04-20 - changes: - - Move module loading into rechoir. -v0.1.0: - date: 2014-04-20 - changes: - - Initial public release. diff --git a/node_modules/shelljs/node_modules/interpret/LICENSE b/node_modules/shelljs/node_modules/interpret/LICENSE deleted file mode 100644 index a55f5b7..0000000 --- a/node_modules/shelljs/node_modules/interpret/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2014 Tyler Kellen - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/shelljs/node_modules/interpret/README.md b/node_modules/shelljs/node_modules/interpret/README.md deleted file mode 100644 index 34ce5b6..0000000 --- a/node_modules/shelljs/node_modules/interpret/README.md +++ /dev/null @@ -1,136 +0,0 @@ -# interpret -> A dictionary of file extensions and associated module loaders. - -[![NPM](https://nodei.co/npm/interpret.png)](https://nodei.co/npm/interpret/) - -## What is it -This is used by [Liftoff](http://github.com/tkellen/node-liftoff) to automatically require dependencies for configuration files, and by [rechoir](http://github.com/tkellen/node-rechoir) for registering module loaders. - -## API - -### extensions -Map file types to modules which provide a [require.extensions] loader. - -```js -{ - '.babel.js': [ - { - module: 'babel-register', - register: function (module) { - module({ - // register on .js extension due to https://github.com/joyent/node/blob/v0.12.0/lib/module.js#L353 - // which only captures the final extension (.babel.js -> .js) - extensions: '.js' - }); - } - }, - { - module: 'babel-core/register', - register: function (module) { - module({ - extensions: '.js' - }); - } - }, - { - module: 'babel/register', - register: function (module) { - module({ - extensions: '.js' - }); - } - } - ], - '.buble.js': [ - { - module: 'buble/register', - register: function (module) { - module({ - extensions: '.js' - }); - } - } - ], - '.cirru': 'cirru-script/lib/register', - '.cjsx': 'node-cjsx/register', - '.co': 'coco', - '.coffee': ['coffee-script/register', 'coffee-script'], - '.coffee.md': ['coffee-script/register', 'coffee-script'], - '.csv': 'require-csv', - '.eg': 'earlgrey/register', - '.iced': ['iced-coffee-script/register', 'iced-coffee-script'], - '.iced.md': 'iced-coffee-script/register', - '.ini': 'require-ini', - '.js': null, - '.json': null, - '.json5': 'json5/lib/require', - '.jsx': [ - { - module: 'babel-register', - register: function (module) { - module({ - extensions: '.jsx' - }); - } - }, - { - module: 'babel-core/register', - register: function (module) { - module({ - extensions: '.jsx' - }); - } - }, - { - module: 'babel/register', - register: function (module) { - module({ - extensions: '.jsx' - }); - }, - }, - { - module: 'node-jsx', - register: function (module) { - module.install({ - extension: '.jsx', - harmony: true - }); - } - } - ], - '.litcoffee': ['coffee-script/register', 'coffee-script'], - '.liticed': 'iced-coffee-script/register', - '.ls': ['livescript', 'LiveScript'], - '.node': null, - '.toml': { - module: 'toml-require', - register: function (module) { - module.install(); - } - }, - '.ts': ['ts-node/register', 'typescript-node/register', 'typescript-register', 'typescript-require'], - '.tsx': ['ts-node/register', 'typescript-node/register'], - '.wisp': 'wisp/engine/node', - '.xml': 'require-xml', - '.yaml': 'require-yaml', - '.yml': 'require-yaml' -}; -``` - -### jsVariants -Same as above, but only include the extensions which are javascript variants. - -## How to use it - -Consumers should use the exported `extensions` or `jsVariants` object to determine which module should be loaded for a given extension. If a matching extension is found, consumers should do the following: - -1. If the value is null, do nothing. - -2. If the value is a string, try to require it. - -3. If the value is an object, try to require the `module` property. If successful, the `register` property (a function) should be called with the module passed as the first argument. - -4. If the value is an array, iterate over it, attempting step #2 or #3 until one of the attempts does not throw. - -[require.extensions]: http://nodejs.org/api/globals.html#globals_require_extensions diff --git a/node_modules/shelljs/node_modules/interpret/index.js b/node_modules/shelljs/node_modules/interpret/index.js deleted file mode 100644 index db4cb94..0000000 --- a/node_modules/shelljs/node_modules/interpret/index.js +++ /dev/null @@ -1,132 +0,0 @@ -const extensions = { - '.babel.js': [ - { - module: 'babel-register', - register: function (module) { - module({ - // register on .js extension due to https://github.com/joyent/node/blob/v0.12.0/lib/module.js#L353 - // which only captures the final extension (.babel.js -> .js) - extensions: '.js' - }); - } - }, - { - module: 'babel-core/register', - register: function (module) { - module({ - extensions: '.js' - }); - } - }, - { - module: 'babel/register', - register: function (module) { - module({ - extensions: '.js' - }); - } - } - ], - '.buble.js': [ - { - module: 'buble/register', - register: function (module) { - module({ - extensions: '.js' - }); - } - } - ], - '.cirru': 'cirru-script/lib/register', - '.cjsx': 'node-cjsx/register', - '.co': 'coco', - '.coffee': ['coffee-script/register', 'coffee-script'], - '.coffee.md': ['coffee-script/register', 'coffee-script'], - '.csv': 'require-csv', - '.eg': 'earlgrey/register', - '.iced': ['iced-coffee-script/register', 'iced-coffee-script'], - '.iced.md': 'iced-coffee-script/register', - '.ini': 'require-ini', - '.js': null, - '.json': null, - '.json5': 'json5/lib/require', - '.jsx': [ - { - module: 'babel-register', - register: function (module) { - module({ - extensions: '.jsx' - }); - } - }, - { - module: 'babel-core/register', - register: function (module) { - module({ - extensions: '.jsx' - }); - } - }, - { - module: 'babel/register', - register: function (module) { - module({ - extensions: '.jsx' - }); - }, - }, - { - module: 'node-jsx', - register: function (module) { - module.install({ - extension: '.jsx', - harmony: true - }); - } - } - ], - '.litcoffee': ['coffee-script/register', 'coffee-script'], - '.liticed': 'iced-coffee-script/register', - '.ls': ['livescript', 'LiveScript'], - '.node': null, - '.toml': { - module: 'toml-require', - register: function (module) { - module.install(); - } - }, - '.ts': ['ts-node/register', 'typescript-node/register', 'typescript-register', 'typescript-require'], - '.tsx': ['ts-node/register', 'typescript-node/register'], - '.wisp': 'wisp/engine/node', - '.xml': 'require-xml', - '.yaml': 'require-yaml', - '.yml': 'require-yaml' -}; - -const jsVariantExtensions = [ - '.js', - '.babel.js', - '.buble.js', - '.cirru', - '.cjsx', - '.co', - '.coffee', - '.coffee.md', - '.eg', - '.iced', - '.iced.md', - '.jsx', - '.litcoffee', - '.liticed', - '.ls', - '.ts', - '.wisp' -]; - -module.exports = { - extensions: extensions, - jsVariants: jsVariantExtensions.reduce(function (result, ext) { - result[ext] = extensions[ext]; - return result; - }, {}) -}; diff --git a/node_modules/shelljs/node_modules/interpret/package.json b/node_modules/shelljs/node_modules/interpret/package.json deleted file mode 100644 index c23c9ea..0000000 --- a/node_modules/shelljs/node_modules/interpret/package.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "interpret", - "description": "A dictionary of file extensions and associated module loaders.", - "version": "1.0.1", - "homepage": "https://github.com/tkellen/node-interpret", - "author": { - "name": "Tyler Kellen", - "url": "http://goingslowly.com/" - }, - "repository": { - "type": "git", - "url": "git://github.com/tkellen/node-interpret.git" - }, - "bugs": { - "url": "https://github.com/tkellen/node-interpret/issues" - }, - "license": "MIT", - "main": "index.js", - "keywords": [ - "cirru-script", - "cjsx", - "co", - "coco", - "coffee-script", - "coffee", - "coffee.md", - "csv", - "earlgrey", - "es", - "es6", - "iced", - "iced.md", - "iced-coffee-script", - "ini", - "js", - "json", - "json5", - "jsx", - "react", - "litcoffee", - "liticed", - "ls", - "livescript", - "toml", - "ts", - "typescript", - "wisp", - "xml", - "yaml", - "yml" - ], - "gitHead": "80e9d49ece362c75e697bc7487186761efd77a6f", - "_id": "interpret@1.0.1", - "scripts": {}, - "_shasum": "d579fb7f693b858004947af39fa0db49f795602c", - "_from": "interpret@>=1.0.0 <2.0.0", - "_npmVersion": "3.6.0", - "_nodeVersion": "5.7.0", - "_npmUser": { - "name": "tkellen", - "email": "tyler@sleekcode.net" - }, - "maintainers": [ - { - "name": "tkellen", - "email": "tyler@sleekcode.net" - }, - { - "name": "phated", - "email": "blaine@iceddev.com" - } - ], - "dist": { - "shasum": "d579fb7f693b858004947af39fa0db49f795602c", - "tarball": "https://registry.npmjs.org/interpret/-/interpret-1.0.1.tgz" - }, - "_npmOperationalInternal": { - "host": "packages-12-west.internal.npmjs.com", - "tmp": "tmp/interpret-1.0.1.tgz_1462139669981_0.06998275523073971" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.1.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/shelljs/node_modules/rechoir/.npmignore b/node_modules/shelljs/node_modules/rechoir/.npmignore deleted file mode 100644 index 9daeafb..0000000 --- a/node_modules/shelljs/node_modules/rechoir/.npmignore +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/node_modules/shelljs/node_modules/rechoir/.travis.yml b/node_modules/shelljs/node_modules/rechoir/.travis.yml deleted file mode 100644 index 57e9fda..0000000 --- a/node_modules/shelljs/node_modules/rechoir/.travis.yml +++ /dev/null @@ -1,24 +0,0 @@ -sudo: false -language: node_js -node_js: - - "0.10" - - "0.12" -env: - global: - - REMOVE_DEPS="" - matrix: - - "CUSTOM_DEPS=coffee-script@~1.3" - - "CUSTOM_DEPS=coffee-script@~1.5" - - "CUSTOM_DEPS=coffee-script@~1.7" - - "CUSTOM_DEPS=coffee-script@latest" - - "CUSTOM_DEPS=iced-coffee-script@1.6.3-j" - - "CUSTOM_DEPS=iced-coffee-script@latest" - - "CUSTOM_DEPS=LiveScript@1.3.1 REMOVE_DEPS=livescript" - - "CUSTOM_DEPS=typescript-require REMOVE_DEPS=typescript-register" -matrix: - fast_finish: true -before_install: - - "npm install -g npm" # needs the newest version of npm -before_script: - - "[ \"${REMOVE_DEPS}\" == \"\" ] || npm rm $REMOVE_DEPS" - - "npm install $CUSTOM_DEPS" # install a specific version of dependencies diff --git a/node_modules/shelljs/node_modules/rechoir/CHANGELOG b/node_modules/shelljs/node_modules/rechoir/CHANGELOG deleted file mode 100644 index e10327b..0000000 --- a/node_modules/shelljs/node_modules/rechoir/CHANGELOG +++ /dev/null @@ -1,38 +0,0 @@ -v0.6.2: - date: 2015-07-22 - changes: - - Return `undefined` when an unknown extension is provided to prepare and - the `nothrow` option is specified. -v0.6.1: - date: 2015-05-22 - changes: - - Add option for not throwing. -v0.6.0: - date: 2015-05-20 - changes: - - Include module name when prepare is successful. -v0.5.0: - date: 2015-05-20 - changes: - - Overhaul to support interpret 0.6.0. -v0.3.0: - date: 2015-01-10 - changes: - - Breaking: `load` method removed. - - Improved extension recognition. - - No longer fails upon dots in filenames. - - Support confuration objects. - - Support and test ES6. - - Support legacy module loading. -v0.2.2: - date: 2014-12-17 - changes: - - Expose interpret. -v0.2.0: - date: 2014-04-20 - changes: - - Simplify loading of coffee-script and iced-coffee-script. -v0.1.0: - date: 2014-04-20 - changes: - - Initial public release. diff --git a/node_modules/shelljs/node_modules/rechoir/LICENSE b/node_modules/shelljs/node_modules/rechoir/LICENSE deleted file mode 100644 index f467993..0000000 --- a/node_modules/shelljs/node_modules/rechoir/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2015 Tyler Kellen - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/shelljs/node_modules/rechoir/README.md b/node_modules/shelljs/node_modules/rechoir/README.md deleted file mode 100644 index 32280c0..0000000 --- a/node_modules/shelljs/node_modules/rechoir/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# rechoir [![Build Status](https://secure.travis-ci.org/tkellen/js-rechoir.png)](http://travis-ci.org/tkellen/js-rechoir) -> Require any supported file as a node module. - -[![NPM](https://nodei.co/npm/rechoir.png)](https://nodei.co/npm/rechoir/) - -## What is it? -This module, in conjunction with [interpret]-like objects can register any file type the npm ecosystem has a module loader for. This library is a dependency of [Liftoff]. - -## API - -### prepare(config, filepath, requireFrom) -Look for a module loader associated with the provided file and attempt require it. If necessary, run any setup required to inject it into [require.extensions](http://nodejs.org/api/globals.html#globals_require_extensions). - -`config` An [interpret]-like configuration object. - -`filepath` A file whose type you'd like to register a module loader for. - -`requireFrom` An optional path to start searching for the module required to load the requested file. Defaults to the directory of `filepath`. - -If calling this method is successful (aka: it doesn't throw), you can now require files of the type you requested natively. - -An error with a `failures` property will be thrown if the module loader(s) configured for a given extension cannot be registered. - -If a loader is already registered, this will simply return `true`. - -**Note:** While rechoir will automatically load and register transpilers like `coffee-script`, you must provide a local installation. The transpilers are **not** bundled with this module. - -#### Usage -```js -const config = require('interpret').extensions; -const rechoir = require('rechoir'); -rechoir.prepare(config, './test/fixtures/test.coffee'); -rechoir.prepare(config, './test/fixtures/test.csv'); -rechoir.prepare(config, './test/fixtures/test.toml'); - -console.log(require('./test/fixtures/test.coffee')); -console.log(require('./test/fixtures/test.csv')); -console.log(require('./test/fixtures/test.toml')); -``` - -[interpret]: http://github.com/tkellen/js-interpret -[Liftoff]: http://github.com/tkellen/js-liftoff diff --git a/node_modules/shelljs/node_modules/rechoir/index.js b/node_modules/shelljs/node_modules/rechoir/index.js deleted file mode 100644 index 0c36d05..0000000 --- a/node_modules/shelljs/node_modules/rechoir/index.js +++ /dev/null @@ -1,59 +0,0 @@ -const path = require('path'); - -const extension = require('./lib/extension'); -const normalize = require('./lib/normalize'); -const register = require('./lib/register'); - -exports.prepare = function (extensions, filepath, cwd, nothrow) { - var option, attempt; - var attempts = []; - var err; - var onlyErrors = false; - var ext = extension(filepath); - if (Object.keys(require.extensions).indexOf(ext) !== -1) { - return true; - } - var config = normalize(extensions[ext]); - if (!config) { - if (nothrow) { - return; - } else { - throw new Error('No module loader found for "'+ext+'".'); - } - } - if (!cwd) { - cwd = path.dirname(path.resolve(filepath)); - } - if (!Array.isArray(config)) { - config = [config]; - } - for (var i in config) { - option = config[i]; - attempt = register(cwd, option.module, option.register); - error = (attempt instanceof Error) ? attempt : null; - if (error) { - attempt = null; - } - attempts.push({ - moduleName: option.module, - module: attempt, - error: error - }); - if (!error) { - onlyErrors = false; - break; - } else { - onlyErrors = true; - } - } - if (onlyErrors) { - err = new Error('Unable to use specified module loaders for "'+ext+'".'); - err.failures = attempts; - if (nothrow) { - return err; - } else { - throw err; - } - } - return attempts; -}; diff --git a/node_modules/shelljs/node_modules/rechoir/lib/extension.js b/node_modules/shelljs/node_modules/rechoir/lib/extension.js deleted file mode 100644 index 60f19da..0000000 --- a/node_modules/shelljs/node_modules/rechoir/lib/extension.js +++ /dev/null @@ -1,11 +0,0 @@ -const path = require('path'); - -const EXTRE = /^[.]?[^.]+([.].*)$/; - -module.exports = function (input) { - var extension = EXTRE.exec(path.basename(input)); - if (!extension) { - return; - } - return extension[1]; -}; diff --git a/node_modules/shelljs/node_modules/rechoir/lib/normalize.js b/node_modules/shelljs/node_modules/rechoir/lib/normalize.js deleted file mode 100644 index 0da5e58..0000000 --- a/node_modules/shelljs/node_modules/rechoir/lib/normalize.js +++ /dev/null @@ -1,15 +0,0 @@ -function normalizer (config) { - if (typeof config === 'string') { - return { - module: config - } - } - return config; -}; - -module.exports = function (config) { - if (Array.isArray(config)) { - return config.map(normalizer); - } - return normalizer(config); -}; diff --git a/node_modules/shelljs/node_modules/rechoir/lib/register.js b/node_modules/shelljs/node_modules/rechoir/lib/register.js deleted file mode 100644 index 20e8ca7..0000000 --- a/node_modules/shelljs/node_modules/rechoir/lib/register.js +++ /dev/null @@ -1,15 +0,0 @@ -const path = require('path'); -const resolve = require('resolve'); - -module.exports = function (cwd, moduleName, register) { - try { - var modulePath = resolve.sync(moduleName, {basedir: cwd}); - var result = require(modulePath); - if (typeof register === 'function') { - register(result); - } - } catch (e) { - result = e; - } - return result; -}; diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/.travis.yml b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/.travis.yml deleted file mode 100644 index 895dbd3..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.8 diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/LICENSE b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/LICENSE deleted file mode 100644 index ee27ba4..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -This software is released under the MIT license: - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/example/async.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/example/async.js deleted file mode 100644 index 6624ff7..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/example/async.js +++ /dev/null @@ -1,5 +0,0 @@ -var resolve = require('../'); -resolve('tap', { basedir: __dirname }, function (err, res) { - if (err) console.error(err) - else console.log(res) -}); diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/example/sync.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/example/sync.js deleted file mode 100644 index 54b2cc1..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/example/sync.js +++ /dev/null @@ -1,3 +0,0 @@ -var resolve = require('../'); -var res = resolve.sync('tap', { basedir: __dirname }); -console.log(res); diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/index.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/index.js deleted file mode 100644 index 51f194b..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/index.js +++ /dev/null @@ -1,5 +0,0 @@ -var core = require('./lib/core'); -exports = module.exports = require('./lib/async'); -exports.core = core; -exports.isCore = function (x) { return core[x] }; -exports.sync = require('./lib/sync'); diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/lib/async.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/lib/async.js deleted file mode 100644 index 0f0eeca..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/lib/async.js +++ /dev/null @@ -1,192 +0,0 @@ -var core = require('./core'); -var fs = require('fs'); -var path = require('path'); -var caller = require('./caller.js'); -var nodeModulesPaths = require('./node-modules-paths.js'); -var splitRe = process.platform === 'win32' ? /[\/\\]/ : /\//; - -module.exports = function resolve (x, opts, cb) { - if (typeof opts === 'function') { - cb = opts; - opts = {}; - } - if (!opts) opts = {}; - if (typeof x !== 'string') { - return process.nextTick(function () { - cb(new Error('path must be a string')); - }); - } - - var isFile = opts.isFile || function (file, cb) { - fs.stat(file, function (err, stat) { - if (err && err.code === 'ENOENT') cb(null, false) - else if (err) cb(err) - else cb(null, stat.isFile() || stat.isFIFO()) - }); - }; - var readFile = opts.readFile || fs.readFile; - - var extensions = opts.extensions || [ '.js' ]; - var y = opts.basedir || path.dirname(caller()); - - opts.paths = opts.paths || []; - - if (/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[\\\/])/.test(x)) { - var res = path.resolve(y, x); - if (x === '..') res += '/'; - if (/\/$/.test(x) && res === y) { - loadAsDirectory(res, opts.package, onfile); - } - else loadAsFile(res, opts.package, onfile); - } - else loadNodeModules(x, y, function (err, n, pkg) { - if (err) cb(err) - else if (n) cb(null, n, pkg) - else if (core[x]) return cb(null, x); - else cb(new Error("Cannot find module '" + x + "' from '" + y + "'")) - }); - - function onfile (err, m, pkg) { - if (err) cb(err) - else if (m) cb(null, m, pkg) - else loadAsDirectory(res, function (err, d, pkg) { - if (err) cb(err) - else if (d) cb(null, d, pkg) - else cb(new Error("Cannot find module '" + x + "' from '" + y + "'")) - }) - } - - function loadAsFile (x, pkg, cb) { - if (typeof pkg === 'function') { - cb = pkg; - pkg = undefined; - } - - var exts = [''].concat(extensions); - load(exts, x, pkg) - - function load (exts, x, pkg) { - if (exts.length === 0) return cb(null, undefined, pkg); - var file = x + exts[0]; - - if (pkg) onpkg(null, pkg) - else loadpkg(path.dirname(file), onpkg); - - function onpkg (err, pkg_, dir) { - pkg = pkg_; - if (err) return cb(err) - if (dir && pkg && opts.pathFilter) { - var rfile = path.relative(dir, file); - var rel = rfile.slice(0, rfile.length - exts[0].length); - var r = opts.pathFilter(pkg, x, rel); - if (r) return load( - [''].concat(extensions.slice()), - path.resolve(dir, r), - pkg - ); - } - isFile(file, onex); - } - function onex (err, ex) { - if (err) cb(err) - else if (!ex) load(exts.slice(1), x, pkg) - else cb(null, file, pkg) - } - } - } - - function loadpkg (dir, cb) { - if (dir === '' || dir === '/') return cb(null); - if (process.platform === 'win32' && /^\w:[\\\/]*$/.test(dir)) { - return cb(null); - } - if (/[\\\/]node_modules[\\\/]*$/.test(dir)) return cb(null); - - var pkgfile = path.join(dir, 'package.json'); - isFile(pkgfile, function (err, ex) { - // on err, ex is false - if (!ex) return loadpkg( - path.dirname(dir), cb - ); - - readFile(pkgfile, function (err, body) { - if (err) cb(err); - try { var pkg = JSON.parse(body) } - catch (err) {} - - if (pkg && opts.packageFilter) { - pkg = opts.packageFilter(pkg, pkgfile); - } - cb(null, pkg, dir); - }); - }); - } - - function loadAsDirectory (x, fpkg, cb) { - if (typeof fpkg === 'function') { - cb = fpkg; - fpkg = opts.package; - } - - var pkgfile = path.join(x, '/package.json'); - isFile(pkgfile, function (err, ex) { - if (err) return cb(err); - if (!ex) return loadAsFile(path.join(x, '/index'), fpkg, cb); - - readFile(pkgfile, function (err, body) { - if (err) return cb(err); - try { - var pkg = JSON.parse(body); - } - catch (err) {} - - if (opts.packageFilter) { - pkg = opts.packageFilter(pkg, pkgfile); - } - - if (pkg.main) { - if (pkg.main === '.' || pkg.main === './'){ - pkg.main = 'index' - } - loadAsFile(path.resolve(x, pkg.main), pkg, function (err, m, pkg) { - if (err) return cb(err); - if (m) return cb(null, m, pkg); - if (!pkg) return loadAsFile(path.join(x, '/index'), pkg, cb); - - var dir = path.resolve(x, pkg.main); - loadAsDirectory(dir, pkg, function (err, n, pkg) { - if (err) return cb(err); - if (n) return cb(null, n, pkg); - loadAsFile(path.join(x, '/index'), pkg, cb); - }); - }); - return; - } - - loadAsFile(path.join(x, '/index'), pkg, cb); - }); - }); - } - - function loadNodeModules (x, start, cb) { - (function process (dirs) { - if (dirs.length === 0) return cb(null, undefined); - var dir = dirs[0]; - - var file = path.join(dir, '/', x); - loadAsFile(file, undefined, onfile); - - function onfile (err, m, pkg) { - if (err) return cb(err); - if (m) return cb(null, m, pkg); - loadAsDirectory(path.join(dir, '/', x), undefined, ondir); - } - - function ondir (err, n, pkg) { - if (err) return cb(err); - if (n) return cb(null, n, pkg); - process(dirs.slice(1)); - } - })(nodeModulesPaths(start, opts)); - } -}; diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/lib/caller.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/lib/caller.js deleted file mode 100644 index 5536549..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/lib/caller.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = function () { - // see https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi - var origPrepareStackTrace = Error.prepareStackTrace; - Error.prepareStackTrace = function (_, stack) { return stack }; - var stack = (new Error()).stack; - Error.prepareStackTrace = origPrepareStackTrace; - return stack[2].getFileName(); -}; diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/lib/core.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/lib/core.js deleted file mode 100644 index ea4a6c8..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/lib/core.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = require('./core.json').reduce(function (acc, x) { - acc[x] = true; - return acc; -}, {}); diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/lib/core.json b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/lib/core.json deleted file mode 100644 index 28560f7..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/lib/core.json +++ /dev/null @@ -1,38 +0,0 @@ -[ - "assert", - "buffer_ieee754", - "buffer", - "child_process", - "cluster", - "console", - "constants", - "crypto", - "_debugger", - "dgram", - "dns", - "domain", - "events", - "freelist", - "fs", - "http", - "https", - "_linklist", - "module", - "net", - "os", - "path", - "punycode", - "querystring", - "readline", - "repl", - "stream", - "string_decoder", - "sys", - "timers", - "tls", - "tty", - "url", - "util", - "vm", - "zlib" -] diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/lib/node-modules-paths.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/lib/node-modules-paths.js deleted file mode 100644 index ce0a0d9..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/lib/node-modules-paths.js +++ /dev/null @@ -1,38 +0,0 @@ -var path = require('path'); - -module.exports = function (start, opts) { - var modules = opts.moduleDirectory - ? [].concat(opts.moduleDirectory) - : ['node_modules'] - ; - - // ensure that `start` is an absolute path at this point, - // resolving against the process' current working directory - start = path.resolve(start); - - var prefix = '/'; - if (/^([A-Za-z]:)/.test(start)) { - prefix = ''; - } else if (/^\\\\/.test(start)) { - prefix = '\\\\'; - } - - var splitRe = process.platform === 'win32' ? /[\/\\]/ : /\/+/; - - var parts = start.split(splitRe); - - var dirs = []; - for (var i = parts.length - 1; i >= 0; i--) { - if (modules.indexOf(parts[i]) !== -1) continue; - dirs = dirs.concat(modules.map(function(module_dir) { - return prefix + path.join( - path.join.apply(path, parts.slice(0, i + 1)), - module_dir - ); - })); - } - if (process.platform === 'win32'){ - dirs[dirs.length-1] = dirs[dirs.length-1].replace(":", ":\\"); - } - return dirs.concat(opts.paths); -} diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/lib/sync.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/lib/sync.js deleted file mode 100644 index ef91edd..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/lib/sync.js +++ /dev/null @@ -1,81 +0,0 @@ -var core = require('./core'); -var fs = require('fs'); -var path = require('path'); -var caller = require('./caller.js'); -var nodeModulesPaths = require('./node-modules-paths.js'); - -module.exports = function (x, opts) { - if (!opts) opts = {}; - var isFile = opts.isFile || function (file) { - try { var stat = fs.statSync(file) } - catch (err) { if (err && err.code === 'ENOENT') return false } - return stat.isFile() || stat.isFIFO(); - }; - var readFileSync = opts.readFileSync || fs.readFileSync; - - var extensions = opts.extensions || [ '.js' ]; - var y = opts.basedir || path.dirname(caller()); - - opts.paths = opts.paths || []; - - if (/^(?:\.\.?(?:\/|$)|\/|([A-Za-z]:)?[\\\/])/.test(x)) { - var res = path.resolve(y, x); - if (x === '..') res += '/'; - var m = loadAsFileSync(res) || loadAsDirectorySync(res); - if (m) return m; - } else { - var n = loadNodeModulesSync(x, y); - if (n) return n; - } - - if (core[x]) return x; - - throw new Error("Cannot find module '" + x + "' from '" + y + "'"); - - function loadAsFileSync (x) { - if (isFile(x)) { - return x; - } - - for (var i = 0; i < extensions.length; i++) { - var file = x + extensions[i]; - if (isFile(file)) { - return file; - } - } - } - - function loadAsDirectorySync (x) { - var pkgfile = path.join(x, '/package.json'); - if (isFile(pkgfile)) { - var body = readFileSync(pkgfile, 'utf8'); - try { - var pkg = JSON.parse(body); - if (opts.packageFilter) { - pkg = opts.packageFilter(pkg, x); - } - - if (pkg.main) { - var m = loadAsFileSync(path.resolve(x, pkg.main)); - if (m) return m; - var n = loadAsDirectorySync(path.resolve(x, pkg.main)); - if (n) return n; - } - } - catch (err) {} - } - - return loadAsFileSync(path.join( x, '/index')); - } - - function loadNodeModulesSync (x, start) { - var dirs = nodeModulesPaths(start, opts); - for (var i = 0; i < dirs.length; i++) { - var dir = dirs[i]; - var m = loadAsFileSync(path.join( dir, '/', x)); - if (m) return m; - var n = loadAsDirectorySync(path.join( dir, '/', x )); - if (n) return n; - } - } -}; diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/package.json b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/package.json deleted file mode 100644 index bb89a12..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/package.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "resolve", - "description": "resolve like require.resolve() on behalf of files asynchronously and synchronously", - "version": "1.1.7", - "repository": { - "type": "git", - "url": "git://github.com/substack/node-resolve.git" - }, - "main": "index.js", - "keywords": [ - "resolve", - "require", - "node", - "module" - ], - "scripts": { - "test": "tape test/*.js" - }, - "devDependencies": { - "tape": "^3.5.0", - "tap": "0.4.13" - }, - "license": "MIT", - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "gitHead": "bb37f0d4400e4d7835375be4bd3ad1264bac3689", - "bugs": { - "url": "https://github.com/substack/node-resolve/issues" - }, - "homepage": "https://github.com/substack/node-resolve#readme", - "_id": "resolve@1.1.7", - "_shasum": "203114d82ad2c5ed9e8e0411b3932875e889e97b", - "_from": "resolve@>=1.1.6 <2.0.0", - "_npmVersion": "3.4.1", - "_nodeVersion": "4.2.1", - "_npmUser": { - "name": "substack", - "email": "substack@gmail.com" - }, - "dist": { - "shasum": "203114d82ad2c5ed9e8e0411b3932875e889e97b", - "tarball": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" - }, - "maintainers": [ - { - "name": "substack", - "email": "mail@substack.net" - } - ], - "directories": {}, - "_resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/readme.markdown b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/readme.markdown deleted file mode 100644 index 4fab9b0..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/readme.markdown +++ /dev/null @@ -1,148 +0,0 @@ -# resolve - -implements the [node `require.resolve()` -algorithm](http://nodejs.org/docs/v0.4.8/api/all.html#all_Together...) -such that you can `require.resolve()` on behalf of a file asynchronously and -synchronously - -[![build status](https://secure.travis-ci.org/substack/node-resolve.png)](http://travis-ci.org/substack/node-resolve) - -# example - -asynchronously resolve: - -``` js -var resolve = require('resolve'); -resolve('tap', { basedir: __dirname }, function (err, res) { - if (err) console.error(err) - else console.log(res) -}); -``` - -``` -$ node example/async.js -/home/substack/projects/node-resolve/node_modules/tap/lib/main.js -``` - -synchronously resolve: - -``` js -var resolve = require('resolve'); -var res = resolve.sync('tap', { basedir: __dirname }); -console.log(res); -``` - -``` -$ node example/sync.js -/home/substack/projects/node-resolve/node_modules/tap/lib/main.js -``` - -# methods - -``` js -var resolve = require('resolve') -``` - -## resolve(id, opts={}, cb) - -Asynchronously resolve the module path string `id` into `cb(err, res [, pkg])`, where `pkg` (if defined) is the data from `package.json`. - -options are: - -* opts.basedir - directory to begin resolving from - -* opts.package - `package.json` data applicable to the module being loaded - -* opts.extensions - array of file extensions to search in order - -* opts.readFile - how to read files asynchronously - -* opts.isFile - function to asynchronously test whether a file exists - -* opts.packageFilter - transform the parsed package.json contents before looking -at the "main" field - -* opts.pathFilter(pkg, path, relativePath) - transform a path within a package - * pkg - package data - * path - the path being resolved - * relativePath - the path relative from the package.json location - * returns - a relative path that will be joined from the package.json location - -* opts.paths - require.paths array to use if nothing is found on the normal -node_modules recursive walk (probably don't use this) - -* opts.moduleDirectory - directory (or directories) in which to recursively look for modules. default: `"node_modules"` - -default `opts` values: - -``` javascript -{ - paths: [], - basedir: __dirname, - extensions: [ '.js' ], - readFile: fs.readFile, - isFile: function (file, cb) { - fs.stat(file, function (err, stat) { - if (err && err.code === 'ENOENT') cb(null, false) - else if (err) cb(err) - else cb(null, stat.isFile()) - }); - }, - moduleDirectory: 'node_modules' -} -``` - -## resolve.sync(id, opts) - -Synchronously resolve the module path string `id`, returning the result and -throwing an error when `id` can't be resolved. - -options are: - -* opts.basedir - directory to begin resolving from - -* opts.extensions - array of file extensions to search in order - -* opts.readFile - how to read files synchronously - -* opts.isFile - function to synchronously test whether a file exists - -* `opts.packageFilter(pkg, pkgfile)` - transform the parsed package.json -* contents before looking at the "main" field - -* opts.paths - require.paths array to use if nothing is found on the normal -node_modules recursive walk (probably don't use this) - -* opts.moduleDirectory - directory (or directories) in which to recursively look for modules. default: `"node_modules"` - -default `opts` values: - -``` javascript -{ - paths: [], - basedir: __dirname, - extensions: [ '.js' ], - readFileSync: fs.readFileSync, - isFile: function (file) { - try { return fs.statSync(file).isFile() } - catch (e) { return false } - }, - moduleDirectory: 'node_modules' -} -```` - -## resolve.isCore(pkg) - -Return whether a package is in core. - -# install - -With [npm](https://npmjs.org) do: - -``` -npm install resolve -``` - -# license - -MIT diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/core.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/core.js deleted file mode 100644 index 4a56682..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/core.js +++ /dev/null @@ -1,12 +0,0 @@ -var test = require('tape'); -var resolve = require('../'); - -test('core modules', function (t) { - t.ok(resolve.isCore('fs')); - t.ok(resolve.isCore('net')); - t.ok(resolve.isCore('http')); - - t.ok(!resolve.isCore('seq')); - t.ok(!resolve.isCore('../')); - t.end(); -}); diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/dotdot.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/dotdot.js deleted file mode 100644 index b876772..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/dotdot.js +++ /dev/null @@ -1,29 +0,0 @@ -var path = require('path'); -var test = require('tape'); -var resolve = require('../'); - -test('dotdot', function (t) { - t.plan(4); - var dir = __dirname + '/dotdot/abc'; - - resolve('..', { basedir : dir }, function (err, res, pkg) { - t.ifError(err); - t.equal(res, __dirname + '/dotdot/index.js'); - }); - - resolve('.', { basedir : dir }, function (err, res, pkg) { - t.ifError(err); - t.equal(res, dir + '/index.js'); - }); -}); - -test('dotdot sync', function (t) { - t.plan(2); - var dir = __dirname + '/dotdot/abc'; - - var a = resolve.sync('..', { basedir : dir }); - t.equal(a, __dirname + '/dotdot/index.js'); - - var b = resolve.sync('.', { basedir : dir }); - t.equal(b, dir + '/index.js'); -}); diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/dotdot/abc/index.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/dotdot/abc/index.js deleted file mode 100644 index 67f2534..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/dotdot/abc/index.js +++ /dev/null @@ -1,2 +0,0 @@ -var x = require('..'); -console.log(x); diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/dotdot/index.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/dotdot/index.js deleted file mode 100644 index afec736..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/dotdot/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = 'whatever' diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/faulty_basedir.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/faulty_basedir.js deleted file mode 100644 index 2440818..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/faulty_basedir.js +++ /dev/null @@ -1,17 +0,0 @@ -var path = require('path'); -var test = require('tape'); -var resolve = require('../'); - -// not sure what's up with this test anymore -if (process.platform !== 'win32') return; - -test('faulty basedir must produce error in windows', function (t) { - t.plan(1); - - var resolverDir = 'C:\\a\\b\\c\\d'; - - resolve('tape/lib/test.js', { basedir : resolverDir }, function (err, res, pkg) { - t.equal(true, !!err); - }); - -}); diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/filter.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/filter.js deleted file mode 100644 index 07c38f3..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/filter.js +++ /dev/null @@ -1,18 +0,0 @@ -var test = require('tape'); -var resolve = require('../'); - -test('filter', function (t) { - t.plan(2); - var dir = __dirname + '/resolver'; - resolve('./baz', { - basedir : dir, - packageFilter : function (pkg) { - pkg.main = 'doom'; - return pkg; - } - }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/baz/doom.js'); - t.equal(pkg.main, 'doom'); - }); -}); diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/filter_sync.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/filter_sync.js deleted file mode 100644 index 3f89b79..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/filter_sync.js +++ /dev/null @@ -1,15 +0,0 @@ -var test = require('tape'); -var resolve = require('../'); - -test('filter', function (t) { - var dir = __dirname + '/resolver'; - var res = resolve.sync('./baz', { - basedir : dir, - packageFilter : function (pkg) { - pkg.main = 'doom' - return pkg; - } - }); - t.equal(res, dir + '/baz/doom.js'); - t.end(); -}); diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/mock.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/mock.js deleted file mode 100644 index 1cf3b12..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/mock.js +++ /dev/null @@ -1,142 +0,0 @@ -var test = require('tape'); -var resolve = require('../'); - -test('mock', function (t) { - t.plan(6); - - var files = { - '/foo/bar/baz.js' : 'beep' - }; - - function opts (basedir) { - return { - basedir : basedir, - isFile : function (file, cb) { - cb(null, files.hasOwnProperty(file)); - }, - readFile : function (file, cb) { - cb(null, files[file]); - } - } - } - - resolve('./baz', opts('/foo/bar'), function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, '/foo/bar/baz.js'); - t.equal(pkg, undefined); - }); - - resolve('./baz.js', opts('/foo/bar'), function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, '/foo/bar/baz.js'); - t.equal(pkg, undefined); - }); - - resolve('baz', opts('/foo/bar'), function (err, res) { - t.equal(err.message, "Cannot find module 'baz' from '/foo/bar'"); - }); - - resolve('../baz', opts('/foo/bar'), function (err, res) { - t.equal(err.message, "Cannot find module '../baz' from '/foo/bar'"); - }); -}); - -test('mock from package', function (t) { - t.plan(6); - - var files = { - '/foo/bar/baz.js' : 'beep' - }; - - function opts (basedir) { - return { - basedir : basedir, - package : { main: 'bar' }, - isFile : function (file, cb) { - cb(null, files.hasOwnProperty(file)); - }, - readFile : function (file, cb) { - cb(null, files[file]); - } - } - } - - resolve('./baz', opts('/foo/bar'), function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, '/foo/bar/baz.js'); - t.equal(pkg.main, 'bar'); - }); - - resolve('./baz.js', opts('/foo/bar'), function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, '/foo/bar/baz.js'); - t.equal(pkg.main, 'bar'); - }); - - resolve('baz', opts('/foo/bar'), function (err, res) { - t.equal(err.message, "Cannot find module 'baz' from '/foo/bar'"); - }); - - resolve('../baz', opts('/foo/bar'), function (err, res) { - t.equal(err.message, "Cannot find module '../baz' from '/foo/bar'"); - }); -}); - -test('mock package', function (t) { - t.plan(2); - - var files = { - '/foo/node_modules/bar/baz.js' : 'beep', - '/foo/node_modules/bar/package.json' : JSON.stringify({ - main : './baz.js' - }) - }; - - function opts (basedir) { - return { - basedir : basedir, - isFile : function (file, cb) { - cb(null, files.hasOwnProperty(file)); - }, - readFile : function (file, cb) { - cb(null, files[file]); - } - } - } - - resolve('bar', opts('/foo'), function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, '/foo/node_modules/bar/baz.js'); - t.equal(pkg.main, './baz.js'); - }); -}); - -test('mock package from package', function (t) { - t.plan(2); - - var files = { - '/foo/node_modules/bar/baz.js' : 'beep', - '/foo/node_modules/bar/package.json' : JSON.stringify({ - main : './baz.js' - }) - }; - - function opts (basedir) { - return { - basedir : basedir, - package : { main: 'bar' }, - isFile : function (file, cb) { - cb(null, files.hasOwnProperty(file)); - }, - readFile : function (file, cb) { - cb(null, files[file]); - } - } - } - - resolve('bar', opts('/foo'), function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, '/foo/node_modules/bar/baz.js'); - t.equal(pkg.main, './baz.js'); - }); -}); diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/mock_sync.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/mock_sync.js deleted file mode 100644 index abfd289..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/mock_sync.js +++ /dev/null @@ -1,68 +0,0 @@ -var test = require('tape'); -var resolve = require('../'); - -test('mock', function (t) { - t.plan(4); - - var files = { - '/foo/bar/baz.js' : 'beep' - }; - - function opts (basedir) { - return { - basedir : basedir, - isFile : function (file) { - return files.hasOwnProperty(file) - }, - readFileSync : function (file) { - return files[file] - } - } - } - - t.equal( - resolve.sync('./baz', opts('/foo/bar')), - '/foo/bar/baz.js' - ); - - t.equal( - resolve.sync('./baz.js', opts('/foo/bar')), - '/foo/bar/baz.js' - ); - - t.throws(function () { - resolve.sync('baz', opts('/foo/bar')); - }); - - t.throws(function () { - resolve.sync('../baz', opts('/foo/bar')); - }); -}); - -test('mock package', function (t) { - t.plan(1); - - var files = { - '/foo/node_modules/bar/baz.js' : 'beep', - '/foo/node_modules/bar/package.json' : JSON.stringify({ - main : './baz.js' - }) - }; - - function opts (basedir) { - return { - basedir : basedir, - isFile : function (file) { - return files.hasOwnProperty(file) - }, - readFileSync : function (file) { - return files[file] - } - } - } - - t.equal( - resolve.sync('bar', opts('/foo')), - '/foo/node_modules/bar/baz.js' - ); -}); diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/module_dir.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/module_dir.js deleted file mode 100644 index 06395d8..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/module_dir.js +++ /dev/null @@ -1,56 +0,0 @@ -var path = require('path'); -var test = require('tape'); -var resolve = require('../'); - -test('moduleDirectory strings', function (t) { - t.plan(4); - var dir = __dirname + '/module_dir'; - var xopts = { - basedir : dir, - moduleDirectory: 'xmodules' - }; - resolve('aaa', xopts, function (err, res, pkg) { - t.ifError(err); - t.equal(res, dir + '/xmodules/aaa/index.js'); - }); - - var yopts = { - basedir : dir, - moduleDirectory: 'ymodules' - }; - resolve('aaa', yopts, function (err, res, pkg) { - t.ifError(err); - t.equal(res, dir + '/ymodules/aaa/index.js'); - }); -}); - -test('moduleDirectory array', function (t) { - t.plan(6); - var dir = __dirname + '/module_dir'; - var aopts = { - basedir : dir, - moduleDirectory: [ 'xmodules', 'ymodules', 'zmodules' ] - }; - resolve('aaa', aopts, function (err, res, pkg) { - t.ifError(err); - t.equal(res, dir + '/xmodules/aaa/index.js'); - }); - - var bopts = { - basedir : dir, - moduleDirectory: [ 'zmodules', 'ymodules', 'xmodules' ] - }; - resolve('aaa', bopts, function (err, res, pkg) { - t.ifError(err); - t.equal(res, dir + '/ymodules/aaa/index.js'); - }); - - var copts = { - basedir : dir, - moduleDirectory: [ 'xmodules', 'ymodules', 'zmodules' ] - }; - resolve('bbb', copts, function (err, res, pkg) { - t.ifError(err); - t.equal(res, dir + '/zmodules/bbb/main.js'); - }); -}); diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/module_dir/xmodules/aaa/index.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/module_dir/xmodules/aaa/index.js deleted file mode 100644 index 55cd18c..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/module_dir/xmodules/aaa/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = function (x) { return x * 100 } diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/module_dir/ymodules/aaa/index.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/module_dir/ymodules/aaa/index.js deleted file mode 100644 index 651aca8..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/module_dir/ymodules/aaa/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = function (x) { return x + 100 } diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/module_dir/zmodules/bbb/main.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/module_dir/zmodules/bbb/main.js deleted file mode 100644 index 4325a0b..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/module_dir/zmodules/bbb/main.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = function (n) { return n * 111 } diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/module_dir/zmodules/bbb/package.json b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/module_dir/zmodules/bbb/package.json deleted file mode 100644 index c13b8cf..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/module_dir/zmodules/bbb/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "main": "main.js" -} diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/node_path.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/node_path.js deleted file mode 100644 index 2407189..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/node_path.js +++ /dev/null @@ -1,48 +0,0 @@ -var path = require('path'); -var test = require('tape'); -var resolve = require('../'); - -test('$NODE_PATH', function (t) { - t.plan(4); - - resolve('aaa', { - paths: [ - __dirname + '/node_path/x', - __dirname + '/node_path/y' - ], - basedir: __dirname, - }, function (err, res) { - t.equal(res, __dirname + '/node_path/x/aaa/index.js'); - }); - - resolve('bbb', { - paths: [ - __dirname + '/node_path/x', - __dirname + '/node_path/y' - ], - basedir: __dirname, - }, function (err, res) { - t.equal(res, __dirname + '/node_path/y/bbb/index.js'); - }); - - resolve('ccc', { - paths: [ - __dirname + '/node_path/x', - __dirname + '/node_path/y' - ], - basedir: __dirname, - }, function (err, res) { - t.equal(res, __dirname + '/node_path/x/ccc/index.js'); - }); - - // ensure that relative paths still resolve against the - // regular `node_modules` correctly - resolve('tap', { - paths: [ - 'node_path', - ], - basedir: 'node_path/x', - }, function (err, res) { - t.equal(res, path.resolve(__dirname, '..', 'node_modules/tap/lib/main.js')); - }); -}); diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/node_path/x/aaa/index.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/node_path/x/aaa/index.js deleted file mode 100644 index 1ea5913..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/node_path/x/aaa/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = 'A' diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/node_path/x/ccc/index.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/node_path/x/ccc/index.js deleted file mode 100644 index f186fa7..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/node_path/x/ccc/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = 'C' diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/node_path/y/bbb/index.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/node_path/y/bbb/index.js deleted file mode 100644 index e22dd83..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/node_path/y/bbb/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = 'B' diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/node_path/y/ccc/index.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/node_path/y/ccc/index.js deleted file mode 100644 index d0043d1..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/node_path/y/ccc/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = 'CY' diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/nonstring.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/nonstring.js deleted file mode 100644 index ef63c40..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/nonstring.js +++ /dev/null @@ -1,9 +0,0 @@ -var test = require('tape'); -var resolve = require('../'); - -test('nonstring', function (t) { - t.plan(1); - resolve(555, function (err, res, pkg) { - t.ok(err); - }); -}); diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/pathfilter.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/pathfilter.js deleted file mode 100644 index 142f94d..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/pathfilter.js +++ /dev/null @@ -1,35 +0,0 @@ -var test = require('tape'); -var resolve = require('../'); - -test('#62: deep module references and the pathFilter', function(t){ - t.plan(9); - - var resolverDir = __dirname + '/pathfilter/deep_ref'; - var pathFilter = function(pkg, x, remainder){ - t.equal(pkg.version, "1.2.3"); - t.equal(x, resolverDir + '/node_modules/deep/ref'); - t.equal(remainder, "ref"); - return "alt"; - }; - - resolve('deep/ref', { basedir : resolverDir }, function (err, res, pkg) { - if (err) t.fail(err); - - t.equal(pkg.version, "1.2.3"); - t.equal(res, resolverDir + '/node_modules/deep/ref.js'); - }); - - resolve('deep/deeper/ref', { basedir: resolverDir }, - function(err, res, pkg) { - if(err) t.fail(err); - t.notEqual(pkg, undefined); - t.equal(pkg.version, "1.2.3"); - t.equal(res, resolverDir + '/node_modules/deep/deeper/ref.js'); - }); - - resolve('deep/ref', { basedir : resolverDir, pathFilter : pathFilter }, - function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, resolverDir + '/node_modules/deep/alt.js'); - }); -}); diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/pathfilter/deep_ref/main.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/pathfilter/deep_ref/main.js deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/pathfilter/deep_ref/node_modules/deep/alt.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/pathfilter/deep_ref/node_modules/deep/alt.js deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/pathfilter/deep_ref/node_modules/deep/deeper/ref.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/pathfilter/deep_ref/node_modules/deep/deeper/ref.js deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/pathfilter/deep_ref/node_modules/deep/package.json b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/pathfilter/deep_ref/node_modules/deep/package.json deleted file mode 100644 index fe4b408..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/pathfilter/deep_ref/node_modules/deep/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "deep", - "version": "1.2.3" -} diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/pathfilter/deep_ref/node_modules/deep/ref.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/pathfilter/deep_ref/node_modules/deep/ref.js deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/precedence.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/precedence.js deleted file mode 100644 index c716f0e..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/precedence.js +++ /dev/null @@ -1,23 +0,0 @@ -var path = require('path'); -var test = require('tape'); -var resolve = require('../'); - -test('precedence', function (t) { - t.plan(3); - var dir = path.join(__dirname, 'precedence/aaa'); - - resolve('./', { basedir : dir }, function (err, res, pkg) { - t.ifError(err); - t.equal(res, path.join(dir, 'index.js')); - t.equal(pkg.name, 'resolve'); - }); -}); - -test('./ should not load ${dir}.js', function (t) { - t.plan(1); - var dir = path.join(__dirname, 'precedence/bbb'); - - resolve('./', { basedir : dir }, function (err, res, pkg) { - t.ok(err); - }); -}); diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/precedence/aaa.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/precedence/aaa.js deleted file mode 100644 index a182397..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/precedence/aaa.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = 'wtf' diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/precedence/aaa/index.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/precedence/aaa/index.js deleted file mode 100644 index 993b03c..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/precedence/aaa/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = 'okok' diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/precedence/aaa/main.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/precedence/aaa/main.js deleted file mode 100644 index db38959..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/precedence/aaa/main.js +++ /dev/null @@ -1 +0,0 @@ -console.log(require('./')) diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/precedence/bbb.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/precedence/bbb.js deleted file mode 100644 index c8a9996..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/precedence/bbb.js +++ /dev/null @@ -1 +0,0 @@ -module.exports '>_<' diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/precedence/bbb/main.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/precedence/bbb/main.js deleted file mode 100644 index 716b81d..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/precedence/bbb/main.js +++ /dev/null @@ -1 +0,0 @@ -console.log(require('./')); // should throw diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver.js deleted file mode 100644 index 5bbb05f..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver.js +++ /dev/null @@ -1,281 +0,0 @@ -var path = require('path'); -var test = require('tape'); -var resolve = require('../'); - -test('async foo', function (t) { - t.plan(9); - var dir = __dirname + '/resolver'; - - resolve('./foo', { basedir : dir }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/foo.js'); - t.equal(pkg.name, 'resolve'); - }); - - resolve('./foo.js', { basedir : dir }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/foo.js'); - t.equal(pkg.name, 'resolve'); - }); - - resolve('./foo', { basedir : dir, package: { main: 'resolver' } }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/foo.js'); - t.equal(pkg.main, 'resolver'); - }); - - resolve('./foo.js', { basedir : dir, package: { main: 'resolver' } }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/foo.js'); - t.equal(pkg.main, 'resolver'); - }); - - resolve('foo', { basedir : dir }, function (err) { - t.equal(err.message, "Cannot find module 'foo' from '" + path.resolve(dir) + "'"); - }); -}); - -test('bar', function (t) { - t.plan(6); - var dir = __dirname + '/resolver'; - - resolve('foo', { basedir : dir + '/bar' }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/bar/node_modules/foo/index.js'); - t.equal(pkg, undefined); - }); - - resolve('foo', { basedir : dir + '/bar' }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/bar/node_modules/foo/index.js'); - t.equal(pkg, undefined); - }); - - resolve('foo', { basedir : dir + '/bar', package: { main: 'bar' } }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/bar/node_modules/foo/index.js'); - t.equal(pkg, undefined); - }); -}); - -test('baz', function (t) { - t.plan(4); - var dir = __dirname + '/resolver'; - - resolve('./baz', { basedir : dir }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/baz/quux.js'); - t.equal(pkg.main, 'quux.js'); - }); - - resolve('./baz', { basedir : dir, package: { main: 'resolver' } }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/baz/quux.js'); - t.equal(pkg.main, 'quux.js'); - }); -}); - -test('biz', function (t) { - t.plan(24); - var dir = __dirname + '/resolver/biz/node_modules'; - - resolve('./grux', { basedir : dir }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/grux/index.js'); - t.equal(pkg, undefined); - }); - - resolve('./grux', { basedir : dir, package: { main: 'biz' } }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/grux/index.js'); - t.equal(pkg.main, 'biz'); - }); - - resolve('./garply', { basedir : dir }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/garply/lib/index.js'); - t.equal(pkg.main, './lib'); - }); - - resolve('./garply', { basedir : dir, package: { main: 'biz' } }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/garply/lib/index.js'); - t.equal(pkg.main, './lib'); - }); - - resolve('tiv', { basedir : dir + '/grux' }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/tiv/index.js'); - t.equal(pkg, undefined); - }); - - resolve('tiv', { basedir : dir + '/grux', package: { main: 'grux' } }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/tiv/index.js'); - t.equal(pkg, undefined); - }); - - resolve('tiv', { basedir : dir + '/garply' }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/tiv/index.js'); - t.equal(pkg, undefined); - }); - - resolve('tiv', { basedir : dir + '/garply', package: { main: './lib' } }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/tiv/index.js'); - t.equal(pkg, undefined); - }); - - resolve('grux', { basedir : dir + '/tiv' }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/grux/index.js'); - t.equal(pkg, undefined); - }); - - resolve('grux', { basedir : dir + '/tiv', package: { main: 'tiv' } }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/grux/index.js'); - t.equal(pkg, undefined); - }); - - resolve('garply', { basedir : dir + '/tiv' }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/garply/lib/index.js'); - t.equal(pkg.main, './lib'); - }); - - resolve('garply', { basedir : dir + '/tiv', package: { main: 'tiv' } }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/garply/lib/index.js'); - t.equal(pkg.main, './lib'); - }); -}); - -test('quux', function (t) { - t.plan(2); - var dir = __dirname + '/resolver/quux'; - - resolve('./foo', { basedir : dir, package: { main: 'quux' } }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/foo/index.js'); - t.equal(pkg.main, 'quux'); - }); -}); - -test('normalize', function (t) { - t.plan(2); - var dir = __dirname + '/resolver/biz/node_modules/grux'; - - resolve('../grux', { basedir : dir }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/index.js'); - t.equal(pkg, undefined); - }); -}); - -test('cup', function (t) { - t.plan(3); - var dir = __dirname + '/resolver'; - - resolve('./cup', { basedir : dir, extensions : [ '.js', '.coffee' ] }, - function (err, res) { - if (err) t.fail(err); - t.equal(res, dir + '/cup.coffee'); - }); - - resolve('./cup.coffee', { basedir : dir }, function (err, res) { - if (err) t.fail(err); - t.equal(res, dir + '/cup.coffee'); - }); - - resolve('./cup', { basedir : dir, extensions : [ '.js' ] }, - function (err, res) { - t.equal(err.message, "Cannot find module './cup' from '" + path.resolve(dir) + "'"); - }); -}); - -test('mug', function (t) { - t.plan(3); - var dir = __dirname + '/resolver'; - - resolve('./mug', { basedir : dir }, function (err, res) { - if (err) t.fail(err); - t.equal(res, dir + '/mug.js'); - }); - - resolve('./mug', { basedir : dir, extensions : [ '.coffee', '.js' ] }, - function (err, res) { - if (err) t.fail(err); - t.equal(res, dir + '/mug.coffee'); - }); - - resolve('./mug', { basedir : dir, extensions : [ '.js', '.coffee' ] }, - function (err, res) { - t.equal(res, dir + '/mug.js'); - }); -}); - -test('other path', function (t) { - t.plan(4); - var resolverDir = __dirname + '/resolver'; - var dir = resolverDir + '/bar'; - var otherDir = resolverDir + '/other_path'; - - resolve('root', { basedir : dir, paths: [otherDir] }, function (err, res) { - if (err) t.fail(err); - t.equal(res, resolverDir + '/other_path/root.js'); - }); - - resolve('lib/other-lib', { basedir : dir, paths: [otherDir] }, - function (err, res) { - if (err) t.fail(err); - t.equal(res, resolverDir + '/other_path/lib/other-lib.js'); - }); - - resolve('root', { basedir : dir, }, function (err, res) { - t.equal(err.message, "Cannot find module 'root' from '" + path.resolve(dir) + "'"); - }); - - resolve('zzz', { basedir : dir, paths: [otherDir] }, function (err, res) { - t.equal(err.message, "Cannot find module 'zzz' from '" + path.resolve(dir) + "'"); - }); -}); - -test('incorrect main', function (t) { - t.plan(1) - - var resolverDir = __dirname + '/resolver'; - var dir = resolverDir + '/incorrect_main'; - - resolve('./incorrect_main', { basedir : resolverDir }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, dir + '/index.js'); - }); -}); - -test('without basedir', function (t) { - t.plan(1); - - var dir = __dirname + '/resolver/without_basedir'; - var tester = require(dir + '/main.js'); - - tester(t, function (err, res, pkg){ - if (err) { - t.fail(err); - } else { - t.equal(res, dir + '/node_modules/mymodule.js'); - } - }); -}); - -test('#25: node modules with the same name as node stdlib modules', function (t) { - t.plan(1); - - var resolverDir = __dirname + '/resolver/punycode'; - - resolve('punycode', { basedir : resolverDir }, function (err, res, pkg) { - if (err) t.fail(err); - t.equal(res, resolverDir + '/node_modules/punycode/index.js'); - }); -}); diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/bar/node_modules/foo/index.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/bar/node_modules/foo/index.js deleted file mode 100644 index bd816ea..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/bar/node_modules/foo/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = 1; diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/baz/doom.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/baz/doom.js deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/baz/package.json b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/baz/package.json deleted file mode 100644 index 6b81dcd..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/baz/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "main" : "quux.js" -} diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/baz/quux.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/baz/quux.js deleted file mode 100644 index bd816ea..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/baz/quux.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = 1; diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/biz/node_modules/garply/lib/index.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/biz/node_modules/garply/lib/index.js deleted file mode 100644 index 0379e29..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/biz/node_modules/garply/lib/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = 'hello garply'; diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/biz/node_modules/garply/package.json b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/biz/node_modules/garply/package.json deleted file mode 100644 index babaac5..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/biz/node_modules/garply/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "main" : "./lib" -} diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/biz/node_modules/grux/index.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/biz/node_modules/grux/index.js deleted file mode 100644 index 4996055..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/biz/node_modules/grux/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('tiv') * 100; diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/biz/node_modules/tiv/index.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/biz/node_modules/tiv/index.js deleted file mode 100644 index 690aad3..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/biz/node_modules/tiv/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = 3; diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/cup.coffee b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/cup.coffee deleted file mode 100644 index 8b13789..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/cup.coffee +++ /dev/null @@ -1 +0,0 @@ - diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/foo.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/foo.js deleted file mode 100644 index bd816ea..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/foo.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = 1; diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/incorrect_main/index.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/incorrect_main/index.js deleted file mode 100644 index bc1fb0a..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/incorrect_main/index.js +++ /dev/null @@ -1,2 +0,0 @@ -// this is the actual main file 'index.js', not 'wrong.js' like the package.json would indicate -module.exports = 1; diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/incorrect_main/package.json b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/incorrect_main/package.json deleted file mode 100644 index 1592ed3..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/incorrect_main/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "main" : "wrong.js" -} diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/mug.coffee b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/mug.coffee deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/mug.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/mug.js deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/other_path/lib/other-lib.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/other_path/lib/other-lib.js deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/other_path/root.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/other_path/root.js deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/punycode/node_modules/punycode/index.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/punycode/node_modules/punycode/index.js deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/quux/foo/index.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/quux/foo/index.js deleted file mode 100644 index bd816ea..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/quux/foo/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = 1; diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/without_basedir/main.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/without_basedir/main.js deleted file mode 100644 index 5f211e9..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/without_basedir/main.js +++ /dev/null @@ -1,6 +0,0 @@ -resolve = require('../../../'); - -module.exports = function(t, cb) { - resolve('mymodule', null, cb); -} - diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/without_basedir/node_modules/mymodule.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/without_basedir/node_modules/mymodule.js deleted file mode 100644 index 2b58aa4..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver/without_basedir/node_modules/mymodule.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = "The tools we use have a profound (and devious!) influence on our thinking habits, and, therefore, on our thinking abilities.- E. Dijkstra" diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver_sync.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver_sync.js deleted file mode 100644 index 5982531..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/resolver_sync.js +++ /dev/null @@ -1,180 +0,0 @@ -var test = require('tape'); -var resolve = require('../'); - -test('foo', function (t) { - var dir = __dirname + '/resolver'; - - t.equal( - resolve.sync('./foo', { basedir : dir }), - dir + '/foo.js' - ); - - t.equal( - resolve.sync('./foo.js', { basedir : dir }), - dir + '/foo.js' - ); - - t.throws(function () { - resolve.sync('foo', { basedir : dir }); - }); - - t.end(); -}); - -test('bar', function (t) { - var dir = __dirname + '/resolver'; - - t.equal( - resolve.sync('foo', { basedir : dir + '/bar' }), - dir + '/bar/node_modules/foo/index.js' - ); - t.end(); -}); - -test('baz', function (t) { - var dir = __dirname + '/resolver'; - - t.equal( - resolve.sync('./baz', { basedir : dir }), - dir + '/baz/quux.js' - ); - t.end(); -}); - -test('biz', function (t) { - var dir = __dirname + '/resolver/biz/node_modules'; - t.equal( - resolve.sync('./grux', { basedir : dir }), - dir + '/grux/index.js' - ); - - t.equal( - resolve.sync('tiv', { basedir : dir + '/grux' }), - dir + '/tiv/index.js' - ); - - t.equal( - resolve.sync('grux', { basedir : dir + '/tiv' }), - dir + '/grux/index.js' - ); - t.end(); -}); - -test('normalize', function (t) { - var dir = __dirname + '/resolver/biz/node_modules/grux'; - t.equal( - resolve.sync('../grux', { basedir : dir }), - dir + '/index.js' - ); - t.end(); -}); - -test('cup', function (t) { - var dir = __dirname + '/resolver'; - t.equal( - resolve.sync('./cup', { - basedir : dir, - extensions : [ '.js', '.coffee' ] - }), - dir + '/cup.coffee' - ); - - t.equal( - resolve.sync('./cup.coffee', { - basedir : dir - }), - dir + '/cup.coffee' - ); - - t.throws(function () { - resolve.sync('./cup', { - basedir : dir, - extensions : [ '.js' ] - }) - }); - - t.end(); -}); - -test('mug', function (t) { - var dir = __dirname + '/resolver'; - t.equal( - resolve.sync('./mug', { basedir : dir }), - dir + '/mug.js' - ); - - t.equal( - resolve.sync('./mug', { - basedir : dir, - extensions : [ '.coffee', '.js' ] - }), - dir + '/mug.coffee' - ); - - t.equal( - resolve.sync('./mug', { - basedir : dir, - extensions : [ '.js', '.coffee' ] - }), - dir + '/mug.js' - ); - - t.end(); -}); - -test('other path', function (t) { - var resolverDir = __dirname + '/resolver'; - var dir = resolverDir + '/bar'; - var otherDir = resolverDir + '/other_path'; - - var path = require('path'); - - t.equal( - resolve.sync('root', { - basedir : dir, - paths: [otherDir] }), - resolverDir + '/other_path/root.js' - ); - - t.equal( - resolve.sync('lib/other-lib', { - basedir : dir, - paths: [otherDir] }), - resolverDir + '/other_path/lib/other-lib.js' - ); - - t.throws(function () { - resolve.sync('root', { basedir : dir, }); - }); - - t.throws(function () { - resolve.sync('zzz', { - basedir : dir, - paths: [otherDir] }); - }); - - t.end(); -}); - -test('incorrect main', function (t) { - var resolverDir = __dirname + '/resolver'; - var dir = resolverDir + '/incorrect_main'; - - t.equal( - resolve.sync('./incorrect_main', { basedir : resolverDir }), - dir + '/index.js' - ) - - t.end() -}); - -test('#25: node modules with the same name as node stdlib modules', function (t) { - var resolverDir = __dirname + '/resolver/punycode'; - - t.equal( - resolve.sync('punycode', { basedir : resolverDir }), - resolverDir + '/node_modules/punycode/index.js' - ) - - t.end() -}); diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/subdirs.js b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/subdirs.js deleted file mode 100644 index 957abfe..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/subdirs.js +++ /dev/null @@ -1,13 +0,0 @@ -var test = require('tape'); -var resolve = require('../'); -var path = require('path'); - -test('subdirs', function (t) { - t.plan(2); - - var dir = path.join(__dirname, '/subdirs'); - resolve('a/b/c/x.json', { basedir: dir }, function (err, res) { - t.ifError(err); - t.equal(res, path.join(dir, 'node_modules/a/b/c/x.json')); - }); -}); diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/subdirs/node_modules/a/b/c/x.json b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/subdirs/node_modules/a/b/c/x.json deleted file mode 100644 index 3cc0ecb..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/subdirs/node_modules/a/b/c/x.json +++ /dev/null @@ -1 +0,0 @@ -[1,2,3] diff --git a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/subdirs/node_modules/a/package.json b/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/subdirs/node_modules/a/package.json deleted file mode 100644 index 0967ef4..0000000 --- a/node_modules/shelljs/node_modules/rechoir/node_modules/resolve/test/subdirs/node_modules/a/package.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/node_modules/shelljs/node_modules/rechoir/package.json b/node_modules/shelljs/node_modules/rechoir/package.json deleted file mode 100644 index 61ae7ae..0000000 --- a/node_modules/shelljs/node_modules/rechoir/package.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "name": "rechoir", - "description": "Require any supported file as a node module.", - "version": "0.6.2", - "homepage": "https://github.com/tkellen/node-rechoir", - "author": { - "name": "Tyler Kellen", - "url": "http://goingslowly.com/" - }, - "repository": { - "type": "git", - "url": "git://github.com/tkellen/node-rechoir.git" - }, - "bugs": { - "url": "https://github.com/tkellen/node-rechoir/issues" - }, - "licenses": [ - { - "type": "MIT", - "url": "https://github.com/tkellen/node-rechoir/blob/master/LICENSE" - } - ], - "main": "index.js", - "engines": { - "node": ">= 0.10" - }, - "scripts": { - "test": "mocha -R spec test/index.js" - }, - "dependencies": { - "resolve": "^1.1.6" - }, - "devDependencies": { - "babel": "^5.4.3", - "chai": "^2.3.0", - "coco": "^0.9.1", - "coffee-script": "^1.9.2", - "earlgrey": "0.0.9", - "iced-coffee-script": "^1.8.0-d", - "interpret": "^0.6.1", - "json5": "^0.4.0", - "livescript": "^1.4.0", - "mocha": "^2.2.5", - "node-jsx": "^0.13.3", - "require-csv": "0.0.1", - "require-ini": "0.0.1", - "require-uncached": "^1.0.2", - "require-xml": "0.0.1", - "require-yaml": "0.0.1", - "rimraf": "^2.3.4", - "semver": "^4.3.4", - "sinon": "^1.14.1", - "toml-require": "^1.0.1", - "typescript-register": "^1.1.0" - }, - "keywords": [ - "require", - "cjsx", - "co", - "coco", - "coffee-script", - "coffee", - "coffee.md", - "csv", - "earlgrey", - "es", - "es6", - "iced", - "iced.md", - "iced-coffee-script", - "ini", - "js", - "json", - "json5", - "jsx", - "react", - "litcoffee", - "liticed", - "ls", - "livescript", - "toml", - "ts", - "typescript", - "xml", - "yaml", - "yml" - ], - "gitHead": "1aafd85aac487171be71891b916c9136c620ac0e", - "_id": "rechoir@0.6.2", - "_shasum": "85204b54dba82d5742e28c96756ef43af50e3384", - "_from": "rechoir@>=0.6.2 <0.7.0", - "_npmVersion": "2.7.4", - "_nodeVersion": "0.12.4", - "_npmUser": { - "name": "tkellen", - "email": "tyler@sleekcode.net" - }, - "maintainers": [ - { - "name": "tkellen", - "email": "tyler@sleekcode.net" - }, - { - "name": "phated", - "email": "blaine@iceddev.com" - } - ], - "dist": { - "shasum": "85204b54dba82d5742e28c96756ef43af50e3384", - "tarball": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "readme": "ERROR: No README data found!" -} diff --git a/node_modules/shelljs/package.json b/node_modules/shelljs/package.json deleted file mode 100644 index 5f50336..0000000 --- a/node_modules/shelljs/package.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "name": "shelljs", - "version": "0.7.5", - "description": "Portable Unix shell commands for Node.js", - "keywords": [ - "shelljs", - "bash", - "unix", - "shell", - "makefile", - "make", - "jake", - "synchronous" - ], - "contributors": [ - { - "name": "Ari Porad", - "email": "ari@ariporad.com", - "url": "http://ariporad.com/" - }, - { - "name": "Nate Fischer", - "email": "ntfschr@gmail.com", - "url": "https://github.com/nfischer" - } - ], - "repository": { - "type": "git", - "url": "git://github.com/shelljs/shelljs.git" - }, - "license": "BSD-3-Clause", - "homepage": "http://github.com/shelljs/shelljs", - "main": "./shell.js", - "scripts": { - "posttest": "npm run lint", - "test": "node scripts/run-tests", - "gendocs": "node scripts/generate-docs", - "lint": "eslint .", - "after-travis": "travis-check-changes", - "changelog": "shelljs-changelog", - "release:major": "shelljs-release major", - "release:minor": "shelljs-release minor", - "release:patch": "shelljs-release patch" - }, - "bin": { - "shjs": "./bin/shjs" - }, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "devDependencies": { - "eslint": "^2.0.0", - "eslint-config-airbnb-base": "^3.0.0", - "eslint-plugin-import": "^1.11.1", - "coffee-script": "^1.10.0", - "shelljs-changelog": "^0.2.0", - "shelljs-release": "^0.2.0", - "travis-check-changes": "^0.2.0" - }, - "optionalDependencies": {}, - "engines": { - "node": ">=0.11.0", - "iojs": "*" - }, - "gitHead": "1a15022f2747d322d771dd7ae0c00840e469a52a", - "bugs": { - "url": "https://github.com/shelljs/shelljs/issues" - }, - "_id": "shelljs@0.7.5", - "_shasum": "2eef7a50a21e1ccf37da00df767ec69e30ad0675", - "_from": "shelljs@>=0.7.0 <0.8.0", - "_npmVersion": "3.10.8", - "_nodeVersion": "6.7.0", - "_npmUser": { - "name": "nfischer", - "email": "ntfschr@gmail.com" - }, - "dist": { - "shasum": "2eef7a50a21e1ccf37da00df767ec69e30ad0675", - "tarball": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.5.tgz" - }, - "maintainers": [ - { - "name": "ariporad", - "email": "ari@ariporad.com" - }, - { - "name": "artur", - "email": "arturadib@gmail.com" - }, - { - "name": "nfischer", - "email": "ntfschr@gmail.com" - } - ], - "_npmOperationalInternal": { - "host": "packages-18-east.internal.npmjs.com", - "tmp": "tmp/shelljs-0.7.5.tgz_1477547417527_0.3151172921061516" - }, - "directories": {}, - "_resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.5.tgz" -} diff --git a/node_modules/shelljs/plugin.js b/node_modules/shelljs/plugin.js deleted file mode 100644 index f879ab3..0000000 --- a/node_modules/shelljs/plugin.js +++ /dev/null @@ -1,16 +0,0 @@ -// Various utilties exposed to plugins - -require('./shell'); // Create the ShellJS instance (mandatory) - -var common = require('./src/common'); - -var exportedAttributes = [ - 'error', // For signaling errors from within commands - 'parseOptions', // For custom option parsing - 'readFromPipe', // For commands with the .canReceivePipe attribute - 'register', // For registering plugins -]; - -exportedAttributes.forEach(function (attr) { - exports[attr] = common[attr]; -}); diff --git a/node_modules/shelljs/scripts/generate-docs.js b/node_modules/shelljs/scripts/generate-docs.js deleted file mode 100644 index f777c8a..0000000 --- a/node_modules/shelljs/scripts/generate-docs.js +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env node -/* globals cat, cd, echo, grep, sed, ShellString */ -require('../global'); - -echo('Appending docs to README.md'); - -cd(__dirname + '/..'); - -// Extract docs from shell.js -var docs = grep('^//@', 'shell.js'); - -// Now extract docs from the appropriate src/*.js files -docs = docs.replace(/\/\/@include (.+)/g, function (match, path) { - var file = path.match('.js$') ? path : path + '.js'; - return grep('^//@', file); -}); - -// Remove '//@' -docs = docs.replace(/\/\/@ ?/g, ''); - -// Wipe out the old docs -ShellString(cat('README.md').replace(/## Command reference(.|\n)*\n## Team/, '## Command reference\n## Team')).to('README.md'); - -// Append new docs to README -sed('-i', /## Command reference/, '## Command reference\n\n' + docs, 'README.md'); - -echo('All done.'); diff --git a/node_modules/shelljs/scripts/run-tests.js b/node_modules/shelljs/scripts/run-tests.js deleted file mode 100644 index 9920562..0000000 --- a/node_modules/shelljs/scripts/run-tests.js +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env node -/* globals cd, echo, exec, exit, ls */ -require('../global'); - -var failed = false; - -// -// Unit tests -// -cd(__dirname + '/../test'); -ls('*.js').forEach(function (file) { - echo('Running test:', file); - if (exec(JSON.stringify(process.execPath) + ' ' + file).code !== 123) { // 123 avoids false positives (e.g. premature exit) - failed = true; - echo('*** TEST FAILED! (missing exit code "123")'); - echo(); - } -}); - -echo(); - -if (failed) { - echo('*******************************************************'); - echo('WARNING: Some tests did not pass!'); - echo('*******************************************************'); - exit(1); -} else { - echo('All tests passed.'); -} diff --git a/node_modules/shelljs/shell.js b/node_modules/shelljs/shell.js deleted file mode 100644 index 9e49ef5..0000000 --- a/node_modules/shelljs/shell.js +++ /dev/null @@ -1,218 +0,0 @@ -// -// ShellJS -// Unix shell commands on top of Node's API -// -// Copyright (c) 2012 Artur Adib -// http://github.com/arturadib/shelljs -// - -var common = require('./src/common'); - -//@ -//@ All commands run synchronously, unless otherwise stated. -//@ All commands accept standard bash globbing characters (`*`, `?`, etc.), -//@ compatible with the [node glob module](https://github.com/isaacs/node-glob). -//@ -//@ For less-commonly used commands and features, please check out our [wiki -//@ page](https://github.com/shelljs/shelljs/wiki). -//@ - -// Boilerplate -// ----------- -// Copy the code block below here & replace variables with appropiate values -// ``` -// //@include ./src/fileName -// var functionName = require('./src/fileName'); -// exports.nameOfCommand = common.wrap(nameOfCommand, functionName, {globStart: firstIndexToExpand}); -// ``` -// -// The //@include includes the docs for that command -// -// firstIndexToExpand should usually be 1 (so, put {globStart: 1}) -// Increase this value if the command takes arguments that shouldn't be expanded -// with wildcards, such as with the regexes for sed & grep - -//@include ./src/cd -require('./src/cd'); - -//@include ./src/pwd -require('./src/pwd'); - -//@include ./src/ls -require('./src/ls'); - -//@include ./src/find -require('./src/find'); - -//@include ./src/cp -require('./src/cp'); - -//@include ./src/rm -require('./src/rm'); - -//@include ./src/mv -require('./src/mv'); - -//@include ./src/mkdir -require('./src/mkdir'); - -//@include ./src/test -require('./src/test'); - -//@include ./src/cat -require('./src/cat'); - -//@include ./src/head -require('./src/head'); - -//@include ./src/tail -require('./src/tail'); - -//@include ./src/to -require('./src/to'); - -//@include ./src/toEnd -require('./src/toEnd'); - -//@include ./src/sed -require('./src/sed'); - -//@include ./src/sort -require('./src/sort'); - -//@include ./src/uniq -require('./src/uniq'); - -//@include ./src/grep -require('./src/grep'); - -//@include ./src/which -require('./src/which'); - -//@include ./src/echo -require('./src/echo'); - -//@include ./src/dirs -require('./src/dirs'); - -//@include ./src/ln -require('./src/ln'); - -//@ -//@ ### exit(code) -//@ Exits the current process with the given exit code. -exports.exit = process.exit; - -//@ -//@ ### env['VAR_NAME'] -//@ Object containing environment variables (both getter and setter). Shortcut to process.env. -exports.env = process.env; - -//@include ./src/exec -require('./src/exec'); - -//@include ./src/chmod -require('./src/chmod'); - -//@include ./src/touch -require('./src/touch'); - -//@include ./src/set -require('./src/set'); - - -//@ -//@ ## Non-Unix commands -//@ - -//@include ./src/tempdir -require('./src/tempdir'); - -//@include ./src/error - -exports.error = require('./src/error'); - -//@include ./src/common -exports.ShellString = common.ShellString; - -//@ -//@ ### Pipes -//@ -//@ Examples: -//@ -//@ ```javascript -//@ grep('foo', 'file1.txt', 'file2.txt').sed(/o/g, 'a').to('output.txt'); -//@ echo('files with o\'s in the name:\n' + ls().grep('o')); -//@ cat('test.js').exec('node'); // pipe to exec() call -//@ ``` -//@ -//@ Commands can send their output to another command in a pipe-like fashion. -//@ `sed`, `grep`, `cat`, `exec`, `to`, and `toEnd` can appear on the right-hand -//@ side of a pipe. Pipes can be chained. - -//@ -//@ ## Configuration -//@ - -exports.config = common.config; - -//@ -//@ ### config.silent -//@ -//@ Example: -//@ -//@ ```javascript -//@ var sh = require('shelljs'); -//@ var silentState = sh.config.silent; // save old silent state -//@ sh.config.silent = true; -//@ /* ... */ -//@ sh.config.silent = silentState; // restore old silent state -//@ ``` -//@ -//@ Suppresses all command output if `true`, except for `echo()` calls. -//@ Default is `false`. - -//@ -//@ ### config.fatal -//@ -//@ Example: -//@ -//@ ```javascript -//@ require('shelljs/global'); -//@ config.fatal = true; // or set('-e'); -//@ cp('this_file_does_not_exist', '/dev/null'); // throws Error here -//@ /* more commands... */ -//@ ``` -//@ -//@ If `true` the script will throw a Javascript error when any shell.js -//@ command encounters an error. Default is `false`. This is analogous to -//@ Bash's `set -e` - -//@ -//@ ### config.verbose -//@ -//@ Example: -//@ -//@ ```javascript -//@ config.verbose = true; // or set('-v'); -//@ cd('dir/'); -//@ ls('subdir/'); -//@ ``` -//@ -//@ Will print each command as follows: -//@ -//@ ``` -//@ cd dir/ -//@ ls subdir/ -//@ ``` - -//@ -//@ ### config.globOptions -//@ -//@ Example: -//@ -//@ ```javascript -//@ config.globOptions = {nodir: true}; -//@ ``` -//@ -//@ Use this value for calls to `glob.sync()` instead of the default options. diff --git a/node_modules/shelljs/src/cat.js b/node_modules/shelljs/src/cat.js deleted file mode 100644 index a74a25c..0000000 --- a/node_modules/shelljs/src/cat.js +++ /dev/null @@ -1,40 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); - -common.register('cat', _cat, { - canReceivePipe: true, -}); - -//@ -//@ ### cat(file [, file ...]) -//@ ### cat(file_array) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ var str = cat('file*.txt'); -//@ var str = cat('file1', 'file2'); -//@ var str = cat(['file1', 'file2']); // same as above -//@ ``` -//@ -//@ Returns a string containing the given file, or a concatenated string -//@ containing the files if more than one file is given (a new line character is -//@ introduced between each file). -function _cat(options, files) { - var cat = common.readFromPipe(); - - if (!files && !cat) common.error('no paths given'); - - files = [].slice.call(arguments, 1); - - files.forEach(function (file) { - if (!fs.existsSync(file)) { - common.error('no such file or directory: ' + file); - } - - cat += fs.readFileSync(file, 'utf8'); - }); - - return cat; -} -module.exports = _cat; diff --git a/node_modules/shelljs/src/cd.js b/node_modules/shelljs/src/cd.js deleted file mode 100644 index 634ed83..0000000 --- a/node_modules/shelljs/src/cd.js +++ /dev/null @@ -1,38 +0,0 @@ -var fs = require('fs'); -var common = require('./common'); - -common.register('cd', _cd, {}); - -//@ -//@ ### cd([dir]) -//@ Changes to directory `dir` for the duration of the script. Changes to home -//@ directory if no argument is supplied. -function _cd(options, dir) { - if (!dir) dir = common.getUserHome(); - - if (dir === '-') { - if (!process.env.OLDPWD) { - common.error('could not find previous directory'); - } else { - dir = process.env.OLDPWD; - } - } - - try { - var curDir = process.cwd(); - process.chdir(dir); - process.env.OLDPWD = curDir; - } catch (e) { - // something went wrong, let's figure out the error - var err; - try { - fs.statSync(dir); // if this succeeds, it must be some sort of file - err = 'not a directory: ' + dir; - } catch (e2) { - err = 'no such file or directory: ' + dir; - } - if (err) common.error(err); - } - return ''; -} -module.exports = _cd; diff --git a/node_modules/shelljs/src/chmod.js b/node_modules/shelljs/src/chmod.js deleted file mode 100644 index a1afd90..0000000 --- a/node_modules/shelljs/src/chmod.js +++ /dev/null @@ -1,215 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); -var path = require('path'); - -var PERMS = (function (base) { - return { - OTHER_EXEC: base.EXEC, - OTHER_WRITE: base.WRITE, - OTHER_READ: base.READ, - - GROUP_EXEC: base.EXEC << 3, - GROUP_WRITE: base.WRITE << 3, - GROUP_READ: base.READ << 3, - - OWNER_EXEC: base.EXEC << 6, - OWNER_WRITE: base.WRITE << 6, - OWNER_READ: base.READ << 6, - - // Literal octal numbers are apparently not allowed in "strict" javascript. - STICKY: parseInt('01000', 8), - SETGID: parseInt('02000', 8), - SETUID: parseInt('04000', 8), - - TYPE_MASK: parseInt('0770000', 8) - }; -}({ - EXEC: 1, - WRITE: 2, - READ: 4 -})); - -common.register('chmod', _chmod, { -}); - -//@ -//@ ### chmod(octal_mode || octal_string, file) -//@ ### chmod(symbolic_mode, file) -//@ -//@ Available options: -//@ -//@ + `-v`: output a diagnostic for every file processed//@ -//@ + `-c`: like verbose but report only when a change is made//@ -//@ + `-R`: change files and directories recursively//@ -//@ -//@ Examples: -//@ -//@ ```javascript -//@ chmod(755, '/Users/brandon'); -//@ chmod('755', '/Users/brandon'); // same as above -//@ chmod('u+x', '/Users/brandon'); -//@ ``` -//@ -//@ Alters the permissions of a file or directory by either specifying the -//@ absolute permissions in octal form or expressing the changes in symbols. -//@ This command tries to mimic the POSIX behavior as much as possible. -//@ Notable exceptions: -//@ -//@ + In symbolic modes, 'a-r' and '-r' are identical. No consideration is -//@ given to the umask. -//@ + There is no "quiet" option since default behavior is to run silent. -function _chmod(options, mode, filePattern) { - if (!filePattern) { - if (options.length > 0 && options.charAt(0) === '-') { - // Special case where the specified file permissions started with - to subtract perms, which - // get picked up by the option parser as command flags. - // If we are down by one argument and options starts with -, shift everything over. - [].unshift.call(arguments, ''); - } else { - common.error('You must specify a file.'); - } - } - - options = common.parseOptions(options, { - 'R': 'recursive', - 'c': 'changes', - 'v': 'verbose' - }); - - filePattern = [].slice.call(arguments, 2); - - var files; - - // TODO: replace this with a call to common.expand() - if (options.recursive) { - files = []; - filePattern.forEach(function addFile(expandedFile) { - var stat = fs.lstatSync(expandedFile); - - if (!stat.isSymbolicLink()) { - files.push(expandedFile); - - if (stat.isDirectory()) { // intentionally does not follow symlinks. - fs.readdirSync(expandedFile).forEach(function (child) { - addFile(expandedFile + '/' + child); - }); - } - } - }); - } else { - files = filePattern; - } - - files.forEach(function innerChmod(file) { - file = path.resolve(file); - if (!fs.existsSync(file)) { - common.error('File not found: ' + file); - } - - // When recursing, don't follow symlinks. - if (options.recursive && fs.lstatSync(file).isSymbolicLink()) { - return; - } - - var stat = fs.statSync(file); - var isDir = stat.isDirectory(); - var perms = stat.mode; - var type = perms & PERMS.TYPE_MASK; - - var newPerms = perms; - - if (isNaN(parseInt(mode, 8))) { - // parse options - mode.split(',').forEach(function (symbolicMode) { - var pattern = /([ugoa]*)([=\+-])([rwxXst]*)/i; - var matches = pattern.exec(symbolicMode); - - if (matches) { - var applyTo = matches[1]; - var operator = matches[2]; - var change = matches[3]; - - var changeOwner = applyTo.indexOf('u') !== -1 || applyTo === 'a' || applyTo === ''; - var changeGroup = applyTo.indexOf('g') !== -1 || applyTo === 'a' || applyTo === ''; - var changeOther = applyTo.indexOf('o') !== -1 || applyTo === 'a' || applyTo === ''; - - var changeRead = change.indexOf('r') !== -1; - var changeWrite = change.indexOf('w') !== -1; - var changeExec = change.indexOf('x') !== -1; - var changeExecDir = change.indexOf('X') !== -1; - var changeSticky = change.indexOf('t') !== -1; - var changeSetuid = change.indexOf('s') !== -1; - - if (changeExecDir && isDir) { - changeExec = true; - } - - var mask = 0; - if (changeOwner) { - mask |= (changeRead ? PERMS.OWNER_READ : 0) + (changeWrite ? PERMS.OWNER_WRITE : 0) + (changeExec ? PERMS.OWNER_EXEC : 0) + (changeSetuid ? PERMS.SETUID : 0); - } - if (changeGroup) { - mask |= (changeRead ? PERMS.GROUP_READ : 0) + (changeWrite ? PERMS.GROUP_WRITE : 0) + (changeExec ? PERMS.GROUP_EXEC : 0) + (changeSetuid ? PERMS.SETGID : 0); - } - if (changeOther) { - mask |= (changeRead ? PERMS.OTHER_READ : 0) + (changeWrite ? PERMS.OTHER_WRITE : 0) + (changeExec ? PERMS.OTHER_EXEC : 0); - } - - // Sticky bit is special - it's not tied to user, group or other. - if (changeSticky) { - mask |= PERMS.STICKY; - } - - switch (operator) { - case '+': - newPerms |= mask; - break; - - case '-': - newPerms &= ~mask; - break; - - case '=': - newPerms = type + mask; - - // According to POSIX, when using = to explicitly set the - // permissions, setuid and setgid can never be cleared. - if (fs.statSync(file).isDirectory()) { - newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms; - } - break; - default: - common.error('Could not recognize operator: `' + operator + '`'); - } - - if (options.verbose) { - console.log(file + ' -> ' + newPerms.toString(8)); - } - - if (perms !== newPerms) { - if (!options.verbose && options.changes) { - console.log(file + ' -> ' + newPerms.toString(8)); - } - fs.chmodSync(file, newPerms); - perms = newPerms; // for the next round of changes! - } - } else { - common.error('Invalid symbolic mode change: ' + symbolicMode); - } - }); - } else { - // they gave us a full number - newPerms = type + parseInt(mode, 8); - - // POSIX rules are that setuid and setgid can only be added using numeric - // form, but not cleared. - if (fs.statSync(file).isDirectory()) { - newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms; - } - - fs.chmodSync(file, newPerms); - } - }); - return ''; -} -module.exports = _chmod; diff --git a/node_modules/shelljs/src/common.js b/node_modules/shelljs/src/common.js deleted file mode 100644 index 8211fef..0000000 --- a/node_modules/shelljs/src/common.js +++ /dev/null @@ -1,403 +0,0 @@ -// Ignore warning about 'new String()' -/* eslint no-new-wrappers: 0 */ -'use strict'; - -var os = require('os'); -var fs = require('fs'); -var glob = require('glob'); -var shell = require('..'); - -var shellMethods = Object.create(shell); - -// Module globals -var config = { - silent: false, - fatal: false, - verbose: false, - noglob: false, - globOptions: {}, - maxdepth: 255 -}; -exports.config = config; - -var state = { - error: null, - errorCode: 0, - currentCmd: 'shell.js', - tempDir: null -}; -exports.state = state; - -delete process.env.OLDPWD; // initially, there's no previous directory - -var platform = os.type().match(/^Win/) ? 'win' : 'unix'; -exports.platform = platform; - -// This is populated by calls to commonl.wrap() -var pipeMethods = []; - -function log() { - if (!config.silent) { - console.error.apply(console, arguments); - } -} -exports.log = log; - -// Shows error message. Throws if config.fatal is true -function error(msg, _code, options) { - // Validate input - if (typeof msg !== 'string') throw new Error('msg must be a string'); - - var DEFAULT_OPTIONS = { - continue: false, - code: 1, - prefix: state.currentCmd + ': ', - silent: false, - }; - - if (typeof _code === 'number' && typeof options === 'object') { - options.code = _code; - } else if (typeof _code === 'object') { // no 'code' - options = _code; - } else if (typeof _code === 'number') { // no 'options' - options = { code: _code }; - } else if (typeof _code !== 'number') { // only 'msg' - options = {}; - } - options = objectAssign({}, DEFAULT_OPTIONS, options); - - if (!state.errorCode) state.errorCode = options.code; - - var logEntry = options.prefix + msg; - state.error = state.error ? state.error + '\n' : ''; - state.error += logEntry; - - // Throw an error, or log the entry - if (config.fatal) throw new Error(logEntry); - if (msg.length > 0 && !options.silent) log(logEntry); - - if (!options.continue) { - throw { - msg: 'earlyExit', - retValue: (new ShellString('', state.error, state.errorCode)) - }; - } -} -exports.error = error; - -//@ -//@ ### ShellString(str) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ var foo = ShellString('hello world'); -//@ ``` -//@ -//@ Turns a regular string into a string-like object similar to what each -//@ command returns. This has special methods, like `.to()` and `.toEnd()` -function ShellString(stdout, stderr, code) { - var that; - if (stdout instanceof Array) { - that = stdout; - that.stdout = stdout.join('\n'); - if (stdout.length > 0) that.stdout += '\n'; - } else { - that = new String(stdout); - that.stdout = stdout; - } - that.stderr = stderr; - that.code = code; - // A list of all commands that can appear on the right-hand side of a pipe - // (populated by calls to common.wrap()) - pipeMethods.forEach(function (cmd) { - that[cmd] = shellMethods[cmd].bind(that); - }); - return that; -} - -exports.ShellString = ShellString; - -// Return the home directory in a platform-agnostic way, with consideration for -// older versions of node -function getUserHome() { - var result; - if (os.homedir) { - result = os.homedir(); // node 3+ - } else { - result = process.env[(process.platform === 'win32') ? 'USERPROFILE' : 'HOME']; - } - return result; -} -exports.getUserHome = getUserHome; - -// Returns {'alice': true, 'bob': false} when passed a string and dictionary as follows: -// parseOptions('-a', {'a':'alice', 'b':'bob'}); -// Returns {'reference': 'string-value', 'bob': false} when passed two dictionaries of the form: -// parseOptions({'-r': 'string-value'}, {'r':'reference', 'b':'bob'}); -function parseOptions(opt, map) { - if (!map) error('parseOptions() internal error: no map given'); - - // All options are false by default - var options = {}; - Object.keys(map).forEach(function (letter) { - if (map[letter][0] !== '!') { - options[map[letter]] = false; - } - }); - - if (!opt) return options; // defaults - - var optionName; - if (typeof opt === 'string') { - if (opt[0] !== '-') { - return options; - } - - // e.g. chars = ['R', 'f'] - var chars = opt.slice(1).split(''); - - chars.forEach(function (c) { - if (c in map) { - optionName = map[c]; - if (optionName[0] === '!') { - options[optionName.slice(1)] = false; - } else { - options[optionName] = true; - } - } else { - error('option not recognized: ' + c); - } - }); - } else if (typeof opt === 'object') { - Object.keys(opt).forEach(function (key) { - // key is a string of the form '-r', '-d', etc. - var c = key[1]; - if (c in map) { - optionName = map[c]; - options[optionName] = opt[key]; // assign the given value - } else { - error('option not recognized: ' + c); - } - }); - } else { - error('options must be strings or key-value pairs'); - } - return options; -} -exports.parseOptions = parseOptions; - -// Expands wildcards with matching (ie. existing) file names. -// For example: -// expand(['file*.js']) = ['file1.js', 'file2.js', ...] -// (if the files 'file1.js', 'file2.js', etc, exist in the current dir) -function expand(list) { - if (!Array.isArray(list)) { - throw new TypeError('must be an array'); - } - var expanded = []; - list.forEach(function (listEl) { - // Don't expand non-strings - if (typeof listEl !== 'string') { - expanded.push(listEl); - } else { - var ret = glob.sync(listEl, config.globOptions); - // if glob fails, interpret the string literally - expanded = expanded.concat(ret.length > 0 ? ret : [listEl]); - } - }); - return expanded; -} -exports.expand = expand; - -// Normalizes _unlinkSync() across platforms to match Unix behavior, i.e. -// file can be unlinked even if it's read-only, see https://github.com/joyent/node/issues/3006 -function unlinkSync(file) { - try { - fs.unlinkSync(file); - } catch (e) { - // Try to override file permission - if (e.code === 'EPERM') { - fs.chmodSync(file, '0666'); - fs.unlinkSync(file); - } else { - throw e; - } - } -} -exports.unlinkSync = unlinkSync; - -// e.g. 'shelljs_a5f185d0443ca...' -function randomFileName() { - function randomHash(count) { - if (count === 1) { - return parseInt(16 * Math.random(), 10).toString(16); - } - var hash = ''; - for (var i = 0; i < count; i++) { - hash += randomHash(1); - } - return hash; - } - - return 'shelljs_' + randomHash(20); -} -exports.randomFileName = randomFileName; - -// objectAssign(target_obj, source_obj1 [, source_obj2 ...]) -// Ponyfill for Object.assign -// objectAssign({A:1}, {b:2}, {c:3}) returns {A:1, b:2, c:3} -function objectAssign(target) { - var sources = [].slice.call(arguments, 1); - sources.forEach(function (source) { - Object.keys(source).forEach(function (key) { - target[key] = source[key]; - }); - }); - - return target; -} -exports.extend = Object.assign || objectAssign; - -// Common wrapper for all Unix-like commands that performs glob expansion, -// command-logging, and other nice things -function wrap(cmd, fn, options) { - options = options || {}; - if (options.canReceivePipe) { - pipeMethods.push(cmd); - } - return function () { - var retValue = null; - - state.currentCmd = cmd; - state.error = null; - state.errorCode = 0; - - try { - var args = [].slice.call(arguments, 0); - - // Log the command to stderr, if appropriate - if (config.verbose) { - console.error.apply(console, [cmd].concat(args)); - } - - // If this is coming from a pipe, let's set the pipedValue (otherwise, set - // it to the empty string) - state.pipedValue = (this && typeof this.stdout === 'string') ? this.stdout : ''; - - if (options.unix === false) { // this branch is for exec() - retValue = fn.apply(this, args); - } else { // and this branch is for everything else - if (args[0] instanceof Object && args[0].constructor.name === 'Object') { - // a no-op, allowing the syntax `touch({'-r': file}, ...)` - } else if (args.length === 0 || typeof args[0] !== 'string' || args[0].length <= 1 || args[0][0] !== '-') { - args.unshift(''); // only add dummy option if '-option' not already present - } - - // flatten out arrays that are arguments, to make the syntax: - // `cp([file1, file2, file3], dest);` - // equivalent to: - // `cp(file1, file2, file3, dest);` - args = args.reduce(function (accum, cur) { - if (Array.isArray(cur)) { - return accum.concat(cur); - } - accum.push(cur); - return accum; - }, []); - - // Convert ShellStrings (basically just String objects) to regular strings - args = args.map(function (arg) { - if (arg instanceof Object && arg.constructor.name === 'String') { - return arg.toString(); - } - return arg; - }); - - // Expand the '~' if appropriate - var homeDir = getUserHome(); - args = args.map(function (arg) { - if (typeof arg === 'string' && arg.slice(0, 2) === '~/' || arg === '~') { - return arg.replace(/^~/, homeDir); - } - return arg; - }); - - // Perform glob-expansion on all arguments after globStart, but preserve - // the arguments before it (like regexes for sed and grep) - if (!config.noglob && options.allowGlobbing === true) { - args = args.slice(0, options.globStart).concat(expand(args.slice(options.globStart))); - } - - try { - // parse options if options are provided - if (typeof options.cmdOptions === 'object') { - args[0] = parseOptions(args[0], options.cmdOptions); - } - - retValue = fn.apply(this, args); - } catch (e) { - if (e.msg === 'earlyExit') { - retValue = e.retValue; - } else { - throw e; // this is probably a bug that should be thrown up the call stack - } - } - } - } catch (e) { - if (!state.error) { - // If state.error hasn't been set it's an error thrown by Node, not us - probably a bug... - console.error('ShellJS: internal error'); - console.error(e.stack || e); - process.exit(1); - } - if (config.fatal) throw e; - } - - if (options.wrapOutput && - (typeof retValue === 'string' || Array.isArray(retValue))) { - retValue = new ShellString(retValue, state.error, state.errorCode); - } - - state.currentCmd = 'shell.js'; - return retValue; - }; -} // wrap -exports.wrap = wrap; - -// This returns all the input that is piped into the current command (or the -// empty string, if this isn't on the right-hand side of a pipe -function _readFromPipe() { - return state.pipedValue; -} -exports.readFromPipe = _readFromPipe; - -var DEFAULT_WRAP_OPTIONS = { - allowGlobbing: true, - canReceivePipe: false, - cmdOptions: false, - globStart: 1, - pipeOnly: false, - unix: true, - wrapOutput: true, - overWrite: false, -}; - -// Register a new ShellJS command -function _register(name, implementation, wrapOptions) { - wrapOptions = wrapOptions || {}; - // If an option isn't specified, use the default - wrapOptions = objectAssign({}, DEFAULT_WRAP_OPTIONS, wrapOptions); - - if (shell[name] && !wrapOptions.overWrite) { - throw new Error('unable to overwrite `' + name + '` command'); - } - - if (wrapOptions.pipeOnly) { - wrapOptions.canReceivePipe = true; - shellMethods[name] = wrap(name, implementation, wrapOptions); - } else { - shell[name] = wrap(name, implementation, wrapOptions); - } -} -exports.register = _register; diff --git a/node_modules/shelljs/src/cp.js b/node_modules/shelljs/src/cp.js deleted file mode 100644 index 487c4f7..0000000 --- a/node_modules/shelljs/src/cp.js +++ /dev/null @@ -1,274 +0,0 @@ -var fs = require('fs'); -var path = require('path'); -var common = require('./common'); -var os = require('os'); - -common.register('cp', _cp, { - cmdOptions: { - 'f': '!no_force', - 'n': 'no_force', - 'u': 'update', - 'R': 'recursive', - 'r': 'recursive', - 'L': 'followsymlink', - 'P': 'noFollowsymlink', - }, - wrapOutput: false, -}); - -// Buffered file copy, synchronous -// (Using readFileSync() + writeFileSync() could easily cause a memory overflow -// with large files) -function copyFileSync(srcFile, destFile, options) { - if (!fs.existsSync(srcFile)) { - common.error('copyFileSync: no such file or directory: ' + srcFile); - } - - // Check the mtimes of the files if the '-u' flag is provided - try { - if (options.update && fs.statSync(srcFile).mtime < fs.statSync(destFile).mtime) { - return; - } - } catch (e) { - // If we're here, destFile probably doesn't exist, so just do a normal copy - } - - if (fs.lstatSync(srcFile).isSymbolicLink() && !options.followsymlink) { - try { - fs.lstatSync(destFile); - common.unlinkSync(destFile); // re-link it - } catch (e) { - // it doesn't exist, so no work needs to be done - } - - var symlinkFull = fs.readlinkSync(srcFile); - fs.symlinkSync(symlinkFull, destFile, os.platform() === 'win32' ? 'junction' : null); - } else { - var BUF_LENGTH = 64 * 1024; - var buf = new Buffer(BUF_LENGTH); - var bytesRead = BUF_LENGTH; - var pos = 0; - var fdr = null; - var fdw = null; - - try { - fdr = fs.openSync(srcFile, 'r'); - } catch (e) { - common.error('copyFileSync: could not read src file (' + srcFile + ')'); - } - - try { - fdw = fs.openSync(destFile, 'w'); - } catch (e) { - common.error('copyFileSync: could not write to dest file (code=' + e.code + '):' + destFile); - } - - while (bytesRead === BUF_LENGTH) { - bytesRead = fs.readSync(fdr, buf, 0, BUF_LENGTH, pos); - fs.writeSync(fdw, buf, 0, bytesRead); - pos += bytesRead; - } - - fs.closeSync(fdr); - fs.closeSync(fdw); - - fs.chmodSync(destFile, fs.statSync(srcFile).mode); - } -} - -// Recursively copies 'sourceDir' into 'destDir' -// Adapted from https://github.com/ryanmcgrath/wrench-js -// -// Copyright (c) 2010 Ryan McGrath -// Copyright (c) 2012 Artur Adib -// -// Licensed under the MIT License -// http://www.opensource.org/licenses/mit-license.php -function cpdirSyncRecursive(sourceDir, destDir, opts) { - if (!opts) opts = {}; - - /* Ensure there is not a run away recursive copy. */ - if (typeof opts.depth === 'undefined') { - opts.depth = 0; - } - if (opts.depth >= common.config.maxdepth) { - // Max depth has been reached, end copy. - return; - } - opts.depth++; - - // Create the directory where all our junk is moving to; read the mode of the - // source directory and mirror it - try { - var checkDir = fs.statSync(sourceDir); - fs.mkdirSync(destDir, checkDir.mode); - } catch (e) { - // if the directory already exists, that's okay - if (e.code !== 'EEXIST') throw e; - } - - var files = fs.readdirSync(sourceDir); - - for (var i = 0; i < files.length; i++) { - var srcFile = sourceDir + '/' + files[i]; - var destFile = destDir + '/' + files[i]; - var srcFileStat = fs.lstatSync(srcFile); - - var symlinkFull; - if (opts.followsymlink) { - if (cpcheckcycle(sourceDir, srcFile)) { - // Cycle link found. - console.error('Cycle link found.'); - symlinkFull = fs.readlinkSync(srcFile); - fs.symlinkSync(symlinkFull, destFile, os.platform() === 'win32' ? 'junction' : null); - continue; - } - } - if (srcFileStat.isDirectory()) { - /* recursion this thing right on back. */ - cpdirSyncRecursive(srcFile, destFile, opts); - } else if (srcFileStat.isSymbolicLink() && !opts.followsymlink) { - symlinkFull = fs.readlinkSync(srcFile); - try { - fs.lstatSync(destFile); - common.unlinkSync(destFile); // re-link it - } catch (e) { - // it doesn't exist, so no work needs to be done - } - fs.symlinkSync(symlinkFull, destFile, os.platform() === 'win32' ? 'junction' : null); - } else if (srcFileStat.isSymbolicLink() && opts.followsymlink) { - srcFileStat = fs.statSync(srcFile); - if (srcFileStat.isDirectory()) { - cpdirSyncRecursive(srcFile, destFile, opts); - } else { - copyFileSync(srcFile, destFile, opts); - } - } else { - /* At this point, we've hit a file actually worth copying... so copy it on over. */ - if (fs.existsSync(destFile) && opts.no_force) { - common.log('skipping existing file: ' + files[i]); - } else { - copyFileSync(srcFile, destFile, opts); - } - } - } // for files -} // cpdirSyncRecursive - -function cpcheckcycle(sourceDir, srcFile) { - var srcFileStat = fs.lstatSync(srcFile); - if (srcFileStat.isSymbolicLink()) { - // Do cycle check. For example: - // $ mkdir -p 1/2/3/4 - // $ cd 1/2/3/4 - // $ ln -s ../../3 link - // $ cd ../../../.. - // $ cp -RL 1 copy - var cyclecheck = fs.statSync(srcFile); - if (cyclecheck.isDirectory()) { - var sourcerealpath = fs.realpathSync(sourceDir); - var symlinkrealpath = fs.realpathSync(srcFile); - var re = new RegExp(symlinkrealpath); - if (re.test(sourcerealpath)) { - return true; - } - } - } - return false; -} - -//@ -//@ ### cp([options,] source [, source ...], dest) -//@ ### cp([options,] source_array, dest) -//@ Available options: -//@ -//@ + `-f`: force (default behavior) -//@ + `-n`: no-clobber -//@ + `-u`: only copy if source is newer than dest -//@ + `-r`, `-R`: recursive -//@ + `-L`: follow symlinks -//@ + `-P`: don't follow symlinks -//@ -//@ Examples: -//@ -//@ ```javascript -//@ cp('file1', 'dir1'); -//@ cp('-R', 'path/to/dir/', '~/newCopy/'); -//@ cp('-Rf', '/tmp/*', '/usr/local/*', '/home/tmp'); -//@ cp('-Rf', ['/tmp/*', '/usr/local/*'], '/home/tmp'); // same as above -//@ ``` -//@ -//@ Copies files. -function _cp(options, sources, dest) { - // If we're missing -R, it actually implies -L (unless -P is explicit) - if (options.followsymlink) { - options.noFollowsymlink = false; - } - if (!options.recursive && !options.noFollowsymlink) { - options.followsymlink = true; - } - - // Get sources, dest - if (arguments.length < 3) { - common.error('missing and/or '); - } else { - sources = [].slice.call(arguments, 1, arguments.length - 1); - dest = arguments[arguments.length - 1]; - } - - var destExists = fs.existsSync(dest); - var destStat = destExists && fs.statSync(dest); - - // Dest is not existing dir, but multiple sources given - if ((!destExists || !destStat.isDirectory()) && sources.length > 1) { - common.error('dest is not a directory (too many sources)'); - } - - // Dest is an existing file, but -n is given - if (destExists && destStat.isFile() && options.no_force) { - return new common.ShellString('', '', 0); - } - - sources.forEach(function (src) { - if (!fs.existsSync(src)) { - common.error('no such file or directory: ' + src, { continue: true }); - return; // skip file - } - var srcStat = fs.statSync(src); - if (!options.noFollowsymlink && srcStat.isDirectory()) { - if (!options.recursive) { - // Non-Recursive - common.error("omitting directory '" + src + "'", { continue: true }); - } else { - // Recursive - // 'cp /a/source dest' should create 'source' in 'dest' - var newDest = (destStat && destStat.isDirectory()) ? - path.join(dest, path.basename(src)) : - dest; - - try { - fs.statSync(path.dirname(dest)); - cpdirSyncRecursive(src, newDest, { no_force: options.no_force, followsymlink: options.followsymlink }); - } catch (e) { - common.error("cannot create directory '" + dest + "': No such file or directory"); - } - } - } else { - // If here, src is a file - - // When copying to '/path/dir': - // thisDest = '/path/dir/file1' - var thisDest = dest; - if (destStat && destStat.isDirectory()) { - thisDest = path.normalize(dest + '/' + path.basename(src)); - } - - if (fs.existsSync(thisDest) && options.no_force) { - return; // skip file - } - - copyFileSync(src, thisDest, options); - } - }); // forEach(src) - return new common.ShellString('', common.state.error, common.state.errorCode); -} -module.exports = _cp; diff --git a/node_modules/shelljs/src/dirs.js b/node_modules/shelljs/src/dirs.js deleted file mode 100644 index cf5fe02..0000000 --- a/node_modules/shelljs/src/dirs.js +++ /dev/null @@ -1,200 +0,0 @@ -var common = require('./common'); -var _cd = require('./cd'); -var path = require('path'); - -common.register('dirs', _dirs, { - wrapOutput: false, -}); -common.register('pushd', _pushd, { - wrapOutput: false, -}); -common.register('popd', _popd, { - wrapOutput: false, -}); - -// Pushd/popd/dirs internals -var _dirStack = []; - -function _isStackIndex(index) { - return (/^[\-+]\d+$/).test(index); -} - -function _parseStackIndex(index) { - if (_isStackIndex(index)) { - if (Math.abs(index) < _dirStack.length + 1) { // +1 for pwd - return (/^-/).test(index) ? Number(index) - 1 : Number(index); - } - common.error(index + ': directory stack index out of range'); - } else { - common.error(index + ': invalid number'); - } -} - -function _actualDirStack() { - return [process.cwd()].concat(_dirStack); -} - -//@ -//@ ### pushd([options,] [dir | '-N' | '+N']) -//@ -//@ Available options: -//@ -//@ + `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated. -//@ -//@ Arguments: -//@ -//@ + `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`. -//@ + `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. -//@ + `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. -//@ -//@ Examples: -//@ -//@ ```javascript -//@ // process.cwd() === '/usr' -//@ pushd('/etc'); // Returns /etc /usr -//@ pushd('+1'); // Returns /usr /etc -//@ ``` -//@ -//@ Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack. -function _pushd(options, dir) { - if (_isStackIndex(options)) { - dir = options; - options = ''; - } - - options = common.parseOptions(options, { - 'n': 'no-cd' - }); - - var dirs = _actualDirStack(); - - if (dir === '+0') { - return dirs; // +0 is a noop - } else if (!dir) { - if (dirs.length > 1) { - dirs = dirs.splice(1, 1).concat(dirs); - } else { - return common.error('no other directory'); - } - } else if (_isStackIndex(dir)) { - var n = _parseStackIndex(dir); - dirs = dirs.slice(n).concat(dirs.slice(0, n)); - } else { - if (options['no-cd']) { - dirs.splice(1, 0, dir); - } else { - dirs.unshift(dir); - } - } - - if (options['no-cd']) { - dirs = dirs.slice(1); - } else { - dir = path.resolve(dirs.shift()); - _cd('', dir); - } - - _dirStack = dirs; - return _dirs(''); -} -exports.pushd = _pushd; - -//@ -//@ ### popd([options,] ['-N' | '+N']) -//@ -//@ Available options: -//@ -//@ + `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated. -//@ -//@ Arguments: -//@ -//@ + `+N`: Removes the Nth directory (counting from the left of the list printed by dirs), starting with zero. -//@ + `-N`: Removes the Nth directory (counting from the right of the list printed by dirs), starting with zero. -//@ -//@ Examples: -//@ -//@ ```javascript -//@ echo(process.cwd()); // '/usr' -//@ pushd('/etc'); // '/etc /usr' -//@ echo(process.cwd()); // '/etc' -//@ popd(); // '/usr' -//@ echo(process.cwd()); // '/usr' -//@ ``` -//@ -//@ When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack. -function _popd(options, index) { - if (_isStackIndex(options)) { - index = options; - options = ''; - } - - options = common.parseOptions(options, { - 'n': 'no-cd' - }); - - if (!_dirStack.length) { - return common.error('directory stack empty'); - } - - index = _parseStackIndex(index || '+0'); - - if (options['no-cd'] || index > 0 || _dirStack.length + index === 0) { - index = index > 0 ? index - 1 : index; - _dirStack.splice(index, 1); - } else { - var dir = path.resolve(_dirStack.shift()); - _cd('', dir); - } - - return _dirs(''); -} -exports.popd = _popd; - -//@ -//@ ### dirs([options | '+N' | '-N']) -//@ -//@ Available options: -//@ -//@ + `-c`: Clears the directory stack by deleting all of the elements. -//@ -//@ Arguments: -//@ -//@ + `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero. -//@ + `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero. -//@ -//@ Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified. -//@ -//@ See also: pushd, popd -function _dirs(options, index) { - if (_isStackIndex(options)) { - index = options; - options = ''; - } - - options = common.parseOptions(options, { - 'c': 'clear' - }); - - if (options.clear) { - _dirStack = []; - return _dirStack; - } - - var stack = _actualDirStack(); - - if (index) { - index = _parseStackIndex(index); - - if (index < 0) { - index = stack.length + index; - } - - common.log(stack[index]); - return stack[index]; - } - - common.log(stack.join(' ')); - - return stack; -} -exports.dirs = _dirs; diff --git a/node_modules/shelljs/src/echo.js b/node_modules/shelljs/src/echo.js deleted file mode 100644 index 2b0e7d9..0000000 --- a/node_modules/shelljs/src/echo.js +++ /dev/null @@ -1,34 +0,0 @@ -var common = require('./common'); - -common.register('echo', _echo, { - allowGlobbing: false, -}); - -//@ -//@ ### echo([options,] string [, string ...]) -//@ Available options: -//@ -//@ + `-e`: interpret backslash escapes (default) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ echo('hello world'); -//@ var str = echo('hello world'); -//@ ``` -//@ -//@ Prints string to stdout, and returns string with additional utility methods -//@ like `.to()`. -function _echo(opts, messages) { - // allow strings starting with '-', see issue #20 - messages = [].slice.call(arguments, opts ? 0 : 1); - - if (messages[0] === '-e') { - // ignore -e - messages.shift(); - } - - console.log.apply(console, messages); - return messages.join(' '); -} -module.exports = _echo; diff --git a/node_modules/shelljs/src/error.js b/node_modules/shelljs/src/error.js deleted file mode 100644 index 507c86d..0000000 --- a/node_modules/shelljs/src/error.js +++ /dev/null @@ -1,14 +0,0 @@ -var common = require('./common'); - -//@ -//@ ### error() -//@ Tests if error occurred in the last command. Returns a truthy value if an -//@ error returned and a falsy value otherwise. -//@ -//@ **Note**: do not rely on the -//@ return value to be an error message. If you need the last error message, use -//@ the `.stderr` attribute from the last command's return value instead. -function error() { - return common.state.error; -} -module.exports = error; diff --git a/node_modules/shelljs/src/exec.js b/node_modules/shelljs/src/exec.js deleted file mode 100644 index f6875b1..0000000 --- a/node_modules/shelljs/src/exec.js +++ /dev/null @@ -1,270 +0,0 @@ -var common = require('./common'); -var _tempDir = require('./tempdir'); -var _pwd = require('./pwd'); -var path = require('path'); -var fs = require('fs'); -var child = require('child_process'); - -var DEFAULT_MAXBUFFER_SIZE = 20 * 1024 * 1024; - -common.register('exec', _exec, { - unix: false, - canReceivePipe: true, - wrapOutput: false, -}); - -// Hack to run child_process.exec() synchronously (sync avoids callback hell) -// Uses a custom wait loop that checks for a flag file, created when the child process is done. -// (Can't do a wait loop that checks for internal Node variables/messages as -// Node is single-threaded; callbacks and other internal state changes are done in the -// event loop). -function execSync(cmd, opts, pipe) { - var tempDir = _tempDir(); - var stdoutFile = path.resolve(tempDir + '/' + common.randomFileName()); - var stderrFile = path.resolve(tempDir + '/' + common.randomFileName()); - var codeFile = path.resolve(tempDir + '/' + common.randomFileName()); - var scriptFile = path.resolve(tempDir + '/' + common.randomFileName()); - var sleepFile = path.resolve(tempDir + '/' + common.randomFileName()); - - opts = common.extend({ - silent: common.config.silent, - cwd: _pwd().toString(), - env: process.env, - maxBuffer: DEFAULT_MAXBUFFER_SIZE - }, opts); - - var previousStdoutContent = ''; - var previousStderrContent = ''; - // Echoes stdout and stderr changes from running process, if not silent - function updateStream(streamFile) { - if (opts.silent || !fs.existsSync(streamFile)) { - return; - } - - var previousStreamContent; - var procStream; - if (streamFile === stdoutFile) { - previousStreamContent = previousStdoutContent; - procStream = process.stdout; - } else { // assume stderr - previousStreamContent = previousStderrContent; - procStream = process.stderr; - } - - var streamContent = fs.readFileSync(streamFile, 'utf8'); - // No changes since last time? - if (streamContent.length <= previousStreamContent.length) { - return; - } - - procStream.write(streamContent.substr(previousStreamContent.length)); - previousStreamContent = streamContent; - } - - if (fs.existsSync(scriptFile)) common.unlinkSync(scriptFile); - if (fs.existsSync(stdoutFile)) common.unlinkSync(stdoutFile); - if (fs.existsSync(stderrFile)) common.unlinkSync(stderrFile); - if (fs.existsSync(codeFile)) common.unlinkSync(codeFile); - - var execCommand = JSON.stringify(process.execPath) + ' ' + JSON.stringify(scriptFile); - var script; - - opts.cwd = path.resolve(opts.cwd); - var optString = JSON.stringify(opts); - - if (typeof child.execSync === 'function') { - script = [ - "var child = require('child_process')", - " , fs = require('fs');", - 'var childProcess = child.exec(' + JSON.stringify(cmd) + ', ' + optString + ', function(err) {', - ' fs.writeFileSync(' + JSON.stringify(codeFile) + ", err ? err.code.toString() : '0');", - '});', - 'var stdoutStream = fs.createWriteStream(' + JSON.stringify(stdoutFile) + ');', - 'var stderrStream = fs.createWriteStream(' + JSON.stringify(stderrFile) + ');', - 'childProcess.stdout.pipe(stdoutStream, {end: false});', - 'childProcess.stderr.pipe(stderrStream, {end: false});', - 'childProcess.stdout.pipe(process.stdout);', - 'childProcess.stderr.pipe(process.stderr);' - ].join('\n') + - (pipe ? '\nchildProcess.stdin.end(' + JSON.stringify(pipe) + ');\n' : '\n') + - [ - 'var stdoutEnded = false, stderrEnded = false;', - 'function tryClosingStdout(){ if(stdoutEnded){ stdoutStream.end(); } }', - 'function tryClosingStderr(){ if(stderrEnded){ stderrStream.end(); } }', - "childProcess.stdout.on('end', function(){ stdoutEnded = true; tryClosingStdout(); });", - "childProcess.stderr.on('end', function(){ stderrEnded = true; tryClosingStderr(); });" - ].join('\n'); - - fs.writeFileSync(scriptFile, script); - - if (opts.silent) { - opts.stdio = 'ignore'; - } else { - opts.stdio = [0, 1, 2]; - } - - // Welcome to the future - try { - child.execSync(execCommand, opts); - } catch (e) { - // Clean up immediately if we have an exception - try { common.unlinkSync(scriptFile); } catch (e2) {} - try { common.unlinkSync(stdoutFile); } catch (e2) {} - try { common.unlinkSync(stderrFile); } catch (e2) {} - try { common.unlinkSync(codeFile); } catch (e2) {} - throw e; - } - } else { - cmd += ' > ' + stdoutFile + ' 2> ' + stderrFile; // works on both win/unix - - script = [ - "var child = require('child_process')", - " , fs = require('fs');", - 'var childProcess = child.exec(' + JSON.stringify(cmd) + ', ' + optString + ', function(err) {', - ' fs.writeFileSync(' + JSON.stringify(codeFile) + ", err ? err.code.toString() : '0');", - '});' - ].join('\n') + - (pipe ? '\nchildProcess.stdin.end(' + JSON.stringify(pipe) + ');\n' : '\n'); - - fs.writeFileSync(scriptFile, script); - - child.exec(execCommand, opts); - - // The wait loop - // sleepFile is used as a dummy I/O op to mitigate unnecessary CPU usage - // (tried many I/O sync ops, writeFileSync() seems to be only one that is effective in reducing - // CPU usage, though apparently not so much on Windows) - while (!fs.existsSync(codeFile)) { updateStream(stdoutFile); fs.writeFileSync(sleepFile, 'a'); } - while (!fs.existsSync(stdoutFile)) { updateStream(stdoutFile); fs.writeFileSync(sleepFile, 'a'); } - while (!fs.existsSync(stderrFile)) { updateStream(stderrFile); fs.writeFileSync(sleepFile, 'a'); } - try { common.unlinkSync(sleepFile); } catch (e) {} - } - - // At this point codeFile exists, but it's not necessarily flushed yet. - // Keep reading it until it is. - var code = parseInt('', 10); - while (isNaN(code)) { - code = parseInt(fs.readFileSync(codeFile, 'utf8'), 10); - } - - var stdout = fs.readFileSync(stdoutFile, 'utf8'); - var stderr = fs.readFileSync(stderrFile, 'utf8'); - - // No biggie if we can't erase the files now -- they're in a temp dir anyway - try { common.unlinkSync(scriptFile); } catch (e) {} - try { common.unlinkSync(stdoutFile); } catch (e) {} - try { common.unlinkSync(stderrFile); } catch (e) {} - try { common.unlinkSync(codeFile); } catch (e) {} - - if (code !== 0) { - common.error('', code, { continue: true }); - } - var obj = common.ShellString(stdout, stderr, code); - return obj; -} // execSync() - -// Wrapper around exec() to enable echoing output to console in real time -function execAsync(cmd, opts, pipe, callback) { - var stdout = ''; - var stderr = ''; - - opts = common.extend({ - silent: common.config.silent, - cwd: _pwd().toString(), - env: process.env, - maxBuffer: DEFAULT_MAXBUFFER_SIZE - }, opts); - - var c = child.exec(cmd, opts, function (err) { - if (callback) { - callback(err ? err.code : 0, stdout, stderr); - } - }); - - if (pipe) c.stdin.end(pipe); - - c.stdout.on('data', function (data) { - stdout += data; - if (!opts.silent) process.stdout.write(data); - }); - - c.stderr.on('data', function (data) { - stderr += data; - if (!opts.silent) process.stderr.write(data); - }); - - return c; -} - -//@ -//@ ### exec(command [, options] [, callback]) -//@ Available options (all `false` by default): -//@ -//@ + `async`: Asynchronous execution. If a callback is provided, it will be set to -//@ `true`, regardless of the passed value. -//@ + `silent`: Do not echo program output to console. -//@ + and any option available to NodeJS's -//@ [child_process.exec()](https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ var version = exec('node --version', {silent:true}).stdout; -//@ -//@ var child = exec('some_long_running_process', {async:true}); -//@ child.stdout.on('data', function(data) { -//@ /* ... do something with data ... */ -//@ }); -//@ -//@ exec('some_long_running_process', function(code, stdout, stderr) { -//@ console.log('Exit code:', code); -//@ console.log('Program output:', stdout); -//@ console.log('Program stderr:', stderr); -//@ }); -//@ ``` -//@ -//@ Executes the given `command` _synchronously_, unless otherwise specified. When in synchronous -//@ mode, this returns a ShellString (compatible with ShellJS v0.6.x, which returns an object -//@ of the form `{ code:..., stdout:... , stderr:... }`). Otherwise, this returns the child process -//@ object, and the `callback` gets the arguments `(code, stdout, stderr)`. -//@ -//@ Not seeing the behavior you want? `exec()` runs everything through `sh` -//@ by default (or `cmd.exe` on Windows), which differs from `bash`. If you -//@ need bash-specific behavior, try out the `{shell: 'path/to/bash'}` option. -//@ -//@ **Note:** For long-lived processes, it's best to run `exec()` asynchronously as -//@ the current synchronous implementation uses a lot of CPU. This should be getting -//@ fixed soon. -function _exec(command, options, callback) { - options = options || {}; - if (!command) common.error('must specify command'); - - var pipe = common.readFromPipe(); - - // Callback is defined instead of options. - if (typeof options === 'function') { - callback = options; - options = { async: true }; - } - - // Callback is defined with options. - if (typeof options === 'object' && typeof callback === 'function') { - options.async = true; - } - - options = common.extend({ - silent: common.config.silent, - async: false - }, options); - - try { - if (options.async) { - return execAsync(command, options, pipe, callback); - } else { - return execSync(command, options, pipe); - } - } catch (e) { - common.error('internal error'); - } -} -module.exports = _exec; diff --git a/node_modules/shelljs/src/find.js b/node_modules/shelljs/src/find.js deleted file mode 100644 index f96a51e..0000000 --- a/node_modules/shelljs/src/find.js +++ /dev/null @@ -1,54 +0,0 @@ -var fs = require('fs'); -var path = require('path'); -var common = require('./common'); -var _ls = require('./ls'); - -common.register('find', _find, {}); - -//@ -//@ ### find(path [, path ...]) -//@ ### find(path_array) -//@ Examples: -//@ -//@ ```javascript -//@ find('src', 'lib'); -//@ find(['src', 'lib']); // same as above -//@ find('.').filter(function(file) { return file.match(/\.js$/); }); -//@ ``` -//@ -//@ Returns array of all files (however deep) in the given paths. -//@ -//@ The main difference from `ls('-R', path)` is that the resulting file names -//@ include the base directories, e.g. `lib/resources/file1` instead of just `file1`. -function _find(options, paths) { - if (!paths) { - common.error('no path specified'); - } else if (typeof paths === 'string') { - paths = [].slice.call(arguments, 1); - } - - var list = []; - - function pushFile(file) { - if (common.platform === 'win') { - file = file.replace(/\\/g, '/'); - } - list.push(file); - } - - // why not simply do ls('-R', paths)? because the output wouldn't give the base dirs - // to get the base dir in the output, we need instead ls('-R', 'dir/*') for every directory - - paths.forEach(function (file) { - pushFile(file); - - if (fs.statSync(file).isDirectory()) { - _ls({ recursive: true, all: true }, file).forEach(function (subfile) { - pushFile(path.join(file, subfile)); - }); - } - }); - - return list; -} -module.exports = _find; diff --git a/node_modules/shelljs/src/grep.js b/node_modules/shelljs/src/grep.js deleted file mode 100644 index 30842bc..0000000 --- a/node_modules/shelljs/src/grep.js +++ /dev/null @@ -1,67 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); - -common.register('grep', _grep, { - globStart: 2, // don't glob-expand the regex - canReceivePipe: true, - cmdOptions: { - 'v': 'inverse', - 'l': 'nameOnly', - }, -}); - -//@ -//@ ### grep([options,] regex_filter, file [, file ...]) -//@ ### grep([options,] regex_filter, file_array) -//@ Available options: -//@ -//@ + `-v`: Inverse the sense of the regex and print the lines not matching the criteria. -//@ + `-l`: Print only filenames of matching files -//@ -//@ Examples: -//@ -//@ ```javascript -//@ grep('-v', 'GLOBAL_VARIABLE', '*.js'); -//@ grep('GLOBAL_VARIABLE', '*.js'); -//@ ``` -//@ -//@ Reads input string from given files and returns a string containing all lines of the -//@ file that match the given `regex_filter`. -function _grep(options, regex, files) { - // Check if this is coming from a pipe - var pipe = common.readFromPipe(); - - if (!files && !pipe) common.error('no paths given', 2); - - files = [].slice.call(arguments, 2); - - if (pipe) { - files.unshift('-'); - } - - var grep = []; - files.forEach(function (file) { - if (!fs.existsSync(file) && file !== '-') { - common.error('no such file or directory: ' + file, 2, { continue: true }); - return; - } - - var contents = file === '-' ? pipe : fs.readFileSync(file, 'utf8'); - var lines = contents.split(/\r*\n/); - if (options.nameOnly) { - if (contents.match(regex)) { - grep.push(file); - } - } else { - lines.forEach(function (line) { - var matched = line.match(regex); - if ((options.inverse && !matched) || (!options.inverse && matched)) { - grep.push(line); - } - }); - } - }); - - return grep.join('\n') + '\n'; -} -module.exports = _grep; diff --git a/node_modules/shelljs/src/head.js b/node_modules/shelljs/src/head.js deleted file mode 100644 index 13d5829..0000000 --- a/node_modules/shelljs/src/head.js +++ /dev/null @@ -1,104 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); - -common.register('head', _head, { - canReceivePipe: true, - cmdOptions: { - 'n': 'numLines', - }, -}); - -// This reads n or more lines, or the entire file, whichever is less. -function readSomeLines(file, numLines) { - var BUF_LENGTH = 64 * 1024; - var buf = new Buffer(BUF_LENGTH); - var bytesRead = BUF_LENGTH; - var pos = 0; - var fdr = null; - - try { - fdr = fs.openSync(file, 'r'); - } catch (e) { - common.error('cannot read file: ' + file); - } - - var numLinesRead = 0; - var ret = ''; - while (bytesRead === BUF_LENGTH && numLinesRead < numLines) { - bytesRead = fs.readSync(fdr, buf, 0, BUF_LENGTH, pos); - var bufStr = buf.toString('utf8', 0, bytesRead); - numLinesRead += bufStr.split('\n').length - 1; - ret += bufStr; - pos += bytesRead; - } - - fs.closeSync(fdr); - return ret; -} -//@ -//@ ### head([{'-n': \},] file [, file ...]) -//@ ### head([{'-n': \},] file_array) -//@ Available options: -//@ -//@ + `-n `: Show the first `` lines of the files -//@ -//@ Examples: -//@ -//@ ```javascript -//@ var str = head({'-n': 1}, 'file*.txt'); -//@ var str = head('file1', 'file2'); -//@ var str = head(['file1', 'file2']); // same as above -//@ ``` -//@ -//@ Read the start of a file. -function _head(options, files) { - var head = []; - var pipe = common.readFromPipe(); - - if (!files && !pipe) common.error('no paths given'); - - var idx = 1; - if (options.numLines === true) { - idx = 2; - options.numLines = Number(arguments[1]); - } else if (options.numLines === false) { - options.numLines = 10; - } - files = [].slice.call(arguments, idx); - - if (pipe) { - files.unshift('-'); - } - - var shouldAppendNewline = false; - files.forEach(function (file) { - if (!fs.existsSync(file) && file !== '-') { - common.error('no such file or directory: ' + file, { continue: true }); - return; - } - - var contents; - if (file === '-') { - contents = pipe; - } else if (options.numLines < 0) { - contents = fs.readFileSync(file, 'utf8'); - } else { - contents = readSomeLines(file, options.numLines); - } - - var lines = contents.split('\n'); - var hasTrailingNewline = (lines[lines.length - 1] === ''); - if (hasTrailingNewline) { - lines.pop(); - } - shouldAppendNewline = (hasTrailingNewline || options.numLines < lines.length); - - head = head.concat(lines.slice(0, options.numLines)); - }); - - if (shouldAppendNewline) { - head.push(''); // to add a trailing newline once we join - } - return head.join('\n'); -} -module.exports = _head; diff --git a/node_modules/shelljs/src/ln.js b/node_modules/shelljs/src/ln.js deleted file mode 100644 index 7393d9f..0000000 --- a/node_modules/shelljs/src/ln.js +++ /dev/null @@ -1,72 +0,0 @@ -var fs = require('fs'); -var path = require('path'); -var common = require('./common'); - -common.register('ln', _ln, { - cmdOptions: { - 's': 'symlink', - 'f': 'force', - }, -}); - -//@ -//@ ### ln([options,] source, dest) -//@ Available options: -//@ -//@ + `-s`: symlink -//@ + `-f`: force -//@ -//@ Examples: -//@ -//@ ```javascript -//@ ln('file', 'newlink'); -//@ ln('-sf', 'file', 'existing'); -//@ ``` -//@ -//@ Links source to dest. Use -f to force the link, should dest already exist. -function _ln(options, source, dest) { - if (!source || !dest) { - common.error('Missing and/or '); - } - - source = String(source); - var sourcePath = path.normalize(source).replace(RegExp(path.sep + '$'), ''); - var isAbsolute = (path.resolve(source) === sourcePath); - dest = path.resolve(process.cwd(), String(dest)); - - if (fs.existsSync(dest)) { - if (!options.force) { - common.error('Destination file exists', { continue: true }); - } - - fs.unlinkSync(dest); - } - - if (options.symlink) { - var isWindows = common.platform === 'win'; - var linkType = isWindows ? 'file' : null; - var resolvedSourcePath = isAbsolute ? sourcePath : path.resolve(process.cwd(), path.dirname(dest), source); - if (!fs.existsSync(resolvedSourcePath)) { - common.error('Source file does not exist', { continue: true }); - } else if (isWindows && fs.statSync(resolvedSourcePath).isDirectory()) { - linkType = 'junction'; - } - - try { - fs.symlinkSync(linkType === 'junction' ? resolvedSourcePath : source, dest, linkType); - } catch (err) { - common.error(err.message); - } - } else { - if (!fs.existsSync(source)) { - common.error('Source file does not exist', { continue: true }); - } - try { - fs.linkSync(source, dest); - } catch (err) { - common.error(err.message); - } - } - return ''; -} -module.exports = _ln; diff --git a/node_modules/shelljs/src/ls.js b/node_modules/shelljs/src/ls.js deleted file mode 100644 index 7f25056..0000000 --- a/node_modules/shelljs/src/ls.js +++ /dev/null @@ -1,121 +0,0 @@ -var path = require('path'); -var fs = require('fs'); -var common = require('./common'); -var glob = require('glob'); - -var globPatternRecursive = path.sep + '**' + path.sep + '*'; - -common.register('ls', _ls, { - cmdOptions: { - 'R': 'recursive', - 'A': 'all', - 'a': 'all_deprecated', - 'd': 'directory', - 'l': 'long', - }, -}); - -//@ -//@ ### ls([options,] [path, ...]) -//@ ### ls([options,] path_array) -//@ Available options: -//@ -//@ + `-R`: recursive -//@ + `-A`: all files (include files beginning with `.`, except for `.` and `..`) -//@ + `-d`: list directories themselves, not their contents -//@ + `-l`: list objects representing each file, each with fields containing `ls -//@ -l` output fields. See -//@ [fs.Stats](https://nodejs.org/api/fs.html#fs_class_fs_stats) -//@ for more info -//@ -//@ Examples: -//@ -//@ ```javascript -//@ ls('projs/*.js'); -//@ ls('-R', '/users/me', '/tmp'); -//@ ls('-R', ['/users/me', '/tmp']); // same as above -//@ ls('-l', 'file.txt'); // { name: 'file.txt', mode: 33188, nlink: 1, ...} -//@ ``` -//@ -//@ Returns array of files in the given path, or in current directory if no path provided. -function _ls(options, paths) { - if (options.all_deprecated) { - // We won't support the -a option as it's hard to image why it's useful - // (it includes '.' and '..' in addition to '.*' files) - // For backwards compatibility we'll dump a deprecated message and proceed as before - common.log('ls: Option -a is deprecated. Use -A instead'); - options.all = true; - } - - if (!paths) { - paths = ['.']; - } else { - paths = [].slice.call(arguments, 1); - } - - var list = []; - - function pushFile(abs, relName, stat) { - if (process.platform === 'win32') { - relName = relName.replace(/\\/g, '/'); - } - if (options.long) { - stat = stat || fs.lstatSync(abs); - list.push(addLsAttributes(relName, stat)); - } else { - // list.push(path.relative(rel || '.', file)); - list.push(relName); - } - } - - paths.forEach(function (p) { - var stat; - - try { - stat = fs.lstatSync(p); - } catch (e) { - common.error('no such file or directory: ' + p, 2, { continue: true }); - return; - } - - // If the stat succeeded - if (stat.isDirectory() && !options.directory) { - if (options.recursive) { - // use glob, because it's simple - glob.sync(p + globPatternRecursive, { dot: options.all }) - .forEach(function (item) { - pushFile(item, path.relative(p, item)); - }); - } else if (options.all) { - // use fs.readdirSync, because it's fast - fs.readdirSync(p).forEach(function (item) { - pushFile(path.join(p, item), item); - }); - } else { - // use fs.readdirSync and then filter out secret files - fs.readdirSync(p).forEach(function (item) { - if (item[0] !== '.') { - pushFile(path.join(p, item), item); - } - }); - } - } else { - pushFile(p, p, stat); - } - }); - - // Add methods, to make this more compatible with ShellStrings - return list; -} - -function addLsAttributes(pathName, stats) { - // Note: this object will contain more information than .toString() returns - stats.name = pathName; - stats.toString = function () { - // Return a string resembling unix's `ls -l` format - return [this.mode, this.nlink, this.uid, this.gid, this.size, this.mtime, this.name].join(' '); - }; - return stats; -} - -module.exports = _ls; diff --git a/node_modules/shelljs/src/mkdir.js b/node_modules/shelljs/src/mkdir.js deleted file mode 100644 index f211bc8..0000000 --- a/node_modules/shelljs/src/mkdir.js +++ /dev/null @@ -1,92 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); -var path = require('path'); - -common.register('mkdir', _mkdir, { - cmdOptions: { - 'p': 'fullpath', - }, -}); - -// Recursively creates 'dir' -function mkdirSyncRecursive(dir) { - var baseDir = path.dirname(dir); - - // Prevents some potential problems arising from malformed UNCs or - // insufficient permissions. - /* istanbul ignore next */ - if (baseDir === dir) { - common.error('dirname() failed: [' + dir + ']'); - } - - // Base dir exists, no recursion necessary - if (fs.existsSync(baseDir)) { - fs.mkdirSync(dir, parseInt('0777', 8)); - return; - } - - // Base dir does not exist, go recursive - mkdirSyncRecursive(baseDir); - - // Base dir created, can create dir - fs.mkdirSync(dir, parseInt('0777', 8)); -} - -//@ -//@ ### mkdir([options,] dir [, dir ...]) -//@ ### mkdir([options,] dir_array) -//@ Available options: -//@ -//@ + `-p`: full path (will create intermediate dirs if necessary) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g'); -//@ mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above -//@ ``` -//@ -//@ Creates directories. -function _mkdir(options, dirs) { - if (!dirs) common.error('no paths given'); - - if (typeof dirs === 'string') { - dirs = [].slice.call(arguments, 1); - } - // if it's array leave it as it is - - dirs.forEach(function (dir) { - try { - fs.lstatSync(dir); - if (!options.fullpath) { - common.error('path already exists: ' + dir, { continue: true }); - } - return; // skip dir - } catch (e) { - // do nothing - } - - // Base dir does not exist, and no -p option given - var baseDir = path.dirname(dir); - if (!fs.existsSync(baseDir) && !options.fullpath) { - common.error('no such file or directory: ' + baseDir, { continue: true }); - return; // skip dir - } - - try { - if (options.fullpath) { - mkdirSyncRecursive(dir); - } else { - fs.mkdirSync(dir, parseInt('0777', 8)); - } - } catch (e) { - if (e.code === 'EACCES') { - common.error('cannot create directory ' + dir + ': Permission denied'); - } else { - throw e; - } - } - }); - return ''; -} // mkdir -module.exports = _mkdir; diff --git a/node_modules/shelljs/src/mv.js b/node_modules/shelljs/src/mv.js deleted file mode 100644 index c09bbbc..0000000 --- a/node_modules/shelljs/src/mv.js +++ /dev/null @@ -1,95 +0,0 @@ -var fs = require('fs'); -var path = require('path'); -var common = require('./common'); -var cp = require('./cp'); -var rm = require('./rm'); - -common.register('mv', _mv, { - cmdOptions: { - 'f': '!no_force', - 'n': 'no_force', - }, -}); - -//@ -//@ ### mv([options ,] source [, source ...], dest') -//@ ### mv([options ,] source_array, dest') -//@ Available options: -//@ -//@ + `-f`: force (default behavior) -//@ + `-n`: no-clobber -//@ -//@ Examples: -//@ -//@ ```javascript -//@ mv('-n', 'file', 'dir/'); -//@ mv('file1', 'file2', 'dir/'); -//@ mv(['file1', 'file2'], 'dir/'); // same as above -//@ ``` -//@ -//@ Moves files. -function _mv(options, sources, dest) { - // Get sources, dest - if (arguments.length < 3) { - common.error('missing and/or '); - } else if (arguments.length > 3) { - sources = [].slice.call(arguments, 1, arguments.length - 1); - dest = arguments[arguments.length - 1]; - } else if (typeof sources === 'string') { - sources = [sources]; - } else { - common.error('invalid arguments'); - } - - var exists = fs.existsSync(dest); - var stats = exists && fs.statSync(dest); - - // Dest is not existing dir, but multiple sources given - if ((!exists || !stats.isDirectory()) && sources.length > 1) { - common.error('dest is not a directory (too many sources)'); - } - - // Dest is an existing file, but no -f given - if (exists && stats.isFile() && options.no_force) { - common.error('dest file already exists: ' + dest); - } - - sources.forEach(function (src) { - if (!fs.existsSync(src)) { - common.error('no such file or directory: ' + src, { continue: true }); - return; // skip file - } - - // If here, src exists - - // When copying to '/path/dir': - // thisDest = '/path/dir/file1' - var thisDest = dest; - if (fs.existsSync(dest) && fs.statSync(dest).isDirectory()) { - thisDest = path.normalize(dest + '/' + path.basename(src)); - } - - if (fs.existsSync(thisDest) && options.no_force) { - common.error('dest file already exists: ' + thisDest, { continue: true }); - return; // skip file - } - - if (path.resolve(src) === path.dirname(path.resolve(thisDest))) { - common.error('cannot move to self: ' + src, { continue: true }); - return; // skip file - } - - try { - fs.renameSync(src, thisDest); - } catch (e) { - if (e.code === 'EXDEV') { // external partition - // if either of these fails, the appropriate error message will bubble - // up to the top level automatically - cp('-r', src, thisDest); - rm('-rf', src); - } - } - }); // forEach(src) - return ''; -} // mv -module.exports = _mv; diff --git a/node_modules/shelljs/src/popd.js b/node_modules/shelljs/src/popd.js deleted file mode 100644 index d9eac3f..0000000 --- a/node_modules/shelljs/src/popd.js +++ /dev/null @@ -1 +0,0 @@ -// see dirs.js diff --git a/node_modules/shelljs/src/pushd.js b/node_modules/shelljs/src/pushd.js deleted file mode 100644 index d9eac3f..0000000 --- a/node_modules/shelljs/src/pushd.js +++ /dev/null @@ -1 +0,0 @@ -// see dirs.js diff --git a/node_modules/shelljs/src/pwd.js b/node_modules/shelljs/src/pwd.js deleted file mode 100644 index 3861851..0000000 --- a/node_modules/shelljs/src/pwd.js +++ /dev/null @@ -1,15 +0,0 @@ -var path = require('path'); -var common = require('./common'); - -common.register('pwd', _pwd, { - allowGlobbing: false, -}); - -//@ -//@ ### pwd() -//@ Returns the current directory. -function _pwd() { - var pwd = path.resolve(process.cwd()); - return pwd; -} -module.exports = _pwd; diff --git a/node_modules/shelljs/src/rm.js b/node_modules/shelljs/src/rm.js deleted file mode 100644 index d6e484a..0000000 --- a/node_modules/shelljs/src/rm.js +++ /dev/null @@ -1,153 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); - -common.register('rm', _rm, { - cmdOptions: { - 'f': 'force', - 'r': 'recursive', - 'R': 'recursive', - }, -}); - -// Recursively removes 'dir' -// Adapted from https://github.com/ryanmcgrath/wrench-js -// -// Copyright (c) 2010 Ryan McGrath -// Copyright (c) 2012 Artur Adib -// -// Licensed under the MIT License -// http://www.opensource.org/licenses/mit-license.php -function rmdirSyncRecursive(dir, force) { - var files; - - files = fs.readdirSync(dir); - - // Loop through and delete everything in the sub-tree after checking it - for (var i = 0; i < files.length; i++) { - var file = dir + '/' + files[i]; - var currFile = fs.lstatSync(file); - - if (currFile.isDirectory()) { // Recursive function back to the beginning - rmdirSyncRecursive(file, force); - } else { // Assume it's a file - perhaps a try/catch belongs here? - if (force || isWriteable(file)) { - try { - common.unlinkSync(file); - } catch (e) { - common.error('could not remove file (code ' + e.code + '): ' + file, { continue: true }); - } - } - } - } - - // Now that we know everything in the sub-tree has been deleted, we can delete the main directory. - // Huzzah for the shopkeep. - - var result; - try { - // Retry on windows, sometimes it takes a little time before all the files in the directory are gone - var start = Date.now(); - while (true) { - try { - result = fs.rmdirSync(dir); - if (fs.existsSync(dir)) throw { code: 'EAGAIN' }; - break; - } catch (er) { - // In addition to error codes, also check if the directory still exists and loop again if true - if (process.platform === 'win32' && (er.code === 'ENOTEMPTY' || er.code === 'EBUSY' || er.code === 'EPERM' || er.code === 'EAGAIN')) { - if (Date.now() - start > 1000) throw er; - } else if (er.code === 'ENOENT') { - // Directory did not exist, deletion was successful - break; - } else { - throw er; - } - } - } - } catch (e) { - common.error('could not remove directory (code ' + e.code + '): ' + dir, { continue: true }); - } - - return result; -} // rmdirSyncRecursive - -// Hack to determine if file has write permissions for current user -// Avoids having to check user, group, etc, but it's probably slow -function isWriteable(file) { - var writePermission = true; - try { - var __fd = fs.openSync(file, 'a'); - fs.closeSync(__fd); - } catch (e) { - writePermission = false; - } - - return writePermission; -} - -//@ -//@ ### rm([options,] file [, file ...]) -//@ ### rm([options,] file_array) -//@ Available options: -//@ -//@ + `-f`: force -//@ + `-r, -R`: recursive -//@ -//@ Examples: -//@ -//@ ```javascript -//@ rm('-rf', '/tmp/*'); -//@ rm('some_file.txt', 'another_file.txt'); -//@ rm(['some_file.txt', 'another_file.txt']); // same as above -//@ ``` -//@ -//@ Removes files. -function _rm(options, files) { - if (!files) common.error('no paths given'); - - // Convert to array - files = [].slice.call(arguments, 1); - - files.forEach(function (file) { - var stats; - try { - stats = fs.lstatSync(file); // test for existence - } catch (e) { - // Path does not exist, no force flag given - if (!options.force) { - common.error('no such file or directory: ' + file, { continue: true }); - } - return; // skip file - } - - // If here, path exists - if (stats.isFile() || stats.isSymbolicLink()) { - // Do not check for file writing permissions - if (options.force) { - common.unlinkSync(file); - return; - } - - if (isWriteable(file)) { - common.unlinkSync(file); - } else { - common.error('permission denied: ' + file, { continue: true }); - } - - return; - } // simple file - - // Path is an existing directory, but no -r flag given - if (stats.isDirectory() && !options.recursive) { - common.error('path is a directory', { continue: true }); - return; // skip path - } - - // Recursively remove existing directory - if (stats.isDirectory() && options.recursive) { - rmdirSyncRecursive(file, options.force); - } - }); // forEach(file) - return ''; -} // rm -module.exports = _rm; diff --git a/node_modules/shelljs/src/sed.js b/node_modules/shelljs/src/sed.js deleted file mode 100644 index 590ba74..0000000 --- a/node_modules/shelljs/src/sed.js +++ /dev/null @@ -1,77 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); - -common.register('sed', _sed, { - globStart: 3, // don't glob-expand regexes - canReceivePipe: true, - cmdOptions: { - 'i': 'inplace', - }, -}); - -//@ -//@ ### sed([options,] search_regex, replacement, file [, file ...]) -//@ ### sed([options,] search_regex, replacement, file_array) -//@ Available options: -//@ -//@ + `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_ -//@ -//@ Examples: -//@ -//@ ```javascript -//@ sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js'); -//@ sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js'); -//@ ``` -//@ -//@ Reads an input string from `files` and performs a JavaScript `replace()` on the input -//@ using the given search regex and replacement string or function. Returns the new string after replacement. -function _sed(options, regex, replacement, files) { - // Check if this is coming from a pipe - var pipe = common.readFromPipe(); - - if (typeof replacement !== 'string' && typeof replacement !== 'function') { - if (typeof replacement === 'number') { - replacement = replacement.toString(); // fallback - } else { - common.error('invalid replacement string'); - } - } - - // Convert all search strings to RegExp - if (typeof regex === 'string') { - regex = RegExp(regex); - } - - if (!files && !pipe) { - common.error('no files given'); - } - - files = [].slice.call(arguments, 3); - - if (pipe) { - files.unshift('-'); - } - - var sed = []; - files.forEach(function (file) { - if (!fs.existsSync(file) && file !== '-') { - common.error('no such file or directory: ' + file, 2, { continue: true }); - return; - } - - var contents = file === '-' ? pipe : fs.readFileSync(file, 'utf8'); - var lines = contents.split(/\r*\n/); - var result = lines.map(function (line) { - return line.replace(regex, replacement); - }).join('\n'); - - sed.push(result); - - if (options.inplace) { - fs.writeFileSync(file, result, 'utf8'); - } - }); - - return sed.join('\n'); -} -module.exports = _sed; diff --git a/node_modules/shelljs/src/set.js b/node_modules/shelljs/src/set.js deleted file mode 100644 index 3402cd6..0000000 --- a/node_modules/shelljs/src/set.js +++ /dev/null @@ -1,55 +0,0 @@ -var common = require('./common'); - -common.register('set', _set, { - allowGlobbing: false, - wrapOutput: false, -}); - -//@ -//@ ### set(options) -//@ Available options: -//@ -//@ + `+/-e`: exit upon error (`config.fatal`) -//@ + `+/-v`: verbose: show all commands (`config.verbose`) -//@ + `+/-f`: disable filename expansion (globbing) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ set('-e'); // exit upon first error -//@ set('+e'); // this undoes a "set('-e')" -//@ ``` -//@ -//@ Sets global configuration variables -function _set(options) { - if (!options) { - var args = [].slice.call(arguments, 0); - if (args.length < 2) common.error('must provide an argument'); - options = args[1]; - } - var negate = (options[0] === '+'); - if (negate) { - options = '-' + options.slice(1); // parseOptions needs a '-' prefix - } - options = common.parseOptions(options, { - 'e': 'fatal', - 'v': 'verbose', - 'f': 'noglob' - }); - - if (negate) { - Object.keys(options).forEach(function (key) { - options[key] = !options[key]; - }); - } - - Object.keys(options).forEach(function (key) { - // Only change the global config if `negate` is false and the option is true - // or if `negate` is true and the option is false (aka negate !== option) - if (negate !== options[key]) { - common.config[key] = options[key]; - } - }); - return; -} -module.exports = _set; diff --git a/node_modules/shelljs/src/sort.js b/node_modules/shelljs/src/sort.js deleted file mode 100644 index 041b037..0000000 --- a/node_modules/shelljs/src/sort.js +++ /dev/null @@ -1,91 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); - -common.register('sort', _sort, { - canReceivePipe: true, - cmdOptions: { - 'r': 'reverse', - 'n': 'numerical', - }, -}); - -// parse out the number prefix of a line -function parseNumber(str) { - var match = str.match(/^\s*(\d*)\s*(.*)$/); - return { num: Number(match[1]), value: match[2] }; -} - -// compare two strings case-insensitively, but examine case for strings that are -// case-insensitive equivalent -function unixCmp(a, b) { - var aLower = a.toLowerCase(); - var bLower = b.toLowerCase(); - return (aLower === bLower ? - -1 * a.localeCompare(b) : // unix sort treats case opposite how javascript does - aLower.localeCompare(bLower)); -} - -// compare two strings in the fashion that unix sort's -n option works -function numericalCmp(a, b) { - var objA = parseNumber(a); - var objB = parseNumber(b); - if (objA.hasOwnProperty('num') && objB.hasOwnProperty('num')) { - return ((objA.num !== objB.num) ? - (objA.num - objB.num) : - unixCmp(objA.value, objB.value)); - } else { - return unixCmp(objA.value, objB.value); - } -} - -//@ -//@ ### sort([options,] file [, file ...]) -//@ ### sort([options,] file_array) -//@ Available options: -//@ -//@ + `-r`: Reverse the result of comparisons -//@ + `-n`: Compare according to numerical value -//@ -//@ Examples: -//@ -//@ ```javascript -//@ sort('foo.txt', 'bar.txt'); -//@ sort('-r', 'foo.txt'); -//@ ``` -//@ -//@ Return the contents of the files, sorted line-by-line. Sorting multiple -//@ files mixes their content, just like unix sort does. -function _sort(options, files) { - // Check if this is coming from a pipe - var pipe = common.readFromPipe(); - - if (!files && !pipe) common.error('no files given'); - - files = [].slice.call(arguments, 1); - - if (pipe) { - files.unshift('-'); - } - - var lines = []; - files.forEach(function (file) { - if (!fs.existsSync(file) && file !== '-') { - // exit upon any sort of error - common.error('no such file or directory: ' + file); - } - - var contents = file === '-' ? pipe : fs.readFileSync(file, 'utf8'); - lines = lines.concat(contents.trimRight().split(/\r*\n/)); - }); - - var sorted; - sorted = lines.sort(options.numerical ? numericalCmp : unixCmp); - - if (options.reverse) { - sorted = sorted.reverse(); - } - - return sorted.join('\n') + '\n'; -} - -module.exports = _sort; diff --git a/node_modules/shelljs/src/tail.js b/node_modules/shelljs/src/tail.js deleted file mode 100644 index 7ece654..0000000 --- a/node_modules/shelljs/src/tail.js +++ /dev/null @@ -1,72 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); - -common.register('tail', _tail, { - canReceivePipe: true, - cmdOptions: { - 'n': 'numLines', - }, -}); - -//@ -//@ ### tail([{'-n': \},] file [, file ...]) -//@ ### tail([{'-n': \},] file_array) -//@ Available options: -//@ -//@ + `-n `: Show the last `` lines of the files -//@ -//@ Examples: -//@ -//@ ```javascript -//@ var str = tail({'-n': 1}, 'file*.txt'); -//@ var str = tail('file1', 'file2'); -//@ var str = tail(['file1', 'file2']); // same as above -//@ ``` -//@ -//@ Read the end of a file. -function _tail(options, files) { - var tail = []; - var pipe = common.readFromPipe(); - - if (!files && !pipe) common.error('no paths given'); - - var idx = 1; - if (options.numLines === true) { - idx = 2; - options.numLines = Number(arguments[1]); - } else if (options.numLines === false) { - options.numLines = 10; - } - options.numLines = -1 * Math.abs(options.numLines); - files = [].slice.call(arguments, idx); - - if (pipe) { - files.unshift('-'); - } - - var shouldAppendNewline = false; - files.forEach(function (file) { - if (!fs.existsSync(file) && file !== '-') { - common.error('no such file or directory: ' + file, { continue: true }); - return; - } - - var contents = file === '-' ? pipe : fs.readFileSync(file, 'utf8'); - - var lines = contents.split('\n'); - if (lines[lines.length - 1] === '') { - lines.pop(); - shouldAppendNewline = true; - } else { - shouldAppendNewline = false; - } - - tail = tail.concat(lines.slice(options.numLines)); - }); - - if (shouldAppendNewline) { - tail.push(''); // to add a trailing newline once we join - } - return tail.join('\n'); -} -module.exports = _tail; diff --git a/node_modules/shelljs/src/tempdir.js b/node_modules/shelljs/src/tempdir.js deleted file mode 100644 index cfd56b3..0000000 --- a/node_modules/shelljs/src/tempdir.js +++ /dev/null @@ -1,59 +0,0 @@ -var common = require('./common'); -var os = require('os'); -var fs = require('fs'); - -common.register('tempdir', _tempDir, { - allowGlobbing: false, - wrapOutput: false, -}); - -// Returns false if 'dir' is not a writeable directory, 'dir' otherwise -function writeableDir(dir) { - if (!dir || !fs.existsSync(dir)) return false; - - if (!fs.statSync(dir).isDirectory()) return false; - - var testFile = dir + '/' + common.randomFileName(); - try { - fs.writeFileSync(testFile, ' '); - common.unlinkSync(testFile); - return dir; - } catch (e) { - return false; - } -} - - -//@ -//@ ### tempdir() -//@ -//@ Examples: -//@ -//@ ```javascript -//@ var tmp = tempdir(); // "/tmp" for most *nix platforms -//@ ``` -//@ -//@ Searches and returns string containing a writeable, platform-dependent temporary directory. -//@ Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir). -function _tempDir() { - var state = common.state; - if (state.tempDir) return state.tempDir; // from cache - - state.tempDir = writeableDir(os.tmpdir && os.tmpdir()) || // node 0.10+ - writeableDir(os.tmpDir && os.tmpDir()) || // node 0.8+ - writeableDir(process.env.TMPDIR) || - writeableDir(process.env.TEMP) || - writeableDir(process.env.TMP) || - writeableDir(process.env.Wimp$ScrapDir) || // RiscOS - writeableDir('C:\\TEMP') || // Windows - writeableDir('C:\\TMP') || // Windows - writeableDir('\\TEMP') || // Windows - writeableDir('\\TMP') || // Windows - writeableDir('/tmp') || - writeableDir('/var/tmp') || - writeableDir('/usr/tmp') || - writeableDir('.'); // last resort - - return state.tempDir; -} -module.exports = _tempDir; diff --git a/node_modules/shelljs/src/test.js b/node_modules/shelljs/src/test.js deleted file mode 100644 index 3fb38ae..0000000 --- a/node_modules/shelljs/src/test.js +++ /dev/null @@ -1,81 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); - -common.register('test', _test, { - cmdOptions: { - 'b': 'block', - 'c': 'character', - 'd': 'directory', - 'e': 'exists', - 'f': 'file', - 'L': 'link', - 'p': 'pipe', - 'S': 'socket', - }, - wrapOutput: false, - allowGlobbing: false, -}); - - -//@ -//@ ### test(expression) -//@ Available expression primaries: -//@ -//@ + `'-b', 'path'`: true if path is a block device -//@ + `'-c', 'path'`: true if path is a character device -//@ + `'-d', 'path'`: true if path is a directory -//@ + `'-e', 'path'`: true if path exists -//@ + `'-f', 'path'`: true if path is a regular file -//@ + `'-L', 'path'`: true if path is a symbolic link -//@ + `'-p', 'path'`: true if path is a pipe (FIFO) -//@ + `'-S', 'path'`: true if path is a socket -//@ -//@ Examples: -//@ -//@ ```javascript -//@ if (test('-d', path)) { /* do something with dir */ }; -//@ if (!test('-f', path)) continue; // skip if it's a regular file -//@ ``` -//@ -//@ Evaluates expression using the available primaries and returns corresponding value. -function _test(options, path) { - if (!path) common.error('no path given'); - - var canInterpret = false; - Object.keys(options).forEach(function (key) { - if (options[key] === true) { - canInterpret = true; - } - }); - - if (!canInterpret) common.error('could not interpret expression'); - - if (options.link) { - try { - return fs.lstatSync(path).isSymbolicLink(); - } catch (e) { - return false; - } - } - - if (!fs.existsSync(path)) return false; - - if (options.exists) return true; - - var stats = fs.statSync(path); - - if (options.block) return stats.isBlockDevice(); - - if (options.character) return stats.isCharacterDevice(); - - if (options.directory) return stats.isDirectory(); - - if (options.file) return stats.isFile(); - - if (options.pipe) return stats.isFIFO(); - - if (options.socket) return stats.isSocket(); - - return false; // fallback -} // test -module.exports = _test; diff --git a/node_modules/shelljs/src/to.js b/node_modules/shelljs/src/to.js deleted file mode 100644 index 99f194e..0000000 --- a/node_modules/shelljs/src/to.js +++ /dev/null @@ -1,36 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); -var path = require('path'); - -common.register('to', _to, { - pipeOnly: true, - wrapOutput: false, -}); - -//@ -//@ ### ShellString.prototype.to(file) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ cat('input.txt').to('output.txt'); -//@ ``` -//@ -//@ Analogous to the redirection operator `>` in Unix, but works with -//@ ShellStrings (such as those returned by `cat`, `grep`, etc). _Like Unix -//@ redirections, `to()` will overwrite any existing file!_ -function _to(options, file) { - if (!file) common.error('wrong arguments'); - - if (!fs.existsSync(path.dirname(file))) { - common.error('no such file or directory: ' + path.dirname(file)); - } - - try { - fs.writeFileSync(file, this.stdout || this.toString(), 'utf8'); - return this; - } catch (e) { - common.error('could not write to file (code ' + e.code + '): ' + file, { continue: true }); - } -} -module.exports = _to; diff --git a/node_modules/shelljs/src/toEnd.js b/node_modules/shelljs/src/toEnd.js deleted file mode 100644 index cf91c94..0000000 --- a/node_modules/shelljs/src/toEnd.js +++ /dev/null @@ -1,35 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); -var path = require('path'); - -common.register('toEnd', _toEnd, { - pipeOnly: true, - wrapOutput: false, -}); - -//@ -//@ ### ShellString.prototype.toEnd(file) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ cat('input.txt').toEnd('output.txt'); -//@ ``` -//@ -//@ Analogous to the redirect-and-append operator `>>` in Unix, but works with -//@ ShellStrings (such as those returned by `cat`, `grep`, etc). -function _toEnd(options, file) { - if (!file) common.error('wrong arguments'); - - if (!fs.existsSync(path.dirname(file))) { - common.error('no such file or directory: ' + path.dirname(file)); - } - - try { - fs.appendFileSync(file, this.stdout || this.toString(), 'utf8'); - return this; - } catch (e) { - common.error('could not append to file (code ' + e.code + '): ' + file, { continue: true }); - } -} -module.exports = _toEnd; diff --git a/node_modules/shelljs/src/touch.js b/node_modules/shelljs/src/touch.js deleted file mode 100644 index b672b2d..0000000 --- a/node_modules/shelljs/src/touch.js +++ /dev/null @@ -1,110 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); - -common.register('touch', _touch, { - cmdOptions: { - 'a': 'atime_only', - 'c': 'no_create', - 'd': 'date', - 'm': 'mtime_only', - 'r': 'reference', - }, -}); - -//@ -//@ ### touch([options,] file [, file ...]) -//@ ### touch([options,] file_array) -//@ Available options: -//@ -//@ + `-a`: Change only the access time -//@ + `-c`: Do not create any files -//@ + `-m`: Change only the modification time -//@ + `-d DATE`: Parse DATE and use it instead of current time -//@ + `-r FILE`: Use FILE's times instead of current time -//@ -//@ Examples: -//@ -//@ ```javascript -//@ touch('source.js'); -//@ touch('-c', '/path/to/some/dir/source.js'); -//@ touch({ '-r': FILE }, '/path/to/some/dir/source.js'); -//@ ``` -//@ -//@ Update the access and modification times of each FILE to the current time. -//@ A FILE argument that does not exist is created empty, unless -c is supplied. -//@ This is a partial implementation of *[touch(1)](http://linux.die.net/man/1/touch)*. -function _touch(opts, files) { - if (!files) { - common.error('no files given'); - } else if (typeof files === 'string') { - files = [].slice.call(arguments, 1); - } else { - common.error('file arg should be a string file path or an Array of string file paths'); - } - - files.forEach(function (f) { - touchFile(opts, f); - }); - return ''; -} - -function touchFile(opts, file) { - var stat = tryStatFile(file); - - if (stat && stat.isDirectory()) { - // don't error just exit - return; - } - - // if the file doesn't already exist and the user has specified --no-create then - // this script is finished - if (!stat && opts.no_create) { - return; - } - - // open the file and then close it. this will create it if it doesn't exist but will - // not truncate the file - fs.closeSync(fs.openSync(file, 'a')); - - // - // Set timestamps - // - - // setup some defaults - var now = new Date(); - var mtime = opts.date || now; - var atime = opts.date || now; - - // use reference file - if (opts.reference) { - var refStat = tryStatFile(opts.reference); - if (!refStat) { - common.error('failed to get attributess of ' + opts.reference); - } - mtime = refStat.mtime; - atime = refStat.atime; - } else if (opts.date) { - mtime = opts.date; - atime = opts.date; - } - - if (opts.atime_only && opts.mtime_only) { - // keep the new values of mtime and atime like GNU - } else if (opts.atime_only) { - mtime = stat.mtime; - } else if (opts.mtime_only) { - atime = stat.atime; - } - - fs.utimesSync(file, atime, mtime); -} - -module.exports = _touch; - -function tryStatFile(filePath) { - try { - return fs.statSync(filePath); - } catch (e) { - return null; - } -} diff --git a/node_modules/shelljs/src/uniq.js b/node_modules/shelljs/src/uniq.js deleted file mode 100644 index 8f5da00..0000000 --- a/node_modules/shelljs/src/uniq.js +++ /dev/null @@ -1,80 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); - -// add c spaces to the left of str -function lpad(c, str) { - var res = '' + str; - if (res.length < c) { - res = Array((c - res.length) + 1).join(' ') + res; - } - return res; -} - -common.register('uniq', _uniq, { - canReceivePipe: true, - cmdOptions: { - 'i': 'ignoreCase', - 'c': 'count', - 'd': 'duplicates', - }, -}); - -//@ -//@ ### uniq([options,] [input, [output]]) -//@ Available options: -//@ -//@ + `-i`: Ignore case while comparing -//@ + `-c`: Prefix lines by the number of occurrences -//@ + `-d`: Only print duplicate lines, one for each group of identical lines -//@ -//@ Examples: -//@ -//@ ```javascript -//@ uniq('foo.txt'); -//@ uniq('-i', 'foo.txt'); -//@ uniq('-cd', 'foo.txt', 'bar.txt'); -//@ ``` -//@ -//@ Filter adjacent matching lines from input -function _uniq(options, input, output) { - // Check if this is coming from a pipe - var pipe = common.readFromPipe(); - - if (!input && !pipe) common.error('no input given'); - - var lines = (input ? fs.readFileSync(input, 'utf8') : pipe). - trimRight(). - split(/\r*\n/); - - var compare = function (a, b) { - return options.ignoreCase ? - a.toLocaleLowerCase().localeCompare(b.toLocaleLowerCase()) : - a.localeCompare(b); - }; - var uniqed = lines.reduceRight(function (res, e) { - // Perform uniq -c on the input - if (res.length === 0) { - return [{ count: 1, ln: e }]; - } else if (compare(res[0].ln, e) === 0) { - return [{ count: res[0].count + 1, ln: e }].concat(res.slice(1)); - } else { - return [{ count: 1, ln: e }].concat(res); - } - }, []).filter(function (obj) { - // Do we want only duplicated objects? - return options.duplicates ? obj.count > 1 : true; - }).map(function (obj) { - // Are we tracking the counts of each line? - return (options.count ? (lpad(7, obj.count) + ' ') : '') + obj.ln; - }).join('\n') + '\n'; - - if (output) { - (new common.ShellString(uniqed)).to(output); - // if uniq writes to output, nothing is passed to the next command in the pipeline (if any) - return ''; - } else { - return uniqed; - } -} - -module.exports = _uniq; diff --git a/node_modules/shelljs/src/which.js b/node_modules/shelljs/src/which.js deleted file mode 100644 index ef5d185..0000000 --- a/node_modules/shelljs/src/which.js +++ /dev/null @@ -1,99 +0,0 @@ -var common = require('./common'); -var fs = require('fs'); -var path = require('path'); - -common.register('which', _which, { - allowGlobbing: false, -}); - -// XP's system default value for PATHEXT system variable, just in case it's not -// set on Windows. -var XP_DEFAULT_PATHEXT = '.com;.exe;.bat;.cmd;.vbs;.vbe;.js;.jse;.wsf;.wsh'; - -// Cross-platform method for splitting environment PATH variables -function splitPath(p) { - if (!p) return []; - - if (common.platform === 'win') { - return p.split(';'); - } else { - return p.split(':'); - } -} - -function checkPath(pathName) { - return fs.existsSync(pathName) && !fs.statSync(pathName).isDirectory(); -} - -//@ -//@ ### which(command) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ var nodeExec = which('node'); -//@ ``` -//@ -//@ Searches for `command` in the system's PATH. On Windows, this uses the -//@ `PATHEXT` variable to append the extension if it's not already executable. -//@ Returns string containing the absolute path to the command. -function _which(options, cmd) { - if (!cmd) common.error('must specify command'); - - var pathEnv = process.env.path || process.env.Path || process.env.PATH; - var pathArray = splitPath(pathEnv); - var where = null; - - // No relative/absolute paths provided? - if (cmd.search(/\//) === -1) { - // Search for command in PATH - pathArray.forEach(function (dir) { - if (where) return; // already found it - - var attempt = path.resolve(dir, cmd); - - if (common.platform === 'win') { - attempt = attempt.toUpperCase(); - - // In case the PATHEXT variable is somehow not set (e.g. - // child_process.spawn with an empty environment), use the XP default. - var pathExtEnv = process.env.PATHEXT || XP_DEFAULT_PATHEXT; - var pathExtArray = splitPath(pathExtEnv.toUpperCase()); - var i; - - // If the extension is already in PATHEXT, just return that. - for (i = 0; i < pathExtArray.length; i++) { - var ext = pathExtArray[i]; - if (attempt.slice(-ext.length) === ext && checkPath(attempt)) { - where = attempt; - return; - } - } - - // Cycle through the PATHEXT variable - var baseAttempt = attempt; - for (i = 0; i < pathExtArray.length; i++) { - attempt = baseAttempt + pathExtArray[i]; - if (checkPath(attempt)) { - where = attempt; - return; - } - } - } else { - // Assume it's Unix-like - if (checkPath(attempt)) { - where = attempt; - return; - } - } - }); - } - - // Command not found anywhere? - if (!checkPath(cmd) && !where) return null; - - where = where || path.resolve(cmd); - - return where; -} -module.exports = _which; diff --git a/node_modules/xml2js/LICENSE b/node_modules/xml2js/LICENSE deleted file mode 100644 index e3b4222..0000000 --- a/node_modules/xml2js/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright 2010, 2011, 2012, 2013. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. diff --git a/node_modules/xml2js/README.md b/node_modules/xml2js/README.md deleted file mode 100644 index 508b15f..0000000 --- a/node_modules/xml2js/README.md +++ /dev/null @@ -1,395 +0,0 @@ -node-xml2js -=========== - -Ever had the urge to parse XML? And wanted to access the data in some sane, -easy way? Don't want to compile a C parser, for whatever reason? Then xml2js is -what you're looking for! - -Description -=========== - -Simple XML to JavaScript object converter. It supports bi-directional conversion. -Uses [sax-js](https://github.com/isaacs/sax-js/) and -[xmlbuilder-js](https://github.com/oozcitak/xmlbuilder-js/). - -Note: If you're looking for a full DOM parser, you probably want -[JSDom](https://github.com/tmpvar/jsdom). - -Installation -============ - -Simplest way to install `xml2js` is to use [npm](http://npmjs.org), just `npm -install xml2js` which will download xml2js and all dependencies. - -xml2js is also available via [Bower](http://bower.io/), just `bower install -xml2js` which will download xml2js and all dependencies. - -Usage -===== - -No extensive tutorials required because you are a smart developer! The task of -parsing XML should be an easy one, so let's make it so! Here's some examples. - -Shoot-and-forget usage ----------------------- - -You want to parse XML as simple and easy as possible? It's dangerous to go -alone, take this: - -```javascript -var parseString = require('xml2js').parseString; -var xml = "Hello xml2js!" -parseString(xml, function (err, result) { - console.dir(result); -}); -``` - -Can't get easier than this, right? This works starting with `xml2js` 0.2.3. -With CoffeeScript it looks like this: - -```coffeescript -{parseString} = require 'xml2js' -xml = "Hello xml2js!" -parseString xml, (err, result) -> - console.dir result -``` - -If you need some special options, fear not, `xml2js` supports a number of -options (see below), you can specify these as second argument: - -```javascript -parseString(xml, {trim: true}, function (err, result) { -}); -``` - -Simple as pie usage -------------------- - -That's right, if you have been using xml-simple or a home-grown -wrapper, this was added in 0.1.11 just for you: - -```javascript -var fs = require('fs'), - xml2js = require('xml2js'); - -var parser = new xml2js.Parser(); -fs.readFile(__dirname + '/foo.xml', function(err, data) { - parser.parseString(data, function (err, result) { - console.dir(result); - console.log('Done'); - }); -}); -``` - -Look ma, no event listeners! - -You can also use `xml2js` from -[CoffeeScript](https://github.com/jashkenas/coffeescript), further reducing -the clutter: - -```coffeescript -fs = require 'fs', -xml2js = require 'xml2js' - -parser = new xml2js.Parser() -fs.readFile __dirname + '/foo.xml', (err, data) -> - parser.parseString data, (err, result) -> - console.dir result - console.log 'Done.' -``` - -But what happens if you forget the `new` keyword to create a new `Parser`? In -the middle of a nightly coding session, it might get lost, after all. Worry -not, we got you covered! Starting with 0.2.8 you can also leave it out, in -which case `xml2js` will helpfully add it for you, no bad surprises and -inexplicable bugs! - -Parsing multiple files ----------------------- - -If you want to parse multiple files, you have multiple possibilities: - - * You can create one `xml2js.Parser` per file. That's the recommended one - and is promised to always *just work*. - * You can call `reset()` on your parser object. - * You can hope everything goes well anyway. This behaviour is not - guaranteed work always, if ever. Use option #1 if possible. Thanks! - -So you wanna some JSON? ------------------------ - -Just wrap the `result` object in a call to `JSON.stringify` like this -`JSON.stringify(result)`. You get a string containing the JSON representation -of the parsed object that you can feed to JSON-hungry consumers. - -Displaying results ------------------- - -You might wonder why, using `console.dir` or `console.log` the output at some -level is only `[Object]`. Don't worry, this is not because `xml2js` got lazy. -That's because Node uses `util.inspect` to convert the object into strings and -that function stops after `depth=2` which is a bit low for most XML. - -To display the whole deal, you can use `console.log(util.inspect(result, false, -null))`, which displays the whole result. - -So much for that, but what if you use -[eyes](https://github.com/cloudhead/eyes.js) for nice colored output and it -truncates the output with `…`? Don't fear, there's also a solution for that, -you just need to increase the `maxLength` limit by creating a custom inspector -`var inspect = require('eyes').inspector({maxLength: false})` and then you can -easily `inspect(result)`. - -XML builder usage ------------------ - -Since 0.4.0, objects can be also be used to build XML: - -```javascript -var fs = require('fs'), - xml2js = require('xml2js'); - -var obj = {name: "Super", Surname: "Man", age: 23}; - -var builder = new xml2js.Builder(); -var xml = builder.buildObject(obj); -``` - -At the moment, a one to one bi-directional conversion is guaranteed only for -default configuration, except for `attrkey`, `charkey` and `explicitArray` options -you can redefine to your taste. Writing CDATA is supported via setting the `cdata` -option to `true`. - -Processing attribute, tag names and values ------------------------------------------- - -Since 0.4.1 you can optionally provide the parser with attribute name and tag name processors as well as element value processors (Since 0.4.14, you can also optionally provide the parser with attribute value processors): - -```javascript - -function nameToUpperCase(name){ - return name.toUpperCase(); -} - -//transform all attribute and tag names and values to uppercase -parseString(xml, { - tagNameProcessors: [nameToUpperCase], - attrNameProcessors: [nameToUpperCase], - valueProcessors: [nameToUpperCase], - attrValueProcessors: [nameToUpperCase]}, - function (err, result) { - // processed data -}); -``` - -The `tagNameProcessors`, `attrNameProcessors`, `attrValueProcessors` and `valueProcessors` options -accept an `Array` of functions with the following signature: - -```javascript -function (name){ - //do something with `name` - return name -} -``` - -Some processors are provided out-of-the-box and can be found in `lib/processors.js`: - -- `normalize`: transforms the name to lowercase. -(Automatically used when `options.normalize` is set to `true`) - -- `firstCharLowerCase`: transforms the first character to lower case. -E.g. 'MyTagName' becomes 'myTagName' - -- `stripPrefix`: strips the xml namespace prefix. E.g `` will become 'Bar'. -(N.B.: the `xmlns` prefix is NOT stripped.) - -- `parseNumbers`: parses integer-like strings as integers and float-like strings as floats -E.g. "0" becomes 0 and "15.56" becomes 15.56 - -- `parseBooleans`: parses boolean-like strings to booleans -E.g. "true" becomes true and "False" becomes false - -Options -======= - -Apart from the default settings, there are a number of options that can be -specified for the parser. Options are specified by ``new Parser({optionName: -value})``. Possible options are: - - * `attrkey` (default: `$`): Prefix that is used to access the attributes. - Version 0.1 default was `@`. - * `charkey` (default: `_`): Prefix that is used to access the character - content. Version 0.1 default was `#`. - * `explicitCharkey` (default: `false`) - * `trim` (default: `false`): Trim the whitespace at the beginning and end of - text nodes. - * `normalizeTags` (default: `false`): Normalize all tag names to lowercase. - * `normalize` (default: `false`): Trim whitespaces inside text nodes. - * `explicitRoot` (default: `true`): Set this if you want to get the root - node in the resulting object. - * `emptyTag` (default: `''`): what will the value of empty nodes be. - * `explicitArray` (default: `true`): Always put child nodes in an array if - true; otherwise an array is created only if there is more than one. - * `ignoreAttrs` (default: `false`): Ignore all XML attributes and only create - text nodes. - * `mergeAttrs` (default: `false`): Merge attributes and child elements as - properties of the parent, instead of keying attributes off a child - attribute object. This option is ignored if `ignoreAttrs` is `false`. - * `validator` (default `null`): You can specify a callable that validates - the resulting structure somehow, however you want. See unit tests - for an example. - * `xmlns` (default `false`): Give each element a field usually called '$ns' - (the first character is the same as attrkey) that contains its local name - and namespace URI. - * `explicitChildren` (default `false`): Put child elements to separate - property. Doesn't work with `mergeAttrs = true`. If element has no children - then "children" won't be created. Added in 0.2.5. - * `childkey` (default `$$`): Prefix that is used to access child elements if - `explicitChildren` is set to `true`. Added in 0.2.5. - * `preserveChildrenOrder` (default `false`): Modifies the behavior of - `explicitChildren` so that the value of the "children" property becomes an - ordered array. When this is `true`, every node will also get a `#name` field - whose value will correspond to the XML nodeName, so that you may iterate - the "children" array and still be able to determine node names. The named - (and potentially unordered) properties are also retained in this - configuration at the same level as the ordered "children" array. Added in - 0.4.9. - * `charsAsChildren` (default `false`): Determines whether chars should be - considered children if `explicitChildren` is on. Added in 0.2.5. - * `includeWhiteChars` (default `false`): Determines whether whitespace-only - text nodes should be included. Added in 0.4.17. - * `async` (default `false`): Should the callbacks be async? This *might* be - an incompatible change if your code depends on sync execution of callbacks. - Future versions of `xml2js` might change this default, so the recommendation - is to not depend on sync execution anyway. Added in 0.2.6. - * `strict` (default `true`): Set sax-js to strict or non-strict parsing mode. - Defaults to `true` which is *highly* recommended, since parsing HTML which - is not well-formed XML might yield just about anything. Added in 0.2.7. - * `attrNameProcessors` (default: `null`): Allows the addition of attribute - name processing functions. Accepts an `Array` of functions with following - signature: - ```javascript - function (name){ - //do something with `name` - return name - } - ``` - Added in 0.4.14 - * `attrValueProcessors` (default: `null`): Allows the addition of attribute - value processing functions. Accepts an `Array` of functions with following - signature: - ```javascript - function (name){ - //do something with `name` - return name - } - ``` - Added in 0.4.1 - * `tagNameProcessors` (default: `null`): Allows the addition of tag name - processing functions. Accepts an `Array` of functions with following - signature: - ```javascript - function (name){ - //do something with `name` - return name - } - ``` - Added in 0.4.1 - * `valueProcessors` (default: `null`): Allows the addition of element value - processing functions. Accepts an `Array` of functions with following - signature: - ```javascript - function (name){ - //do something with `name` - return name - } - ``` - Added in 0.4.6 - -Options for the `Builder` class -------------------------------- -These options are specified by ``new Builder({optionName: value})``. -Possible options are: - - * `rootName` (default `root` or the root key name): root element name to be used in case - `explicitRoot` is `false` or to override the root element name. - * `renderOpts` (default `{ 'pretty': true, 'indent': ' ', 'newline': '\n' }`): - Rendering options for xmlbuilder-js. - * pretty: prettify generated XML - * indent: whitespace for indentation (only when pretty) - * newline: newline char (only when pretty) - * `xmldec` (default `{ 'version': '1.0', 'encoding': 'UTF-8', 'standalone': true }`: - XML declaration attributes. - * `xmldec.version` A version number string, e.g. 1.0 - * `xmldec.encoding` Encoding declaration, e.g. UTF-8 - * `xmldec.standalone` standalone document declaration: true or false - * `doctype` (default `null`): optional DTD. Eg. `{'ext': 'hello.dtd'}` - * `headless` (default: `false`): omit the XML header. Added in 0.4.3. - * `allowSurrogateChars` (default: `false`): allows using characters from the Unicode - surrogate blocks. - * `cdata` (default: `false`): wrap text nodes in `` instead of - escaping when necessary. Does not add `` if it is not required. - Added in 0.4.5. - -`renderOpts`, `xmldec`,`doctype` and `headless` pass through to -[xmlbuilder-js](https://github.com/oozcitak/xmlbuilder-js). - -Updating to new version -======================= - -Version 0.2 changed the default parsing settings, but version 0.1.14 introduced -the default settings for version 0.2, so these settings can be tried before the -migration. - -```javascript -var xml2js = require('xml2js'); -var parser = new xml2js.Parser(xml2js.defaults["0.2"]); -``` - -To get the 0.1 defaults in version 0.2 you can just use -`xml2js.defaults["0.1"]` in the same place. This provides you with enough time -to migrate to the saner way of parsing in `xml2js` 0.2. We try to make the -migration as simple and gentle as possible, but some breakage cannot be -avoided. - -So, what exactly did change and why? In 0.2 we changed some defaults to parse -the XML in a more universal and sane way. So we disabled `normalize` and `trim` -so `xml2js` does not cut out any text content. You can reenable this at will of -course. A more important change is that we return the root tag in the resulting -JavaScript structure via the `explicitRoot` setting, so you need to access the -first element. This is useful for anybody who wants to know what the root node -is and preserves more information. The last major change was to enable -`explicitArray`, so everytime it is possible that one might embed more than one -sub-tag into a tag, xml2js >= 0.2 returns an array even if the array just -includes one element. This is useful when dealing with APIs that return -variable amounts of subtags. - -Running tests, development -========================== - -[![Build Status](https://travis-ci.org/Leonidas-from-XIV/node-xml2js.svg?branch=master)](https://travis-ci.org/Leonidas-from-XIV/node-xml2js) -[![Coverage Status](https://coveralls.io/repos/Leonidas-from-XIV/node-xml2js/badge.svg?branch=)](https://coveralls.io/r/Leonidas-from-XIV/node-xml2js?branch=master) -[![Dependency Status](https://david-dm.org/Leonidas-from-XIV/node-xml2js.svg)](https://david-dm.org/Leonidas-from-XIV/node-xml2js) - -The development requirements are handled by npm, you just need to install them. -We also have a number of unit tests, they can be run using `npm test` directly -from the project root. This runs zap to discover all the tests and execute -them. - -If you like to contribute, keep in mind that `xml2js` is written in -CoffeeScript, so don't develop on the JavaScript files that are checked into -the repository for convenience reasons. Also, please write some unit test to -check your behaviour and if it is some user-facing thing, add some -documentation to this README, so people will know it exists. Thanks in advance! - -Getting support -=============== - -Please, if you have a problem with the library, first make sure you read this -README. If you read this far, thanks, you're good. Then, please make sure your -problem really is with `xml2js`. It is? Okay, then I'll look at it. Send me a -mail and we can talk. Please don't open issues, as I don't think that is the -proper forum for support problems. Some problems might as well really be bugs -in `xml2js`, if so I'll let you know to open an issue instead :) - -But if you know you really found a bug, feel free to open an issue instead. diff --git a/node_modules/xml2js/lib/bom.js b/node_modules/xml2js/lib/bom.js deleted file mode 100644 index 3a78479..0000000 --- a/node_modules/xml2js/lib/bom.js +++ /dev/null @@ -1,12 +0,0 @@ -// Generated by CoffeeScript 1.10.0 -(function() { - "use strict"; - exports.stripBOM = function(str) { - if (str[0] === '\uFEFF') { - return str.substring(1); - } else { - return str; - } - }; - -}).call(this); diff --git a/node_modules/xml2js/lib/processors.js b/node_modules/xml2js/lib/processors.js deleted file mode 100644 index 31ccde2..0000000 --- a/node_modules/xml2js/lib/processors.js +++ /dev/null @@ -1,34 +0,0 @@ -// Generated by CoffeeScript 1.10.0 -(function() { - "use strict"; - var prefixMatch; - - prefixMatch = new RegExp(/(?!xmlns)^.*:/); - - exports.normalize = function(str) { - return str.toLowerCase(); - }; - - exports.firstCharLowerCase = function(str) { - return str.charAt(0).toLowerCase() + str.slice(1); - }; - - exports.stripPrefix = function(str) { - return str.replace(prefixMatch, ''); - }; - - exports.parseNumbers = function(str) { - if (!isNaN(str)) { - str = str % 1 === 0 ? parseInt(str, 10) : parseFloat(str); - } - return str; - }; - - exports.parseBooleans = function(str) { - if (/^(?:true|false)$/i.test(str)) { - str = str.toLowerCase() === 'true'; - } - return str; - }; - -}).call(this); diff --git a/node_modules/xml2js/lib/xml2js.js b/node_modules/xml2js/lib/xml2js.js deleted file mode 100644 index 26e34e7..0000000 --- a/node_modules/xml2js/lib/xml2js.js +++ /dev/null @@ -1,543 +0,0 @@ -// Generated by CoffeeScript 1.10.0 -(function() { - "use strict"; - var bom, builder, escapeCDATA, events, isEmpty, processName, processors, requiresCDATA, sax, setImmediate, wrapCDATA, - extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - hasProp = {}.hasOwnProperty, - bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; - - sax = require('sax'); - - events = require('events'); - - builder = require('xmlbuilder'); - - bom = require('./bom'); - - processors = require('./processors'); - - setImmediate = require('timers').setImmediate; - - isEmpty = function(thing) { - return typeof thing === "object" && (thing != null) && Object.keys(thing).length === 0; - }; - - processName = function(processors, processedName) { - var i, len, process; - for (i = 0, len = processors.length; i < len; i++) { - process = processors[i]; - processedName = process(processedName); - } - return processedName; - }; - - requiresCDATA = function(entry) { - return entry.indexOf('&') >= 0 || entry.indexOf('>') >= 0 || entry.indexOf('<') >= 0; - }; - - wrapCDATA = function(entry) { - return ""; - }; - - escapeCDATA = function(entry) { - return entry.replace(']]>', ']]]]>'); - }; - - exports.processors = processors; - - exports.defaults = { - "0.1": { - explicitCharkey: false, - trim: true, - normalize: true, - normalizeTags: false, - attrkey: "@", - charkey: "#", - explicitArray: false, - ignoreAttrs: false, - mergeAttrs: false, - explicitRoot: false, - validator: null, - xmlns: false, - explicitChildren: false, - childkey: '@@', - charsAsChildren: false, - includeWhiteChars: false, - async: false, - strict: true, - attrNameProcessors: null, - attrValueProcessors: null, - tagNameProcessors: null, - valueProcessors: null, - emptyTag: '' - }, - "0.2": { - explicitCharkey: false, - trim: false, - normalize: false, - normalizeTags: false, - attrkey: "$", - charkey: "_", - explicitArray: true, - ignoreAttrs: false, - mergeAttrs: false, - explicitRoot: true, - validator: null, - xmlns: false, - explicitChildren: false, - preserveChildrenOrder: false, - childkey: '$$', - charsAsChildren: false, - includeWhiteChars: false, - async: false, - strict: true, - attrNameProcessors: null, - attrValueProcessors: null, - tagNameProcessors: null, - valueProcessors: null, - rootName: 'root', - xmldec: { - 'version': '1.0', - 'encoding': 'UTF-8', - 'standalone': true - }, - doctype: null, - renderOpts: { - 'pretty': true, - 'indent': ' ', - 'newline': '\n' - }, - headless: false, - chunkSize: 10000, - emptyTag: '', - cdata: false - } - }; - - exports.ValidationError = (function(superClass) { - extend(ValidationError, superClass); - - function ValidationError(message) { - this.message = message; - } - - return ValidationError; - - })(Error); - - exports.Builder = (function() { - function Builder(opts) { - var key, ref, value; - this.options = {}; - ref = exports.defaults["0.2"]; - for (key in ref) { - if (!hasProp.call(ref, key)) continue; - value = ref[key]; - this.options[key] = value; - } - for (key in opts) { - if (!hasProp.call(opts, key)) continue; - value = opts[key]; - this.options[key] = value; - } - } - - Builder.prototype.buildObject = function(rootObj) { - var attrkey, charkey, render, rootElement, rootName; - attrkey = this.options.attrkey; - charkey = this.options.charkey; - if ((Object.keys(rootObj).length === 1) && (this.options.rootName === exports.defaults['0.2'].rootName)) { - rootName = Object.keys(rootObj)[0]; - rootObj = rootObj[rootName]; - } else { - rootName = this.options.rootName; - } - render = (function(_this) { - return function(element, obj) { - var attr, child, entry, index, key, value; - if (typeof obj !== 'object') { - if (_this.options.cdata && requiresCDATA(obj)) { - element.raw(wrapCDATA(obj)); - } else { - element.txt(obj); - } - } else { - for (key in obj) { - if (!hasProp.call(obj, key)) continue; - child = obj[key]; - if (key === attrkey) { - if (typeof child === "object") { - for (attr in child) { - value = child[attr]; - element = element.att(attr, value); - } - } - } else if (key === charkey) { - if (_this.options.cdata && requiresCDATA(child)) { - element = element.raw(wrapCDATA(child)); - } else { - element = element.txt(child); - } - } else if (Array.isArray(child)) { - for (index in child) { - if (!hasProp.call(child, index)) continue; - entry = child[index]; - if (typeof entry === 'string') { - if (_this.options.cdata && requiresCDATA(entry)) { - element = element.ele(key).raw(wrapCDATA(entry)).up(); - } else { - element = element.ele(key, entry).up(); - } - } else { - element = render(element.ele(key), entry).up(); - } - } - } else if (typeof child === "object") { - element = render(element.ele(key), child).up(); - } else { - if (typeof child === 'string' && _this.options.cdata && requiresCDATA(child)) { - element = element.ele(key).raw(wrapCDATA(child)).up(); - } else { - if (child == null) { - child = ''; - } - element = element.ele(key, child.toString()).up(); - } - } - } - } - return element; - }; - })(this); - rootElement = builder.create(rootName, this.options.xmldec, this.options.doctype, { - headless: this.options.headless, - allowSurrogateChars: this.options.allowSurrogateChars - }); - return render(rootElement, rootObj).end(this.options.renderOpts); - }; - - return Builder; - - })(); - - exports.Parser = (function(superClass) { - extend(Parser, superClass); - - function Parser(opts) { - this.parseString = bind(this.parseString, this); - this.reset = bind(this.reset, this); - this.assignOrPush = bind(this.assignOrPush, this); - this.processAsync = bind(this.processAsync, this); - var key, ref, value; - if (!(this instanceof exports.Parser)) { - return new exports.Parser(opts); - } - this.options = {}; - ref = exports.defaults["0.2"]; - for (key in ref) { - if (!hasProp.call(ref, key)) continue; - value = ref[key]; - this.options[key] = value; - } - for (key in opts) { - if (!hasProp.call(opts, key)) continue; - value = opts[key]; - this.options[key] = value; - } - if (this.options.xmlns) { - this.options.xmlnskey = this.options.attrkey + "ns"; - } - if (this.options.normalizeTags) { - if (!this.options.tagNameProcessors) { - this.options.tagNameProcessors = []; - } - this.options.tagNameProcessors.unshift(processors.normalize); - } - this.reset(); - } - - Parser.prototype.processAsync = function() { - var chunk, err, error1; - try { - if (this.remaining.length <= this.options.chunkSize) { - chunk = this.remaining; - this.remaining = ''; - this.saxParser = this.saxParser.write(chunk); - return this.saxParser.close(); - } else { - chunk = this.remaining.substr(0, this.options.chunkSize); - this.remaining = this.remaining.substr(this.options.chunkSize, this.remaining.length); - this.saxParser = this.saxParser.write(chunk); - return setImmediate(this.processAsync); - } - } catch (error1) { - err = error1; - if (!this.saxParser.errThrown) { - this.saxParser.errThrown = true; - return this.emit(err); - } - } - }; - - Parser.prototype.assignOrPush = function(obj, key, newValue) { - if (!(key in obj)) { - if (!this.options.explicitArray) { - return obj[key] = newValue; - } else { - return obj[key] = [newValue]; - } - } else { - if (!(obj[key] instanceof Array)) { - obj[key] = [obj[key]]; - } - return obj[key].push(newValue); - } - }; - - Parser.prototype.reset = function() { - var attrkey, charkey, ontext, stack; - this.removeAllListeners(); - this.saxParser = sax.parser(this.options.strict, { - trim: false, - normalize: false, - xmlns: this.options.xmlns - }); - this.saxParser.errThrown = false; - this.saxParser.onerror = (function(_this) { - return function(error) { - _this.saxParser.resume(); - if (!_this.saxParser.errThrown) { - _this.saxParser.errThrown = true; - return _this.emit("error", error); - } - }; - })(this); - this.saxParser.onend = (function(_this) { - return function() { - if (!_this.saxParser.ended) { - _this.saxParser.ended = true; - return _this.emit("end", _this.resultObject); - } - }; - })(this); - this.saxParser.ended = false; - this.EXPLICIT_CHARKEY = this.options.explicitCharkey; - this.resultObject = null; - stack = []; - attrkey = this.options.attrkey; - charkey = this.options.charkey; - this.saxParser.onopentag = (function(_this) { - return function(node) { - var key, newValue, obj, processedKey, ref; - obj = {}; - obj[charkey] = ""; - if (!_this.options.ignoreAttrs) { - ref = node.attributes; - for (key in ref) { - if (!hasProp.call(ref, key)) continue; - if (!(attrkey in obj) && !_this.options.mergeAttrs) { - obj[attrkey] = {}; - } - newValue = _this.options.attrValueProcessors ? processName(_this.options.attrValueProcessors, node.attributes[key]) : node.attributes[key]; - processedKey = _this.options.attrNameProcessors ? processName(_this.options.attrNameProcessors, key) : key; - if (_this.options.mergeAttrs) { - _this.assignOrPush(obj, processedKey, newValue); - } else { - obj[attrkey][processedKey] = newValue; - } - } - } - obj["#name"] = _this.options.tagNameProcessors ? processName(_this.options.tagNameProcessors, node.name) : node.name; - if (_this.options.xmlns) { - obj[_this.options.xmlnskey] = { - uri: node.uri, - local: node.local - }; - } - return stack.push(obj); - }; - })(this); - this.saxParser.onclosetag = (function(_this) { - return function() { - var cdata, emptyStr, err, error1, key, node, nodeName, obj, objClone, old, s, xpath; - obj = stack.pop(); - nodeName = obj["#name"]; - if (!_this.options.explicitChildren || !_this.options.preserveChildrenOrder) { - delete obj["#name"]; - } - if (obj.cdata === true) { - cdata = obj.cdata; - delete obj.cdata; - } - s = stack[stack.length - 1]; - if (obj[charkey].match(/^\s*$/) && !cdata) { - emptyStr = obj[charkey]; - delete obj[charkey]; - } else { - if (_this.options.trim) { - obj[charkey] = obj[charkey].trim(); - } - if (_this.options.normalize) { - obj[charkey] = obj[charkey].replace(/\s{2,}/g, " ").trim(); - } - obj[charkey] = _this.options.valueProcessors ? processName(_this.options.valueProcessors, obj[charkey]) : obj[charkey]; - if (Object.keys(obj).length === 1 && charkey in obj && !_this.EXPLICIT_CHARKEY) { - obj = obj[charkey]; - } - } - if (isEmpty(obj)) { - obj = _this.options.emptyTag !== '' ? _this.options.emptyTag : emptyStr; - } - if (_this.options.validator != null) { - xpath = "/" + ((function() { - var i, len, results; - results = []; - for (i = 0, len = stack.length; i < len; i++) { - node = stack[i]; - results.push(node["#name"]); - } - return results; - })()).concat(nodeName).join("/"); - try { - obj = _this.options.validator(xpath, s && s[nodeName], obj); - } catch (error1) { - err = error1; - _this.emit("error", err); - } - } - if (_this.options.explicitChildren && !_this.options.mergeAttrs && typeof obj === 'object') { - if (!_this.options.preserveChildrenOrder) { - node = {}; - if (_this.options.attrkey in obj) { - node[_this.options.attrkey] = obj[_this.options.attrkey]; - delete obj[_this.options.attrkey]; - } - if (!_this.options.charsAsChildren && _this.options.charkey in obj) { - node[_this.options.charkey] = obj[_this.options.charkey]; - delete obj[_this.options.charkey]; - } - if (Object.getOwnPropertyNames(obj).length > 0) { - node[_this.options.childkey] = obj; - } - obj = node; - } else if (s) { - s[_this.options.childkey] = s[_this.options.childkey] || []; - objClone = {}; - for (key in obj) { - if (!hasProp.call(obj, key)) continue; - objClone[key] = obj[key]; - } - s[_this.options.childkey].push(objClone); - delete obj["#name"]; - if (Object.keys(obj).length === 1 && charkey in obj && !_this.EXPLICIT_CHARKEY) { - obj = obj[charkey]; - } - } - } - if (stack.length > 0) { - return _this.assignOrPush(s, nodeName, obj); - } else { - if (_this.options.explicitRoot) { - old = obj; - obj = {}; - obj[nodeName] = old; - } - _this.resultObject = obj; - _this.saxParser.ended = true; - return _this.emit("end", _this.resultObject); - } - }; - })(this); - ontext = (function(_this) { - return function(text) { - var charChild, s; - s = stack[stack.length - 1]; - if (s) { - s[charkey] += text; - if (_this.options.explicitChildren && _this.options.preserveChildrenOrder && _this.options.charsAsChildren && (_this.options.includeWhiteChars || text.replace(/\\n/g, '').trim() !== '')) { - s[_this.options.childkey] = s[_this.options.childkey] || []; - charChild = { - '#name': '__text__' - }; - charChild[charkey] = text; - if (_this.options.normalize) { - charChild[charkey] = charChild[charkey].replace(/\s{2,}/g, " ").trim(); - } - s[_this.options.childkey].push(charChild); - } - return s; - } - }; - })(this); - this.saxParser.ontext = ontext; - return this.saxParser.oncdata = (function(_this) { - return function(text) { - var s; - s = ontext(text); - if (s) { - return s.cdata = true; - } - }; - })(this); - }; - - Parser.prototype.parseString = function(str, cb) { - var err, error1; - if ((cb != null) && typeof cb === "function") { - this.on("end", function(result) { - this.reset(); - return cb(null, result); - }); - this.on("error", function(err) { - this.reset(); - return cb(err); - }); - } - try { - str = str.toString(); - if (str.trim() === '') { - this.emit("end", null); - return true; - } - str = bom.stripBOM(str); - if (this.options.async) { - this.remaining = str; - setImmediate(this.processAsync); - return this.saxParser; - } - return this.saxParser.write(str).close(); - } catch (error1) { - err = error1; - if (!(this.saxParser.errThrown || this.saxParser.ended)) { - this.emit('error', err); - return this.saxParser.errThrown = true; - } else if (this.saxParser.ended) { - throw err; - } - } - }; - - return Parser; - - })(events.EventEmitter); - - exports.parseString = function(str, a, b) { - var cb, options, parser; - if (b != null) { - if (typeof b === 'function') { - cb = b; - } - if (typeof a === 'object') { - options = a; - } - } else { - if (typeof a === 'function') { - cb = a; - } - options = {}; - } - parser = new exports.Parser(options); - return parser.parseString(str, cb); - }; - -}).call(this); diff --git a/node_modules/xml2js/node_modules/sax/LICENSE b/node_modules/xml2js/node_modules/sax/LICENSE deleted file mode 100644 index ccffa08..0000000 --- a/node_modules/xml2js/node_modules/sax/LICENSE +++ /dev/null @@ -1,41 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -==== - -`String.fromCodePoint` by Mathias Bynens used according to terms of MIT -License, as follows: - - Copyright Mathias Bynens - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/xml2js/node_modules/sax/LICENSE-W3C.html b/node_modules/xml2js/node_modules/sax/LICENSE-W3C.html deleted file mode 100644 index a611e3f..0000000 --- a/node_modules/xml2js/node_modules/sax/LICENSE-W3C.html +++ /dev/null @@ -1,188 +0,0 @@ - -W3C Software Notice and License
- -
diff --git a/node_modules/xml2js/node_modules/sax/README.md b/node_modules/xml2js/node_modules/sax/README.md deleted file mode 100644 index afcd3f3..0000000 --- a/node_modules/xml2js/node_modules/sax/README.md +++ /dev/null @@ -1,225 +0,0 @@ -# sax js - -A sax-style parser for XML and HTML. - -Designed with [node](http://nodejs.org/) in mind, but should work fine in -the browser or other CommonJS implementations. - -## What This Is - -* A very simple tool to parse through an XML string. -* A stepping stone to a streaming HTML parser. -* A handy way to deal with RSS and other mostly-ok-but-kinda-broken XML - docs. - -## What This Is (probably) Not - -* An HTML Parser - That's a fine goal, but this isn't it. It's just - XML. -* A DOM Builder - You can use it to build an object model out of XML, - but it doesn't do that out of the box. -* XSLT - No DOM = no querying. -* 100% Compliant with (some other SAX implementation) - Most SAX - implementations are in Java and do a lot more than this does. -* An XML Validator - It does a little validation when in strict mode, but - not much. -* A Schema-Aware XSD Thing - Schemas are an exercise in fetishistic - masochism. -* A DTD-aware Thing - Fetching DTDs is a much bigger job. - -## Regarding `Hello, world!').close(); - -// stream usage -// takes the same options as the parser -var saxStream = require("sax").createStream(strict, options) -saxStream.on("error", function (e) { - // unhandled errors will throw, since this is a proper node - // event emitter. - console.error("error!", e) - // clear the error - this._parser.error = null - this._parser.resume() -}) -saxStream.on("opentag", function (node) { - // same object as above -}) -// pipe is supported, and it's readable/writable -// same chunks coming in also go out. -fs.createReadStream("file.xml") - .pipe(saxStream) - .pipe(fs.createWriteStream("file-copy.xml")) -``` - - -## Arguments - -Pass the following arguments to the parser function. All are optional. - -`strict` - Boolean. Whether or not to be a jerk. Default: `false`. - -`opt` - Object bag of settings regarding string formatting. All default to `false`. - -Settings supported: - -* `trim` - Boolean. Whether or not to trim text and comment nodes. -* `normalize` - Boolean. If true, then turn any whitespace into a single - space. -* `lowercase` - Boolean. If true, then lowercase tag names and attribute names - in loose mode, rather than uppercasing them. -* `xmlns` - Boolean. If true, then namespaces are supported. -* `position` - Boolean. If false, then don't track line/col/position. -* `strictEntities` - Boolean. If true, only parse [predefined XML - entities](http://www.w3.org/TR/REC-xml/#sec-predefined-ent) - (`&`, `'`, `>`, `<`, and `"`) - -## Methods - -`write` - Write bytes onto the stream. You don't have to do this all at -once. You can keep writing as much as you want. - -`close` - Close the stream. Once closed, no more data may be written until -it is done processing the buffer, which is signaled by the `end` event. - -`resume` - To gracefully handle errors, assign a listener to the `error` -event. Then, when the error is taken care of, you can call `resume` to -continue parsing. Otherwise, the parser will not continue while in an error -state. - -## Members - -At all times, the parser object will have the following members: - -`line`, `column`, `position` - Indications of the position in the XML -document where the parser currently is looking. - -`startTagPosition` - Indicates the position where the current tag starts. - -`closed` - Boolean indicating whether or not the parser can be written to. -If it's `true`, then wait for the `ready` event to write again. - -`strict` - Boolean indicating whether or not the parser is a jerk. - -`opt` - Any options passed into the constructor. - -`tag` - The current tag being dealt with. - -And a bunch of other stuff that you probably shouldn't touch. - -## Events - -All events emit with a single argument. To listen to an event, assign a -function to `on`. Functions get executed in the this-context of -the parser object. The list of supported events are also in the exported -`EVENTS` array. - -When using the stream interface, assign handlers using the EventEmitter -`on` function in the normal fashion. - -`error` - Indication that something bad happened. The error will be hanging -out on `parser.error`, and must be deleted before parsing can continue. By -listening to this event, you can keep an eye on that kind of stuff. Note: -this happens *much* more in strict mode. Argument: instance of `Error`. - -`text` - Text node. Argument: string of text. - -`doctype` - The ``. Argument: -object with `name` and `body` members. Attributes are not parsed, as -processing instructions have implementation dependent semantics. - -`sgmldeclaration` - Random SGML declarations. Stuff like `` -would trigger this kind of event. This is a weird thing to support, so it -might go away at some point. SAX isn't intended to be used to parse SGML, -after all. - -`opentagstart` - Emitted immediately when the tag name is available, -but before any attributes are encountered. Argument: object with a -`name` field and an empty `attributes` set. Note that this is the -same object that will later be emitted in the `opentag` event. - -`opentag` - An opening tag. Argument: object with `name` and `attributes`. -In non-strict mode, tag names are uppercased, unless the `lowercase` -option is set. If the `xmlns` option is set, then it will contain -namespace binding information on the `ns` member, and will have a -`local`, `prefix`, and `uri` member. - -`closetag` - A closing tag. In loose mode, tags are auto-closed if their -parent closes. In strict mode, well-formedness is enforced. Note that -self-closing tags will have `closeTag` emitted immediately after `openTag`. -Argument: tag name. - -`attribute` - An attribute node. Argument: object with `name` and `value`. -In non-strict mode, attribute names are uppercased, unless the `lowercase` -option is set. If the `xmlns` option is set, it will also contains namespace -information. - -`comment` - A comment node. Argument: the string of the comment. - -`opencdata` - The opening tag of a ``) of a `` tags trigger a `"script"` -event, and their contents are not checked for special xml characters. -If you pass `noscript: true`, then this behavior is suppressed. - -## Reporting Problems - -It's best to write a failing test if you find an issue. I will always -accept pull requests with failing tests if they demonstrate intended -behavior, but it is very hard to figure out what issue you're describing -without a test. Writing a test is also the best way for you yourself -to figure out if you really understand the issue you think you have with -sax-js. diff --git a/node_modules/xml2js/node_modules/sax/lib/sax.js b/node_modules/xml2js/node_modules/sax/lib/sax.js deleted file mode 100644 index f125c5f..0000000 --- a/node_modules/xml2js/node_modules/sax/lib/sax.js +++ /dev/null @@ -1,1576 +0,0 @@ -;(function (sax) { // wrapper for non-node envs - sax.parser = function (strict, opt) { return new SAXParser(strict, opt) } - sax.SAXParser = SAXParser - sax.SAXStream = SAXStream - sax.createStream = createStream - - // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns. - // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)), - // since that's the earliest that a buffer overrun could occur. This way, checks are - // as rare as required, but as often as necessary to ensure never crossing this bound. - // Furthermore, buffers are only tested at most once per write(), so passing a very - // large string into write() might have undesirable effects, but this is manageable by - // the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme - // edge case, result in creating at most one complete copy of the string passed in. - // Set to Infinity to have unlimited buffers. - sax.MAX_BUFFER_LENGTH = 64 * 1024 - - var buffers = [ - 'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype', - 'procInstName', 'procInstBody', 'entity', 'attribName', - 'attribValue', 'cdata', 'script' - ] - - sax.EVENTS = [ - 'text', - 'processinginstruction', - 'sgmldeclaration', - 'doctype', - 'comment', - 'opentagstart', - 'attribute', - 'opentag', - 'closetag', - 'opencdata', - 'cdata', - 'closecdata', - 'error', - 'end', - 'ready', - 'script', - 'opennamespace', - 'closenamespace' - ] - - function SAXParser (strict, opt) { - if (!(this instanceof SAXParser)) { - return new SAXParser(strict, opt) - } - - var parser = this - clearBuffers(parser) - parser.q = parser.c = '' - parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH - parser.opt = opt || {} - parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags - parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase' - parser.tags = [] - parser.closed = parser.closedRoot = parser.sawRoot = false - parser.tag = parser.error = null - parser.strict = !!strict - parser.noscript = !!(strict || parser.opt.noscript) - parser.state = S.BEGIN - parser.strictEntities = parser.opt.strictEntities - parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES) - parser.attribList = [] - - // namespaces form a prototype chain. - // it always points at the current tag, - // which protos to its parent tag. - if (parser.opt.xmlns) { - parser.ns = Object.create(rootNS) - } - - // mostly just for error reporting - parser.trackPosition = parser.opt.position !== false - if (parser.trackPosition) { - parser.position = parser.line = parser.column = 0 - } - emit(parser, 'onready') - } - - if (!Object.create) { - Object.create = function (o) { - function F () {} - F.prototype = o - var newf = new F() - return newf - } - } - - if (!Object.keys) { - Object.keys = function (o) { - var a = [] - for (var i in o) if (o.hasOwnProperty(i)) a.push(i) - return a - } - } - - function checkBufferLength (parser) { - var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10) - var maxActual = 0 - for (var i = 0, l = buffers.length; i < l; i++) { - var len = parser[buffers[i]].length - if (len > maxAllowed) { - // Text/cdata nodes can get big, and since they're buffered, - // we can get here under normal conditions. - // Avoid issues by emitting the text node now, - // so at least it won't get any bigger. - switch (buffers[i]) { - case 'textNode': - closeText(parser) - break - - case 'cdata': - emitNode(parser, 'oncdata', parser.cdata) - parser.cdata = '' - break - - case 'script': - emitNode(parser, 'onscript', parser.script) - parser.script = '' - break - - default: - error(parser, 'Max buffer length exceeded: ' + buffers[i]) - } - } - maxActual = Math.max(maxActual, len) - } - // schedule the next check for the earliest possible buffer overrun. - var m = sax.MAX_BUFFER_LENGTH - maxActual - parser.bufferCheckPosition = m + parser.position - } - - function clearBuffers (parser) { - for (var i = 0, l = buffers.length; i < l; i++) { - parser[buffers[i]] = '' - } - } - - function flushBuffers (parser) { - closeText(parser) - if (parser.cdata !== '') { - emitNode(parser, 'oncdata', parser.cdata) - parser.cdata = '' - } - if (parser.script !== '') { - emitNode(parser, 'onscript', parser.script) - parser.script = '' - } - } - - SAXParser.prototype = { - end: function () { end(this) }, - write: write, - resume: function () { this.error = null; return this }, - close: function () { return this.write(null) }, - flush: function () { flushBuffers(this) } - } - - var Stream - try { - Stream = require('stream').Stream - } catch (ex) { - Stream = function () {} - } - - var streamWraps = sax.EVENTS.filter(function (ev) { - return ev !== 'error' && ev !== 'end' - }) - - function createStream (strict, opt) { - return new SAXStream(strict, opt) - } - - function SAXStream (strict, opt) { - if (!(this instanceof SAXStream)) { - return new SAXStream(strict, opt) - } - - Stream.apply(this) - - this._parser = new SAXParser(strict, opt) - this.writable = true - this.readable = true - - var me = this - - this._parser.onend = function () { - me.emit('end') - } - - this._parser.onerror = function (er) { - me.emit('error', er) - - // if didn't throw, then means error was handled. - // go ahead and clear error, so we can write again. - me._parser.error = null - } - - this._decoder = null - - streamWraps.forEach(function (ev) { - Object.defineProperty(me, 'on' + ev, { - get: function () { - return me._parser['on' + ev] - }, - set: function (h) { - if (!h) { - me.removeAllListeners(ev) - me._parser['on' + ev] = h - return h - } - me.on(ev, h) - }, - enumerable: true, - configurable: false - }) - }) - } - - SAXStream.prototype = Object.create(Stream.prototype, { - constructor: { - value: SAXStream - } - }) - - SAXStream.prototype.write = function (data) { - if (typeof Buffer === 'function' && - typeof Buffer.isBuffer === 'function' && - Buffer.isBuffer(data)) { - if (!this._decoder) { - var SD = require('string_decoder').StringDecoder - this._decoder = new SD('utf8') - } - data = this._decoder.write(data) - } - - this._parser.write(data.toString()) - this.emit('data', data) - return true - } - - SAXStream.prototype.end = function (chunk) { - if (chunk && chunk.length) { - this.write(chunk) - } - this._parser.end() - return true - } - - SAXStream.prototype.on = function (ev, handler) { - var me = this - if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) { - me._parser['on' + ev] = function () { - var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments) - args.splice(0, 0, ev) - me.emit.apply(me, args) - } - } - - return Stream.prototype.on.call(me, ev, handler) - } - - // character classes and tokens - var whitespace = '\r\n\t ' - - // this really needs to be replaced with character classes. - // XML allows all manner of ridiculous numbers and digits. - var number = '0124356789' - var letter = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' - - // (Letter | "_" | ":") - var quote = '\'"' - var attribEnd = whitespace + '>' - var CDATA = '[CDATA[' - var DOCTYPE = 'DOCTYPE' - var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace' - var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/' - var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE } - - // turn all the string character sets into character class objects. - whitespace = charClass(whitespace) - number = charClass(number) - letter = charClass(letter) - - // http://www.w3.org/TR/REC-xml/#NT-NameStartChar - // This implementation works on strings, a single character at a time - // as such, it cannot ever support astral-plane characters (10000-EFFFF) - // without a significant breaking change to either this parser, or the - // JavaScript language. Implementation of an emoji-capable xml parser - // is left as an exercise for the reader. - var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/ - - var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/ - - var entityStart = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/ - var entityBody = /[#:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/ - - quote = charClass(quote) - attribEnd = charClass(attribEnd) - - function charClass (str) { - return str.split('').reduce(function (s, c) { - s[c] = true - return s - }, {}) - } - - function isRegExp (c) { - return Object.prototype.toString.call(c) === '[object RegExp]' - } - - function is (charclass, c) { - return isRegExp(charclass) ? !!c.match(charclass) : charclass[c] - } - - function not (charclass, c) { - return !is(charclass, c) - } - - var S = 0 - sax.STATE = { - BEGIN: S++, // leading byte order mark or whitespace - BEGIN_WHITESPACE: S++, // leading whitespace - TEXT: S++, // general stuff - TEXT_ENTITY: S++, // & and such. - OPEN_WAKA: S++, // < - SGML_DECL: S++, // - SCRIPT: S++, //
- - - -
-

- W3C - -

- -
- - - -
-
- -
- - -
-
- -
- - -
-
-
- -
-
-

W3C Software Notice and License

-
-
-

This work (and included software, documentation such as READMEs, or other -related items) is being provided by the copyright holders under the following -license.

-

License

- -

-By obtaining, using and/or copying this work, you (the licensee) -agree that you have read, understood, and will comply with the following -terms and conditions.

- -

Permission to copy, modify, and distribute this software and its -documentation, with or without modification, for any purpose and without -fee or royalty is hereby granted, provided that you include the following on -ALL copies of the software and documentation or portions thereof, including -modifications:

- -
  • The full text of this NOTICE in a location viewable to users of the - redistributed or derivative work.
  • Any pre-existing intellectual property disclaimers, notices, or terms - and conditions. If none exist, the W3C Software Short - Notice should be included (hypertext is preferred, text is permitted) - within the body of any redistributed or derivative code.
  • Notice of any changes or modifications to the files, including the date - changes were made. (We recommend you provide URIs to the location from - which the code is derived.)
- -

Disclaimers

- -

THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS -MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR -PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE -ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.

- -

COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR -DOCUMENTATION.

- -

The name and trademarks of copyright holders may NOT be used in -advertising or publicity pertaining to the software without specific, written -prior permission. Title to copyright in this software and any associated -documentation will at all times remain with copyright holders.

- -

Notes

- -

This version: http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231

- -

This formulation of W3C's notice and license became active on December 31 -2002. This version removes the copyright ownership notice such that this -license can be used with materials other than those owned by the W3C, -reflects that ERCIM is now a host of the W3C, includes references to this -specific dated version of the license, and removes the ambiguous grant of -"use". Otherwise, this version is the same as the previous -version and is written so as to preserve the Free -Software Foundation's assessment of GPL compatibility and OSI's certification -under the Open Source -Definition.

-
-
-
-
- - - -