Skip to content

Instantly share code, notes, and snippets.

@dancrumb
Last active August 29, 2015 13:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dancrumb/10928172 to your computer and use it in GitHub Desktop.
Save dancrumb/10928172 to your computer and use it in GitHub Desktop.
Debug info for node-stringprep problem
$ which icu-config > /dev/null || echo n
$ which icu-config
/usr/bin/icu-config
$ icu-config --version
4.8.1.1
$ node -e "require('nan')"
module.js:340
throw err;
^
Error: Cannot find module 'nan'
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at [eval]:1:1
at Object.<anonymous> ([eval]-wrapper:6:22)
at Module._compile (module.js:456:26)
at evalScript (node.js:532:25)
at startup (node.js:80:7)
at node.js:901:3
$ npm install nan
npm http GET https://registry.npmjs.org/nan
npm http 304 https://registry.npmjs.org/nan
nan@0.8.0 node_modules/nan
$ node -e "require('nan')"
node_modules/nan
0 info it worked if it ends with ok
1 verbose cli [ 'node', '/usr/local/bin/npm', 'install', 'node-stringprep' ]
2 info using npm@1.4.7
3 info using node@v0.10.22
4 verbose readDependencies using package.json deps
5 verbose cache add [ 'node-stringprep', null ]
6 verbose cache add name=undefined spec="node-stringprep" args=["node-stringprep",null]
7 verbose parsed url { protocol: null,
7 verbose parsed url slashes: null,
7 verbose parsed url auth: null,
7 verbose parsed url host: null,
7 verbose parsed url port: null,
7 verbose parsed url hostname: null,
7 verbose parsed url hash: null,
7 verbose parsed url search: null,
7 verbose parsed url query: null,
7 verbose parsed url pathname: 'node-stringprep',
7 verbose parsed url path: 'node-stringprep',
7 verbose parsed url href: 'node-stringprep' }
8 silly lockFile d7e52d33-node-stringprep node-stringprep
9 verbose lock node-stringprep /home/dancrumb/.npm/d7e52d33-node-stringprep.lock
10 silly lockFile d7e52d33-node-stringprep node-stringprep
11 silly lockFile d7e52d33-node-stringprep node-stringprep
12 verbose addNamed [ 'node-stringprep', '' ]
13 verbose addNamed [ null, '*' ]
14 silly lockFile c469c25e-node-stringprep node-stringprep@
15 verbose lock node-stringprep@ /home/dancrumb/.npm/c469c25e-node-stringprep.lock
16 silly addNameRange { name: 'node-stringprep', range: '*', hasData: false }
17 verbose url raw node-stringprep
18 verbose url resolving [ 'https://registry.npmjs.org/', './node-stringprep' ]
19 verbose url resolved https://registry.npmjs.org/node-stringprep
20 info trying registry request attempt 1 at 15:11:03
21 verbose etag "6EN5REWO518SZGM5G6A0IRV8Q"
22 http GET https://registry.npmjs.org/node-stringprep
23 http 304 https://registry.npmjs.org/node-stringprep
24 silly registry.get cb [ 304,
24 silly registry.get { date: 'Wed, 16 Apr 2014 20:11:03 GMT',
24 silly registry.get server: 'Apache',
24 silly registry.get via: '1.1 varnish',
24 silly registry.get 'last-modified': 'Wed, 16 Apr 2014 20:11:03 GMT',
24 silly registry.get 'cache-control': 'max-age=1',
24 silly registry.get etag: '"6EN5REWO518SZGM5G6A0IRV8Q"',
24 silly registry.get 'x-served-by': 'cache-jfk1033-JFK',
24 silly registry.get 'x-cache': 'MISS',
24 silly registry.get 'x-cache-hits': '0',
24 silly registry.get 'x-timer': 'S1397679063.506720304,VS0,VE167',
24 silly registry.get vary: 'Accept',
24 silly registry.get 'content-length': '0',
24 silly registry.get 'keep-alive': 'timeout=10, max=50',
24 silly registry.get connection: 'Keep-Alive' } ]
25 verbose etag node-stringprep from cache
26 silly addNameRange number 2 { name: 'node-stringprep', range: '*', hasData: true }
27 silly addNameRange versions [ 'node-stringprep',
27 silly addNameRange [ '0.0.2',
27 silly addNameRange '0.0.3',
27 silly addNameRange '0.0.4',
27 silly addNameRange '0.0.5',
27 silly addNameRange '0.1.0',
27 silly addNameRange '0.1.1',
27 silly addNameRange '0.1.2',
27 silly addNameRange '0.1.3',
27 silly addNameRange '0.1.4',
27 silly addNameRange '0.1.5',
27 silly addNameRange '0.1.5-test',
27 silly addNameRange '0.1.6',
27 silly addNameRange '0.1.7',
27 silly addNameRange '0.1.8',
27 silly addNameRange '0.1.9',
27 silly addNameRange '0.1.10',
27 silly addNameRange '0.1.11',
27 silly addNameRange '0.1.12',
27 silly addNameRange '0.2.0',
27 silly addNameRange '0.2.1',
27 silly addNameRange '0.2.2',
27 silly addNameRange '0.2.3' ] ]
28 verbose addNamed [ 'node-stringprep', '0.2.3' ]
29 verbose addNamed [ '0.2.3', '0.2.3' ]
30 silly lockFile ea2af155-node-stringprep-0-2-3 node-stringprep@0.2.3
31 verbose lock node-stringprep@0.2.3 /home/dancrumb/.npm/ea2af155-node-stringprep-0-2-3.lock
32 silly lockFile ea2af155-node-stringprep-0-2-3 node-stringprep@0.2.3
33 silly lockFile ea2af155-node-stringprep-0-2-3 node-stringprep@0.2.3
34 silly lockFile c469c25e-node-stringprep node-stringprep@
35 silly lockFile c469c25e-node-stringprep node-stringprep@
36 silly resolved [ { name: 'node-stringprep',
36 silly resolved version: '0.2.3',
36 silly resolved main: 'index.js',
36 silly resolved description: 'ICU StringPrep profiles',
36 silly resolved keywords: [ 'unicode', 'stringprep', 'icu' ],
36 silly resolved scripts: { test: 'grunt test', install: 'node-gyp rebuild' },
36 silly resolved dependencies: { nan: '~0.7.0', bindings: '~1.1.1' },
36 silly resolved devDependencies:
36 silly resolved { proxyquire: '~0.5.2',
36 silly resolved 'grunt-mocha-cli': '~1.3.0',
36 silly resolved 'grunt-contrib-jshint': '~0.7.2',
36 silly resolved should: '~2.1.1',
36 silly resolved grunt: '~0.4.2' },
36 silly resolved repository:
36 silly resolved { type: 'git',
36 silly resolved path: 'git://github.com/node-xmpp/node-stringprep.git' },
36 silly resolved homepage: 'http://github.com/node-xmpp/node-stringprep',
36 silly resolved bugs: { url: 'http://github.com/node-xmpp/node-stringprep/issues' },
36 silly resolved author:
36 silly resolved { name: 'Lloyd Watkin',
36 silly resolved email: 'lloyd@evilprofessor.co.uk',
36 silly resolved url: 'http://evilprofessor.co.uk' },
36 silly resolved licenses: [ [Object] ],
36 silly resolved engines: { node: '>=0.8' },
36 silly resolved gypfile: true,
36 silly resolved readme: '# node-stringprep #\n\n[![Build Status](https://travis-ci.org/node-xmpp/node-stringprep.png)](https://travis-ci.org/node-xmpp/node-stringprep)\n\n[Flattr this!](https://flattr.com/thing/44598/node-stringprep)\n\n## Purpose ##\n\nExposes predefined Unicode normalization functions that are required by many protocols. This is just a binding to [ICU](http://icu-project.org/), which is [said to be fast.](http://ayena.de/node/74)\n\n## Installation ##\n\n npm i node-stringprep\n\nIf `libicu` isn\'t available installation will gracefully fail and javascript fallbacks will be used.\n\n### Debian ###\n\n apt-get install libicu-dev\n\n### Gentoo ###\n\nemerge icu\n\n### OSX ###\n#### MacPorts ####\n port install icu +devel\n\n#### Boxen ####\n\n sudo ln -s /opt/boxen/homebrew/Cellar/icu4c/52.1/bin/icu-config /usr/local/bin/icu-config\n sudo ln -s /opt/boxen/homebrew/Cellar/icu4c/52.1/include/* /usr/local/include\n \n#### Homebrew ####\n brew install icu4c\n ln -s /usr/local/Cellar/icu4c/<VERSION>/bin/icu-config /usr/local/bin/icu-config\n ln -s /usr/local/Cellar/icu4c/<VERSION>/include/* /usr/local/include\n\nIf experiencing issues with \'homebrew\' installing version 50.1 of icu4c, try the following:\n\n brew search icu4c\n brew tap homebrew/versions\n brew versions icu4c\n cd $(brew --prefix) && git pull --rebase\n git checkout c25fd2f $(brew --prefix)/Library/Formula/icu4c.rb\n brew install icu4c\n\n## Usage ##\n\n var StringPrep = require(\'node-stringprep\').StringPrep;\n var prep = new StringPrep(\'nameprep\');\n prep.prepare(\'Äffchen\') // => \'äffchen\'\n\nFor a list of supported profiles, see [node-stringprep.cc](http://github.com/astro/node-stringprep/blob/master/node-stringprep.cc#L160)\n\nJavascript fallbacks can be disabled/enabled using the following methods on the `StringPrep` object:\n\n```javascript\nvar prep = new StringPrep(\'resourceprep\')\nprep.disableJsFallbacks()\nprep.enableJsFallbacks()\n```\n\nJavascript fallbacks are enabled by default. You can also check to see if native `icu` bindings can/will be used by calling the `isNative()` method:\n\n```javascript\nvar prep = new StringPrep(\'resourceprep\')\nprep.isNative() // true or false\n```\n',
36 silly resolved readmeFilename: 'README.markdown',
36 silly resolved _id: 'node-stringprep@0.2.3',
36 silly resolved _shasum: 'deab53eacbb2744eb65a3ab76f49a53a6d7f6b1c',
36 silly resolved _from: 'node-stringprep@',
36 silly resolved _resolved: 'https://registry.npmjs.org/node-stringprep/-/node-stringprep-0.2.3.tgz' } ]
37 info install node-stringprep@0.2.3 into /projects/vodori-bot
38 info installOne node-stringprep@0.2.3
39 info /projects/vodori-bot/node_modules/node-stringprep unbuild
40 verbose tar unpack /home/dancrumb/.npm/node-stringprep/0.2.3/package.tgz
41 silly lockFile ba91bab9-bot-node-modules-node-stringprep tar:///projects/vodori-bot/node_modules/node-stringprep
42 verbose lock tar:///projects/vodori-bot/node_modules/node-stringprep /home/dancrumb/.npm/ba91bab9-bot-node-modules-node-stringprep.lock
43 silly lockFile 3518faaf-ode-stringprep-0-2-3-package-tgz tar:///home/dancrumb/.npm/node-stringprep/0.2.3/package.tgz
44 verbose lock tar:///home/dancrumb/.npm/node-stringprep/0.2.3/package.tgz /home/dancrumb/.npm/3518faaf-ode-stringprep-0-2-3-package-tgz.lock
45 silly gunzTarPerm modes [ '755', '644' ]
46 silly gunzTarPerm extractEntry package.json
47 silly gunzTarPerm extractEntry .npmignore
48 silly gunzTarPerm extractEntry LICENSE
49 silly gunzTarPerm extractEntry Gruntfile.js
50 silly gunzTarPerm extractEntry index.js
51 silly gunzTarPerm extractEntry binding.gyp
52 silly gunzTarPerm extractEntry .jshintrc
53 silly gunzTarPerm extractEntry .travis.yml
54 silly gunzTarPerm extractEntry node-stringprep.cc
55 silly gunzTarPerm extractEntry README.markdown
56 silly gunzTarPerm extractEntry test/fallback.js
57 silly gunzTarPerm extractEntry test/leakcheck.js
58 silly gunzTarPerm extractEntry wscript
59 silly lockFile ba91bab9-bot-node-modules-node-stringprep tar:///projects/vodori-bot/node_modules/node-stringprep
60 silly lockFile ba91bab9-bot-node-modules-node-stringprep tar:///projects/vodori-bot/node_modules/node-stringprep
61 silly lockFile 3518faaf-ode-stringprep-0-2-3-package-tgz tar:///home/dancrumb/.npm/node-stringprep/0.2.3/package.tgz
62 silly lockFile 3518faaf-ode-stringprep-0-2-3-package-tgz tar:///home/dancrumb/.npm/node-stringprep/0.2.3/package.tgz
63 info preinstall node-stringprep@0.2.3
64 verbose readDependencies using package.json deps
65 verbose readDependencies using package.json deps
66 verbose cache add [ 'nan@~0.7.0', null ]
67 verbose cache add name=undefined spec="nan@~0.7.0" args=["nan@~0.7.0",null]
68 verbose parsed url { protocol: null,
68 verbose parsed url slashes: null,
68 verbose parsed url auth: null,
68 verbose parsed url host: null,
68 verbose parsed url port: null,
68 verbose parsed url hostname: null,
68 verbose parsed url hash: null,
68 verbose parsed url search: null,
68 verbose parsed url query: null,
68 verbose parsed url pathname: 'nan@~0.7.0',
68 verbose parsed url path: 'nan@~0.7.0',
68 verbose parsed url href: 'nan@~0.7.0' }
69 verbose cache add name="nan" spec="~0.7.0" args=["nan","~0.7.0"]
70 verbose parsed url { protocol: null,
70 verbose parsed url slashes: null,
70 verbose parsed url auth: null,
70 verbose parsed url host: null,
70 verbose parsed url port: null,
70 verbose parsed url hostname: null,
70 verbose parsed url hash: null,
70 verbose parsed url search: null,
70 verbose parsed url query: null,
70 verbose parsed url pathname: '~0.7.0',
70 verbose parsed url path: '~0.7.0',
70 verbose parsed url href: '~0.7.0' }
71 verbose addNamed [ 'nan', '~0.7.0' ]
72 verbose addNamed [ null, '>=0.7.0-0 <0.8.0-0' ]
73 silly lockFile 9df25a33-nan-0-7-0 nan@~0.7.0
74 verbose lock nan@~0.7.0 /home/dancrumb/.npm/9df25a33-nan-0-7-0.lock
75 verbose cache add [ 'bindings@~1.1.1', null ]
76 verbose cache add name=undefined spec="bindings@~1.1.1" args=["bindings@~1.1.1",null]
77 verbose parsed url { protocol: null,
77 verbose parsed url slashes: null,
77 verbose parsed url auth: null,
77 verbose parsed url host: null,
77 verbose parsed url port: null,
77 verbose parsed url hostname: null,
77 verbose parsed url hash: null,
77 verbose parsed url search: null,
77 verbose parsed url query: null,
77 verbose parsed url pathname: 'bindings@~1.1.1',
77 verbose parsed url path: 'bindings@~1.1.1',
77 verbose parsed url href: 'bindings@~1.1.1' }
78 verbose cache add name="bindings" spec="~1.1.1" args=["bindings","~1.1.1"]
79 verbose parsed url { protocol: null,
79 verbose parsed url slashes: null,
79 verbose parsed url auth: null,
79 verbose parsed url host: null,
79 verbose parsed url port: null,
79 verbose parsed url hostname: null,
79 verbose parsed url hash: null,
79 verbose parsed url search: null,
79 verbose parsed url query: null,
79 verbose parsed url pathname: '~1.1.1',
79 verbose parsed url path: '~1.1.1',
79 verbose parsed url href: '~1.1.1' }
80 verbose addNamed [ 'bindings', '~1.1.1' ]
81 verbose addNamed [ null, '>=1.1.1-0 <1.2.0-0' ]
82 silly lockFile cc1512d6-bindings-1-1-1 bindings@~1.1.1
83 verbose lock bindings@~1.1.1 /home/dancrumb/.npm/cc1512d6-bindings-1-1-1.lock
84 silly addNameRange { name: 'nan', range: '>=0.7.0-0 <0.8.0-0', hasData: false }
85 silly addNameRange { name: 'bindings', range: '>=1.1.1-0 <1.2.0-0', hasData: false }
86 verbose url raw bindings
87 verbose url resolving [ 'https://registry.npmjs.org/', './bindings' ]
88 verbose url resolved https://registry.npmjs.org/bindings
89 info trying registry request attempt 1 at 15:11:04
90 verbose etag "46F6QA6GQH8US6OJEYEPIMOT6"
91 http GET https://registry.npmjs.org/bindings
92 verbose url raw nan
93 verbose url resolving [ 'https://registry.npmjs.org/', './nan' ]
94 verbose url resolved https://registry.npmjs.org/nan
95 info trying registry request attempt 1 at 15:11:04
96 verbose etag "6LINUV3CT91YKWSBCEUQS4GL3"
97 http GET https://registry.npmjs.org/nan
98 http 304 https://registry.npmjs.org/nan
99 silly registry.get cb [ 304,
99 silly registry.get { date: 'Wed, 16 Apr 2014 20:11:03 GMT',
99 silly registry.get server: 'Apache',
99 silly registry.get via: '1.1 varnish',
99 silly registry.get 'last-modified': 'Wed, 16 Apr 2014 20:11:03 GMT',
99 silly registry.get 'cache-control': 'max-age=1',
99 silly registry.get etag: '"6LINUV3CT91YKWSBCEUQS4GL3"',
99 silly registry.get 'x-served-by': 'cache-jfk1021-JFK',
99 silly registry.get 'x-cache': 'HIT',
99 silly registry.get 'x-cache-hits': '1',
99 silly registry.get 'x-timer': 'S1397679063.954596281,VS0,VE32',
99 silly registry.get vary: 'Accept',
99 silly registry.get 'content-length': '0',
99 silly registry.get 'keep-alive': 'timeout=10, max=50',
99 silly registry.get connection: 'Keep-Alive' } ]
100 verbose etag nan from cache
101 silly addNameRange number 2 { name: 'nan', range: '>=0.7.0-0 <0.8.0-0', hasData: true }
102 silly addNameRange versions [ 'nan',
102 silly addNameRange [ '0.3.0-wip',
102 silly addNameRange '0.3.0-wip2',
102 silly addNameRange '0.3.0',
102 silly addNameRange '0.3.1',
102 silly addNameRange '0.3.2',
102 silly addNameRange '0.4.0',
102 silly addNameRange '0.4.1',
102 silly addNameRange '0.4.2',
102 silly addNameRange '0.4.3',
102 silly addNameRange '0.4.4',
102 silly addNameRange '0.5.0',
102 silly addNameRange '0.5.1',
102 silly addNameRange '0.5.2',
102 silly addNameRange '0.6.0',
102 silly addNameRange '0.7.0',
102 silly addNameRange '0.7.1',
102 silly addNameRange '0.8.0' ] ]
103 verbose addNamed [ 'nan', '0.7.1' ]
104 verbose addNamed [ '0.7.1', '0.7.1' ]
105 silly lockFile f54c0d1e-nan-0-7-1 nan@0.7.1
106 verbose lock nan@0.7.1 /home/dancrumb/.npm/f54c0d1e-nan-0-7-1.lock
107 silly lockFile f54c0d1e-nan-0-7-1 nan@0.7.1
108 silly lockFile f54c0d1e-nan-0-7-1 nan@0.7.1
109 silly lockFile 9df25a33-nan-0-7-0 nan@~0.7.0
110 silly lockFile 9df25a33-nan-0-7-0 nan@~0.7.0
111 http 304 https://registry.npmjs.org/bindings
112 silly registry.get cb [ 304,
112 silly registry.get { date: 'Wed, 16 Apr 2014 20:11:03 GMT',
112 silly registry.get server: 'Apache',
112 silly registry.get via: '1.1 varnish',
112 silly registry.get 'last-modified': 'Wed, 16 Apr 2014 20:11:04 GMT',
112 silly registry.get 'cache-control': 'max-age=1',
112 silly registry.get etag: '"46F6QA6GQH8US6OJEYEPIMOT6"',
112 silly registry.get 'x-served-by': 'cache-jfk1024-JFK',
112 silly registry.get 'x-cache': 'HIT',
112 silly registry.get 'x-cache-hits': '1',
112 silly registry.get 'x-timer': 'S1397679063.935769081,VS0,VE101',
112 silly registry.get vary: 'Accept',
112 silly registry.get 'content-length': '0',
112 silly registry.get 'keep-alive': 'timeout=10, max=50',
112 silly registry.get connection: 'Keep-Alive' } ]
113 verbose etag bindings from cache
114 silly addNameRange number 2 { name: 'bindings', range: '>=1.1.1-0 <1.2.0-0', hasData: true }
115 silly addNameRange versions [ 'bindings',
115 silly addNameRange [ '0.0.1',
115 silly addNameRange '0.1.0',
115 silly addNameRange '0.1.1',
115 silly addNameRange '0.2.0',
115 silly addNameRange '0.2.1',
115 silly addNameRange '0.2.2',
115 silly addNameRange '0.2.3',
115 silly addNameRange '0.2.4',
115 silly addNameRange '0.3.0',
115 silly addNameRange '0.4.0',
115 silly addNameRange '1.0.0',
115 silly addNameRange '1.1.0',
115 silly addNameRange '1.1.1',
115 silly addNameRange '1.2.0' ] ]
116 verbose addNamed [ 'bindings', '1.1.1' ]
117 verbose addNamed [ '1.1.1', '1.1.1' ]
118 silly lockFile 52dd60a7-bindings-1-1-1 bindings@1.1.1
119 verbose lock bindings@1.1.1 /home/dancrumb/.npm/52dd60a7-bindings-1-1-1.lock
120 silly lockFile 52dd60a7-bindings-1-1-1 bindings@1.1.1
121 silly lockFile 52dd60a7-bindings-1-1-1 bindings@1.1.1
122 silly lockFile cc1512d6-bindings-1-1-1 bindings@~1.1.1
123 silly lockFile cc1512d6-bindings-1-1-1 bindings@~1.1.1
124 silly resolved [ { name: 'nan',
124 silly resolved version: '0.7.1',
124 silly resolved description: 'Native Abstractions for Node.js: C++ header for Node 0.8->0.12 compatibility',
124 silly resolved main: 'include_dirs.js',
124 silly resolved repository: { type: 'git', url: 'git://github.com/rvagg/nan.git' },
124 silly resolved contributors: [ [Object], [Object], [Object], [Object], [Object], [Object] ],
124 silly resolved license: 'MIT',
124 silly resolved readme: 'Native Abstractions for Node.js\n===============================\n\n**A header file filled with macro and utility goodness for making add-on development for Node.js easier across versions 0.8, 0.10 and 0.11, and eventually 0.12.**\n\n***Current version: 0.7.1*** *(See [nan.h](https://github.com/rvagg/nan/blob/master/nan.h) for complete ChangeLog)*\n\n[![NPM](https://nodei.co/npm/nan.png?downloads=true)](https://nodei.co/npm/nan/) [![NPM](https://nodei.co/npm-dl/nan.png?months=6)](https://nodei.co/npm/nan/)\n\nThanks to the crazy changes in V8 (and some in Node core), keeping native addons compiling happily across versions, particularly 0.10 to 0.11/0.12, is a minor nightmare. The goal of this project is to store all logic necessary to develop native Node.js addons without having to inspect `NODE_MODULE_VERSION` and get yourself into a macro-tangle.\n\nThis project also contains some helper utilities that make addon development a bit more pleasant.\n\n * **[News & Updates](#news)**\n * **[Usage](#usage)**\n * **[Example](#example)**\n * **[API](#api)**\n\n<a name="news"></a>\n## News & Updates\n\n### Dec-2013: NanCString and NanRawString\n\nTwo new functions have been introduced to replace the functionality that\'s been provided by `NanFromV8String` until now. NanCString has sensible defaults so it\'s super easy to fetch a null-terminated c-style string out of a `v8::String`. `NanFromV8String` is still around and has defaults that allow you to pass a single handle to fetch a `char*` while `NanRawString` requires a little more attention to arguments.\n\n### Nov-2013: Node 0.11.9+ breaking V8 change\n\nThe version of V8 that\'s shipping with Node 0.11.9+ has changed the signature for new `Local`s to: `v8::Local<T>::New(isolate, value)`, i.e. introducing the `isolate` argument and therefore breaking all new `Local` declarations for previous versions. NAN 0.6+ now includes a `NanNewLocal<T>(value)` that can be used in place to work around this incompatibility and maintain compatibility with 0.8->0.11.9+ (minus a few early 0.11 releases).\n\nFor example, if you wanted to return a `null` on a callback you will have to change the argument from `v8::Local<v8::Value>::New(v8::Null())` to `NanNewLocal<v8::Value>(v8::Null())`.\n\n### Nov-2013: Change to binding.gyp `"include_dirs"` for NAN\n\nInclusion of NAN in a project\'s binding.gyp is now greatly simplified. You can now just use `"<!(node -e \\"require(\'nan\')\\")"` in your `"include_dirs"`, see example below (note Windows needs the quoting around `require` to be just right: `"require(\'nan\')"` with appropriate `\\` escaping).\n\n<a name="usage"></a>\n## Usage\n\nSimply add **NAN** as a dependency in the *package.json* of your Node addon:\n\n``` bash\n$ npm install --save nan\n```\n\nPull in the path to **NAN** in your *binding.gyp* so that you can use `#include "nan.h"` in your *.cpp* files:\n\n``` python\n"include_dirs" : [\n "<!(node -e \\"require(\'nan\')\\")"\n]\n```\n\nThis works like a `-I<path-to-NAN>` when compiling your addon.\n\n<a name="example"></a>\n## Example\n\nSee **[LevelDOWN](https://github.com/rvagg/node-leveldown/pull/48)** for a full example of **NAN** in use.\n\nFor a simpler example, see the **[async pi estimation example](https://github.com/rvagg/nan/tree/master/examples/async_pi_estimate)** in the examples directory for full code and an explanation of what this Monte Carlo Pi estimation example does. Below are just some parts of the full example that illustrate the use of **NAN**.\n\nCompare to the current 0.10 version of this example, found in the [node-addon-examples](https://github.com/rvagg/node-addon-examples/tree/master/9_async_work) repository and also a 0.11 version of the same found [here](https://github.com/kkoopa/node-addon-examples/tree/5c01f58fc993377a567812597e54a83af69686d7/9_async_work).\n\nNote that there is no embedded version sniffing going on here and also the async work is made much simpler, see below for details on the `NanAsyncWorker` class.\n\n```c++\n// addon.cc\n#include <node.h>\n#include "nan.h"\n// ...\n\nusing namespace v8;\n\nvoid InitAll(Handle<Object> exports) {\n exports->Set(NanSymbol("calculateSync"),\n FunctionTemplate::New(CalculateSync)->GetFunction());\n\n exports->Set(NanSymbol("calculateAsync"),\n FunctionTemplate::New(CalculateAsync)->GetFunction());\n}\n\nNODE_MODULE(addon, InitAll)\n```\n\n```c++\n// sync.h\n#include <node.h>\n#include "nan.h"\n\nNAN_METHOD(CalculateSync);\n```\n\n```c++\n// sync.cc\n#include <node.h>\n#include "nan.h"\n#include "sync.h"\n// ...\n\nusing namespace v8;\n\n// Simple synchronous access to the `Estimate()` function\nNAN_METHOD(CalculateSync) {\n NanScope();\n\n // expect a number as the first argument\n int points = args[0]->Uint32Value();\n double est = Estimate(points);\n\n NanReturnValue(Number::New(est));\n}\n```\n\n```c++\n// async.cc\n#include <node.h>\n#include "nan.h"\n#include "async.h"\n\n// ...\n\nusing namespace v8;\n\nclass PiWorker : public NanAsyncWorker {\n public:\n PiWorker(NanCallback *callback, int points)\n : NanAsyncWorker(callback), points(points) {}\n ~PiWorker() {}\n\n // Executed inside the worker-thread.\n // It is not safe to access V8, or V8 data structures\n // here, so everything we need for input and output\n // should go on `this`.\n void Execute () {\n estimate = Estimate(points);\n }\n\n // Executed when the async work is complete\n // this function will be run inside the main event loop\n // so it is safe to use V8 again\n void HandleOKCallback () {\n NanScope();\n\n Local<Value> argv[] = {\n Local<Value>::New(Null())\n , Number::New(estimate)\n };\n\n callback->Call(2, argv);\n };\n\n private:\n int points;\n double estimate;\n};\n\n// Asynchronous access to the `Estimate()` function\nNAN_METHOD(CalculateAsync) {\n NanScope();\n\n int points = args[0]->Uint32Value();\n NanCallback *callback = new NanCallback(args[1].As<Function>());\n\n NanAsyncQueueWorker(new PiWorker(callback, points));\n NanReturnUndefined();\n}\n```\n\n<a name="api"></a>\n## API\n\n * <a href="#api_nan_method"><b><code>NAN_METHOD</code></b></a>\n * <a href="#api_nan_getter"><b><code>NAN_GETTER</code></b></a>\n * <a href="#api_nan_setter"><b><code>NAN_SETTER</code></b></a>\n * <a href="#api_nan_property_getter"><b><code>NAN_PROPERTY_GETTER</code></b></a>\n * <a href="#api_nan_property_setter"><b><code>NAN_PROPERTY_SETTER</code></b></a>\n * <a href="#api_nan_property_enumerator"><b><code>NAN_PROPERTY_ENUMERATOR</code></b></a>\n * <a href="#api_nan_property_deleter"><b><code>NAN_PROPERTY_DELETER</code></b></a>\n * <a href="#api_nan_property_query"><b><code>NAN_PROPERTY_QUERY</code></b></a>\n * <a href="#api_nan_index_getter"><b><code>NAN_INDEX_GETTER</code></b></a>\n * <a href="#api_nan_index_setter"><b><code>NAN_INDEX_SETTER</code></b></a>\n * <a href="#api_nan_index_enumerator"><b><code>NAN_INDEX_ENUMERATOR</code></b></a>\n * <a href="#api_nan_index_deleter"><b><code>NAN_INDEX_DELETER</code></b></a>\n * <a href="#api_nan_index_query"><b><code>NAN_INDEX_QUERY</code></b></a>\n * <a href="#api_nan_weak_callback"><b><code>NAN_WEAK_CALLBACK</code></b></a>\n * <a href="#api_nan_deprecated"><b><code>NAN_DEPRECATED</code></b></a>\n * <a href="#api_nan_inline"><b><code>NAN_INLINE</code></b></a> \n * <a href="#api_nan_new_local"><b><code>NanNewLocal</code></b></a>\n * <a href="#api_nan_return_value"><b><code>NanReturnValue</code></b></a>\n * <a href="#api_nan_return_undefined"><b><code>NanReturnUndefined</code></b></a>\n * <a href="#api_nan_return_null"><b><code>NanReturnNull</code></b></a>\n * <a href="#api_nan_return_empty_string"><b><code>NanReturnEmptyString</code></b></a>\n * <a href="#api_nan_scope"><b><code>NanScope</code></b></a>\n * <a href="#api_nan_locker"><b><code>NanLocker</code></b></a>\n * <a href="#api_nan_unlocker"><b><code>NanUnlocker</code></b></a>\n * <a href="#api_nan_get_internal_field_pointer"><b><code>NanGetInternalFieldPointer</code></b></a>\n * <a href="#api_nan_set_internal_field_pointer"><b><code>NanSetInternalFieldPointer</code></b></a>\n * <a href="#api_nan_object_wrap_handle"><b><code>NanObjectWrapHandle</code></b></a>\n * <a href="#api_nan_make_weak"><b><code>NanMakeWeak</code></b></a>\n * <a href="#api_nan_symbol"><b><code>NanSymbol</code></b></a>\n * <a href="#api_nan_get_pointer_safe"><b><code>NanGetPointerSafe</code></b></a>\n * <a href="#api_nan_set_pointer_safe"><b><code>NanSetPointerSafe</code></b></a>\n * <a href="#api_nan_raw_string"><b><code>NanRawString</code></b></a>\n * <a href="#api_nan_c_string"><b><code>NanCString</code></b></a>\n * <a href="#api_nan_from_v8_string"><b><code>NanFromV8String</code></b></a>\n * <a href="#api_nan_boolean_option_value"><b><code>NanBooleanOptionValue</code></b></a>\n * <a href="#api_nan_uint32_option_value"><b><code>NanUInt32OptionValue</code></b></a>\n * <a href="#api_nan_error"><b><code>NanError</code></b>, <b><code>NanTypeError</code></b>, <b><code>NanRangeError</code></b></a>\n * <a href="#api_nan_throw_error"><b><code>NanThrowError</code></b>, <b><code>NanThrowTypeError</code></b>, <b><code>NanThrowRangeError</code></b>, <b><code>NanThrowError(Handle<Value>)</code></b>, <b><code>NanThrowError(Handle<Value>, int)</code></b></a>\n * <a href="#api_nan_new_buffer_handle"><b><code>NanNewBufferHandle(char *, size_t, FreeCallback, void *)</code></b>, <b><code>NanNewBufferHandle(char *, uint32_t)</code></b>, <b><code>NanNewBufferHandle(uint32_t)</code></b></a>\n * <a href="#api_nan_buffer_use"><b><code>NanBufferUse(char *, uint32_t)</code></b></a>\n * <a href="#api_nan_new_context_handle"><b><code>NanNewContextHandle</code></b></a>\n * <a href="#api_nan_has_instance"><b><code>NanHasInstance</code></b></a>\n * <a href="#api_nan_persistent_to_local"><b><code>NanPersistentToLocal</code></b></a>\n * <a href="#api_nan_dispose"><b><code>NanDispose</code></b></a>\n * <a href="#api_nan_assign_persistent"><b><code>NanAssignPersistent</code></b></a>\n * <a href="#api_nan_init_persistent"><b><code>NanInitPersistent</code></b></a>\n * <a href="#api_nan_callback"><b><code>NanCallback</code></b></a>\n * <a href="#api_nan_async_worker"><b><code>NanAsyncWorker</code></b></a>\n * <a href="#api_nan_async_queue_worker"><b><code>NanAsyncQueueWorker</code></b></a>\n\n<a name="api_nan_method"></a>\n### NAN_METHOD(methodname)\n\nUse `NAN_METHOD` to define your V8 accessible methods:\n\n```c++\n// .h:\nclass Foo : public node::ObjectWrap {\n ...\n\n static NAN_METHOD(Bar);\n static NAN_METHOD(Baz);\n}\n\n\n// .cc:\nNAN_METHOD(Foo::Bar) {\n ...\n}\n\nNAN_METHOD(Foo::Baz) {\n ...\n}\n```\n\nThe reason for this macro is because of the method signature change in 0.11:\n\n```c++\n// 0.10 and below:\nHandle<Value> name(const Arguments& args)\n\n// 0.11 and above\nvoid name(const FunctionCallbackInfo<Value>& args)\n```\n\nThe introduction of `FunctionCallbackInfo` brings additional complications:\n\n<a name="api_nan_getter"></a>\n### NAN_GETTER(methodname)\n\nUse `NAN_GETTER` to declare your V8 accessible getters. You get a `Local<String>` `property` and an appropriately typed `args` object that can act like the `args` argument to a `NAN_METHOD` call.\n\nYou can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_GETTER`.\n\n<a name="api_nan_setter"></a>\n### NAN_SETTER(methodname)\n\nUse `NAN_SETTER` to declare your V8 accessible setters. Same as `NAN_GETTER` but you also get a `Local<Value>` `value` object to work with.\n\n<a name="api_nan_property_getter"></a>\n### NAN_PROPERTY_GETTER(cbname)\nUse `NAN_PROPERTY_GETTER` to declare your V8 accessible property getters. You get a `Local<String>` `property` and an appropriately typed `args` object that can act similar to the `args` argument to a `NAN_METHOD` call.\n\nYou can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_PROPERTY_GETTER`.\n\n<a name="api_nan_property_setter"></a>\n### NAN_PROPERTY_SETTER(cbname)\nUse `NAN_PROPERTY_SETTER` to declare your V8 accessible property setters. Same as `NAN_PROPERTY_GETTER` but you also get a `Local<Value>` `value` object to work with.\n\n<a name="api_nan_property_enumerator"></a>\n### NAN_PROPERTY_ENUMERATOR(cbname)\nUse `NAN_PROPERTY_ENUMERATOR` to declare your V8 accessible property enumerators. You get an appropriately typed `args` object like the `args` argument to a `NAN_PROPERTY_GETTER` call.\n\nYou can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_PROPERTY_ENUMERATOR`.\n\n<a name="api_nan_property_deleter"></a>\n### NAN_PROPERTY_DELETER(cbname)\nUse `NAN_PROPERTY_DELETER` to declare your V8 accessible property deleters. Same as `NAN_PROPERTY_GETTER`.\n\nYou can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_PROPERTY_DELETER`.\n\n<a name="api_nan_property_query"></a>\n### NAN_PROPERTY_QUERY(cbname)\nUse `NAN_PROPERTY_QUERY` to declare your V8 accessible property queries. Same as `NAN_PROPERTY_GETTER`.\n\nYou can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_PROPERTY_QUERY`.\n\n<a name="api_nan_index_getter"></a>\n### NAN_INDEX_GETTER(cbname)\nUse `NAN_INDEX_GETTER` to declare your V8 accessible index getters. You get a `uint32_t` `index` and an appropriately typed `args` object that can act similar to the `args` argument to a `NAN_METHOD` call.\n\nYou can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_INDEX_GETTER`.\n\n<a name="api_nan_index_setter"></a>\n### NAN_INDEX_SETTER(cbname)\nUse `NAN_INDEX_SETTER` to declare your V8 accessible index setters. Same as `NAN_INDEX_GETTER` but you also get a `Local<Value>` `value` object to work with.\n\n<a name="api_nan_index_enumerator"></a>\n### NAN_INDEX_ENUMERATOR(cbname)\nUse `NAN_INDEX_ENUMERATOR` to declare your V8 accessible index enumerators. You get an appropriately typed `args` object like the `args` argument to a `NAN_INDEX_GETTER` call.\n\nYou can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_INDEX_ENUMERATOR`.\n\n<a name="api_nan_index_deleter"></a>\n### NAN_INDEX_DELETER(cbname)\nUse `NAN_INDEX_DELETER` to declare your V8 accessible index deleters. Same as `NAN_INDEX_GETTER`.\n\nYou can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_INDEX_DELETER`.\n\n<a name="api_nan_index_query"></a>\n### NAN_INDEX_QUERY(cbname)\nUse `NAN_INDEX_QUERY` to declare your V8 accessible index queries. Same as `NAN_INDEX_GETTER`.\n\nYou can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_INDEX_QUERY`.\n\n<a name="api_nan_weak_callback"></a>\n### NAN_WEAK_CALLBACK(type, cbname)\n\nUse `NAN_WEAK_CALLBACK` to declare your V8 WeakReference callbacks. There is an object argument accessible through `NAN_WEAK_CALLBACK_OBJECT`. The `type` argument gives the type of the `data` argument, accessible through `NAN_WEAK_CALLBACK_DATA(type)`.\n\n```c++\nstatic NAN_WEAK_CALLBACK(BufferReference*, WeakCheck) {\n if (NAN_WEAK_CALLBACK_DATA(BufferReference*)->noLongerNeeded_) {\n delete NAN_WEAK_CALLBACK_DATA(BufferReference*);\n } else {\n // Still in use, revive, prevent GC\n NanMakeWeak(NAN_WEAK_CALLBACK_OBJECT, NAN_WEAK_CALLBACK_DATA(BufferReference*), &WeakCheck);\n }\n}\n```\n\n<a name="api_nan_deprecated"></a>\n### NAN_DEPRECATED(declarator)\nDeclares a function as deprecated. Identical to `V8_DEPRECATED`.\n\n```c++\nstatic NAN_DEPRECATED(NAN_METHOD(foo)) {\n ...\n}\n```\n\n<a name="api_nan_inline"></a>\n### NAN_INLINE(declarator)\nInlines a function. Identical to `V8_INLINE`.\n\n```c++\nstatic NAN_INLINE(int foo(int bar)) {\n ...\n}\n```\n\n<a name="api_nan_new_local"></a>\n### NanNewLocal&lt;T&gt;(Handle&lt;Value&gt;)\n\nUse `NanNewLocal` in place of `v8::Local<T>::New(...)` as this function\nrequires an `isolate` argument in recent versions of V8 but not in older versions.\n\n```c++\nNanNewLocal<v8::Value>(v8::Null())\n```\n\n<a name="api_nan_return_value"></a>\n### NanReturnValue(Handle&lt;Value&gt;)\n\nUse `NanReturnValue` when you want to return a value from your V8 accessible method:\n\n```c++\nNAN_METHOD(Foo::Bar) {\n ...\n\n NanReturnValue(String::New("FooBar!"));\n}\n```\n\nNo `return` statement required.\n\n<a name="api_nan_return_undefined"></a>\n### NanReturnUndefined()\n\nUse `NanReturnUndefined` when you don\'t want to return anything from your V8 accessible method:\n\n```c++\nNAN_METHOD(Foo::Baz) {\n ...\n\n NanReturnUndefined();\n}\n```\n\n<a name="api_nan_return_null"></a>\n### NanReturnNull()\n\nUse `NanReturnNull` when you want to return `Null` from your V8 accessible method:\n\n```c++\nNAN_METHOD(Foo::Baz) {\n ...\n\n NanReturnNull();\n}\n```\n\n<a name="api_nan_return_empty_string"></a>\n### NanReturnEmptyString()\n\nUse `NanReturnEmptyString` when you want to return an empty `String` from your V8 accessible method:\n\n```c++\nNAN_METHOD(Foo::Baz) {\n ...\n\n NanReturnEmptyString();\n}\n```\n\n<a name="api_nan_scope"></a>\n### NanScope()\n\nThe introduction of `isolate` references for many V8 calls in Node 0.11 makes `NanScope()` necessary, use it in place of `HandleScope scope`:\n\n```c++\nNAN_METHOD(Foo::Bar) {\n NanScope();\n\n NanReturnValue(String::New("FooBar!"));\n}\n```\n\n<a name="api_nan_locker"></a>\n### NanLocker()\n\nThe introduction of `isolate` references for many V8 calls in Node 0.11 makes `NanLocker()` necessary, use it in place of `Locker locker`:\n\n```c++\nNAN_METHOD(Foo::Bar) {\n NanLocker();\n ...\n NanUnlocker();\n}\n```\n\n<a name="api_nan_unlocker"></a>\n### NanUnlocker()\n\nThe introduction of `isolate` references for many V8 calls in Node 0.11 makes `NanUnlocker()` necessary, use it in place of `Unlocker unlocker`:\n\n```c++\nNAN_METHOD(Foo::Bar) {\n NanLocker();\n ...\n NanUnlocker();\n}\n```\n\n<a name="api_nan_get_internal_field_pointer"></a>\n### void * NanGetInternalFieldPointer(Handle&lt;Object&gt;, int)\n\nGets a pointer to the internal field with at `index` from a V8 `Object` handle.\n\n```c++\nLocal<Object> obj;\n...\nNanGetInternalFieldPointer(obj, 0);\n```\n<a name="api_nan_set_internal_field_pointer"></a>\n### void NanSetInternalFieldPointer(Handle&lt;Object&gt;, int, void *)\n\nSets the value of the internal field at `index` on a V8 `Object` handle.\n\n```c++\nstatic Persistent<Function> dataWrapperCtor;\n...\nLocal<Object> wrapper = NanPersistentToLocal(dataWrapperCtor)->NewInstance();\nNanSetInternalFieldPointer(wrapper, 0, this);\n```\n\n<a name="api_nan_object_wrap_handle"></a>\n### Local&lt;Object&gt; NanObjectWrapHandle(Object)\n\nWhen you want to fetch the V8 object handle from a native object you\'ve wrapped with Node\'s `ObjectWrap`, you should use `NanObjectWrapHandle`:\n\n```c++\nNanObjectWrapHandle(iterator)->Get(String::NewSymbol("end"))\n```\n\n<a name="api_nan_make_weak"></a>\n### NanMakeWeak(Persistent&lt;T&gt;, parameter, callback)\n\nMake a persistent reference weak.\n\n<a name="api_nan_symbol"></a>\n### String NanSymbol(char *)\n\nThis isn\'t strictly about compatibility, it\'s just an easier way to create string symbol objects (i.e. `String::NewSymbol(x)`), for getting and setting object properties, or names of objects.\n\n```c++\nbool foo = false;\nif (obj->Has(NanSymbol("foo")))\n foo = optionsObj->Get(NanSymbol("foo"))->BooleanValue()\n```\n\n<a name="api_nan_get_pointer_safe"></a>\n### Type NanGetPointerSafe(Type *[, Type])\n\nA helper for getting values from optional pointers. If the pointer is `NULL`, the function returns the optional default value, which defaults to `0`. Otherwise, the function returns the value the pointer points to.\n\n```c++\nchar *plugh(uint32_t *optional) {\n char res[] = "xyzzy";\n uint32_t param = NanGetPointerSafe<uint32_t>(optional, 0x1337);\n switch (param) {\n ...\n }\n NanSetPointerSafe<uint32_t>(optional, 0xDEADBEEF);\n} \n```\n\n<a name="api_nan_set_pointer_safe"></a>\n### bool NanSetPointerSafe(Type *, Type)\n\nA helper for setting optional argument pointers. If the pointer is `NULL`, the function simply return `false`. Otherwise, the value is assigned to the variable the pointer points to.\n\n```c++\nconst char *plugh(size_t *outputsize) {\n char res[] = "xyzzy";\n if !(NanSetPointerSafe<size_t>(outputsize, strlen(res) + 1)) {\n ...\n }\n\n ...\n}\n```\n\n<a name="api_nan_raw_string"></a>\n### void* NanRawString(Handle&lt;Value&gt;, enum Nan::Encoding, size_t *, void *, size_t, int)\n\nWhen you want to convert a V8 `String` to a `char*` buffer, use `NanRawString`. You have to supply an encoding as well as a pointer to a variable that will be assigned the number of bytes in the returned string. It is also possible to supply a buffer and its length to the function in order not to have a new buffer allocated. The final argument allows setting `String::WriteOptions`.\nJust remember that you\'ll end up with an object that you\'ll need to `delete[]` at some point unless you supply your own buffer:\n\n```c++\nsize_t count;\nvoid* decoded = NanRawString(args[1], Nan::BASE64, &count, NULL, 0, String::HINT_MANY_WRITES_EXPECTED);\nchar param_copy[count];\nmemcpy(param_copy, decoded, count);\ndelete[] decoded;\n```\n\n<a name="api_nan_c_string"></a>\n### char* NanCString(Handle&lt;Value&gt;, size_t *[, char *, size_t, int])\n\nWhen you want to convert a V8 `String` to a null-terminated C `char*` use `NanCString`. The resulting `char*` will be UTF-8-encoded, and you need to supply a pointer to a variable that will be assigned the number of bytes in the returned string. It is also possible to supply a buffer and its length to the function in order not to have a new buffer allocated. The final argument allows optionally setting `String::WriteOptions`, which default to `v8::String::NO_OPTIONS`.\nJust remember that you\'ll end up with an object that you\'ll need to `delete[]` at some point unless you supply your own buffer:\n\n```c++\nsize_t count;\nchar* name = NanCString(args[0], &count);\n```\n\n<a name="api_nan_from_v8_string"></a>\n### char* NanFromV8String(Handle&lt;Value&gt;[, enum Nan::Encoding, size_t *, char *, size_t, int])\n\nA convenience function that uses `NanRawString()` to convert a V8 `String` to a `char*`. Defaults to UTF8 encoding and no null-termination.\n\n```c++\nsize_t count;\nchar* name = NanFromV8String(args[0]);\n```\n\n<a name="api_nan_boolean_option_value"></a>\n### bool NanBooleanOptionValue(Handle&lt;Value&gt;, Handle&lt;String&gt;[, bool])\n\nWhen you have an "options" object that you need to fetch properties from, boolean options can be fetched with this pair. They check first if the object exists (`IsEmpty`), then if the object has the given property (`Has`) then they get and convert/coerce the property to a `bool`.\n\nThe optional last parameter is the *default* value, which is `false` if left off:\n\n```c++\n// `foo` is false unless the user supplies a truthy value for it\nbool foo = NanBooleanOptionValue(optionsObj, NanSymbol("foo"));\n// `bar` is true unless the user supplies a falsy value for it\nbool bar = NanBooleanOptionValueDefTrue(optionsObj, NanSymbol("bar"), true);\n```\n\n<a name="api_nan_uint32_option_value"></a>\n### uint32_t NanUInt32OptionValue(Handle&lt;Value&gt;, Handle&lt;String&gt;, uint32_t)\n\nSimilar to `NanBooleanOptionValue`, use `NanUInt32OptionValue` to fetch an integer option from your options object. Can be any kind of JavaScript `Number` and it will be coerced to an unsigned 32-bit integer.\n\nRequires all 3 arguments as a default is not optional:\n\n```c++\nuint32_t count = NanUInt32OptionValue(optionsObj, NanSymbol("count"), 1024);\n```\n\n<a name="api_nan_error"></a>\n### NanError(message), NanTypeError(message), NanRangeError(message)\n\nFor making `Error`, `TypeError` and `RangeError` objects.\n\n```c++\nLocal<Value> res = NanError("you must supply a callback argument");\n```\n\n<a name="api_nan_throw_error"></a>\n### NanThrowError(message), NanThrowTypeError(message), NanThrowRangeError(message), NanThrowError(Local&lt;Value&gt;), NanThrowError(Local&lt;Value&gt;, int)\n\nFor throwing `Error`, `TypeError` and `RangeError` objects. You should `return` this call:\n\n```c++\nreturn NanThrowError("you must supply a callback argument");\n```\n\nCan also handle any custom object you may want to throw. If used with the error code argument, it will add the supplied error code to the error object as a property called `code`.\n\n<a name="api_nan_new_buffer_handle"></a>\n### Local&lt;Object&gt; NanNewBufferHandle(char *, uint32_t), Local&lt;Object&gt; NanNewBufferHandle(uint32_t)\n\nThe `Buffer` API has changed a little in Node 0.11, this helper provides consistent access to `Buffer` creation:\n\n```c++\nNanNewBufferHandle((char*)value.data(), value.size());\n```\n\nCan also be used to initialize a `Buffer` with just a `size` argument.\n\nCan also be supplied with a `NAN_WEAK_CALLBACK` and a hint for the garbage collector, when dealing with weak references.\n\n<a name="api_nan_buffer_use"></a>\n### Local&lt;Object&gt; NanBufferUse(char*, uint32_t)\n\n`Buffer::New(char*, uint32_t)` prior to 0.11 would make a copy of the data.\nWhile it was possible to get around this, it required a shim by passing a\ncallback. So the new API `Buffer::Use(char*, uint32_t)` was introduced to remove\nneeding to use this shim.\n\n`NanBufferUse` uses the `char*` passed as the backing data, and will free the\nmemory automatically when the weak callback is called. Keep this in mind, as\ncareless use can lead to "double free or corruption" and other cryptic failures.\n\n<a name="api_nan_has_instance"></a>\n### bool NanHasInstance(Persistent&lt;FunctionTemplate&gt;&, Handle&lt;Value&gt;)\n\nCan be used to check the type of an object to determine it is of a particular class you have already defined and have a `Persistent<FunctionTemplate>` handle for.\n\n<a name="api_nan_persistent_to_local"></a>\n### Local&lt;Type&gt; NanPersistentToLocal(Persistent&lt;Type&gt;&)\n\nAside from `FunctionCallbackInfo`, the biggest and most painful change to V8 in Node 0.11 is the many restrictions now placed on `Persistent` handles. They are difficult to assign and difficult to fetch the original value out of.\n\nUse `NanPersistentToLocal` to convert a `Persistent` handle back to a `Local` handle.\n\n```c++\nLocal<Object> handle = NanPersistentToLocal(persistentHandle);\n```\n\n<a href="#api_nan_new_context_handle">\n### Local&lt;Context&gt; NanNewContextHandle([ExtensionConfiguration*, Handle&lt;ObjectTemplate&gt;, Handle&lt;Value&gt;])\nCreates a new `Local<Context>` handle.\n\n```c++\nLocal<FunctionTemplate> ftmpl = FunctionTemplate::New();\nLocal<ObjectTemplate> otmpl = ftmpl->InstanceTemplate();\nLocal<Context> ctx = NanNewContextHandle(NULL, otmpl);\n```\n\n<a name="api_nan_dispose"></a>\n### void NanDispose(Persistent&lt;T&gt; &)\n\nUse `NanDispose` to dispose a `Persistent` handle.\n\n```c++\nNanDispose(persistentHandle);\n```\n\n<a name="api_nan_assign_persistent"></a>\n### NanAssignPersistent(type, handle, object)\n\nUse `NanAssignPersistent` to assign a non-`Persistent` handle to a `Persistent` one. You can no longer just declare a `Persistent` handle and assign directly to it later, you have to `Reset` it in Node 0.11, so this makes it easier.\n\nIn general it is now better to place anything you want to protect from V8\'s garbage collector as properties of a generic `Object` and then assign that to a `Persistent`. This works in older versions of Node also if you use `NanAssignPersistent`:\n\n```c++\nPersistent<Object> persistentHandle;\n\n...\n\nLocal<Object> obj = Object::New();\nobj->Set(NanSymbol("key"), keyHandle); // where keyHandle might be a Local<String>\nNanAssignPersistent(Object, persistentHandle, obj)\n```\n\n<a name="api_nan_init_persistent"></a>\n### NanInitPersistent(type, name, object)\n\nUser `NanInitPersistent` to declare and initialize a new `Persistent` with the supplied object. The assignment operator for `Persistent` is no longer public in Node 0.11, so this macro makes it easier to declare and initializing a new `Persistent`. See <a href="#api_nan_assign_persistent"><b><code>NanAssignPersistent</code></b></a> for more information.\n\n```c++\nLocal<Object> obj = Object::New();\nobj->Set(NanSymbol("key"), keyHandle); // where keyHandle might be a Local<String>\nNanInitPersistent(Object, persistentHandle, obj);\n```\n\n<a name="api_nan_callback"></a>\n### NanCallback\n\nBecause of the difficulties imposed by the changes to `Persistent` handles in V8 in Node 0.11, creating `Persistent` versions of your `Handle<Function>` is annoyingly tricky. `NanCallback` makes it easier by taking your handle, making it persistent until the `NanCallback` is deleted and even providing a handy `Call()` method to fetch and execute the callback `Function`.\n\n```c++\nLocal<Function> callbackHandle = args[0].As<Function>();\nNanCallback *callback = new NanCallback(callbackHandle);\n// pass `callback` around and it\'s safe from GC until you:\ndelete callback;\n```\n\nYou can execute the callback like so:\n\n```c++\n// no arguments:\ncallback->Call(0, NULL);\n\n// an error argument:\nHandle<Value> argv[] = {\n Exception::Error(String::New("fail!"))\n};\ncallback->Call(1, argv);\n\n// a success argument:\nHandle<Value> argv[] = {\n Null(),\n String::New("w00t!")\n};\ncallback->Call(2, argv);\n```\n\n`NanCallback` also has a `Local<Function> GetCallback()` method that you can use\nto fetch a local handle to the underlying callback function, as well as a\n`void SetFunction(Handle<Function>)` for setting the callback on the\n`NanCallback`. Additionally a generic constructor is available for using\n`NanCallback` without performing heap allocations.\n\n<a name="api_nan_async_worker"></a>\n### NanAsyncWorker\n\n`NanAsyncWorker` is an abstract class that you can subclass to have much of the annoying async queuing and handling taken care of for you. It can even store arbitrary V8 objects for you and have them persist while the async work is in progress.\n\nSee a rough outline of the implementation:\n\n```c++\nclass NanAsyncWorker {\npublic:\n NanAsyncWorker (NanCallback *callback);\n\n // Clean up persistent handles and delete the *callback\n virtual ~NanAsyncWorker ();\n\n // Check the `char *errmsg` property and call HandleOKCallback()\n // or HandleErrorCallback depending on whether it has been set or not\n virtual void WorkComplete ();\n\n // You must implement this to do some async work. If there is an\n // error then allocate `errmsg` to to a message and the callback will\n // be passed that string in an Error object\n virtual void Execute ();\n\n // Save a V8 object in a Persistent handle to protect it from GC\n void SavePersistent(const char *key, Local<Object> &obj);\n\n // Fetch a stored V8 object (don\'t call from within `Execute()`)\n Local<Object> GetFromPersistent(const char *key);\n\nprotected:\n // Set this if there is an error, otherwise it\'s NULL\n const char *errmsg;\n\n // Default implementation calls the callback function with no arguments.\n // Override this to return meaningful data\n virtual void HandleOKCallback ();\n\n // Default implementation calls the callback function with an Error object\n // wrapping the `errmsg` string\n virtual void HandleErrorCallback ();\n};\n```\n\n<a name="api_nan_async_queue_worker"></a>\n### NanAsyncQueueWorker(NanAsyncWorker *)\n\n`NanAsyncQueueWorker` will run a `NanAsyncWorker` asynchronously via libuv. Both the *execute* and *after_work* steps are taken care of for you&mdash;most of the logic for this is embedded in `NanAsyncWorker`.\n\n### Contributors\n\nNAN is only possible due to the excellent work of the following contributors:\n\n<table><tbody>\n<tr><th align="left">Rod Vagg</th><td><a href="https://github.com/rvagg">GitHub/rvagg</a></td><td><a href="http://twitter.com/rvagg">Twitter/@rvagg</a></td></tr>\n<tr><th align="left">Benjamin Byholm</th><td><a href="https://github.com/kkoopa/">GitHub/kkoopa</a></td></tr>\n<tr><th align="left">Trevor Norris</th><td><a href="https://github.com/trevnorris">GitHub/trevnorris</a></td><td><a href="http://twitter.com/trevnorris">Twitter/@trevnorris</a></td></tr>\n<tr><th align="left">Nathan Rajlich</th><td><a href="https://github.com/TooTallNate">GitHub/TooTallNate</a></td><td><a href="http://twitter.com/TooTallNate">Twitter/@TooTallNate</a></td></tr>\n<tr><th align="left">Brett Lawson</th><td><a href="https://github.com/brett19">GitHub/brett19</a></td><td><a href="http://twitter.com/brett19x">Twitter/@brett19x</a></td></tr>\n<tr><th align="left">Ben Noordhuis</th><td><a href="https://github.com/bnoordhuis">GitHub/bnoordhuis</a></td><td><a href="http://twitter.com/bnoordhuis">Twitter/@bnoordhuis</a></td></tr>\n</tbody></table>\n\nLicence &amp; copyright\n-----------------------\n\nCopyright (c) 2013 NAN contributors (listed above).\n\nNative Abstractions for Node.js is licensed under an MIT +no-false-attribs license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details.\n',
124 silly resolved readmeFilename: 'README.md',
124 silly resolved bugs: { url: 'https://github.com/rvagg/nan/issues' },
124 silly resolved homepage: 'https://github.com/rvagg/nan',
124 silly resolved _id: 'nan@0.7.1',
124 silly resolved _shasum: 'fc576184a1037b3e5675f2ba3740dee2044ff8f4',
124 silly resolved _from: 'nan@~0.7.0',
124 silly resolved _resolved: 'https://registry.npmjs.org/nan/-/nan-0.7.1.tgz' },
124 silly resolved { name: 'bindings',
124 silly resolved description: 'Helper module for loading your native module\'s .node file',
124 silly resolved keywords: [ 'native', 'addon', 'bindings', 'gyp', 'waf', 'c', 'c++' ],
124 silly resolved version: '1.1.1',
124 silly resolved author:
124 silly resolved { name: 'Nathan Rajlich',
124 silly resolved email: 'nathan@tootallnate.net',
124 silly resolved url: 'http://tootallnate.net' },
124 silly resolved repository:
124 silly resolved { type: 'git',
124 silly resolved url: 'git://github.com/TooTallNate/node-bindings.git' },
124 silly resolved main: './bindings.js',
124 silly resolved readme: 'node-bindings\n=============\n### Helper module for loading your native module\'s .node file\n\nThis is a helper module for authors of Node.js native addon modules.\nIt is basically the "swiss army knife" of `require()`ing your native module\'s\n`.node` file.\n\nThroughout the course of Node\'s native addon history, addons have ended up being\ncompiled in a variety of different places, depending on which build tool and which\nversion of node was used. To make matters worse, now the _gyp_ build tool can\nproduce either a _Release_ or _Debug_ build, each being built into different\nlocations.\n\nThis module checks _all_ the possible locations that a native addon would be built\nat, and returns the first one that loads successfully.\n\n\nInstallation\n------------\n\nInstall with `npm`:\n\n``` bash\n$ npm install bindings\n```\n\nOr add it to the `"dependencies"` section of your _package.json_ file.\n\n\nExample\n-------\n\n`require()`ing the proper bindings file for the current node version, platform\nand architecture is as simple as:\n\n``` js\nvar bindings = require(\'bindings\')(\'binding.node\')\n\n// Use your bindings defined in your C files\nbindings.your_c_function()\n```\n\n\nNice Error Output\n-----------------\n\nWhen the `.node` file could not be loaded, `node-bindings` throws an Error with\na nice error message telling you exactly what was tried. You can also check the\n`err.tries` Array property.\n\n```\nError: Could not load the bindings file. Tried:\n → /Users/nrajlich/ref/build/binding.node\n → /Users/nrajlich/ref/build/Debug/binding.node\n → /Users/nrajlich/ref/build/Release/binding.node\n → /Users/nrajlich/ref/out/Debug/binding.node\n → /Users/nrajlich/ref/Debug/binding.node\n → /Users/nrajlich/ref/out/Release/binding.node\n → /Users/nrajlich/ref/Release/binding.node\n → /Users/nrajlich/ref/build/default/binding.node\n → /Users/nrajlich/ref/compiled/0.8.2/darwin/x64/binding.node\n at bindings (/Users/nrajlich/ref/node_modules/bindings/bindings.js:84:13)\n at Object.<anonymous> (/Users/nrajlich/ref/lib/ref.js:5:47)\n at Module._compile (module.js:449:26)\n at Object.Module._extensions..js (module.js:467:10)\n at Module.load (module.js:356:32)\n at Function.Module._load (module.js:312:12)\n ...\n```\n\n\nLicense\n-------\n\n(The MIT License)\n\nCopyright (c) 2012 Nathan Rajlich &lt;nathan@tootallnate.net&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\'Software\'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \'AS IS\', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n',
124 silly resolved readmeFilename: 'README.md',
124 silly resolved bugs: { url: 'https://github.com/TooTallNate/node-bindings/issues' },
124 silly resolved homepage: 'https://github.com/TooTallNate/node-bindings',
124 silly resolved _id: 'bindings@1.1.1',
124 silly resolved _shasum: '951f7ae010302ffc50b265b124032017ed2bf6f3',
124 silly resolved _from: 'bindings@~1.1.1',
124 silly resolved _resolved: 'https://registry.npmjs.org/bindings/-/bindings-1.1.1.tgz' } ]
125 info install nan@0.7.1 into /projects/vodori-bot/node_modules/node-stringprep
126 info install bindings@1.1.1 into /projects/vodori-bot/node_modules/node-stringprep
127 info installOne nan@0.7.1
128 info installOne bindings@1.1.1
129 info /projects/vodori-bot/node_modules/node-stringprep/node_modules/nan unbuild
130 info /projects/vodori-bot/node_modules/node-stringprep/node_modules/bindings unbuild
131 verbose tar unpack /home/dancrumb/.npm/nan/0.7.1/package.tgz
132 silly lockFile ade50c4d-node-stringprep-node-modules-nan tar:///projects/vodori-bot/node_modules/node-stringprep/node_modules/nan
133 verbose lock tar:///projects/vodori-bot/node_modules/node-stringprep/node_modules/nan /home/dancrumb/.npm/ade50c4d-node-stringprep-node-modules-nan.lock
134 silly lockFile 636bc6e7-ncrumb-npm-nan-0-7-1-package-tgz tar:///home/dancrumb/.npm/nan/0.7.1/package.tgz
135 verbose lock tar:///home/dancrumb/.npm/nan/0.7.1/package.tgz /home/dancrumb/.npm/636bc6e7-ncrumb-npm-nan-0-7-1-package-tgz.lock
136 verbose tar unpack /home/dancrumb/.npm/bindings/1.1.1/package.tgz
137 silly lockFile 204dcdff-stringprep-node-modules-bindings tar:///projects/vodori-bot/node_modules/node-stringprep/node_modules/bindings
138 verbose lock tar:///projects/vodori-bot/node_modules/node-stringprep/node_modules/bindings /home/dancrumb/.npm/204dcdff-stringprep-node-modules-bindings.lock
139 silly lockFile 128db0fa-b-npm-bindings-1-1-1-package-tgz tar:///home/dancrumb/.npm/bindings/1.1.1/package.tgz
140 verbose lock tar:///home/dancrumb/.npm/bindings/1.1.1/package.tgz /home/dancrumb/.npm/128db0fa-b-npm-bindings-1-1-1-package-tgz.lock
141 silly gunzTarPerm modes [ '755', '644' ]
142 silly gunzTarPerm modes [ '755', '644' ]
143 silly gunzTarPerm extractEntry package.json
144 silly gunzTarPerm extractEntry package.json
145 silly gunzTarPerm extractEntry README.md
146 silly gunzTarPerm extractEntry LICENSE
147 silly gunzTarPerm extractEntry README.md
148 silly gunzTarPerm extractEntry bindings.js
149 silly gunzTarPerm extractEntry include_dirs.js
150 silly gunzTarPerm extractEntry .dntrc
151 silly lockFile 204dcdff-stringprep-node-modules-bindings tar:///projects/vodori-bot/node_modules/node-stringprep/node_modules/bindings
152 silly lockFile 204dcdff-stringprep-node-modules-bindings tar:///projects/vodori-bot/node_modules/node-stringprep/node_modules/bindings
153 silly lockFile 128db0fa-b-npm-bindings-1-1-1-package-tgz tar:///home/dancrumb/.npm/bindings/1.1.1/package.tgz
154 silly lockFile 128db0fa-b-npm-bindings-1-1-1-package-tgz tar:///home/dancrumb/.npm/bindings/1.1.1/package.tgz
155 info preinstall bindings@1.1.1
156 verbose readDependencies using package.json deps
157 verbose readDependencies using package.json deps
158 silly resolved []
159 verbose about to build /projects/vodori-bot/node_modules/node-stringprep/node_modules/bindings
160 info build /projects/vodori-bot/node_modules/node-stringprep/node_modules/bindings
161 verbose linkStuff [ false,
161 verbose linkStuff false,
161 verbose linkStuff false,
161 verbose linkStuff '/projects/vodori-bot/node_modules/node-stringprep/node_modules' ]
162 info linkStuff bindings@1.1.1
163 verbose linkBins bindings@1.1.1
164 verbose linkMans bindings@1.1.1
165 verbose rebuildBundles bindings@1.1.1
166 info install bindings@1.1.1
167 info postinstall bindings@1.1.1
168 silly gunzTarPerm extractEntry build/config.gypi
169 silly gunzTarPerm extractEntry nan.h
170 silly lockFile ade50c4d-node-stringprep-node-modules-nan tar:///projects/vodori-bot/node_modules/node-stringprep/node_modules/nan
171 silly lockFile ade50c4d-node-stringprep-node-modules-nan tar:///projects/vodori-bot/node_modules/node-stringprep/node_modules/nan
172 silly lockFile 636bc6e7-ncrumb-npm-nan-0-7-1-package-tgz tar:///home/dancrumb/.npm/nan/0.7.1/package.tgz
173 silly lockFile 636bc6e7-ncrumb-npm-nan-0-7-1-package-tgz tar:///home/dancrumb/.npm/nan/0.7.1/package.tgz
174 info preinstall nan@0.7.1
175 verbose readDependencies using package.json deps
176 verbose readDependencies using package.json deps
177 silly resolved []
178 verbose about to build /projects/vodori-bot/node_modules/node-stringprep/node_modules/nan
179 info build /projects/vodori-bot/node_modules/node-stringprep/node_modules/nan
180 verbose linkStuff [ false,
180 verbose linkStuff false,
180 verbose linkStuff false,
180 verbose linkStuff '/projects/vodori-bot/node_modules/node-stringprep/node_modules' ]
181 info linkStuff nan@0.7.1
182 verbose linkBins nan@0.7.1
183 verbose linkMans nan@0.7.1
184 verbose rebuildBundles nan@0.7.1
185 info install nan@0.7.1
186 info postinstall nan@0.7.1
187 verbose about to build /projects/vodori-bot/node_modules/node-stringprep
188 info build /projects/vodori-bot/node_modules/node-stringprep
189 verbose linkStuff [ false, false, false, '/projects/vodori-bot/node_modules' ]
190 info linkStuff node-stringprep@0.2.3
191 verbose linkBins node-stringprep@0.2.3
192 verbose linkMans node-stringprep@0.2.3
193 verbose rebuildBundles node-stringprep@0.2.3
194 verbose rebuildBundles [ 'bindings', 'nan' ]
195 info install node-stringprep@0.2.3
196 verbose unsafe-perm in lifecycle true
197 info node-stringprep@0.2.3 Failed to exec install script
198 info /projects/vodori-bot/node_modules/node-stringprep unbuild
199 info preuninstall node-stringprep@0.2.3
200 info uninstall node-stringprep@0.2.3
201 verbose true,/projects/vodori-bot/node_modules,/projects/vodori-bot/node_modules unbuild node-stringprep@0.2.3
202 info postuninstall node-stringprep@0.2.3
203 error node-stringprep@0.2.3 install: `node-gyp rebuild`
203 error Exit status 1
204 error Failed at the node-stringprep@0.2.3 install script.
204 error This is most likely a problem with the node-stringprep package,
204 error not with npm itself.
204 error Tell the author that this fails on your system:
204 error node-gyp rebuild
204 error You can get their info via:
204 error npm owner ls node-stringprep
204 error There is likely additional logging output above.
205 error System Linux 3.11.0-19-generic
206 error command "node" "/usr/local/bin/npm" "install" "node-stringprep"
207 error cwd /projects/vodori-bot
208 error node -v v0.10.22
209 error npm -v 1.4.7
210 error code ELIFECYCLE
211 verbose exit [ 1, true ]
$ npm install node-stringprep
npm http GET https://registry.npmjs.org/node-stringprep
npm http 304 https://registry.npmjs.org/node-stringprep
npm http GET https://registry.npmjs.org/bindings
npm http GET https://registry.npmjs.org/nan
npm http 304 https://registry.npmjs.org/nan
npm http 304 https://registry.npmjs.org/bindings
> node-stringprep@0.2.3 install /projects/vodori-bot/node_modules/node-stringprep
> node-gyp rebuild
Traceback (most recent call last):
File "/usr/local/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py", line 18, in <module>
sys.exit(gyp.script_main())
AttributeError: 'module' object has no attribute 'script_main'
gyp ERR! configure error
gyp ERR! stack Error: `gyp` failed with exit code: 1
gyp ERR! stack at ChildProcess.onCpExit (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:340:16)
gyp ERR! stack at ChildProcess.EventEmitter.emit (events.js:98:17)
gyp ERR! stack at Process.ChildProcess._handle.onexit (child_process.js:789:12)
gyp ERR! System Linux 3.11.0-19-generic
gyp ERR! command "node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /projects/vodori-bot/node_modules/node-stringprep
gyp ERR! node -v v0.10.22
gyp ERR! node-gyp -v v0.13.0
gyp ERR! not ok
npm ERR! node-stringprep@0.2.3 install: `node-gyp rebuild`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the node-stringprep@0.2.3 install script.
npm ERR! This is most likely a problem with the node-stringprep package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR! node-gyp rebuild
npm ERR! You can get their info via:
npm ERR! npm owner ls node-stringprep
npm ERR! There is likely additional logging output above.
npm ERR! System Linux 3.11.0-19-generic
npm ERR! command "node" "/usr/local/bin/npm" "install" "node-stringprep"
npm ERR! cwd /projects/vodori-bot
npm ERR! node -v v0.10.22
npm ERR! npm -v 1.4.7
npm ERR! code ELIFECYCLE
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR! /projects/vodori-bot/npm-debug.log
npm ERR! not ok code 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment