[Pkg-javascript-commits] [node-gyp] 77/82: Imported Upstream version 2.0.2
Ximin Luo
infinity0 at debian.org
Mon Aug 31 00:41:03 UTC 2015
This is an automated email from the git hooks/post-receive script.
infinity0 pushed a commit to branch master
in repository node-gyp.
commit d59d56a616c907e6d6a420e31936e825bbcd34e6
Author: Ximin Luo <infinity0 at pwned.gg>
Date: Mon Aug 31 02:23:17 2015 +0200
Imported Upstream version 2.0.2
---
0001-gyp-always-install-into-PRODUCT_DIR.patch | 35 ++++
...ly-https-codereview.chromium.org-11361103.patch | 36 ++++
...se-links-at-all-just-copy-the-files-inste.patch | 39 ++++
History.md | 41 ++++
README.md | 61 ++++--
addon.gypi | 58 +++++-
lib/build.js | 12 +-
lib/configure.js | 32 +++-
lib/install.js | 103 +++++++++-
lib/node-gyp.js | 7 +-
lib/rebuild.js | 4 +-
node_modules/.bin/mkdirp | 1 +
node_modules/path-array/.npmignore | 1 +
node_modules/path-array/.travis.yml | 6 +
node_modules/path-array/History.md | 22 +++
node_modules/path-array/README.md | 92 +++++++++
node_modules/path-array/index.js | 137 ++++++++++++++
.../path-array/node_modules/array-index/.jshintrc | 4 +
.../path-array/node_modules/array-index/.npmignore | 1 +
.../node_modules/array-index/.travis.yml | 5 +
.../path-array/node_modules/array-index/History.md | 39 ++++
.../path-array/node_modules/array-index/Makefile | 11 ++
.../path-array/node_modules/array-index/README.md | 156 +++++++++++++++
.../node_modules/array-index/component.json | 22 +++
.../path-array/node_modules/array-index/index.js | 180 ++++++++++++++++++
.../array-index/node_modules/debug/.jshintrc | 3 +
.../array-index/node_modules/debug/.npmignore | 6 +
.../array-index/node_modules/debug/History.md | 195 +++++++++++++++++++
.../array-index/node_modules/debug/Makefile | 36 ++++
.../array-index/node_modules/debug/Readme.md | 188 ++++++++++++++++++
.../array-index/node_modules/debug/bower.json | 28 +++
.../array-index/node_modules/debug/browser.js | 168 +++++++++++++++++
.../array-index/node_modules/debug/component.json | 19 ++
.../array-index/node_modules/debug/debug.js | 197 +++++++++++++++++++
.../array-index/node_modules/debug/node.js | 209 +++++++++++++++++++++
.../node_modules/debug/node_modules/ms/.npmignore | 5 +
.../node_modules/debug/node_modules/ms/History.md | 66 +++++++
.../node_modules/debug/node_modules/ms/LICENSE | 20 ++
.../node_modules/debug/node_modules/ms/README.md | 35 ++++
.../node_modules/debug/node_modules/ms/index.js | 125 ++++++++++++
.../debug/node_modules/ms/package.json | 48 +++++
.../array-index/node_modules/debug/package.json | 73 +++++++
.../node_modules/array-index/package.json | 58 ++++++
node_modules/path-array/package.json | 56 ++++++
package.json | 22 ++-
src/win_delay_load_hook.c | 33 ++++
46 files changed, 2638 insertions(+), 57 deletions(-)
diff --git a/0001-gyp-always-install-into-PRODUCT_DIR.patch b/0001-gyp-always-install-into-PRODUCT_DIR.patch
new file mode 100644
index 0000000..694913f
--- /dev/null
+++ b/0001-gyp-always-install-into-PRODUCT_DIR.patch
@@ -0,0 +1,35 @@
+From 9b5e8dc426ada891d67d27b09acc73122ab46849 Mon Sep 17 00:00:00 2001
+From: Nathan Rajlich <nathan at tootallnate.net>
+Date: Wed, 14 Nov 2012 16:48:52 -0800
+Subject: [PATCH 1/3] gyp: always install into $PRODUCT_DIR
+
+---
+ gyp/pylib/gyp/generator/make.py | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+diff --git a/gyp/pylib/gyp/generator/make.py b/gyp/pylib/gyp/generator/make.py
+index b88a433..9b3e4e3 100644
+--- a/gyp/pylib/gyp/generator/make.py
++++ b/gyp/pylib/gyp/generator/make.py
+@@ -1888,11 +1888,13 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)/%%%s FORCE_DO_CMD
+ """Returns the location of the final output for an installable target."""
+ # Xcode puts shared_library results into PRODUCT_DIR, and some gyp files
+ # rely on this. Emulate this behavior for mac.
+- if (self.type == 'shared_library' and
+- (self.flavor != 'mac' or self.toolset != 'target')):
+- # Install all shared libs into a common directory (per toolset) for
+- # convenient access with LD_LIBRARY_PATH.
+- return '$(builddir)/lib.%s/%s' % (self.toolset, self.alias)
++
++ # XXX(TooTallNate): disabling this code since we don't want this behavior...
++ #if (self.type == 'shared_library' and
++ # (self.flavor != 'mac' or self.toolset != 'target')):
++ # # Install all shared libs into a common directory (per toolset) for
++ # # convenient access with LD_LIBRARY_PATH.
++ # return '$(builddir)/lib.%s/%s' % (self.toolset, self.alias)
+ return '$(builddir)/' + self.alias
+
+
+--
+2.3.2 (Apple Git-55)
+
diff --git a/0002-gyp-apply-https-codereview.chromium.org-11361103.patch b/0002-gyp-apply-https-codereview.chromium.org-11361103.patch
new file mode 100644
index 0000000..d1c5cac
--- /dev/null
+++ b/0002-gyp-apply-https-codereview.chromium.org-11361103.patch
@@ -0,0 +1,36 @@
+From 511840e82116662aa825088fb8a52a9f799f7767 Mon Sep 17 00:00:00 2001
+From: Nathan Rajlich <nathan at tootallnate.net>
+Date: Wed, 14 Nov 2012 16:54:04 -0800
+Subject: [PATCH 2/3] gyp: apply https://codereview.chromium.org/11361103/
+
+---
+ gyp/pylib/gyp/generator/msvs.py | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/gyp/pylib/gyp/generator/msvs.py b/gyp/pylib/gyp/generator/msvs.py
+index d8e0872..c59aea1 100644
+--- a/gyp/pylib/gyp/generator/msvs.py
++++ b/gyp/pylib/gyp/generator/msvs.py
+@@ -2720,6 +2720,9 @@ def _GetMSBuildAttributes(spec, config, build_file):
+ product_name = spec.get('product_name', '$(ProjectName)')
+ target_name = prefix + product_name
+ msbuild_attributes['TargetName'] = target_name
++ if 'TargetExt' not in msbuild_attributes and 'product_extension' in spec:
++ ext = spec.get('product_extension')
++ msbuild_attributes['TargetExt'] = '.' + ext
+
+ if spec.get('msvs_external_builder'):
+ external_out_dir = spec.get('msvs_external_builder_out_dir', '.')
+@@ -2773,6 +2776,9 @@ def _GetMSBuildConfigurationGlobalProperties(spec, configurations, build_file):
+ attributes['OutputDirectory'])
+ _AddConditionalProperty(properties, condition, 'TargetName',
+ attributes['TargetName'])
++ if 'TargetExt' in attributes:
++ _AddConditionalProperty(properties, condition, 'TargetExt',
++ attributes['TargetExt'])
+
+ if attributes.get('TargetPath'):
+ _AddConditionalProperty(properties, condition, 'TargetPath',
+--
+2.3.2 (Apple Git-55)
+
diff --git a/0003-gyp-don-t-use-links-at-all-just-copy-the-files-inste.patch b/0003-gyp-don-t-use-links-at-all-just-copy-the-files-inste.patch
new file mode 100644
index 0000000..673a3dd
--- /dev/null
+++ b/0003-gyp-don-t-use-links-at-all-just-copy-the-files-inste.patch
@@ -0,0 +1,39 @@
+From 0cd9f08a6d4f4be6643001b6c3b5ad40e094bdcc Mon Sep 17 00:00:00 2001
+From: Nathan Zadoks <nathan at nathan7.eu>
+Date: Tue, 2 Jul 2013 11:07:16 -0700
+Subject: [PATCH 3/3] gyp: don't use links at all, just copy the files instead
+
+---
+ gyp/pylib/gyp/generator/make.py | 2 +-
+ gyp/pylib/gyp/generator/ninja.py | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/gyp/pylib/gyp/generator/make.py b/gyp/pylib/gyp/generator/make.py
+index 9b3e4e3..b3f8a2b 100644
+--- a/gyp/pylib/gyp/generator/make.py
++++ b/gyp/pylib/gyp/generator/make.py
+@@ -372,7 +372,7 @@ cmd_touch = touch $@
+
+ quiet_cmd_copy = COPY $@
+ # send stderr to /dev/null to ignore messages when linking directories.
+-cmd_copy = ln -f "$<" "$@" 2>/dev/null || (rm -rf "$@" && cp -af "$<" "$@")
++cmd_copy = rm -rf "$@" && cp -af "$<" "$@"
+
+ %(link_commands)s
+ """
+diff --git a/gyp/pylib/gyp/generator/ninja.py b/gyp/pylib/gyp/generator/ninja.py
+index 7461814..c2951a4 100644
+--- a/gyp/pylib/gyp/generator/ninja.py
++++ b/gyp/pylib/gyp/generator/ninja.py
+@@ -2020,7 +2020,7 @@ def GenerateOutputForConfig(target_list, target_dicts, data, params,
+ master_ninja.rule(
+ 'copy',
+ description='COPY $in $out',
+- command='ln -f $in $out 2>/dev/null || (rm -rf $out && cp -af $in $out)')
++ command='rm -rf $out && cp -af $in $out')
+ master_ninja.newline()
+
+ all_targets = set()
+--
+2.3.2 (Apple Git-55)
+
diff --git a/History.md b/History.md
new file mode 100644
index 0000000..8768081
--- /dev/null
+++ b/History.md
@@ -0,0 +1,41 @@
+
+2.0.2 / 2015-07-14
+==================
+
+ * Use HTTPS for dist url (#656, @SonicHedgehog)
+ * Merge pull request #648 from nevosegal/master
+ * Merge pull request #650 from magic890/patch-1
+ * Updated Installation section on README
+ * Updated link to gyp user documentation
+ * Fix download error message spelling (#643, @tomxtobin)
+ * Merge pull request #637 from lygstate/master
+ * Set NODE_GYP_DIR for addon.gypi to setting absolute path for
+ src/win_delay_load_hook.c, and fixes of the long relative path issue on Win32.
+ Fixes #636 (#637, @lygstate).
+
+2.0.1 / 2015-05-28
+==================
+
+ * configure: try/catch the semver range.test() call
+ * README: update for visual studio 2013 (#510, @samccone)
+
+2.0.0 / 2015-05-24
+==================
+
+ * configure: check for python2 executable by default, fallback to python
+ * configure: don't clobber existing $PYTHONPATH
+ * configure: use "path-array" for PYTHONPATH
+ * gyp: fix for non-acsii userprofile name on Windows
+ * gyp: always install into $PRODUCT_DIR
+ * gyp: apply https://codereview.chromium.org/11361103/
+ * gyp: don't use links at all, just copy the files instead
+ * gyp: update gyp to e1c8fcf7
+ * Updated README.md with updated Windows build info
+ * Show URL when a download fails
+ * package: add a "license" field
+ * move HMODULE m declaration to top
+ * Only add "-undefined dynamic_lookup" to loadable_module targets
+ * win: optionally allow node.exe/iojs.exe to be renamed
+ * Avoid downloading shasums if using tarPath
+ * Add target name preprocessor define: `NODE_GYP_MODULE_NAME`
+ * Show better error message in case of bad network settings
diff --git a/README.md b/README.md
index ffe429c..edde1f6 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,8 @@ node-gyp
### Node.js native addon build tool
`node-gyp` is a cross-platform command-line tool written in Node.js for compiling
-native addon modules for Node.js, which takes away the pain of dealing with the
+native addon modules for Node.js. It bundles the [gyp](https://code.google.com/p/gyp/)
+project used by the Chromium team and takes away the pain of dealing with the
various differences in build platforms. It is the replacement to the `node-waf`
program which is removed for node `v0.8`. If you have a native addon for node that
still has a `wscript` file, then you should definitely add a `binding.gyp` file
@@ -34,16 +35,44 @@ You will also need to install:
* On Unix:
* `python` (`v2.7` recommended, `v3.x.x` is __*not*__ supported)
* `make`
- * A proper C/C++ compiler toolchain, like GCC
+ * A proper C/C++ compiler toolchain, like [GCC](https://gcc.gnu.org)
+ * On Mac OS X:
+ * `python` (`v2.7` recommended, `v3.x.x` is __*not*__ supported) (already installed on Mac OS X)
+ * [Xcode](https://developer.apple.com/xcode/downloads/)
+ * You also need to install the `Command Line Tools` via Xcode. You can find this under the menu `Xcode -> Preferences -> Downloads`
+ * This step will install `gcc` and the related toolchain containing `make`
* On Windows:
* [Python][windows-python] ([`v2.7.3`][windows-python-v2.7.3] recommended, `v3.x.x` is __*not*__ supported)
+ * Make sure that you have a PYTHON environment variable, and it is set to drive:\path\to\python.exe not to a folder
* Windows XP/Vista/7:
- * Microsoft Visual Studio C++ 2010 ([Express][msvc2010] version works well)
- * For 64-bit builds of node and native modules you will _**also**_ need the [Windows 7 64-bit SDK][win7sdk]
- * If the install fails, try uninstalling any C++ 2010 x64&x86 Redistributable that you have installed first.
- * If you get errors that the 64-bit compilers are not installed you may also need the [compiler update for the Windows SDK 7.1]
+ * Microsoft Visual Studio C++ 2013 ([Express][msvc2013] version works well)
+ * If the install fails, try uninstalling any C++ 2010 x64&x86 Redistributable that you have installed first
+ * If you get errors that the 64-bit compilers are not installed you may also need the [compiler update for the Windows SDK 7.1]
* Windows 7/8:
- * Microsoft Visual Studio C++ 2012 for Windows Desktop ([Express][msvc2012] version works well)
+ * Microsoft Visual Studio C++ 2013 for Windows Desktop ([Express][msvc2013] version works well)
+ * All Windows Versions
+ * For 64-bit builds of node and native modules you will _**also**_ need the [Windows 7 64-bit SDK][win7sdk]
+ * You may need to run one of the following commands if your build complains about WindowsSDKDir not being set, and you are sure you have already installed the SDK:
+
+```
+call "C:\Program Files\Microsoft SDKs\Windows\v7.1\bin\Setenv.cmd" /Release /x86
+call "C:\Program Files\Microsoft SDKs\Windows\v7.1\bin\Setenv.cmd" /Release /x64
+```
+
+If you have multiple Python versions installed, you can identify which Python
+version `node-gyp` uses by setting the '--python' variable:
+
+``` bash
+$ node-gyp --python /path/to/python2.7
+```
+
+If `node-gyp` is called by way of `npm` *and* you have multiple versions of
+Python installed, then you can set `npm`'s 'python' config key to the appropriate
+value:
+
+``` bash
+$ npm config set python /path/to/executable/python2.7
+```
Note that OS X is just a flavour of Unix and so needs `python`, `make`, and C/C++.
An easy way to obtain these is to install XCode from Apple,
@@ -66,7 +95,7 @@ $ node-gyp configure
```
__Note__: The `configure` step looks for the `binding.gyp` file in the current
-directory to processs. See below for instructions on creating the `binding.gyp` file.
+directory to process. See below for instructions on creating the `binding.gyp` file.
Now you will have either a `Makefile` (on Unix platforms) or a `vcxproj` file
(on Windows) in the `build/` directory. Next invoke the `build` command:
@@ -80,7 +109,7 @@ in `build/Debug/` or `build/Release/`, depending on the build mode. At this poin
you can require the `.node` file with Node and run your tests!
__Note:__ To create a _Debug_ build of the bindings file, pass the `--debug` (or
-`-d`) switch when running the either `configure` or `build` command.
+`-d`) switch when running either the `configure`, `build` or `rebuild` command.
The "binding.gyp" file
@@ -104,11 +133,12 @@ A barebones `gyp` file appropriate for building a node addon looks like:
}
```
-Some additional resources for writing `gyp` files:
+Some additional resources for addons and writing `gyp` files:
+ * ["Going Native" a nodeschool.io tutorial](http://nodeschool.io/#goingnative)
* ["Hello World" node addon example](https://github.com/joyent/node/tree/master/test/addons/hello-world)
- * [gyp user documentation](http://code.google.com/p/gyp/wiki/GypUserDocumentation)
- * [gyp input format reference](http://code.google.com/p/gyp/wiki/InputFormatReference)
+ * [gyp user documentation](https://chromium.googlesource.com/external/gyp/+/master/docs/UserDocumentation.md)
+ * [gyp input format reference](https://chromium.googlesource.com/external/gyp/+/master/docs/InputFormatReference.md)
* [*"binding.gyp" files out in the wild* wiki page](https://github.com/TooTallNate/node-gyp/wiki/%22binding.gyp%22-files-out-in-the-wild)
@@ -120,9 +150,9 @@ Commands
| **Command** | **Description**
|:--------------|:---------------------------------------------------------------
| `build` | Invokes `make`/`msbuild.exe` and builds the native addon
-| `clean` | Removes any the `build` dir if it exists
+| `clean` | Removes the `build` directory if it exists
| `configure` | Generates project build files for the current platform
-| `rebuild` | Runs "clean", "configure" and "build" all in a row
+| `rebuild` | Runs `clean`, `configure` and `build` all in a row
| `install` | Installs node development header files for the given version
| `list` | Lists the currently installed node development file versions
| `remove` | Removes the node development header files for the given version
@@ -157,7 +187,6 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
[windows-python]: http://www.python.org/getit/windows
[windows-python-v2.7.3]: http://www.python.org/download/releases/2.7.3#download
-[msvc2010]: http://go.microsoft.com/?linkid=9709949
-[msvc2012]: http://go.microsoft.com/?linkid=9816758
+[msvc2013]: http://www.visualstudio.com/en-us/downloads/download-visual-studio-vs
[win7sdk]: http://www.microsoft.com/en-us/download/details.aspx?id=8279
[compiler update for the Windows SDK 7.1]: http://www.microsoft.com/en-us/download/details.aspx?id=4422
diff --git a/addon.gypi b/addon.gypi
index 6b9e20e..3377942 100644
--- a/addon.gypi
+++ b/addon.gypi
@@ -1,29 +1,65 @@
{
'target_defaults': {
'type': 'loadable_module',
+ 'win_delay_load_hook': 'false',
'product_prefix': '',
+
'include_dirs': [
'<(node_root_dir)/src',
'<(node_root_dir)/deps/uv/include',
'<(node_root_dir)/deps/v8/include'
],
+ 'defines': [
+ 'NODE_GYP_MODULE_NAME=>(_target_name)'
+ ],
'target_conditions': [
['_type=="loadable_module"', {
'product_extension': 'node',
- 'defines': [ 'BUILDING_NODE_EXTENSION' ],
+ 'defines': [
+ 'BUILDING_NODE_EXTENSION'
+ ],
+ 'xcode_settings': {
+ 'OTHER_LDFLAGS': [
+ '-undefined dynamic_lookup'
+ ],
+ },
}],
+
['_type=="static_library"', {
# set to `1` to *disable* the -T thin archive 'ld' flag.
# older linkers don't support this flag.
'standalone_static_library': '<(standalone_static_library)'
}],
+
+ ['_win_delay_load_hook=="true"', {
+ # If the addon specifies `'win_delay_load_hook': 'true'` in its
+ # binding.gyp, link a delay-load hook into the DLL. This hook ensures
+ # that the addon will work regardless of whether the node/iojs binary
+ # is named node.exe, iojs.exe, or something else.
+ 'conditions': [
+ [ 'OS=="win"', {
+ 'sources': [
+ '<(node_gyp_dir)/src/win_delay_load_hook.c',
+ ],
+ 'msvs_settings': {
+ 'VCLinkerTool': {
+ 'DelayLoadDLLs': [ 'iojs.exe', 'node.exe' ],
+ # Don't print a linker warning when no imports from either .exe
+ # are used.
+ 'AdditionalOptions': [ '/ignore:4199' ],
+ },
+ },
+ }],
+ ],
+ }],
],
'conditions': [
[ 'OS=="mac"', {
- 'defines': [ '_DARWIN_USE_64_BIT_INODE=1' ],
- 'libraries': [ '-undefined dynamic_lookup' ],
+ 'defines': [
+ '_DARWIN_USE_64_BIT_INODE=1'
+ ],
'xcode_settings': {
'DYLIB_INSTALL_NAME_BASE': '@rpath'
},
@@ -42,14 +78,20 @@
'-luuid.lib',
'-lodbc32.lib',
'-lDelayImp.lib',
- '-l<(node_root_dir)/$(Configuration)/node.lib'
+ '-l"<(node_root_dir)/$(ConfigurationName)/node.lib"'
+ ],
+ 'msvs_disabled_warnings': [
+ # warning C4251: 'node::ObjectWrap::handle_' : class 'v8::Persistent<T>'
+ # needs to have dll-interface to be used by
+ # clients of class 'node::ObjectWrap'
+ 4251
],
- # warning C4251: 'node::ObjectWrap::handle_' : class 'v8::Persistent<T>'
- # needs to have dll-interface to be used by clients of class 'node::ObjectWrap'
- 'msvs_disabled_warnings': [ 4251 ],
}, {
# OS!="win"
- 'defines': [ '_LARGEFILE_SOURCE', '_FILE_OFFSET_BITS=64' ],
+ 'defines': [
+ '_LARGEFILE_SOURCE',
+ '_FILE_OFFSET_BITS=64'
+ ],
}],
[ 'OS=="freebsd" or OS=="openbsd" or OS=="solaris" or (OS=="linux" and target_arch!="ia32")', {
'cflags': [ '-fPIC' ],
diff --git a/lib/build.js b/lib/build.js
index f360590..eeeb602 100644
--- a/lib/build.js
+++ b/lib/build.js
@@ -150,7 +150,7 @@ function build (gyp, argv, callback) {
return (x.version < y.version ? -1 : 1)
})
;(function verifyMsbuild () {
- if (!msbuilds.length) return callback(notfoundErr);
+ if (!msbuilds.length) return callback(notfoundErr)
msbuildPath = path.resolve(msbuilds.pop().path, 'msbuild.exe')
fs.stat(msbuildPath, function (err, stat) {
if (err) {
@@ -222,8 +222,9 @@ function build (gyp, argv, callback) {
var p = arch === 'x64' ? 'x64' : 'Win32'
argv.push('/p:Configuration=' + buildType + ';Platform=' + p)
if (jobs) {
- if (!isNaN(parseInt(jobs, 10))) {
- argv.push('/m:' + parseInt(jobs, 10))
+ var j = parseInt(jobs, 10)
+ if (!isNaN(j) && j > 0) {
+ argv.push('/m:' + j)
} else if (jobs.toUpperCase() === 'MAX') {
argv.push('/m:' + require('os').cpus().length)
}
@@ -234,9 +235,10 @@ function build (gyp, argv, callback) {
argv.push('-C')
argv.push('build')
if (jobs) {
- if (!isNaN(parseInt(jobs, 10))) {
+ var j = parseInt(jobs, 10)
+ if (!isNaN(j) && j > 0) {
argv.push('--jobs')
- argv.push(parseInt(jobs, 10))
+ argv.push(j)
} else if (jobs.toUpperCase() === 'MAX') {
argv.push('--jobs')
argv.push(require('os').cpus().length)
diff --git a/lib/configure.js b/lib/configure.js
index e101a31..e8c2029 100644
--- a/lib/configure.js
+++ b/lib/configure.js
@@ -1,4 +1,3 @@
-
module.exports = exports = configure
/**
@@ -14,6 +13,8 @@ var fs = require('graceful-fs')
, semver = require('semver')
, mkdirp = require('mkdirp')
, cp = require('child_process')
+ , PathArray = require('path-array')
+ , extend = require('util')._extend
, spawn = cp.spawn
, execFile = cp.execFile
, win = process.platform == 'win32'
@@ -22,7 +23,7 @@ exports.usage = 'Generates ' + (win ? 'MSVC project files' : 'a Makefile') + ' f
function configure (gyp, argv, callback) {
- var python = gyp.opts.python || process.env.PYTHON || 'python'
+ var python = gyp.opts.python || process.env.PYTHON || 'python2'
, buildDir = path.resolve('build')
, configNames = [ 'config.gypi', 'common.gypi' ]
, configs = []
@@ -36,6 +37,10 @@ function configure (gyp, argv, callback) {
which(python, function (err, execPath) {
if (err) {
log.verbose('`which` failed', python, err)
+ if (python === 'python2') {
+ python = 'python'
+ return checkPython()
+ }
if (win) {
guessPython()
} else {
@@ -73,7 +78,9 @@ function configure (gyp, argv, callback) {
}
function checkPythonVersion () {
- var env = { TERM: 'dumb', PATH: process.env.PATH };
+ var env = extend({}, process.env)
+ env.TERM = 'dumb'
+
execFile(python, ['-c', 'import platform; print(platform.python_version());'], { env: env }, function (err, stdout) {
if (err) {
return callback(err)
@@ -88,8 +95,14 @@ function configure (gyp, argv, callback) {
log.silly('stripping "rc" identifier from version')
version = version.replace(/rc(.*)$/ig, '')
}
- var range = semver.Range('>=2.5.0 <3.0.0');
- if (range.test(version)) {
+ var range = semver.Range('>=2.5.0 <3.0.0')
+ var valid = false
+ try {
+ valid = range.test(version)
+ } catch (e) {
+ log.silly('range.test() error', e)
+ }
+ if (valid) {
getNodeDir()
} else {
failPythonVersion(version)
@@ -210,7 +223,7 @@ function configure (gyp, argv, callback) {
variables.copy_dev_lib = !gyp.opts.nodedir
// disable -T "thin" static archives by default
- variables.standalone_static_library = gyp.opts.thin ? 0 : 1;
+ variables.standalone_static_library = gyp.opts.thin ? 0 : 1
// loop through the rest of the opts and add the unknown ones as variables.
// this allows for module-specific configure flags like:
@@ -303,14 +316,17 @@ function configure (gyp, argv, callback) {
// Windows expects an absolute path
output_dir = buildDir
}
+ var nodeGypDir = path.resolve(__dirname, '..')
argv.push('-I', addon_gypi)
argv.push('-I', common_gypi)
argv.push('-Dlibrary=shared_library')
argv.push('-Dvisibility=default')
argv.push('-Dnode_root_dir=' + nodeDir)
+ argv.push('-Dnode_gyp_dir=' + nodeGypDir)
argv.push('-Dmodule_root_dir=' + process.cwd())
argv.push('--depth=.')
+ argv.push('--no-parallel')
// tell gyp to write the Makefile/Solution files into output_dir
argv.push('--generator-output', output_dir)
@@ -324,6 +340,10 @@ function configure (gyp, argv, callback) {
// execute `gyp` from the current target nodedir
argv.unshift(gyp_script)
+ // make sure python uses files that came with this particular node package
+ var pypath = new PathArray(process.env, 'PYTHONPATH')
+ pypath.unshift(path.join(__dirname, '..', 'gyp', 'pylib'))
+
var cp = gyp.spawn(python, argv)
cp.on('exit', onCpExit)
}
diff --git a/lib/install.js b/lib/install.js
index 60dc3cd..6cbcdb8 100644
--- a/lib/install.js
+++ b/lib/install.js
@@ -12,6 +12,7 @@ var fs = require('graceful-fs')
, tar = require('tar')
, rm = require('rimraf')
, path = require('path')
+ , crypto = require('crypto')
, zlib = require('zlib')
, log = require('npmlog')
, semver = require('semver')
@@ -38,7 +39,7 @@ function install (gyp, argv, callback) {
}
}
- var distUrl = gyp.opts['dist-url'] || gyp.opts.disturl || 'http://nodejs.org/dist'
+ var distUrl = gyp.opts['dist-url'] || gyp.opts.disturl || 'https://nodejs.org/dist'
// Determine which node dev files version we are installing
@@ -71,6 +72,9 @@ function install (gyp, argv, callback) {
version = version.version
log.verbose('install', 'installing version: %s', version)
+ // distributions starting with 0.10.0 contain sha256 checksums
+ var checksumAlgo = semver.gte(version, '0.10.0') ? 'sha256' : 'sha1'
+
// the directory where the dev files will be installed
var devDir = path.resolve(gyp.devDir, version)
@@ -151,6 +155,15 @@ function install (gyp, argv, callback) {
return req
}
+ function getContentSha(res, callback) {
+ var shasum = crypto.createHash(checksumAlgo)
+ res.on('data', function (chunk) {
+ shasum.update(chunk)
+ }).on('end', function () {
+ callback(null, shasum.digest('hex'))
+ })
+ }
+
function go () {
log.verbose('ensuring nodedir is created', devDir)
@@ -171,13 +184,16 @@ function install (gyp, argv, callback) {
}
// now download the node tarball
- var tarPath = gyp.opts['tarball'];
+ var tarPath = gyp.opts['tarball']
var tarballUrl = tarPath ? tarPath : distUrl + '/v' + version + '/node-v' + version + '.tar.gz'
, badDownload = false
, extractCount = 0
, gunzip = zlib.createGunzip()
, extracter = tar.Extract({ path: devDir, strip: 1, filter: isValid })
+ var contentShasums = {}
+ var expectShasums = {}
+
// checks if a file to be extracted from the tarball is valid.
// only .h header files and the gyp files get extracted
function isValid () {
@@ -214,6 +230,11 @@ function install (gyp, argv, callback) {
// something went wrong downloading the tarball?
req.on('error', function (err) {
+ if (err.code === 'ENOTFOUND') {
+ return cb(new Error('This is most likely not a problem with node-gyp or the package itself and\n' +
+ 'is related to network connectivity. In most cases you are behind a proxy or have bad \n' +
+ 'network settings.'))
+ }
badDownload = true
cb(err)
})
@@ -227,9 +248,16 @@ function install (gyp, argv, callback) {
req.on('response', function (res) {
if (res.statusCode !== 200) {
badDownload = true
- cb(new Error(res.statusCode + ' status code downloading tarball'))
+ cb(new Error(res.statusCode + ' response downloading ' + tarballUrl))
return
}
+ // content checksum
+ getContentSha(res, function (_, checksum) {
+ var filename = path.basename(tarballUrl).trim()
+ contentShasums[filename] = checksum
+ log.verbose('content checksum', filename, checksum)
+ })
+
// start unzipping and untaring
req.pipe(gunzip).pipe(extracter)
})
@@ -254,6 +282,13 @@ function install (gyp, argv, callback) {
var installVersionPath = path.resolve(devDir, 'installVersion')
fs.writeFile(installVersionPath, gyp.package.installVersion + '\n', deref)
+ // Only download SHASUMS.txt if not using tarPath override
+ if (!tarPath) {
+ // download SHASUMS.txt
+ async++
+ downloadShasums(deref)
+ }
+
if (async === 0) {
// no async tasks required
cb()
@@ -261,10 +296,60 @@ function install (gyp, argv, callback) {
function deref (err) {
if (err) return cb(err)
- --async || cb()
+
+ async--
+ if (!async) {
+ log.verbose('download contents checksum', JSON.stringify(contentShasums))
+ // check content shasums
+ for (var k in contentShasums) {
+ log.verbose('validating download checksum for ' + k, '(%s == %s)', contentShasums[k], expectShasums[k])
+ if (contentShasums[k] !== expectShasums[k]) {
+ cb(new Error(k + ' local checksum ' + contentShasums[k] + ' not match remote ' + expectShasums[k]))
+ return
+ }
+ }
+ cb()
+ }
}
}
+ function downloadShasums(done) {
+ var shasumsFile = (checksumAlgo === 'sha256') ? 'SHASUMS256.txt' : 'SHASUMS.txt'
+ log.verbose('check download content checksum, need to download `' + shasumsFile + '`...')
+ var shasumsPath = path.resolve(devDir, shasumsFile)
+ , shasumsUrl = distUrl + '/v' + version + '/' + shasumsFile
+
+ log.verbose('checksum url', shasumsUrl)
+ var req = download(shasumsUrl)
+ if (!req) return
+ req.on('error', done)
+ req.on('response', function (res) {
+ if (res.statusCode !== 200) {
+ done(new Error(res.statusCode + ' status code downloading checksum'))
+ return
+ }
+
+ var chunks = []
+ res.on('data', function (chunk) {
+ chunks.push(chunk)
+ })
+ res.on('end', function () {
+ var lines = Buffer.concat(chunks).toString().trim().split('\n')
+ lines.forEach(function (line) {
+ var items = line.trim().split(/\s+/)
+ if (items.length !== 2) return
+
+ // 0035d18e2dcf9aad669b1c7c07319e17abfe3762 ./node-v0.11.4.tar.gz
+ var name = items[1].replace(/^\.\//, '')
+ expectShasums[name] = items[0]
+ })
+
+ log.verbose('checksum data', JSON.stringify(expectShasums))
+ done()
+ })
+ })
+ }
+
function downloadNodeLib (done) {
log.verbose('on Windows; need to download `node.lib`...')
var dir32 = path.resolve(devDir, 'ia32')
@@ -293,6 +378,11 @@ function install (gyp, argv, callback) {
return
}
+ getContentSha(res, function (_, checksum) {
+ contentShasums['node.lib'] = checksum
+ log.verbose('content checksum', 'node.lib', checksum)
+ })
+
var ws = fs.createWriteStream(nodeLibPath32)
ws.on('error', cb)
req.pipe(ws)
@@ -314,6 +404,11 @@ function install (gyp, argv, callback) {
return
}
+ getContentSha(res, function (_, checksum) {
+ contentShasums['x64/node.lib'] = checksum
+ log.verbose('content checksum', 'x64/node.lib', checksum)
+ })
+
var ws = fs.createWriteStream(nodeLibPath64)
ws.on('error', cb)
req.pipe(ws)
diff --git a/lib/node-gyp.js b/lib/node-gyp.js
index 2ae0890..6223d4b 100644
--- a/lib/node-gyp.js
+++ b/lib/node-gyp.js
@@ -180,8 +180,8 @@ proto.parseArgv = function parseOpts (argv) {
proto.spawn = function spawn (command, args, opts) {
if (!opts) opts = {}
- if (!opts.silent && !opts.customFds) {
- opts.customFds = [ 0, 1, 2 ]
+ if (!opts.silent && !opts.stdio) {
+ opts.stdio = [ 0, 1, 2 ]
}
var cp = child_process.spawn(command, args, opts)
log.info('spawn', command)
@@ -203,9 +203,6 @@ proto.usage = function usage () {
return ' - ' + c + ' - ' + require('./' + c).usage
}).join('\n')
, ''
- , ' for specific command usage and options try:'
- , ' $ node-gyp <command> --help'
- , ''
, 'node-gyp@' + this.version + ' ' + path.resolve(__dirname, '..')
, 'node@' + process.versions.node
].join('\n')
diff --git a/lib/rebuild.js b/lib/rebuild.js
index 595d87a..4c6f472 100644
--- a/lib/rebuild.js
+++ b/lib/rebuild.js
@@ -3,13 +3,11 @@ module.exports = exports = rebuild
exports.usage = 'Runs "clean", "configure" and "build" all at once'
-var log = require('npmlog')
-
function rebuild (gyp, argv, callback) {
gyp.todo.push(
{ name: 'clean', args: [] }
- , { name: 'configure', args: [] }
+ , { name: 'configure', args: argv }
, { name: 'build', args: [] }
)
process.nextTick(callback)
diff --git a/node_modules/.bin/mkdirp b/node_modules/.bin/mkdirp
new file mode 120000
index 0000000..017896c
--- /dev/null
+++ b/node_modules/.bin/mkdirp
@@ -0,0 +1 @@
+../mkdirp/bin/cmd.js
\ No newline at end of file
diff --git a/node_modules/path-array/.npmignore b/node_modules/path-array/.npmignore
new file mode 100644
index 0000000..07e6e47
--- /dev/null
+++ b/node_modules/path-array/.npmignore
@@ -0,0 +1 @@
+/node_modules
diff --git a/node_modules/path-array/.travis.yml b/node_modules/path-array/.travis.yml
new file mode 100644
index 0000000..c7d8e3d
--- /dev/null
+++ b/node_modules/path-array/.travis.yml
@@ -0,0 +1,6 @@
+language: node_js
+node_js:
+ - 0.8
+ - 0.9
+ - 0.10
+ - 0.11
diff --git a/node_modules/path-array/History.md b/node_modules/path-array/History.md
new file mode 100644
index 0000000..ff93a2a
--- /dev/null
+++ b/node_modules/path-array/History.md
@@ -0,0 +1,22 @@
+
+1.0.0 / 2014-11-11
+==================
+
+ * index: add support for a configrable `property` name to use
+ * README: fix Travis badge
+
+0.0.2 / 2013-12-22
+==================
+
+ * README++
+ * test: add unshift() test
+ * test: add more tests
+ * index: ensure that the indexed getters/setters are set up in the constructor
+ * add .travis.yml file
+ * add initial tests
+
+0.0.1 / 2013-12-21
+==================
+
+ * add README.md
+ * initial commit
diff --git a/node_modules/path-array/README.md b/node_modules/path-array/README.md
new file mode 100644
index 0000000..2595316
--- /dev/null
+++ b/node_modules/path-array/README.md
@@ -0,0 +1,92 @@
+path-array
+==========
+### Treat your `$PATH` like a JavaScript Array
+[](https://travis-ci.org/TooTallNate/path-array)
+
+This module provides a JavaScript `Array` implementation that is backed by your
+`$PATH` env variable. That is, you can use regular Array functions like `shift()`,
+`pop()`, `push()`, `unshift()`, etc. to mutate your `$PATH`.
+
+Also works for preparing an `env` object for passing to
+[`child_process.spawn()`][cp.spawn].
+
+
+Installation
+------------
+
+Install with `npm`:
+
+``` bash
+$ npm install path-array
+```
+
+
+Example
+-------
+
+Interacting with your own `$PATH` env variable:
+
+``` js
+var PathArray = require('path-array');
+
+// no args uses `process.env` by default
+var p = new PathArray();
+
+console.log(p);
+// [ './node_modules/.bin',
+// '/opt/local/bin',
+// '/opt/local/sbin',
+// '/usr/local/bin',
+// '/usr/local/sbin',
+// '/usr/bin',
+// '/bin',
+// '/usr/sbin',
+// '/sbin',
+// '/usr/local/bin',
+// '/opt/X11/bin' ]
+
+// push another path entry. this function mutates the `process.env.PATH`
+p.unshift('/foo');
+
+console.log(process.env.PATH);
+// '/foo:./node_modules/.bin:/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin'
+```
+
+
+API
+---
+
+### new PathArray([env]) → PathArray
+
+Creates and returns a new `PathArray` instance with the given `env` object. If no
+`env` is specified, then [`process.env`][process.env] is used by default.
+
+
+License
+-------
+
+(The MIT License)
+
+Copyright (c) 2013 Nathan Rajlich <nathan at tootallnate.net>
+
+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.
+
+[process.env]: http://nodejs.org/docs/latest/api/process.html#process_process_env
+[cp.spawn]: http://nodejs.org/docs/latest/api/child_process.html#child_process_child_process_spawn_command_args_options
diff --git a/node_modules/path-array/index.js b/node_modules/path-array/index.js
new file mode 100644
index 0000000..40b982d
--- /dev/null
+++ b/node_modules/path-array/index.js
@@ -0,0 +1,137 @@
+
+/**
+ * Module dependencies.
+ */
+
+var inherits = require('util').inherits;
+var delimiter = require('path').delimiter || ':';
+var ArrayIndex = require('array-index');
+
+/**
+ * Module exports.
+ */
+
+module.exports = PathArray;
+
+/**
+ * `PathArray` constructor. Treat your `$PATH` like a mutable JavaScript Array!
+ *
+ * @param {Env} env - `process.env` object to use.
+ * @param {String} [property] - optional property name to use (`PATH` by default).
+ * @public
+ */
+
+function PathArray (env, property) {
+ if (!(this instanceof PathArray)) return new PathArray(env);
+ ArrayIndex.call(this);
+
+ this.property = property || 'PATH';
+
+ // overwrite only the `get` operator of the ".length" property
+ Object.defineProperty(this, 'length', {
+ get: this._getLength
+ });
+
+ // store the `process.env` object as a non-enumerable `_env`
+ Object.defineProperty(this, '_env', {
+ value: env || process.env,
+ writable: true,
+ enumerable: false,
+ configurable: true
+ });
+
+ // need to invoke the `length` getter to ensure that the
+ // indexed getters/setters are set up at this point
+ void(this.length);
+}
+
+// inherit from ArrayIndex
+inherits(PathArray, ArrayIndex);
+
+/**
+ * Returns the current $PATH representation as an Array.
+ *
+ * @api private
+ */
+
+PathArray.prototype._array = function () {
+ var path = this._env[this.property];
+ if (!path) return [];
+ return path.split(delimiter);
+};
+
+/**
+ * Sets the `env` object's `PATH` string to the values in the passed in Array
+ * instance.
+ *
+ * @api private
+ */
+
+PathArray.prototype._setArray = function (arr) {
+ // mutate the $PATH
+ this._env[this.property] = arr.join(delimiter);
+};
+
+/**
+ * `.length` getter operation implementation.
+ *
+ * @api private
+ */
+
+PathArray.prototype._getLength = function () {
+ var length = this._array().length;
+
+ // invoke the ArrayIndex internal `set` operator to ensure that
+ // there's getters/setters defined for the determined length so far...
+ this.length = length;
+
+ return length;
+};
+
+/**
+ * ArrayIndex [0] getter operator implementation.
+ *
+ * @api private
+ */
+
+PathArray.prototype.__get__ = function get (index) {
+ return this._array()[index];
+};
+
+/**
+ * ArrayIndex [0]= setter operator implementation.
+ *
+ * @api private
+ */
+
+PathArray.prototype.__set__ = function set (index, value) {
+ var arr = this._array();
+ arr[index] = value;
+ this._setArray(arr);
+ return value;
+};
+
+/**
+ * `toString()` returns the current $PATH string.
+ *
+ * @api public
+ */
+
+PathArray.prototype.toString = function toString () {
+ return this._env[this.property] || '';
+};
+
+// proxy the JavaScript Array functions, and mutate the $PATH
+Object.getOwnPropertyNames(Array.prototype).forEach(function (name) {
+ if ('constructor' == name) return;
+ if ('function' != typeof Array.prototype[name]) return;
+ if (/to(Locale)?String/.test(name)) return;
+ //console.log('proxy %s', name);
+
+ PathArray.prototype[name] = function () {
+ var arr = this._array();
+ var rtn = arr[name].apply(arr, arguments);
+ this._setArray(arr);
+ return rtn;
+ };
+});
diff --git a/node_modules/path-array/node_modules/array-index/.jshintrc b/node_modules/path-array/node_modules/array-index/.jshintrc
new file mode 100644
index 0000000..182e34d
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/.jshintrc
@@ -0,0 +1,4 @@
+{
+ "asi": true,
+ "laxcomma": true
+}
diff --git a/node_modules/path-array/node_modules/array-index/.npmignore b/node_modules/path-array/node_modules/array-index/.npmignore
new file mode 100644
index 0000000..3c3629e
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/.npmignore
@@ -0,0 +1 @@
+node_modules
diff --git a/node_modules/path-array/node_modules/array-index/.travis.yml b/node_modules/path-array/node_modules/array-index/.travis.yml
new file mode 100644
index 0000000..99cdc74
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/.travis.yml
@@ -0,0 +1,5 @@
+language: node_js
+node_js:
+ - "0.8"
+ - "0.10"
+ - "0.11"
diff --git a/node_modules/path-array/node_modules/array-index/History.md b/node_modules/path-array/node_modules/array-index/History.md
new file mode 100644
index 0000000..20b03e9
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/History.md
@@ -0,0 +1,39 @@
+
+0.1.1 / 2014-11-03
+==================
+
+ * index: use `%o` debug formatters
+ * .travis: don't test node v0.9.x
+ * README: use svg for Travis badge
+ * add .jshintrc file
+
+0.1.0 / 2013-12-01
+==================
+
+ * add `History.md` file
+ * .travis.yml: test node v0.8-v0.11
+ * add component.json
+ * package: update "main" field
+ * package: beautify
+
+0.0.4 / 2013-09-27
+==================
+
+ * ensure that the `length` property has the same maximum as regular Arrays
+
+0.0.3 / 2013-09-15
+==================
+
+ * add `toArray()`, `toJSON()`, and `toString()` functions
+ * add an `inspect()` function
+
+0.0.2 / 2013-09-15
+==================
+
+ * use "configurable: true"
+ * add `travis.yml` file
+
+0.0.1 / 2013-06-14
+==================
+
+ * Initial release
diff --git a/node_modules/path-array/node_modules/array-index/Makefile b/node_modules/path-array/node_modules/array-index/Makefile
new file mode 100644
index 0000000..0f14dac
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/Makefile
@@ -0,0 +1,11 @@
+
+build: components index.js
+ @component build --dev
+
+components: component.json
+ @component install --dev
+
+clean:
+ rm -fr build components template.js
+
+.PHONY: clean
diff --git a/node_modules/path-array/node_modules/array-index/README.md b/node_modules/path-array/node_modules/array-index/README.md
new file mode 100644
index 0000000..ecd3498
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/README.md
@@ -0,0 +1,156 @@
+array-index
+===========
+### Invoke getter/setter functions on array-like objects
+[](http://travis-ci.org/TooTallNate/array-index)
+
+
+This little module provides an `ArrayIndex` constructor function that you can
+inherit from with your own objects. When a numbered property gets read, then the
+`__get__` function on the object will be invoked. When a numbered property gets
+set, then the `__set__` function on the object will be invoked.
+
+
+Installation
+------------
+
+Install with `npm`:
+
+``` bash
+$ npm install array-index
+```
+
+
+Examples
+--------
+
+A quick silly example, using `Math.sqrt()` for the "getter":
+
+``` js
+var ArrayIndex = require('array-index')
+
+// let's just create a singleton instance.
+var a = new ArrayIndex()
+
+// the "__get__" function is invoked for each "a[n]" access.
+// it is given a single argument, the "index" currently being accessed.
+// so here, we're passing in the `Math.sqrt()` function, so accessing
+// "a[9]" will return `Math.sqrt(9)`.
+a.__get__ = Math.sqrt
+
+// the "__get__" and "__set__" functions are only invoked up
+// to "a.length", so we must set that manually.
+a.length = 10
+
+console.log(a)
+// [ 0,
+// 1,
+// 1.4142135623730951,
+// 1.7320508075688772,
+// 2,
+// 2.23606797749979,
+// 2.449489742783178,
+// 2.6457513110645907,
+// 2.8284271247461903,
+// 3,
+// __get__: [Function: sqrt] ]
+```
+
+Here's an example of creating a subclass of `ArrayIndex` using `util.inherits()`:
+
+``` js
+var ArrayIndex = require('array-index')
+var inherits = require('util').inherits
+
+function MyArray (length) {
+ // be sure to call the ArrayIndex constructor in your own constructor
+ ArrayIndex.call(this, length)
+
+ // the "set" object will contain values at indexes previously set,
+ // so that they can be returned in the "getter" function. This is just a
+ // silly example, your subclass will have more meaningful logic.
+ Object.defineProperty(this, 'set', {
+ value: Object.create(null),
+ enumerable: false
+ })
+}
+
+// inherit from the ArrayIndex's prototype
+inherits(MyArray, ArrayIndex)
+
+MyArray.prototype.__get__ = function (index) {
+ if (index in this.set) return this.set[index]
+ return index * 2
+}
+
+MyArray.prototype.__set__ = function (index, v) {
+ this.set[index] = v
+}
+
+
+// and now you can create some instances
+var a = new MyArray(15)
+a[9] = a[10] = a[14] = '_'
+a[0] = 'nate'
+
+console.log(a)
+// [ 'nate', 2, 4, 6, 8, 10, 12, 14, 16, '_', '_', 22, 24, 26, '_' ]
+```
+
+API
+---
+
+The `ArrayIndex` base class is meant to be subclassed, but it also has a few
+convenient functions built-in.
+
+### "length" -> Number
+
+The length of the ArrayIndex instance. The `__get__` and `__set__` functions will
+only be invoked on the object up to this "length". You may set this length at any
+time to adjust the amount range where the getters/setters will be invoked.
+
+### "toArray()" -> Array
+
+Returns a new regular Array instance with the same values that this ArrayIndex
+class would have. This function calls the `__get__` function repeatedly from
+`0...length-1` and returns the "flattened" array instance.
+
+### "toJSON()" -> Array
+
+All `ArrayIndex` instances get basic support for `JSON.stringify()`, which is
+the same as a "flattened" Array being stringified.
+
+### "toString()" -> String
+
+The `toString()` override is basically just `array.toArray().toString()`.
+
+### "format()" -> String
+
+The `inspect()` implementation for the REPL attempts to mimic what a regular
+Array looks like in the REPL.
+
+
+License
+-------
+
+(The MIT License)
+
+Copyright (c) 2012 Nathan Rajlich <nathan at tootallnate.net>
+
+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/path-array/node_modules/array-index/component.json b/node_modules/path-array/node_modules/array-index/component.json
new file mode 100644
index 0000000..390d7a7
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/component.json
@@ -0,0 +1,22 @@
+{
+ "name": "array-index",
+ "repo": "TooTallNate/array-index",
+ "description": "Invoke getter/setter functions on array-like objects",
+ "keywords": [
+ "index",
+ "array",
+ "getter",
+ "setter",
+ "proxy"
+ ],
+ "version": "0.1.1",
+ "dependencies": {
+ "visionmedia/debug": "*"
+ },
+ "development": {},
+ "license": "MIT",
+ "main": "index.js",
+ "scripts": [
+ "index.js"
+ ]
+}
diff --git a/node_modules/path-array/node_modules/array-index/index.js b/node_modules/path-array/node_modules/array-index/index.js
new file mode 100644
index 0000000..18069c6
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/index.js
@@ -0,0 +1,180 @@
+
+/**
+ * Module dependencies.
+ */
+
+var util = require('util')
+var debug = require('debug')('array-index')
+
+/**
+ * JavaScript Array "length" is bound to an unsigned 32-bit int.
+ * See: http://stackoverflow.com/a/6155063/376773
+ */
+
+var MAX_LENGTH = Math.pow(2, 32)
+
+/**
+ * Module exports.
+ */
+
+module.exports = ArrayIndex
+
+/**
+ * Subclass this.
+ */
+
+function ArrayIndex (length) {
+ Object.defineProperty(this, 'length', {
+ get: getLength,
+ set: setLength,
+ enumerable: false,
+ configurable: true
+ })
+
+ Object.defineProperty(this, '__length', {
+ value: 0,
+ writable: true,
+ enumerable: false,
+ configurable: true
+ })
+
+ if (arguments.length > 0) {
+ this.length = length
+ }
+}
+
+/**
+ * You overwrite the "__get__" function in your subclass.
+ */
+
+ArrayIndex.prototype.__get__ = function () {
+ throw new Error('you must implement the __get__ function')
+}
+
+/**
+ * You overwrite the "__set__" function in your subclass.
+ */
+
+ArrayIndex.prototype.__set__ = function () {
+ throw new Error('you must implement the __set__ function')
+}
+
+/**
+ * Converts this array class into a real JavaScript Array. Note that this
+ * is a "flattened" array and your defined getters and setters won't be invoked
+ * when you interact with the returned Array. This function will call the
+ * getter on every array index of the object.
+ *
+ * @return {Array} The flattened array
+ * @api public
+ */
+
+ArrayIndex.prototype.toArray = function toArray () {
+ var i = 0, l = this.length, array = new Array(l)
+ for (; i < l; i++) {
+ array[i] = this[i]
+ }
+ return array
+}
+
+/**
+ * Basic support for `JSON.stringify()`.
+ */
+
+ArrayIndex.prototype.toJSON = function toJSON () {
+ return this.toArray()
+}
+
+/**
+ * toString() override. Use Array.prototype.toString().
+ */
+
+ArrayIndex.prototype.toString = function toString () {
+ var a = this.toArray()
+ return a.toString.apply(a, arguments)
+}
+
+/**
+ * inspect() override. For the REPL.
+ */
+
+ArrayIndex.prototype.inspect = function inspect () {
+ var a = this.toArray()
+ Object.keys(this).forEach(function (k) {
+ a[k] = this[k]
+ }, this)
+ return util.inspect(a)
+}
+
+/**
+ * Getter for the "length" property.
+ * Returns the value of the "__length" property.
+ */
+
+function getLength () {
+ debug('getting "length": %o', this.__length)
+ return this.__length
+}
+
+/**
+ * Setter for the "length" property.
+ * Calls "ensureLength()", then sets the "__length" property.
+ */
+
+function setLength (v) {
+ debug('setting "length": %o', v)
+ return this.__length = ensureLength(v)
+}
+
+/**
+ * Ensures that getters/setters from 0 up to "_length" have been defined
+ * on `ArrayIndex.prototype`.
+ *
+ * @api private
+ */
+
+function ensureLength (_length) {
+ var length
+ if (_length > MAX_LENGTH) {
+ length = MAX_LENGTH
+ } else {
+ length = _length | 0
+ }
+ var cur = ArrayIndex.prototype.__length__ | 0
+ var num = length - cur
+ if (num > 0) {
+ var desc = {}
+ debug('creating a descriptor object with %o entries', num)
+ for (var i = cur; i < length; i++) {
+ desc[i] = setup(i)
+ }
+ debug('done creating descriptor object')
+ debug('calling `Object.defineProperties()` with %o entries', num)
+ Object.defineProperties(ArrayIndex.prototype, desc)
+ debug('finished `Object.defineProperties()`')
+ ArrayIndex.prototype.__length__ = length
+ }
+ return length
+}
+
+/**
+ * Returns a property descriptor for the given "index", with "get" and "set"
+ * functions created within the closure.
+ *
+ * @api private
+ */
+
+function setup (index) {
+ function get () {
+ return this.__get__(index)
+ }
+ function set (v) {
+ return this.__set__(index, v)
+ }
+ return {
+ enumerable: true
+ , configurable: true
+ , get: get
+ , set: set
+ }
+}
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/.jshintrc b/node_modules/path-array/node_modules/array-index/node_modules/debug/.jshintrc
new file mode 100644
index 0000000..299877f
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/.jshintrc
@@ -0,0 +1,3 @@
+{
+ "laxbreak": true
+}
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/.npmignore b/node_modules/path-array/node_modules/array-index/node_modules/debug/.npmignore
new file mode 100644
index 0000000..7e6163d
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/.npmignore
@@ -0,0 +1,6 @@
+support
+test
+examples
+example
+*.sock
+dist
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/History.md b/node_modules/path-array/node_modules/array-index/node_modules/debug/History.md
new file mode 100644
index 0000000..854c971
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/History.md
@@ -0,0 +1,195 @@
+
+2.2.0 / 2015-05-09
+==================
+
+ * package: update "ms" to v0.7.1 (#202, @dougwilson)
+ * README: add logging to file example (#193, @DanielOchoa)
+ * README: fixed a typo (#191, @amir-s)
+ * browser: expose `storage` (#190, @stephenmathieson)
+ * Makefile: add a `distclean` target (#189, @stephenmathieson)
+
+2.1.3 / 2015-03-13
+==================
+
+ * Updated stdout/stderr example (#186)
+ * Updated example/stdout.js to match debug current behaviour
+ * Renamed example/stderr.js to stdout.js
+ * Update Readme.md (#184)
+ * replace high intensity foreground color for bold (#182, #183)
+
+2.1.2 / 2015-03-01
+==================
+
+ * dist: recompile
+ * update "ms" to v0.7.0
+ * package: update "browserify" to v9.0.3
+ * component: fix "ms.js" repo location
+ * changed bower package name
+ * updated documentation about using debug in a browser
+ * fix: security error on safari (#167, #168, @yields)
+
+2.1.1 / 2014-12-29
+==================
+
+ * browser: use `typeof` to check for `console` existence
+ * browser: check for `console.log` truthiness (fix IE 8/9)
+ * browser: add support for Chrome apps
+ * Readme: added Windows usage remarks
+ * Add `bower.json` to properly support bower install
+
+2.1.0 / 2014-10-15
+==================
+
+ * node: implement `DEBUG_FD` env variable support
+ * package: update "browserify" to v6.1.0
+ * package: add "license" field to package.json (#135, @panuhorsmalahti)
+
+2.0.0 / 2014-09-01
+==================
+
+ * package: update "browserify" to v5.11.0
+ * node: use stderr rather than stdout for logging (#29, @stephenmathieson)
+
+1.0.4 / 2014-07-15
+==================
+
+ * dist: recompile
+ * example: remove `console.info()` log usage
+ * example: add "Content-Type" UTF-8 header to browser example
+ * browser: place %c marker after the space character
+ * browser: reset the "content" color via `color: inherit`
+ * browser: add colors support for Firefox >= v31
+ * debug: prefer an instance `log()` function over the global one (#119)
+ * Readme: update documentation about styled console logs for FF v31 (#116, @wryk)
+
+1.0.3 / 2014-07-09
+==================
+
+ * Add support for multiple wildcards in namespaces (#122, @seegno)
+ * browser: fix lint
+
+1.0.2 / 2014-06-10
+==================
+
+ * browser: update color palette (#113, @gscottolson)
+ * common: make console logging function configurable (#108, @timoxley)
+ * node: fix %o colors on old node <= 0.8.x
+ * Makefile: find node path using shell/which (#109, @timoxley)
+
+1.0.1 / 2014-06-06
+==================
+
+ * browser: use `removeItem()` to clear localStorage
+ * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777)
+ * package: add "contributors" section
+ * node: fix comment typo
+ * README: list authors
+
+1.0.0 / 2014-06-04
+==================
+
+ * make ms diff be global, not be scope
+ * debug: ignore empty strings in enable()
+ * node: make DEBUG_COLORS able to disable coloring
+ * *: export the `colors` array
+ * npmignore: don't publish the `dist` dir
+ * Makefile: refactor to use browserify
+ * package: add "browserify" as a dev dependency
+ * Readme: add Web Inspector Colors section
+ * node: reset terminal color for the debug content
+ * node: map "%o" to `util.inspect()`
+ * browser: map "%j" to `JSON.stringify()`
+ * debug: add custom "formatters"
+ * debug: use "ms" module for humanizing the diff
+ * Readme: add "bash" syntax highlighting
+ * browser: add Firebug color support
+ * browser: add colors for WebKit browsers
+ * node: apply log to `console`
+ * rewrite: abstract common logic for Node & browsers
+ * add .jshintrc file
+
+0.8.1 / 2014-04-14
+==================
+
+ * package: re-add the "component" section
+
+0.8.0 / 2014-03-30
+==================
+
+ * add `enable()` method for nodejs. Closes #27
+ * change from stderr to stdout
+ * remove unnecessary index.js file
+
+0.7.4 / 2013-11-13
+==================
+
+ * remove "browserify" key from package.json (fixes something in browserify)
+
+0.7.3 / 2013-10-30
+==================
+
+ * fix: catch localStorage security error when cookies are blocked (Chrome)
+ * add debug(err) support. Closes #46
+ * add .browser prop to package.json. Closes #42
+
+0.7.2 / 2013-02-06
+==================
+
+ * fix package.json
+ * fix: Mobile Safari (private mode) is broken with debug
+ * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript
+
+0.7.1 / 2013-02-05
+==================
+
+ * add repository URL to package.json
+ * add DEBUG_COLORED to force colored output
+ * add browserify support
+ * fix component. Closes #24
+
+0.7.0 / 2012-05-04
+==================
+
+ * Added .component to package.json
+ * Added debug.component.js build
+
+0.6.0 / 2012-03-16
+==================
+
+ * Added support for "-" prefix in DEBUG [Vinay Pulim]
+ * Added `.enabled` flag to the node version [TooTallNate]
+
+0.5.0 / 2012-02-02
+==================
+
+ * Added: humanize diffs. Closes #8
+ * Added `debug.disable()` to the CS variant
+ * Removed padding. Closes #10
+ * Fixed: persist client-side variant again. Closes #9
+
+0.4.0 / 2012-02-01
+==================
+
+ * Added browser variant support for older browsers [TooTallNate]
+ * Added `debug.enable('project:*')` to browser variant [TooTallNate]
+ * Added padding to diff (moved it to the right)
+
+0.3.0 / 2012-01-26
+==================
+
+ * Added millisecond diff when isatty, otherwise UTC string
+
+0.2.0 / 2012-01-22
+==================
+
+ * Added wildcard support
+
+0.1.0 / 2011-12-02
+==================
+
+ * Added: remove colors unless stderr isatty [TooTallNate]
+
+0.0.1 / 2010-01-03
+==================
+
+ * Initial release
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/Makefile b/node_modules/path-array/node_modules/array-index/node_modules/debug/Makefile
new file mode 100644
index 0000000..5cf4a59
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/Makefile
@@ -0,0 +1,36 @@
+
+# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
+THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
+THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)
+
+# BIN directory
+BIN := $(THIS_DIR)/node_modules/.bin
+
+# applications
+NODE ?= $(shell which node)
+NPM ?= $(NODE) $(shell which npm)
+BROWSERIFY ?= $(NODE) $(BIN)/browserify
+
+all: dist/debug.js
+
+install: node_modules
+
+clean:
+ @rm -rf dist
+
+dist:
+ @mkdir -p $@
+
+dist/debug.js: node_modules browser.js debug.js dist
+ @$(BROWSERIFY) \
+ --standalone debug \
+ . > $@
+
+distclean: clean
+ @rm -rf node_modules
+
+node_modules: package.json
+ @NODE_ENV= $(NPM) install
+ @touch node_modules
+
+.PHONY: all install clean distclean
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/Readme.md b/node_modules/path-array/node_modules/array-index/node_modules/debug/Readme.md
new file mode 100644
index 0000000..b4f45e3
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/Readme.md
@@ -0,0 +1,188 @@
+# debug
+
+ tiny node.js debugging utility modelled after node core's debugging technique.
+
+## Installation
+
+```bash
+$ npm install debug
+```
+
+## Usage
+
+ With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility.
+
+Example _app.js_:
+
+```js
+var debug = require('debug')('http')
+ , http = require('http')
+ , name = 'My App';
+
+// fake app
+
+debug('booting %s', name);
+
+http.createServer(function(req, res){
+ debug(req.method + ' ' + req.url);
+ res.end('hello\n');
+}).listen(3000, function(){
+ debug('listening');
+});
+
+// fake worker of some kind
+
+require('./worker');
+```
+
+Example _worker.js_:
+
+```js
+var debug = require('debug')('worker');
+
+setInterval(function(){
+ debug('doing some work');
+}, 1000);
+```
+
+ The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples:
+
+ 
+
+ 
+
+#### Windows note
+
+ On Windows the environment variable is set using the `set` command.
+
+ ```cmd
+ set DEBUG=*,-not_this
+ ```
+
+Then, run the program to be debugged as usual.
+
+## Millisecond diff
+
+ When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls.
+
+ 
+
+ When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below:
+
+ 
+
+## Conventions
+
+ If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser".
+
+## Wildcards
+
+ The `*` character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`.
+
+ You can also exclude specific debuggers by prefixing them with a "-" character. For example, `DEBUG=*,-connect:*` would include all debuggers except those starting with "connect:".
+
+## Browser support
+
+ Debug works in the browser as well, currently persisted by `localStorage`. Consider the situation shown below where you have `worker:a` and `worker:b`, and wish to debug both. Somewhere in the code on your page, include:
+
+```js
+window.myDebug = require("debug");
+```
+
+ ("debug" is a global object in the browser so we give this object a different name.) When your page is open in the browser, type the following in the console:
+
+```js
+myDebug.enable("worker:*")
+```
+
+ Refresh the page. Debug output will continue to be sent to the console until it is disabled by typing `myDebug.disable()` in the console.
+
+```js
+a = debug('worker:a');
+b = debug('worker:b');
+
+setInterval(function(){
+ a('doing some work');
+}, 1000);
+
+setInterval(function(){
+ b('doing some work');
+}, 1200);
+```
+
+#### Web Inspector Colors
+
+ Colors are also enabled on "Web Inspectors" that understand the `%c` formatting
+ option. These are WebKit web inspectors, Firefox ([since version
+ 31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/))
+ and the Firebug plugin for Firefox (any version).
+
+ Colored output looks something like:
+
+ 
+
+### stderr vs stdout
+
+You can set an alternative logging method per-namespace by overriding the `log` method on a per-namespace or globally:
+
+Example _stdout.js_:
+
+```js
+var debug = require('debug');
+var error = debug('app:error');
+
+// by default stderr is used
+error('goes to stderr!');
+
+var log = debug('app:log');
+// set this namespace to log via console.log
+log.log = console.log.bind(console); // don't forget to bind to console!
+log('goes to stdout');
+error('still goes to stderr!');
+
+// set all output to go via console.info
+// overrides all per-namespace log settings
+debug.log = console.info.bind(console);
+error('now goes to stdout via console.info');
+log('still goes to stdout, but via console.info now');
+```
+
+### Save debug output to a file
+
+You can save all debug statements to a file by piping them.
+
+Example:
+
+```bash
+$ DEBUG_FD=3 node your-app.js 3> whatever.log
+```
+
+## Authors
+
+ - TJ Holowaychuk
+ - Nathan Rajlich
+
+## License
+
+(The MIT License)
+
+Copyright (c) 2014 TJ Holowaychuk <tj at vision-media.ca>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/bower.json b/node_modules/path-array/node_modules/array-index/node_modules/debug/bower.json
new file mode 100644
index 0000000..6af573f
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/bower.json
@@ -0,0 +1,28 @@
+{
+ "name": "visionmedia-debug",
+ "main": "dist/debug.js",
+ "version": "2.2.0",
+ "homepage": "https://github.com/visionmedia/debug",
+ "authors": [
+ "TJ Holowaychuk <tj at vision-media.ca>"
+ ],
+ "description": "visionmedia-debug",
+ "moduleType": [
+ "amd",
+ "es6",
+ "globals",
+ "node"
+ ],
+ "keywords": [
+ "visionmedia",
+ "debug"
+ ],
+ "license": "MIT",
+ "ignore": [
+ "**/.*",
+ "node_modules",
+ "bower_components",
+ "test",
+ "tests"
+ ]
+}
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/browser.js b/node_modules/path-array/node_modules/array-index/node_modules/debug/browser.js
new file mode 100644
index 0000000..7c76452
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/browser.js
@@ -0,0 +1,168 @@
+
+/**
+ * This is the web browser implementation of `debug()`.
+ *
+ * Expose `debug()` as the module.
+ */
+
+exports = module.exports = require('./debug');
+exports.log = log;
+exports.formatArgs = formatArgs;
+exports.save = save;
+exports.load = load;
+exports.useColors = useColors;
+exports.storage = 'undefined' != typeof chrome
+ && 'undefined' != typeof chrome.storage
+ ? chrome.storage.local
+ : localstorage();
+
+/**
+ * Colors.
+ */
+
+exports.colors = [
+ 'lightseagreen',
+ 'forestgreen',
+ 'goldenrod',
+ 'dodgerblue',
+ 'darkorchid',
+ 'crimson'
+];
+
+/**
+ * Currently only WebKit-based Web Inspectors, Firefox >= v31,
+ * and the Firebug extension (any Firefox version) are known
+ * to support "%c" CSS customizations.
+ *
+ * TODO: add a `localStorage` variable to explicitly enable/disable colors
+ */
+
+function useColors() {
+ // is webkit? http://stackoverflow.com/a/16459606/376773
+ return ('WebkitAppearance' in document.documentElement.style) ||
+ // is firebug? http://stackoverflow.com/a/398120/376773
+ (window.console && (console.firebug || (console.exception && console.table))) ||
+ // is firefox >= v31?
+ // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
+ (navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31);
+}
+
+/**
+ * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
+ */
+
+exports.formatters.j = function(v) {
+ return JSON.stringify(v);
+};
+
+
+/**
+ * Colorize log arguments if enabled.
+ *
+ * @api public
+ */
+
+function formatArgs() {
+ var args = arguments;
+ var useColors = this.useColors;
+
+ args[0] = (useColors ? '%c' : '')
+ + this.namespace
+ + (useColors ? ' %c' : ' ')
+ + args[0]
+ + (useColors ? '%c ' : ' ')
+ + '+' + exports.humanize(this.diff);
+
+ if (!useColors) return args;
+
+ var c = 'color: ' + this.color;
+ args = [args[0], c, 'color: inherit'].concat(Array.prototype.slice.call(args, 1));
+
+ // the final "%c" is somewhat tricky, because there could be other
+ // arguments passed either before or after the %c, so we need to
+ // figure out the correct index to insert the CSS into
+ var index = 0;
+ var lastC = 0;
+ args[0].replace(/%[a-z%]/g, function(match) {
+ if ('%%' === match) return;
+ index++;
+ if ('%c' === match) {
+ // we only are interested in the *last* %c
+ // (the user may have provided their own)
+ lastC = index;
+ }
+ });
+
+ args.splice(lastC, 0, c);
+ return args;
+}
+
+/**
+ * Invokes `console.log()` when available.
+ * No-op when `console.log` is not a "function".
+ *
+ * @api public
+ */
+
+function log() {
+ // this hackery is required for IE8/9, where
+ // the `console.log` function doesn't have 'apply'
+ return 'object' === typeof console
+ && console.log
+ && Function.prototype.apply.call(console.log, console, arguments);
+}
+
+/**
+ * Save `namespaces`.
+ *
+ * @param {String} namespaces
+ * @api private
+ */
+
+function save(namespaces) {
+ try {
+ if (null == namespaces) {
+ exports.storage.removeItem('debug');
+ } else {
+ exports.storage.debug = namespaces;
+ }
+ } catch(e) {}
+}
+
+/**
+ * Load `namespaces`.
+ *
+ * @return {String} returns the previously persisted debug modes
+ * @api private
+ */
+
+function load() {
+ var r;
+ try {
+ r = exports.storage.debug;
+ } catch(e) {}
+ return r;
+}
+
+/**
+ * Enable namespaces listed in `localStorage.debug` initially.
+ */
+
+exports.enable(load());
+
+/**
+ * Localstorage attempts to return the localstorage.
+ *
+ * This is necessary because safari throws
+ * when a user disables cookies/localstorage
+ * and you attempt to access it.
+ *
+ * @return {LocalStorage}
+ * @api private
+ */
+
+function localstorage(){
+ try {
+ return window.localStorage;
+ } catch (e) {}
+}
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/component.json b/node_modules/path-array/node_modules/array-index/node_modules/debug/component.json
new file mode 100644
index 0000000..ca10637
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/component.json
@@ -0,0 +1,19 @@
+{
+ "name": "debug",
+ "repo": "visionmedia/debug",
+ "description": "small debugging utility",
+ "version": "2.2.0",
+ "keywords": [
+ "debug",
+ "log",
+ "debugger"
+ ],
+ "main": "browser.js",
+ "scripts": [
+ "browser.js",
+ "debug.js"
+ ],
+ "dependencies": {
+ "rauchg/ms.js": "0.7.1"
+ }
+}
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/debug.js b/node_modules/path-array/node_modules/array-index/node_modules/debug/debug.js
new file mode 100644
index 0000000..7571a86
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/debug.js
@@ -0,0 +1,197 @@
+
+/**
+ * This is the common logic for both the Node.js and web browser
+ * implementations of `debug()`.
+ *
+ * Expose `debug()` as the module.
+ */
+
+exports = module.exports = debug;
+exports.coerce = coerce;
+exports.disable = disable;
+exports.enable = enable;
+exports.enabled = enabled;
+exports.humanize = require('ms');
+
+/**
+ * The currently active debug mode names, and names to skip.
+ */
+
+exports.names = [];
+exports.skips = [];
+
+/**
+ * Map of special "%n" handling functions, for the debug "format" argument.
+ *
+ * Valid key names are a single, lowercased letter, i.e. "n".
+ */
+
+exports.formatters = {};
+
+/**
+ * Previously assigned color.
+ */
+
+var prevColor = 0;
+
+/**
+ * Previous log timestamp.
+ */
+
+var prevTime;
+
+/**
+ * Select a color.
+ *
+ * @return {Number}
+ * @api private
+ */
+
+function selectColor() {
+ return exports.colors[prevColor++ % exports.colors.length];
+}
+
+/**
+ * Create a debugger with the given `namespace`.
+ *
+ * @param {String} namespace
+ * @return {Function}
+ * @api public
+ */
+
+function debug(namespace) {
+
+ // define the `disabled` version
+ function disabled() {
+ }
+ disabled.enabled = false;
+
+ // define the `enabled` version
+ function enabled() {
+
+ var self = enabled;
+
+ // set `diff` timestamp
+ var curr = +new Date();
+ var ms = curr - (prevTime || curr);
+ self.diff = ms;
+ self.prev = prevTime;
+ self.curr = curr;
+ prevTime = curr;
+
+ // add the `color` if not set
+ if (null == self.useColors) self.useColors = exports.useColors();
+ if (null == self.color && self.useColors) self.color = selectColor();
+
+ var args = Array.prototype.slice.call(arguments);
+
+ args[0] = exports.coerce(args[0]);
+
+ if ('string' !== typeof args[0]) {
+ // anything else let's inspect with %o
+ args = ['%o'].concat(args);
+ }
+
+ // apply any `formatters` transformations
+ var index = 0;
+ args[0] = args[0].replace(/%([a-z%])/g, function(match, format) {
+ // if we encounter an escaped % then don't increase the array index
+ if (match === '%%') return match;
+ index++;
+ var formatter = exports.formatters[format];
+ if ('function' === typeof formatter) {
+ var val = args[index];
+ match = formatter.call(self, val);
+
+ // now we need to remove `args[index]` since it's inlined in the `format`
+ args.splice(index, 1);
+ index--;
+ }
+ return match;
+ });
+
+ if ('function' === typeof exports.formatArgs) {
+ args = exports.formatArgs.apply(self, args);
+ }
+ var logFn = enabled.log || exports.log || console.log.bind(console);
+ logFn.apply(self, args);
+ }
+ enabled.enabled = true;
+
+ var fn = exports.enabled(namespace) ? enabled : disabled;
+
+ fn.namespace = namespace;
+
+ return fn;
+}
+
+/**
+ * Enables a debug mode by namespaces. This can include modes
+ * separated by a colon and wildcards.
+ *
+ * @param {String} namespaces
+ * @api public
+ */
+
+function enable(namespaces) {
+ exports.save(namespaces);
+
+ var split = (namespaces || '').split(/[\s,]+/);
+ var len = split.length;
+
+ for (var i = 0; i < len; i++) {
+ if (!split[i]) continue; // ignore empty strings
+ namespaces = split[i].replace(/\*/g, '.*?');
+ if (namespaces[0] === '-') {
+ exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
+ } else {
+ exports.names.push(new RegExp('^' + namespaces + '$'));
+ }
+ }
+}
+
+/**
+ * Disable debug output.
+ *
+ * @api public
+ */
+
+function disable() {
+ exports.enable('');
+}
+
+/**
+ * Returns true if the given mode name is enabled, false otherwise.
+ *
+ * @param {String} name
+ * @return {Boolean}
+ * @api public
+ */
+
+function enabled(name) {
+ var i, len;
+ for (i = 0, len = exports.skips.length; i < len; i++) {
+ if (exports.skips[i].test(name)) {
+ return false;
+ }
+ }
+ for (i = 0, len = exports.names.length; i < len; i++) {
+ if (exports.names[i].test(name)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+/**
+ * Coerce `val`.
+ *
+ * @param {Mixed} val
+ * @return {Mixed}
+ * @api private
+ */
+
+function coerce(val) {
+ if (val instanceof Error) return val.stack || val.message;
+ return val;
+}
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/node.js b/node_modules/path-array/node_modules/array-index/node_modules/debug/node.js
new file mode 100644
index 0000000..1d392a8
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/node.js
@@ -0,0 +1,209 @@
+
+/**
+ * Module dependencies.
+ */
+
+var tty = require('tty');
+var util = require('util');
+
+/**
+ * This is the Node.js implementation of `debug()`.
+ *
+ * Expose `debug()` as the module.
+ */
+
+exports = module.exports = require('./debug');
+exports.log = log;
+exports.formatArgs = formatArgs;
+exports.save = save;
+exports.load = load;
+exports.useColors = useColors;
+
+/**
+ * Colors.
+ */
+
+exports.colors = [6, 2, 3, 4, 5, 1];
+
+/**
+ * The file descriptor to write the `debug()` calls to.
+ * Set the `DEBUG_FD` env variable to override with another value. i.e.:
+ *
+ * $ DEBUG_FD=3 node script.js 3>debug.log
+ */
+
+var fd = parseInt(process.env.DEBUG_FD, 10) || 2;
+var stream = 1 === fd ? process.stdout :
+ 2 === fd ? process.stderr :
+ createWritableStdioStream(fd);
+
+/**
+ * Is stdout a TTY? Colored output is enabled when `true`.
+ */
+
+function useColors() {
+ var debugColors = (process.env.DEBUG_COLORS || '').trim().toLowerCase();
+ if (0 === debugColors.length) {
+ return tty.isatty(fd);
+ } else {
+ return '0' !== debugColors
+ && 'no' !== debugColors
+ && 'false' !== debugColors
+ && 'disabled' !== debugColors;
+ }
+}
+
+/**
+ * Map %o to `util.inspect()`, since Node doesn't do that out of the box.
+ */
+
+var inspect = (4 === util.inspect.length ?
+ // node <= 0.8.x
+ function (v, colors) {
+ return util.inspect(v, void 0, void 0, colors);
+ } :
+ // node > 0.8.x
+ function (v, colors) {
+ return util.inspect(v, { colors: colors });
+ }
+);
+
+exports.formatters.o = function(v) {
+ return inspect(v, this.useColors)
+ .replace(/\s*\n\s*/g, ' ');
+};
+
+/**
+ * Adds ANSI color escape codes if enabled.
+ *
+ * @api public
+ */
+
+function formatArgs() {
+ var args = arguments;
+ var useColors = this.useColors;
+ var name = this.namespace;
+
+ if (useColors) {
+ var c = this.color;
+
+ args[0] = ' \u001b[3' + c + ';1m' + name + ' '
+ + '\u001b[0m'
+ + args[0] + '\u001b[3' + c + 'm'
+ + ' +' + exports.humanize(this.diff) + '\u001b[0m';
+ } else {
+ args[0] = new Date().toUTCString()
+ + ' ' + name + ' ' + args[0];
+ }
+ return args;
+}
+
+/**
+ * Invokes `console.error()` with the specified arguments.
+ */
+
+function log() {
+ return stream.write(util.format.apply(this, arguments) + '\n');
+}
+
+/**
+ * Save `namespaces`.
+ *
+ * @param {String} namespaces
+ * @api private
+ */
+
+function save(namespaces) {
+ if (null == namespaces) {
+ // If you set a process.env field to null or undefined, it gets cast to the
+ // string 'null' or 'undefined'. Just delete instead.
+ delete process.env.DEBUG;
+ } else {
+ process.env.DEBUG = namespaces;
+ }
+}
+
+/**
+ * Load `namespaces`.
+ *
+ * @return {String} returns the previously persisted debug modes
+ * @api private
+ */
+
+function load() {
+ return process.env.DEBUG;
+}
+
+/**
+ * Copied from `node/src/node.js`.
+ *
+ * XXX: It's lame that node doesn't expose this API out-of-the-box. It also
+ * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.
+ */
+
+function createWritableStdioStream (fd) {
+ var stream;
+ var tty_wrap = process.binding('tty_wrap');
+
+ // Note stream._type is used for test-module-load-list.js
+
+ switch (tty_wrap.guessHandleType(fd)) {
+ case 'TTY':
+ stream = new tty.WriteStream(fd);
+ stream._type = 'tty';
+
+ // Hack to have stream not keep the event loop alive.
+ // See https://github.com/joyent/node/issues/1726
+ if (stream._handle && stream._handle.unref) {
+ stream._handle.unref();
+ }
+ break;
+
+ case 'FILE':
+ var fs = require('fs');
+ stream = new fs.SyncWriteStream(fd, { autoClose: false });
+ stream._type = 'fs';
+ break;
+
+ case 'PIPE':
+ case 'TCP':
+ var net = require('net');
+ stream = new net.Socket({
+ fd: fd,
+ readable: false,
+ writable: true
+ });
+
+ // FIXME Should probably have an option in net.Socket to create a
+ // stream from an existing fd which is writable only. But for now
+ // we'll just add this hack and set the `readable` member to false.
+ // Test: ./node test/fixtures/echo.js < /etc/passwd
+ stream.readable = false;
+ stream.read = null;
+ stream._type = 'pipe';
+
+ // FIXME Hack to have stream not keep the event loop alive.
+ // See https://github.com/joyent/node/issues/1726
+ if (stream._handle && stream._handle.unref) {
+ stream._handle.unref();
+ }
+ break;
+
+ default:
+ // Probably an error on in uv_guess_handle()
+ throw new Error('Implement me. Unknown stream file type!');
+ }
+
+ // For supporting legacy API we put the FD here.
+ stream.fd = fd;
+
+ stream._isStdio = true;
+
+ return stream;
+}
+
+/**
+ * Enable namespaces listed in `process.env.DEBUG` initially.
+ */
+
+exports.enable(load());
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/.npmignore b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/.npmignore
new file mode 100644
index 0000000..d1aa0ce
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/.npmignore
@@ -0,0 +1,5 @@
+node_modules
+test
+History.md
+Makefile
+component.json
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/History.md b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/History.md
new file mode 100644
index 0000000..32fdfc1
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/History.md
@@ -0,0 +1,66 @@
+
+0.7.1 / 2015-04-20
+==================
+
+ * prevent extraordinary long inputs (@evilpacket)
+ * Fixed broken readme link
+
+0.7.0 / 2014-11-24
+==================
+
+ * add time abbreviations, updated tests and readme for the new units
+ * fix example in the readme.
+ * add LICENSE file
+
+0.6.2 / 2013-12-05
+==================
+
+ * Adding repository section to package.json to suppress warning from NPM.
+
+0.6.1 / 2013-05-10
+==================
+
+ * fix singularization [visionmedia]
+
+0.6.0 / 2013-03-15
+==================
+
+ * fix minutes
+
+0.5.1 / 2013-02-24
+==================
+
+ * add component namespace
+
+0.5.0 / 2012-11-09
+==================
+
+ * add short formatting as default and .long option
+ * add .license property to component.json
+ * add version to component.json
+
+0.4.0 / 2012-10-22
+==================
+
+ * add rounding to fix crazy decimals
+
+0.3.0 / 2012-09-07
+==================
+
+ * fix `ms(<String>)` [visionmedia]
+
+0.2.0 / 2012-09-03
+==================
+
+ * add component.json [visionmedia]
+ * add days support [visionmedia]
+ * add hours support [visionmedia]
+ * add minutes support [visionmedia]
+ * add seconds support [visionmedia]
+ * add ms string support [visionmedia]
+ * refactor tests to facilitate ms(number) [visionmedia]
+
+0.1.0 / 2012-03-07
+==================
+
+ * Initial release
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/LICENSE b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/LICENSE
new file mode 100644
index 0000000..6c07561
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/LICENSE
@@ -0,0 +1,20 @@
+(The MIT License)
+
+Copyright (c) 2014 Guillermo Rauch <rauchg at 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/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/README.md b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/README.md
new file mode 100644
index 0000000..9b4fd03
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/README.md
@@ -0,0 +1,35 @@
+# ms.js: miliseconds conversion utility
+
+```js
+ms('2 days') // 172800000
+ms('1d') // 86400000
+ms('10h') // 36000000
+ms('2.5 hrs') // 9000000
+ms('2h') // 7200000
+ms('1m') // 60000
+ms('5s') // 5000
+ms('100') // 100
+```
+
+```js
+ms(60000) // "1m"
+ms(2 * 60000) // "2m"
+ms(ms('10 hours')) // "10h"
+```
+
+```js
+ms(60000, { long: true }) // "1 minute"
+ms(2 * 60000, { long: true }) // "2 minutes"
+ms(ms('10 hours'), { long: true }) // "10 hours"
+```
+
+- Node/Browser compatible. Published as [`ms`](https://www.npmjs.org/package/ms) in [NPM](http://nodejs.org/download).
+- If a number is supplied to `ms`, a string with a unit is returned.
+- If a string that contains the number is supplied, it returns it as
+a number (e.g: it returns `100` for `'100'`).
+- If you pass a string with a number and a valid unit, the number of
+equivalent ms is returned.
+
+## License
+
+MIT
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/index.js b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/index.js
new file mode 100644
index 0000000..4f92771
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/index.js
@@ -0,0 +1,125 @@
+/**
+ * Helpers.
+ */
+
+var s = 1000;
+var m = s * 60;
+var h = m * 60;
+var d = h * 24;
+var y = d * 365.25;
+
+/**
+ * Parse or format the given `val`.
+ *
+ * Options:
+ *
+ * - `long` verbose formatting [false]
+ *
+ * @param {String|Number} val
+ * @param {Object} options
+ * @return {String|Number}
+ * @api public
+ */
+
+module.exports = function(val, options){
+ options = options || {};
+ if ('string' == typeof val) return parse(val);
+ return options.long
+ ? long(val)
+ : short(val);
+};
+
+/**
+ * Parse the given `str` and return milliseconds.
+ *
+ * @param {String} str
+ * @return {Number}
+ * @api private
+ */
+
+function parse(str) {
+ str = '' + str;
+ if (str.length > 10000) return;
+ var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str);
+ if (!match) return;
+ var n = parseFloat(match[1]);
+ var type = (match[2] || 'ms').toLowerCase();
+ switch (type) {
+ case 'years':
+ case 'year':
+ case 'yrs':
+ case 'yr':
+ case 'y':
+ return n * y;
+ case 'days':
+ case 'day':
+ case 'd':
+ return n * d;
+ case 'hours':
+ case 'hour':
+ case 'hrs':
+ case 'hr':
+ case 'h':
+ return n * h;
+ case 'minutes':
+ case 'minute':
+ case 'mins':
+ case 'min':
+ case 'm':
+ return n * m;
+ case 'seconds':
+ case 'second':
+ case 'secs':
+ case 'sec':
+ case 's':
+ return n * s;
+ case 'milliseconds':
+ case 'millisecond':
+ case 'msecs':
+ case 'msec':
+ case 'ms':
+ return n;
+ }
+}
+
+/**
+ * Short format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
+ */
+
+function short(ms) {
+ if (ms >= d) return Math.round(ms / d) + 'd';
+ if (ms >= h) return Math.round(ms / h) + 'h';
+ if (ms >= m) return Math.round(ms / m) + 'm';
+ if (ms >= s) return Math.round(ms / s) + 's';
+ return ms + 'ms';
+}
+
+/**
+ * Long format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
+ */
+
+function long(ms) {
+ return plural(ms, d, 'day')
+ || plural(ms, h, 'hour')
+ || plural(ms, m, 'minute')
+ || plural(ms, s, 'second')
+ || ms + ' ms';
+}
+
+/**
+ * Pluralization helper.
+ */
+
+function plural(ms, n, name) {
+ if (ms < n) return;
+ if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name;
+ return Math.ceil(ms / n) + ' ' + name + 's';
+}
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/package.json b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/package.json
new file mode 100644
index 0000000..253335e
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/node_modules/ms/package.json
@@ -0,0 +1,48 @@
+{
+ "name": "ms",
+ "version": "0.7.1",
+ "description": "Tiny ms conversion utility",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/guille/ms.js.git"
+ },
+ "main": "./index",
+ "devDependencies": {
+ "mocha": "*",
+ "expect.js": "*",
+ "serve": "*"
+ },
+ "component": {
+ "scripts": {
+ "ms/index.js": "index.js"
+ }
+ },
+ "gitHead": "713dcf26d9e6fd9dbc95affe7eff9783b7f1b909",
+ "bugs": {
+ "url": "https://github.com/guille/ms.js/issues"
+ },
+ "homepage": "https://github.com/guille/ms.js",
+ "_id": "ms at 0.7.1",
+ "scripts": {},
+ "_shasum": "9cd13c03adbff25b65effde7ce864ee952017098",
+ "_from": "ms at 0.7.1",
+ "_npmVersion": "2.7.5",
+ "_nodeVersion": "0.12.2",
+ "_npmUser": {
+ "name": "rauchg",
+ "email": "rauchg at gmail.com"
+ },
+ "maintainers": [
+ {
+ "name": "rauchg",
+ "email": "rauchg at gmail.com"
+ }
+ ],
+ "dist": {
+ "shasum": "9cd13c03adbff25b65effde7ce864ee952017098",
+ "tarball": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz"
+ },
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
+ "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/path-array/node_modules/array-index/node_modules/debug/package.json b/node_modules/path-array/node_modules/array-index/node_modules/debug/package.json
new file mode 100644
index 0000000..7e6d9fc
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/node_modules/debug/package.json
@@ -0,0 +1,73 @@
+{
+ "name": "debug",
+ "version": "2.2.0",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/visionmedia/debug.git"
+ },
+ "description": "small debugging utility",
+ "keywords": [
+ "debug",
+ "log",
+ "debugger"
+ ],
+ "author": {
+ "name": "TJ Holowaychuk",
+ "email": "tj at vision-media.ca"
+ },
+ "contributors": [
+ {
+ "name": "Nathan Rajlich",
+ "email": "nathan at tootallnate.net",
+ "url": "http://n8.io"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "ms": "0.7.1"
+ },
+ "devDependencies": {
+ "browserify": "9.0.3",
+ "mocha": "*"
+ },
+ "main": "./node.js",
+ "browser": "./browser.js",
+ "component": {
+ "scripts": {
+ "debug/index.js": "browser.js",
+ "debug/debug.js": "debug.js"
+ }
+ },
+ "gitHead": "b38458422b5aa8aa6d286b10dfe427e8a67e2b35",
+ "bugs": {
+ "url": "https://github.com/visionmedia/debug/issues"
+ },
+ "homepage": "https://github.com/visionmedia/debug",
+ "_id": "debug at 2.2.0",
+ "scripts": {},
+ "_shasum": "f87057e995b1a1f6ae6a4960664137bc56f039da",
+ "_from": "debug@*",
+ "_npmVersion": "2.7.4",
+ "_nodeVersion": "0.12.2",
+ "_npmUser": {
+ "name": "tootallnate",
+ "email": "nathan at tootallnate.net"
+ },
+ "maintainers": [
+ {
+ "name": "tjholowaychuk",
+ "email": "tj at vision-media.ca"
+ },
+ {
+ "name": "tootallnate",
+ "email": "nathan at tootallnate.net"
+ }
+ ],
+ "dist": {
+ "shasum": "f87057e995b1a1f6ae6a4960664137bc56f039da",
+ "tarball": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz"
+ },
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
+ "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/path-array/node_modules/array-index/package.json b/node_modules/path-array/node_modules/array-index/package.json
new file mode 100644
index 0000000..6ba9df7
--- /dev/null
+++ b/node_modules/path-array/node_modules/array-index/package.json
@@ -0,0 +1,58 @@
+{
+ "name": "array-index",
+ "description": "Invoke getter/setter functions on array-like objects",
+ "keywords": [
+ "index",
+ "array",
+ "getter",
+ "setter",
+ "proxy"
+ ],
+ "version": "0.1.1",
+ "author": {
+ "name": "Nathan Rajlich",
+ "email": "nathan at tootallnate.net",
+ "url": "http://tootallnate.net"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/TooTallNate/array-index.git"
+ },
+ "main": "index.js",
+ "scripts": {
+ "test": "node test"
+ },
+ "dependencies": {
+ "debug": "*"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "gitHead": "65a5d884f25b4b7a1608e367d715d713dbd3b3d6",
+ "bugs": {
+ "url": "https://github.com/TooTallNate/array-index/issues"
+ },
+ "homepage": "https://github.com/TooTallNate/array-index",
+ "_id": "array-index at 0.1.1",
+ "_shasum": "4d5eaf06cc3d925847cd73d1535c217ba306d3e1",
+ "_from": "array-index@>=0.1.0 <0.2.0",
+ "_npmVersion": "2.1.3",
+ "_nodeVersion": "0.10.32",
+ "_npmUser": {
+ "name": "tootallnate",
+ "email": "nathan at tootallnate.net"
+ },
+ "maintainers": [
+ {
+ "name": "tootallnate",
+ "email": "nathan at tootallnate.net"
+ }
+ ],
+ "dist": {
+ "shasum": "4d5eaf06cc3d925847cd73d1535c217ba306d3e1",
+ "tarball": "http://registry.npmjs.org/array-index/-/array-index-0.1.1.tgz"
+ },
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/array-index/-/array-index-0.1.1.tgz",
+ "readme": "ERROR: No README data found!"
+}
diff --git a/node_modules/path-array/package.json b/node_modules/path-array/package.json
new file mode 100644
index 0000000..41d2548
--- /dev/null
+++ b/node_modules/path-array/package.json
@@ -0,0 +1,56 @@
+{
+ "name": "path-array",
+ "version": "1.0.0",
+ "description": "Treat your $PATH like a JavaScript Array",
+ "main": "index.js",
+ "scripts": {
+ "test": "mocha --reporter spec"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/TooTallNate/node-path-array.git"
+ },
+ "keywords": [
+ "PATH",
+ "env",
+ "array"
+ ],
+ "author": {
+ "name": "Nathan Rajlich",
+ "email": "nathan at tootallnate.net",
+ "url": "http://n8.io/"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/TooTallNate/node-path-array/issues"
+ },
+ "homepage": "https://github.com/TooTallNate/node-path-array",
+ "dependencies": {
+ "array-index": "~0.1.0"
+ },
+ "devDependencies": {
+ "mocha": "~1.16.1"
+ },
+ "gitHead": "5d1fedd54e4413459f67e4a4babb024144cd00d0",
+ "_id": "path-array at 1.0.0",
+ "_shasum": "6c14130c33084f0150553c657b38397ab67aaa4e",
+ "_from": "path-array@>=1.0.0 <2.0.0",
+ "_npmVersion": "1.4.28",
+ "_npmUser": {
+ "name": "tootallnate",
+ "email": "nathan at tootallnate.net"
+ },
+ "maintainers": [
+ {
+ "name": "tootallnate",
+ "email": "nathan at tootallnate.net"
+ }
+ ],
+ "dist": {
+ "shasum": "6c14130c33084f0150553c657b38397ab67aaa4e",
+ "tarball": "http://registry.npmjs.org/path-array/-/path-array-1.0.0.tgz"
+ },
+ "directories": {},
+ "_resolved": "https://registry.npmjs.org/path-array/-/path-array-1.0.0.tgz",
+ "readme": "ERROR: No README data found!"
+}
diff --git a/package.json b/package.json
index db3b9de..b6f6133 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,7 @@
{
"name": "node-gyp",
"description": "Node.js native addon build tool",
+ "license": "MIT",
"keywords": [
"native",
"addon",
@@ -10,7 +11,7 @@
"bindings",
"gyp"
],
- "version": "0.12.2",
+ "version": "2.0.2",
"installVersion": 9,
"author": "Nathan Rajlich <nathan at tootallnate.net> (http://tootallnate.net)",
"repository": {
@@ -21,18 +22,19 @@
"bin": "./bin/node-gyp.js",
"main": "./lib/node-gyp.js",
"dependencies": {
- "glob": "3",
- "graceful-fs": "2",
- "fstream": "0",
- "minimatch": "0",
- "mkdirp": "0",
- "nopt": "2",
- "npmlog": "0",
+ "fstream": "^1.0.0",
+ "glob": "3 || 4",
+ "graceful-fs": "3",
+ "minimatch": "1",
+ "mkdirp": "^0.5.0",
+ "nopt": "2 || 3",
+ "npmlog": "0 || 1",
"osenv": "0",
+ "path-array": "^1.0.0",
"request": "2",
"rimraf": "2",
- "semver": "~2.2.1",
- "tar": "0",
+ "semver": "2.x || 3.x || 4",
+ "tar": "^1.0.0",
"which": "1"
},
"engines": {
diff --git a/src/win_delay_load_hook.c b/src/win_delay_load_hook.c
new file mode 100644
index 0000000..f397cfa
--- /dev/null
+++ b/src/win_delay_load_hook.c
@@ -0,0 +1,33 @@
+/*
+ * When this file is linked to a DLL, it sets up a delay-load hook that
+ * intervenes when the DLL is trying to load 'node.exe' or 'iojs.exe'
+ * dynamically. Instead of trying to locate the .exe file it'll just return
+ * a handle to the process image.
+ *
+ * This allows compiled addons to work when node.exe or iojs.exe is renamed.
+ */
+
+#ifdef _MSC_VER
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+#include <delayimp.h>
+#include <string.h>
+
+static FARPROC WINAPI load_exe_hook(unsigned int event, DelayLoadInfo* info) {
+ HMODULE m;
+ if (event != dliNotePreLoadLibrary)
+ return NULL;
+
+ if (_stricmp(info->szDll, "iojs.exe") != 0 &&
+ _stricmp(info->szDll, "node.exe") != 0)
+ return NULL;
+
+ m = GetModuleHandle(NULL);
+ return (FARPROC) m;
+}
+
+PfnDliHook __pfnDliNotifyHook2 = load_exe_hook;
+
+#endif
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/node-gyp.git
More information about the Pkg-javascript-commits
mailing list