├── .dntrc ├── .gitignore ├── .npmignore ├── .travis.yml ├── LICENSE.txt ├── README.md ├── binding.gyp ├── changelog ├── lib └── contextify.js ├── package-lock.json ├── package.json ├── src └── contextify.cc └── test └── contextify.js /.dntrc: -------------------------------------------------------------------------------- 1 | ## DNT config file 2 | ## see https://github.com/rvagg/dnt 3 | 4 | NODE_VERSIONS="\ 5 | v4.8.7 \ 6 | v6.13.0 \ 7 | v8.9.4 \ 8 | v9.7.1 \ 9 | " 10 | OUTPUT_PREFIX="contextify-" 11 | TEST_CMD="\ 12 | cd /dnt/ && \ 13 | npm install --nodedir=/usr/src/node && \ 14 | npm test; \ 15 | " 16 | LOG_OK_CMD="tail -1 | sed 's/.\[1m.\[32mOK: .\[39m.\[22m.* assertions.*/ok/'" 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .lock-wscript 2 | node_modules/ 3 | build/ 4 | *.swp 5 | *.swo 6 | TODO 7 | Makefile.gyp 8 | *.Makefile 9 | *.target.gyp.mk 10 | gyp-mac-tool 11 | out/ 12 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | Makefile 2 | .lock-wscript 3 | node_modules 4 | build 5 | *.swp 6 | *.swo 7 | TODO 8 | Makefile.gyp 9 | *.Makefile 10 | *.target.gyp.mk 11 | gyp-mac-tool 12 | out 13 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "11" 4 | - "10" 5 | - "8" 6 | - "6" 7 | cache: 8 | directories: 9 | - node_modules 10 | addons: 11 | apt: 12 | sources: 13 | - ubuntu-toolchain-r-test 14 | packages: 15 | - g++-4.8 16 | env: 17 | CXX=g++-4.8 18 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2011 Brian McDaniel 2 | 3 | Permission is hereby granted, free of charge, to any person 4 | obtaining a copy of this software and associated documentation 5 | files (the "Software"), to deal in the Software without 6 | restriction, including without limitation the rights to use, 7 | copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the 9 | Software is furnished to do so, subject to the following 10 | conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 17 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # UNMAINTAINED 2 | This module is no longer being maintained. If you're interested in becoming a maintainer, please open an issue. 3 | 4 | ## YOU DON'T NEED THIS MODULE ON NODE >= 0.12 5 | 6 | As of Node 0.12, Contextify has been merged into Node (thanks to @domenic), replacing the native `vm` module. 7 | The code has been improved on since then, so if at all possible, you should use a newer Node and the native `vm` module. 8 | Note that newer versions of JSDOM no longer depend on Contextify. 9 | 10 | The README below applies to Node 0.10 and below. 11 | 12 | # Contextify 13 | 14 | ## Installation issues 15 | 16 | Make sure you have the `node-gyp` prerequisites installed: https://github.com/nodejs/node-gyp#installation 17 | 18 | For Windows issues, see here: https://github.com/brianmcd/contextify/wiki/Windows-Installation-Guide 19 | 20 | ## What is Contextify? 21 | 22 | Turn an object into a V8 execution context. A contextified object acts as the global 'this' when executing scripts in its context. Contextify adds 3 methods to the contextified object: run(code, filename), getGlobal(), and dispose(). The main difference between Contextify and Node's vm methods is that Contextify allows asynchronous functions to continue executing in the Contextified object's context. See vm vs. Contextify below for more discussion. 23 | 24 | ## Examples 25 | ```javascript 26 | var Contextify = require('contextify'); 27 | var sandbox = { console : console, prop1 : 'prop1'}; 28 | Contextify(sandbox); 29 | sandbox.run('console.log(prop1);'); 30 | sandbox.dispose(); // free the resources allocated for the context. 31 | ``` 32 | 33 | ```javascript 34 | var sandbox = Contextify(); // returns an empty contextified object. 35 | sandbox.run('var x = 3;'); 36 | console.log(sandbox.x); // prints 3 37 | sandbox.dispose(); 38 | ``` 39 | 40 | ```javascript 41 | var sandbox = Contextify({setTimeout : setTimeout}); 42 | sandbox.run("setTimeout(function () { x = 3; }, 5);"); 43 | console.log(sandbox.x); // prints undefined 44 | setTimeout(function () { 45 | console.log(sandbox.x); // prints 3 46 | sandbox.dispose(); 47 | }, 10); 48 | ``` 49 | ## Details 50 | 51 | **Contextify([sandbox])** 52 | 53 | sandbox - The object to contextify, which will be modified as described below 54 | If no sandbox is specified, an empty object will be allocated and used instead. 55 | 56 | Returns the contextified object. It doesn't make a copy, so if you already have a reference 57 | to the sandbox, you don't need to catch the return value. 58 | 59 | A Contextified object has 2 methods added to it: 60 | 61 | **run(code, [filename])** 62 | 63 | code - string containing JavaScript to execute 64 | filename - an optional filename for debugging. 65 | 66 | Runs the code in the Contextified object's context. 67 | 68 | **getGlobal()** 69 | 70 | Returns the actual global object for the V8 context. The global object is initialized with interceptors (discussed below) which forward accesses on it to the contextified object. This means the contextified object acts like the global object in most cases. Sometimes, though, you need to make a reference to the actual global object. 71 | 72 | For example: 73 | 74 | ```javascript 75 | var window = Contextify({console : console}); 76 | window.window = window; 77 | window.run("console.log(window === this);"); 78 | // prints false. 79 | ``` 80 | 81 | ```javascript 82 | var window = Contextify({console : console}); 83 | window.window = window.getGlobal(); 84 | window.run("console.log(window === this);"); 85 | // prints true 86 | ``` 87 | 88 | The global object returned by getGlobal() can be treated like the contextified sandbox object, except that defining getters/setters will not work on it. Define getters and setters on the actual sandbox object instead. 89 | 90 | **dispose()** 91 | 92 | Frees the memory allocated for the underlying V8 context. If you don't call this when you're done, the V8 context memory will leak, as will the sandbox memory, since the context's global stores a strong reference to the sandbox object. You can still use your sandbox object after calling dispose(), but it's unsafe to use a global previously returned from getGlobal(). run, getGlobal, and dispose will be removed from the sandbox object. 93 | 94 | ## Install 95 | 96 | npm install contextify 97 | 98 | ## require('vm') vs. Contextify 99 | 100 | Node's vm functions (runInContext etc) work by copying the values from the sandbox object onto a context's global object, executing the passed in script, then copying the results back. This means that scripts that create asynchronous functions (using mechanisms like setTimeout) won't have see the results of executing those functions, since the copying in/out only occurs during an explicit call to runInContext and friends. 101 | 102 | Contextify creates a V8 context, and uses interceptors (see: http://code.google.com/apis/v8/embed.html#interceptors) to forward global object accesses to the sandbox object. This means there is no copying in or out, so asynchronous functions have the expected effect on the sandbox object. 103 | 104 | ## Tests 105 | 106 | Testing is done with nodeunit. Run the tests with 107 | 108 | nodeunit test/ 109 | 110 | Output: 111 | 112 | OK: 92 assertions (27ms) 113 | 114 | 115 | ## Building 116 | 117 | node-gyp rebuild 118 | 119 | ## Acknowledgments 120 | 121 | Inspiration taken from Assaf's Zombie.js context solution: https://github.com/assaf/zombie 122 | -------------------------------------------------------------------------------- /binding.gyp: -------------------------------------------------------------------------------- 1 | { 2 | 'targets': [ 3 | { 4 | 'target_name': 'contextify', 5 | 'include_dirs': ["= 0.11.4 (Benjamin Byholm - @kkoopa) 24 | 0.1.6 25 | * Fix broken build with node >= 0.11.0 (Jamie Kirkpatrick - @jpk) 26 | 0.1.5 27 | * Fix broken builds on 0.9.11 and above (tomgco - #61) 28 | 0.1.4 29 | * Fix segfault on Node >= 0.9.6. (pyokagan) 30 | * Allow pre-compiling scripts. (mroch) 31 | 0.1.3 32 | * Remove PrintException. 33 | 0.1.2 34 | * Renamed bindings.gyp to binding.gyp (Rex Morgan) 35 | * More fixes for OS X build. 36 | 0.1.1 37 | * Add node-gyp build support (Nathan Rajlich) 38 | * Fix build for OS X (stolen from einaros's work on ws :)). 39 | * Better exception reporting (print error message and stack trace). 40 | 0.1.0 41 | * Fix: #13 - Can't use global.eval as function. 42 | * Added [Named|Indexed]SecurityCallbacks to global ObjectTemplate. 43 | * No longer detaching the global proxy. 44 | * Refactored to use node::ObjectWrap. 45 | 0.0.7 46 | * Fix: #11 - Declared global variables treated as undefined 47 | 48 | 0.0.6 49 | * Fix: potential segfault when looking up properties on sandbox. 50 | 51 | 0.0.5 52 | * Better error feedback when the module isn't built on the current node 53 | version. 54 | * All builds now build to the Release directory, regardless of Node 55 | version. 56 | 57 | 0.0.4 58 | * Defend against calling Contextify methods on the global after dispose() 59 | has been called. 60 | * Fix: npm install fails on Node 0.5.x. 61 | 62 | 0.0.3 63 | * Fix: segfault due to premature garbage collection of sandbox. 64 | * Added dispose() method to clean up context. 65 | 66 | 0.0.2 67 | * Fix: memory leak due to creating unnecessary function instances. 68 | 69 | 0.0.1 70 | * Initial release 71 | -------------------------------------------------------------------------------- /lib/contextify.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const binding = require('bindings')('contextify'); 4 | const ContextifyContext = binding.ContextifyContext; 5 | const ContextifyScript = binding.ContextifyScript; 6 | 7 | function Contextify (sandbox) { 8 | if (typeof sandbox != 'object') { 9 | sandbox = {}; 10 | } 11 | let ctx = new ContextifyContext(sandbox); 12 | 13 | sandbox.run = function () { 14 | return ctx.run.apply(ctx, arguments); 15 | }; 16 | 17 | sandbox.getGlobal = function () { 18 | return ctx.getGlobal(); 19 | } 20 | 21 | sandbox.dispose = function () { 22 | sandbox.run = function () { 23 | throw new Error('Called run() after dispose().'); 24 | }; 25 | sandbox.getGlobal = function () { 26 | throw new Error('Called getGlobal() after dispose().'); 27 | }; 28 | sandbox.dispose = function () { 29 | throw new Error('Called dispose() after dispose().'); 30 | }; 31 | ctx = null; 32 | } 33 | return sandbox; 34 | } 35 | 36 | Contextify.createContext = function (sandbox) { 37 | if (typeof sandbox != 'object') { 38 | sandbox = {}; 39 | } 40 | return new ContextifyContext(sandbox); 41 | }; 42 | 43 | Contextify.createScript = function (code, filename) { 44 | if (typeof code != 'string') { 45 | throw new TypeError('Code argument is required'); 46 | } 47 | return new ContextifyScript(code, filename); 48 | }; 49 | 50 | module.exports = Contextify; 51 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "contextify", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ajv": { 8 | "version": "5.5.2", 9 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 10 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 11 | "dev": true, 12 | "requires": { 13 | "co": "^4.6.0", 14 | "fast-deep-equal": "^1.0.0", 15 | "fast-json-stable-stringify": "^2.0.0", 16 | "json-schema-traverse": "^0.3.0" 17 | } 18 | }, 19 | "ansi-regex": { 20 | "version": "2.1.1", 21 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 22 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 23 | "dev": true 24 | }, 25 | "argparse": { 26 | "version": "1.0.10", 27 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 28 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 29 | "dev": true, 30 | "requires": { 31 | "sprintf-js": "~1.0.2" 32 | } 33 | }, 34 | "asn1": { 35 | "version": "0.2.4", 36 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 37 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 38 | "dev": true, 39 | "requires": { 40 | "safer-buffer": "~2.1.0" 41 | } 42 | }, 43 | "assert-plus": { 44 | "version": "1.0.0", 45 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 46 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 47 | "dev": true 48 | }, 49 | "asynckit": { 50 | "version": "0.4.0", 51 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 52 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 53 | "dev": true 54 | }, 55 | "aws-sign2": { 56 | "version": "0.7.0", 57 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 58 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 59 | "dev": true 60 | }, 61 | "aws4": { 62 | "version": "1.8.0", 63 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 64 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", 65 | "dev": true 66 | }, 67 | "balanced-match": { 68 | "version": "1.0.0", 69 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 70 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 71 | "dev": true 72 | }, 73 | "bcrypt-pbkdf": { 74 | "version": "1.0.2", 75 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 76 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 77 | "dev": true, 78 | "requires": { 79 | "tweetnacl": "^0.14.3" 80 | } 81 | }, 82 | "bind-obj-methods": { 83 | "version": "2.0.0", 84 | "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-2.0.0.tgz", 85 | "integrity": "sha512-3/qRXczDi2Cdbz6jE+W3IflJOutRVica8frpBn14de1mBOkzDo+6tY33kNhvkw54Kn3PzRRD2VnGbGPcTAk4sw==", 86 | "dev": true 87 | }, 88 | "bindings": { 89 | "version": "1.3.0", 90 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", 91 | "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==" 92 | }, 93 | "bluebird": { 94 | "version": "3.5.2", 95 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz", 96 | "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==", 97 | "dev": true 98 | }, 99 | "brace-expansion": { 100 | "version": "1.1.11", 101 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 102 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 103 | "dev": true, 104 | "requires": { 105 | "balanced-match": "^1.0.0", 106 | "concat-map": "0.0.1" 107 | } 108 | }, 109 | "buffer-from": { 110 | "version": "1.1.1", 111 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 112 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 113 | "dev": true 114 | }, 115 | "caseless": { 116 | "version": "0.12.0", 117 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 118 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 119 | "dev": true 120 | }, 121 | "clean-yaml-object": { 122 | "version": "0.1.0", 123 | "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", 124 | "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", 125 | "dev": true 126 | }, 127 | "co": { 128 | "version": "4.6.0", 129 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 130 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 131 | "dev": true 132 | }, 133 | "color-support": { 134 | "version": "1.1.3", 135 | "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", 136 | "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", 137 | "dev": true 138 | }, 139 | "combined-stream": { 140 | "version": "1.0.7", 141 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", 142 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", 143 | "dev": true, 144 | "requires": { 145 | "delayed-stream": "~1.0.0" 146 | } 147 | }, 148 | "concat-map": { 149 | "version": "0.0.1", 150 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 151 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 152 | "dev": true 153 | }, 154 | "core-util-is": { 155 | "version": "1.0.2", 156 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 157 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 158 | "dev": true 159 | }, 160 | "coveralls": { 161 | "version": "3.0.2", 162 | "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.2.tgz", 163 | "integrity": "sha512-Tv0LKe/MkBOilH2v7WBiTBdudg2ChfGbdXafc/s330djpF3zKOmuehTeRwjXWc7pzfj9FrDUTA7tEx6Div8NFw==", 164 | "dev": true, 165 | "requires": { 166 | "growl": "~> 1.10.0", 167 | "js-yaml": "^3.11.0", 168 | "lcov-parse": "^0.0.10", 169 | "log-driver": "^1.2.7", 170 | "minimist": "^1.2.0", 171 | "request": "^2.85.0" 172 | } 173 | }, 174 | "cross-spawn": { 175 | "version": "4.0.2", 176 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", 177 | "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", 178 | "dev": true, 179 | "requires": { 180 | "lru-cache": "^4.0.1", 181 | "which": "^1.2.9" 182 | } 183 | }, 184 | "dashdash": { 185 | "version": "1.14.1", 186 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 187 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 188 | "dev": true, 189 | "requires": { 190 | "assert-plus": "^1.0.0" 191 | } 192 | }, 193 | "debug": { 194 | "version": "2.6.9", 195 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 196 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 197 | "dev": true, 198 | "requires": { 199 | "ms": "2.0.0" 200 | } 201 | }, 202 | "delayed-stream": { 203 | "version": "1.0.0", 204 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 205 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 206 | "dev": true 207 | }, 208 | "diff": { 209 | "version": "1.4.0", 210 | "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", 211 | "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", 212 | "dev": true 213 | }, 214 | "ecc-jsbn": { 215 | "version": "0.1.2", 216 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 217 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 218 | "dev": true, 219 | "requires": { 220 | "jsbn": "~0.1.0", 221 | "safer-buffer": "^2.1.0" 222 | } 223 | }, 224 | "ejs": { 225 | "version": "2.6.1", 226 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", 227 | "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", 228 | "dev": true 229 | }, 230 | "escape-string-regexp": { 231 | "version": "1.0.5", 232 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 233 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 234 | "dev": true 235 | }, 236 | "esprima": { 237 | "version": "4.0.1", 238 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 239 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 240 | "dev": true 241 | }, 242 | "events-to-array": { 243 | "version": "1.1.2", 244 | "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", 245 | "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", 246 | "dev": true 247 | }, 248 | "extend": { 249 | "version": "3.0.2", 250 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 251 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 252 | "dev": true 253 | }, 254 | "extsprintf": { 255 | "version": "1.3.0", 256 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 257 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 258 | "dev": true 259 | }, 260 | "fast-deep-equal": { 261 | "version": "1.1.0", 262 | "resolved": "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 263 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", 264 | "dev": true 265 | }, 266 | "fast-json-stable-stringify": { 267 | "version": "2.0.0", 268 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 269 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 270 | "dev": true 271 | }, 272 | "foreground-child": { 273 | "version": "1.5.6", 274 | "resolved": "http://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", 275 | "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", 276 | "dev": true, 277 | "requires": { 278 | "cross-spawn": "^4", 279 | "signal-exit": "^3.0.0" 280 | } 281 | }, 282 | "forever-agent": { 283 | "version": "0.6.1", 284 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 285 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 286 | "dev": true 287 | }, 288 | "form-data": { 289 | "version": "2.3.3", 290 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 291 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 292 | "dev": true, 293 | "requires": { 294 | "asynckit": "^0.4.0", 295 | "combined-stream": "^1.0.6", 296 | "mime-types": "^2.1.12" 297 | } 298 | }, 299 | "fs-exists-cached": { 300 | "version": "1.0.0", 301 | "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", 302 | "integrity": "sha1-zyVVTKBQ3EmuZla0HeQiWJidy84=", 303 | "dev": true 304 | }, 305 | "fs.realpath": { 306 | "version": "1.0.0", 307 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 308 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 309 | "dev": true 310 | }, 311 | "function-loop": { 312 | "version": "1.0.1", 313 | "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-1.0.1.tgz", 314 | "integrity": "sha1-gHa7MF6OajzO7ikgdl8zDRkPNAw=", 315 | "dev": true 316 | }, 317 | "getpass": { 318 | "version": "0.1.7", 319 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 320 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 321 | "dev": true, 322 | "requires": { 323 | "assert-plus": "^1.0.0" 324 | } 325 | }, 326 | "glob": { 327 | "version": "7.1.3", 328 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 329 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 330 | "dev": true, 331 | "requires": { 332 | "fs.realpath": "^1.0.0", 333 | "inflight": "^1.0.4", 334 | "inherits": "2", 335 | "minimatch": "^3.0.4", 336 | "once": "^1.3.0", 337 | "path-is-absolute": "^1.0.0" 338 | } 339 | }, 340 | "graceful-fs": { 341 | "version": "4.1.11", 342 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 343 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 344 | "dev": true 345 | }, 346 | "growl": { 347 | "version": "1.10.5", 348 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 349 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 350 | "dev": true 351 | }, 352 | "har-schema": { 353 | "version": "2.0.0", 354 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 355 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 356 | "dev": true 357 | }, 358 | "har-validator": { 359 | "version": "5.1.0", 360 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", 361 | "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", 362 | "dev": true, 363 | "requires": { 364 | "ajv": "^5.3.0", 365 | "har-schema": "^2.0.0" 366 | } 367 | }, 368 | "http-signature": { 369 | "version": "1.2.0", 370 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 371 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 372 | "dev": true, 373 | "requires": { 374 | "assert-plus": "^1.0.0", 375 | "jsprim": "^1.2.2", 376 | "sshpk": "^1.7.0" 377 | } 378 | }, 379 | "imurmurhash": { 380 | "version": "0.1.4", 381 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 382 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 383 | "dev": true 384 | }, 385 | "inflight": { 386 | "version": "1.0.6", 387 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 388 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 389 | "dev": true, 390 | "requires": { 391 | "once": "^1.3.0", 392 | "wrappy": "1" 393 | } 394 | }, 395 | "inherits": { 396 | "version": "2.0.3", 397 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 398 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 399 | "dev": true 400 | }, 401 | "is-typedarray": { 402 | "version": "1.0.0", 403 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 404 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 405 | "dev": true 406 | }, 407 | "isarray": { 408 | "version": "1.0.0", 409 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 410 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 411 | "dev": true, 412 | "optional": true 413 | }, 414 | "isexe": { 415 | "version": "2.0.0", 416 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 417 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 418 | "dev": true 419 | }, 420 | "isstream": { 421 | "version": "0.1.2", 422 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 423 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 424 | "dev": true 425 | }, 426 | "js-yaml": { 427 | "version": "3.12.0", 428 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", 429 | "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", 430 | "dev": true, 431 | "requires": { 432 | "argparse": "^1.0.7", 433 | "esprima": "^4.0.0" 434 | } 435 | }, 436 | "jsbn": { 437 | "version": "0.1.1", 438 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 439 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 440 | "dev": true 441 | }, 442 | "json-schema": { 443 | "version": "0.2.3", 444 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 445 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 446 | "dev": true 447 | }, 448 | "json-schema-traverse": { 449 | "version": "0.3.1", 450 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 451 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", 452 | "dev": true 453 | }, 454 | "json-stringify-safe": { 455 | "version": "5.0.1", 456 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 457 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 458 | "dev": true 459 | }, 460 | "jsprim": { 461 | "version": "1.4.1", 462 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 463 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 464 | "dev": true, 465 | "requires": { 466 | "assert-plus": "1.0.0", 467 | "extsprintf": "1.3.0", 468 | "json-schema": "0.2.3", 469 | "verror": "1.10.0" 470 | } 471 | }, 472 | "lcov-parse": { 473 | "version": "0.0.10", 474 | "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", 475 | "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", 476 | "dev": true 477 | }, 478 | "log-driver": { 479 | "version": "1.2.7", 480 | "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", 481 | "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", 482 | "dev": true 483 | }, 484 | "lru-cache": { 485 | "version": "4.1.3", 486 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", 487 | "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", 488 | "dev": true, 489 | "requires": { 490 | "pseudomap": "^1.0.2", 491 | "yallist": "^2.1.2" 492 | } 493 | }, 494 | "mime-db": { 495 | "version": "1.37.0", 496 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 497 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", 498 | "dev": true 499 | }, 500 | "mime-types": { 501 | "version": "2.1.21", 502 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 503 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 504 | "dev": true, 505 | "requires": { 506 | "mime-db": "~1.37.0" 507 | } 508 | }, 509 | "minimatch": { 510 | "version": "3.0.4", 511 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 512 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 513 | "dev": true, 514 | "requires": { 515 | "brace-expansion": "^1.1.7" 516 | } 517 | }, 518 | "minimist": { 519 | "version": "1.2.0", 520 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 521 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 522 | "dev": true 523 | }, 524 | "minipass": { 525 | "version": "2.3.5", 526 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", 527 | "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", 528 | "dev": true, 529 | "requires": { 530 | "safe-buffer": "^5.1.2", 531 | "yallist": "^3.0.0" 532 | }, 533 | "dependencies": { 534 | "yallist": { 535 | "version": "3.0.2", 536 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", 537 | "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", 538 | "dev": true 539 | } 540 | } 541 | }, 542 | "mkdirp": { 543 | "version": "0.5.1", 544 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 545 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 546 | "dev": true, 547 | "requires": { 548 | "minimist": "0.0.8" 549 | }, 550 | "dependencies": { 551 | "minimist": { 552 | "version": "0.0.8", 553 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 554 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 555 | "dev": true 556 | } 557 | } 558 | }, 559 | "ms": { 560 | "version": "2.0.0", 561 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 562 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 563 | "dev": true 564 | }, 565 | "nan": { 566 | "version": "2.11.1", 567 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", 568 | "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==" 569 | }, 570 | "nodeunit": { 571 | "version": "0.11.3", 572 | "resolved": "https://registry.npmjs.org/nodeunit/-/nodeunit-0.11.3.tgz", 573 | "integrity": "sha512-gDNxrDWpx07BxYNO/jn1UrGI1vNhDQZrIFphbHMcTCDc5mrrqQBWfQMXPHJ5WSgbFwD1D6bv4HOsqtTrPG03AA==", 574 | "dev": true, 575 | "requires": { 576 | "ejs": "^2.5.2", 577 | "tap": "^12.0.1" 578 | } 579 | }, 580 | "nyc": { 581 | "version": "11.9.0", 582 | "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.9.0.tgz", 583 | "integrity": "sha512-w8OdJAhXL5izerzZMdqzYKMj/pgHJyY3qEPYBjLLxrhcVoHEY9pU5ENIiZyCgG9OR7x3VcUMoD40o6PtVpfR4g==", 584 | "dev": true, 585 | "requires": { 586 | "archy": "^1.0.0", 587 | "arrify": "^1.0.1", 588 | "caching-transform": "^1.0.0", 589 | "convert-source-map": "^1.5.1", 590 | "debug-log": "^1.0.1", 591 | "default-require-extensions": "^1.0.0", 592 | "find-cache-dir": "^0.1.1", 593 | "find-up": "^2.1.0", 594 | "foreground-child": "^1.5.3", 595 | "glob": "^7.0.6", 596 | "istanbul-lib-coverage": "^1.1.2", 597 | "istanbul-lib-hook": "^1.1.0", 598 | "istanbul-lib-instrument": "^1.10.0", 599 | "istanbul-lib-report": "^1.1.3", 600 | "istanbul-lib-source-maps": "^1.2.3", 601 | "istanbul-reports": "^1.4.0", 602 | "md5-hex": "^1.2.0", 603 | "merge-source-map": "^1.1.0", 604 | "micromatch": "^3.1.10", 605 | "mkdirp": "^0.5.0", 606 | "resolve-from": "^2.0.0", 607 | "rimraf": "^2.6.2", 608 | "signal-exit": "^3.0.1", 609 | "spawn-wrap": "^1.4.2", 610 | "test-exclude": "^4.2.0", 611 | "yargs": "11.1.0", 612 | "yargs-parser": "^8.0.0" 613 | }, 614 | "dependencies": { 615 | "align-text": { 616 | "version": "0.1.4", 617 | "bundled": true, 618 | "dev": true, 619 | "requires": { 620 | "kind-of": "^3.0.2", 621 | "longest": "^1.0.1", 622 | "repeat-string": "^1.5.2" 623 | } 624 | }, 625 | "amdefine": { 626 | "version": "1.0.1", 627 | "bundled": true, 628 | "dev": true 629 | }, 630 | "ansi-regex": { 631 | "version": "2.1.1", 632 | "bundled": true, 633 | "dev": true 634 | }, 635 | "ansi-styles": { 636 | "version": "2.2.1", 637 | "bundled": true, 638 | "dev": true 639 | }, 640 | "append-transform": { 641 | "version": "0.4.0", 642 | "bundled": true, 643 | "dev": true, 644 | "requires": { 645 | "default-require-extensions": "^1.0.0" 646 | } 647 | }, 648 | "archy": { 649 | "version": "1.0.0", 650 | "bundled": true, 651 | "dev": true 652 | }, 653 | "arr-diff": { 654 | "version": "4.0.0", 655 | "bundled": true, 656 | "dev": true 657 | }, 658 | "arr-flatten": { 659 | "version": "1.1.0", 660 | "bundled": true, 661 | "dev": true 662 | }, 663 | "arr-union": { 664 | "version": "3.1.0", 665 | "bundled": true, 666 | "dev": true 667 | }, 668 | "array-unique": { 669 | "version": "0.3.2", 670 | "bundled": true, 671 | "dev": true 672 | }, 673 | "arrify": { 674 | "version": "1.0.1", 675 | "bundled": true, 676 | "dev": true 677 | }, 678 | "assign-symbols": { 679 | "version": "1.0.0", 680 | "bundled": true, 681 | "dev": true 682 | }, 683 | "async": { 684 | "version": "1.5.2", 685 | "bundled": true, 686 | "dev": true 687 | }, 688 | "atob": { 689 | "version": "2.1.1", 690 | "bundled": true, 691 | "dev": true 692 | }, 693 | "babel-code-frame": { 694 | "version": "6.26.0", 695 | "bundled": true, 696 | "dev": true, 697 | "requires": { 698 | "chalk": "^1.1.3", 699 | "esutils": "^2.0.2", 700 | "js-tokens": "^3.0.2" 701 | } 702 | }, 703 | "babel-generator": { 704 | "version": "6.26.1", 705 | "bundled": true, 706 | "dev": true, 707 | "requires": { 708 | "babel-messages": "^6.23.0", 709 | "babel-runtime": "^6.26.0", 710 | "babel-types": "^6.26.0", 711 | "detect-indent": "^4.0.0", 712 | "jsesc": "^1.3.0", 713 | "lodash": "^4.17.4", 714 | "source-map": "^0.5.7", 715 | "trim-right": "^1.0.1" 716 | } 717 | }, 718 | "babel-messages": { 719 | "version": "6.23.0", 720 | "bundled": true, 721 | "dev": true, 722 | "requires": { 723 | "babel-runtime": "^6.22.0" 724 | } 725 | }, 726 | "babel-runtime": { 727 | "version": "6.26.0", 728 | "bundled": true, 729 | "dev": true, 730 | "requires": { 731 | "core-js": "^2.4.0", 732 | "regenerator-runtime": "^0.11.0" 733 | } 734 | }, 735 | "babel-template": { 736 | "version": "6.26.0", 737 | "bundled": true, 738 | "dev": true, 739 | "requires": { 740 | "babel-runtime": "^6.26.0", 741 | "babel-traverse": "^6.26.0", 742 | "babel-types": "^6.26.0", 743 | "babylon": "^6.18.0", 744 | "lodash": "^4.17.4" 745 | } 746 | }, 747 | "babel-traverse": { 748 | "version": "6.26.0", 749 | "bundled": true, 750 | "dev": true, 751 | "requires": { 752 | "babel-code-frame": "^6.26.0", 753 | "babel-messages": "^6.23.0", 754 | "babel-runtime": "^6.26.0", 755 | "babel-types": "^6.26.0", 756 | "babylon": "^6.18.0", 757 | "debug": "^2.6.8", 758 | "globals": "^9.18.0", 759 | "invariant": "^2.2.2", 760 | "lodash": "^4.17.4" 761 | } 762 | }, 763 | "babel-types": { 764 | "version": "6.26.0", 765 | "bundled": true, 766 | "dev": true, 767 | "requires": { 768 | "babel-runtime": "^6.26.0", 769 | "esutils": "^2.0.2", 770 | "lodash": "^4.17.4", 771 | "to-fast-properties": "^1.0.3" 772 | } 773 | }, 774 | "babylon": { 775 | "version": "6.18.0", 776 | "bundled": true, 777 | "dev": true 778 | }, 779 | "balanced-match": { 780 | "version": "1.0.0", 781 | "bundled": true, 782 | "dev": true 783 | }, 784 | "base": { 785 | "version": "0.11.2", 786 | "bundled": true, 787 | "dev": true, 788 | "requires": { 789 | "cache-base": "^1.0.1", 790 | "class-utils": "^0.3.5", 791 | "component-emitter": "^1.2.1", 792 | "define-property": "^1.0.0", 793 | "isobject": "^3.0.1", 794 | "mixin-deep": "^1.2.0", 795 | "pascalcase": "^0.1.1" 796 | }, 797 | "dependencies": { 798 | "define-property": { 799 | "version": "1.0.0", 800 | "bundled": true, 801 | "dev": true, 802 | "requires": { 803 | "is-descriptor": "^1.0.0" 804 | } 805 | }, 806 | "is-accessor-descriptor": { 807 | "version": "1.0.0", 808 | "bundled": true, 809 | "dev": true, 810 | "requires": { 811 | "kind-of": "^6.0.0" 812 | } 813 | }, 814 | "is-data-descriptor": { 815 | "version": "1.0.0", 816 | "bundled": true, 817 | "dev": true, 818 | "requires": { 819 | "kind-of": "^6.0.0" 820 | } 821 | }, 822 | "is-descriptor": { 823 | "version": "1.0.2", 824 | "bundled": true, 825 | "dev": true, 826 | "requires": { 827 | "is-accessor-descriptor": "^1.0.0", 828 | "is-data-descriptor": "^1.0.0", 829 | "kind-of": "^6.0.2" 830 | } 831 | }, 832 | "isobject": { 833 | "version": "3.0.1", 834 | "bundled": true, 835 | "dev": true 836 | }, 837 | "kind-of": { 838 | "version": "6.0.2", 839 | "bundled": true, 840 | "dev": true 841 | } 842 | } 843 | }, 844 | "brace-expansion": { 845 | "version": "1.1.11", 846 | "bundled": true, 847 | "dev": true, 848 | "requires": { 849 | "balanced-match": "^1.0.0", 850 | "concat-map": "0.0.1" 851 | } 852 | }, 853 | "braces": { 854 | "version": "2.3.2", 855 | "bundled": true, 856 | "dev": true, 857 | "requires": { 858 | "arr-flatten": "^1.1.0", 859 | "array-unique": "^0.3.2", 860 | "extend-shallow": "^2.0.1", 861 | "fill-range": "^4.0.0", 862 | "isobject": "^3.0.1", 863 | "repeat-element": "^1.1.2", 864 | "snapdragon": "^0.8.1", 865 | "snapdragon-node": "^2.0.1", 866 | "split-string": "^3.0.2", 867 | "to-regex": "^3.0.1" 868 | }, 869 | "dependencies": { 870 | "extend-shallow": { 871 | "version": "2.0.1", 872 | "bundled": true, 873 | "dev": true, 874 | "requires": { 875 | "is-extendable": "^0.1.0" 876 | } 877 | } 878 | } 879 | }, 880 | "builtin-modules": { 881 | "version": "1.1.1", 882 | "bundled": true, 883 | "dev": true 884 | }, 885 | "cache-base": { 886 | "version": "1.0.1", 887 | "bundled": true, 888 | "dev": true, 889 | "requires": { 890 | "collection-visit": "^1.0.0", 891 | "component-emitter": "^1.2.1", 892 | "get-value": "^2.0.6", 893 | "has-value": "^1.0.0", 894 | "isobject": "^3.0.1", 895 | "set-value": "^2.0.0", 896 | "to-object-path": "^0.3.0", 897 | "union-value": "^1.0.0", 898 | "unset-value": "^1.0.0" 899 | }, 900 | "dependencies": { 901 | "isobject": { 902 | "version": "3.0.1", 903 | "bundled": true, 904 | "dev": true 905 | } 906 | } 907 | }, 908 | "caching-transform": { 909 | "version": "1.0.1", 910 | "bundled": true, 911 | "dev": true, 912 | "requires": { 913 | "md5-hex": "^1.2.0", 914 | "mkdirp": "^0.5.1", 915 | "write-file-atomic": "^1.1.4" 916 | } 917 | }, 918 | "camelcase": { 919 | "version": "1.2.1", 920 | "bundled": true, 921 | "dev": true, 922 | "optional": true 923 | }, 924 | "center-align": { 925 | "version": "0.1.3", 926 | "bundled": true, 927 | "dev": true, 928 | "optional": true, 929 | "requires": { 930 | "align-text": "^0.1.3", 931 | "lazy-cache": "^1.0.3" 932 | } 933 | }, 934 | "chalk": { 935 | "version": "1.1.3", 936 | "bundled": true, 937 | "dev": true, 938 | "requires": { 939 | "ansi-styles": "^2.2.1", 940 | "escape-string-regexp": "^1.0.2", 941 | "has-ansi": "^2.0.0", 942 | "strip-ansi": "^3.0.0", 943 | "supports-color": "^2.0.0" 944 | } 945 | }, 946 | "class-utils": { 947 | "version": "0.3.6", 948 | "bundled": true, 949 | "dev": true, 950 | "requires": { 951 | "arr-union": "^3.1.0", 952 | "define-property": "^0.2.5", 953 | "isobject": "^3.0.0", 954 | "static-extend": "^0.1.1" 955 | }, 956 | "dependencies": { 957 | "define-property": { 958 | "version": "0.2.5", 959 | "bundled": true, 960 | "dev": true, 961 | "requires": { 962 | "is-descriptor": "^0.1.0" 963 | } 964 | }, 965 | "isobject": { 966 | "version": "3.0.1", 967 | "bundled": true, 968 | "dev": true 969 | } 970 | } 971 | }, 972 | "cliui": { 973 | "version": "2.1.0", 974 | "bundled": true, 975 | "dev": true, 976 | "optional": true, 977 | "requires": { 978 | "center-align": "^0.1.1", 979 | "right-align": "^0.1.1", 980 | "wordwrap": "0.0.2" 981 | }, 982 | "dependencies": { 983 | "wordwrap": { 984 | "version": "0.0.2", 985 | "bundled": true, 986 | "dev": true, 987 | "optional": true 988 | } 989 | } 990 | }, 991 | "code-point-at": { 992 | "version": "1.1.0", 993 | "bundled": true, 994 | "dev": true 995 | }, 996 | "collection-visit": { 997 | "version": "1.0.0", 998 | "bundled": true, 999 | "dev": true, 1000 | "requires": { 1001 | "map-visit": "^1.0.0", 1002 | "object-visit": "^1.0.0" 1003 | } 1004 | }, 1005 | "commondir": { 1006 | "version": "1.0.1", 1007 | "bundled": true, 1008 | "dev": true 1009 | }, 1010 | "component-emitter": { 1011 | "version": "1.2.1", 1012 | "bundled": true, 1013 | "dev": true 1014 | }, 1015 | "concat-map": { 1016 | "version": "0.0.1", 1017 | "bundled": true, 1018 | "dev": true 1019 | }, 1020 | "convert-source-map": { 1021 | "version": "1.5.1", 1022 | "bundled": true, 1023 | "dev": true 1024 | }, 1025 | "copy-descriptor": { 1026 | "version": "0.1.1", 1027 | "bundled": true, 1028 | "dev": true 1029 | }, 1030 | "core-js": { 1031 | "version": "2.5.6", 1032 | "bundled": true, 1033 | "dev": true 1034 | }, 1035 | "cross-spawn": { 1036 | "version": "4.0.2", 1037 | "bundled": true, 1038 | "dev": true, 1039 | "requires": { 1040 | "lru-cache": "^4.0.1", 1041 | "which": "^1.2.9" 1042 | } 1043 | }, 1044 | "debug": { 1045 | "version": "2.6.9", 1046 | "bundled": true, 1047 | "dev": true, 1048 | "requires": { 1049 | "ms": "2.0.0" 1050 | } 1051 | }, 1052 | "debug-log": { 1053 | "version": "1.0.1", 1054 | "bundled": true, 1055 | "dev": true 1056 | }, 1057 | "decamelize": { 1058 | "version": "1.2.0", 1059 | "bundled": true, 1060 | "dev": true 1061 | }, 1062 | "decode-uri-component": { 1063 | "version": "0.2.0", 1064 | "bundled": true, 1065 | "dev": true 1066 | }, 1067 | "default-require-extensions": { 1068 | "version": "1.0.0", 1069 | "bundled": true, 1070 | "dev": true, 1071 | "requires": { 1072 | "strip-bom": "^2.0.0" 1073 | } 1074 | }, 1075 | "define-property": { 1076 | "version": "2.0.2", 1077 | "bundled": true, 1078 | "dev": true, 1079 | "requires": { 1080 | "is-descriptor": "^1.0.2", 1081 | "isobject": "^3.0.1" 1082 | }, 1083 | "dependencies": { 1084 | "is-accessor-descriptor": { 1085 | "version": "1.0.0", 1086 | "bundled": true, 1087 | "dev": true, 1088 | "requires": { 1089 | "kind-of": "^6.0.0" 1090 | } 1091 | }, 1092 | "is-data-descriptor": { 1093 | "version": "1.0.0", 1094 | "bundled": true, 1095 | "dev": true, 1096 | "requires": { 1097 | "kind-of": "^6.0.0" 1098 | } 1099 | }, 1100 | "is-descriptor": { 1101 | "version": "1.0.2", 1102 | "bundled": true, 1103 | "dev": true, 1104 | "requires": { 1105 | "is-accessor-descriptor": "^1.0.0", 1106 | "is-data-descriptor": "^1.0.0", 1107 | "kind-of": "^6.0.2" 1108 | } 1109 | }, 1110 | "isobject": { 1111 | "version": "3.0.1", 1112 | "bundled": true, 1113 | "dev": true 1114 | }, 1115 | "kind-of": { 1116 | "version": "6.0.2", 1117 | "bundled": true, 1118 | "dev": true 1119 | } 1120 | } 1121 | }, 1122 | "detect-indent": { 1123 | "version": "4.0.0", 1124 | "bundled": true, 1125 | "dev": true, 1126 | "requires": { 1127 | "repeating": "^2.0.0" 1128 | } 1129 | }, 1130 | "error-ex": { 1131 | "version": "1.3.1", 1132 | "bundled": true, 1133 | "dev": true, 1134 | "requires": { 1135 | "is-arrayish": "^0.2.1" 1136 | } 1137 | }, 1138 | "escape-string-regexp": { 1139 | "version": "1.0.5", 1140 | "bundled": true, 1141 | "dev": true 1142 | }, 1143 | "esutils": { 1144 | "version": "2.0.2", 1145 | "bundled": true, 1146 | "dev": true 1147 | }, 1148 | "execa": { 1149 | "version": "0.7.0", 1150 | "bundled": true, 1151 | "dev": true, 1152 | "requires": { 1153 | "cross-spawn": "^5.0.1", 1154 | "get-stream": "^3.0.0", 1155 | "is-stream": "^1.1.0", 1156 | "npm-run-path": "^2.0.0", 1157 | "p-finally": "^1.0.0", 1158 | "signal-exit": "^3.0.0", 1159 | "strip-eof": "^1.0.0" 1160 | }, 1161 | "dependencies": { 1162 | "cross-spawn": { 1163 | "version": "5.1.0", 1164 | "bundled": true, 1165 | "dev": true, 1166 | "requires": { 1167 | "lru-cache": "^4.0.1", 1168 | "shebang-command": "^1.2.0", 1169 | "which": "^1.2.9" 1170 | } 1171 | } 1172 | } 1173 | }, 1174 | "expand-brackets": { 1175 | "version": "2.1.4", 1176 | "bundled": true, 1177 | "dev": true, 1178 | "requires": { 1179 | "debug": "^2.3.3", 1180 | "define-property": "^0.2.5", 1181 | "extend-shallow": "^2.0.1", 1182 | "posix-character-classes": "^0.1.0", 1183 | "regex-not": "^1.0.0", 1184 | "snapdragon": "^0.8.1", 1185 | "to-regex": "^3.0.1" 1186 | }, 1187 | "dependencies": { 1188 | "define-property": { 1189 | "version": "0.2.5", 1190 | "bundled": true, 1191 | "dev": true, 1192 | "requires": { 1193 | "is-descriptor": "^0.1.0" 1194 | } 1195 | }, 1196 | "extend-shallow": { 1197 | "version": "2.0.1", 1198 | "bundled": true, 1199 | "dev": true, 1200 | "requires": { 1201 | "is-extendable": "^0.1.0" 1202 | } 1203 | } 1204 | } 1205 | }, 1206 | "extend-shallow": { 1207 | "version": "3.0.2", 1208 | "bundled": true, 1209 | "dev": true, 1210 | "requires": { 1211 | "assign-symbols": "^1.0.0", 1212 | "is-extendable": "^1.0.1" 1213 | }, 1214 | "dependencies": { 1215 | "is-extendable": { 1216 | "version": "1.0.1", 1217 | "bundled": true, 1218 | "dev": true, 1219 | "requires": { 1220 | "is-plain-object": "^2.0.4" 1221 | } 1222 | } 1223 | } 1224 | }, 1225 | "extglob": { 1226 | "version": "2.0.4", 1227 | "bundled": true, 1228 | "dev": true, 1229 | "requires": { 1230 | "array-unique": "^0.3.2", 1231 | "define-property": "^1.0.0", 1232 | "expand-brackets": "^2.1.4", 1233 | "extend-shallow": "^2.0.1", 1234 | "fragment-cache": "^0.2.1", 1235 | "regex-not": "^1.0.0", 1236 | "snapdragon": "^0.8.1", 1237 | "to-regex": "^3.0.1" 1238 | }, 1239 | "dependencies": { 1240 | "define-property": { 1241 | "version": "1.0.0", 1242 | "bundled": true, 1243 | "dev": true, 1244 | "requires": { 1245 | "is-descriptor": "^1.0.0" 1246 | } 1247 | }, 1248 | "extend-shallow": { 1249 | "version": "2.0.1", 1250 | "bundled": true, 1251 | "dev": true, 1252 | "requires": { 1253 | "is-extendable": "^0.1.0" 1254 | } 1255 | }, 1256 | "is-accessor-descriptor": { 1257 | "version": "1.0.0", 1258 | "bundled": true, 1259 | "dev": true, 1260 | "requires": { 1261 | "kind-of": "^6.0.0" 1262 | } 1263 | }, 1264 | "is-data-descriptor": { 1265 | "version": "1.0.0", 1266 | "bundled": true, 1267 | "dev": true, 1268 | "requires": { 1269 | "kind-of": "^6.0.0" 1270 | } 1271 | }, 1272 | "is-descriptor": { 1273 | "version": "1.0.2", 1274 | "bundled": true, 1275 | "dev": true, 1276 | "requires": { 1277 | "is-accessor-descriptor": "^1.0.0", 1278 | "is-data-descriptor": "^1.0.0", 1279 | "kind-of": "^6.0.2" 1280 | } 1281 | }, 1282 | "kind-of": { 1283 | "version": "6.0.2", 1284 | "bundled": true, 1285 | "dev": true 1286 | } 1287 | } 1288 | }, 1289 | "fill-range": { 1290 | "version": "4.0.0", 1291 | "bundled": true, 1292 | "dev": true, 1293 | "requires": { 1294 | "extend-shallow": "^2.0.1", 1295 | "is-number": "^3.0.0", 1296 | "repeat-string": "^1.6.1", 1297 | "to-regex-range": "^2.1.0" 1298 | }, 1299 | "dependencies": { 1300 | "extend-shallow": { 1301 | "version": "2.0.1", 1302 | "bundled": true, 1303 | "dev": true, 1304 | "requires": { 1305 | "is-extendable": "^0.1.0" 1306 | } 1307 | } 1308 | } 1309 | }, 1310 | "find-cache-dir": { 1311 | "version": "0.1.1", 1312 | "bundled": true, 1313 | "dev": true, 1314 | "requires": { 1315 | "commondir": "^1.0.1", 1316 | "mkdirp": "^0.5.1", 1317 | "pkg-dir": "^1.0.0" 1318 | } 1319 | }, 1320 | "find-up": { 1321 | "version": "2.1.0", 1322 | "bundled": true, 1323 | "dev": true, 1324 | "requires": { 1325 | "locate-path": "^2.0.0" 1326 | } 1327 | }, 1328 | "for-in": { 1329 | "version": "1.0.2", 1330 | "bundled": true, 1331 | "dev": true 1332 | }, 1333 | "foreground-child": { 1334 | "version": "1.5.6", 1335 | "bundled": true, 1336 | "dev": true, 1337 | "requires": { 1338 | "cross-spawn": "^4", 1339 | "signal-exit": "^3.0.0" 1340 | } 1341 | }, 1342 | "fragment-cache": { 1343 | "version": "0.2.1", 1344 | "bundled": true, 1345 | "dev": true, 1346 | "requires": { 1347 | "map-cache": "^0.2.2" 1348 | } 1349 | }, 1350 | "fs.realpath": { 1351 | "version": "1.0.0", 1352 | "bundled": true, 1353 | "dev": true 1354 | }, 1355 | "get-caller-file": { 1356 | "version": "1.0.2", 1357 | "bundled": true, 1358 | "dev": true 1359 | }, 1360 | "get-stream": { 1361 | "version": "3.0.0", 1362 | "bundled": true, 1363 | "dev": true 1364 | }, 1365 | "get-value": { 1366 | "version": "2.0.6", 1367 | "bundled": true, 1368 | "dev": true 1369 | }, 1370 | "glob": { 1371 | "version": "7.1.2", 1372 | "bundled": true, 1373 | "dev": true, 1374 | "requires": { 1375 | "fs.realpath": "^1.0.0", 1376 | "inflight": "^1.0.4", 1377 | "inherits": "2", 1378 | "minimatch": "^3.0.4", 1379 | "once": "^1.3.0", 1380 | "path-is-absolute": "^1.0.0" 1381 | } 1382 | }, 1383 | "globals": { 1384 | "version": "9.18.0", 1385 | "bundled": true, 1386 | "dev": true 1387 | }, 1388 | "graceful-fs": { 1389 | "version": "4.1.11", 1390 | "bundled": true, 1391 | "dev": true 1392 | }, 1393 | "handlebars": { 1394 | "version": "4.0.11", 1395 | "bundled": true, 1396 | "dev": true, 1397 | "requires": { 1398 | "async": "^1.4.0", 1399 | "optimist": "^0.6.1", 1400 | "source-map": "^0.4.4", 1401 | "uglify-js": "^2.6" 1402 | }, 1403 | "dependencies": { 1404 | "source-map": { 1405 | "version": "0.4.4", 1406 | "bundled": true, 1407 | "dev": true, 1408 | "requires": { 1409 | "amdefine": ">=0.0.4" 1410 | } 1411 | } 1412 | } 1413 | }, 1414 | "has-ansi": { 1415 | "version": "2.0.0", 1416 | "bundled": true, 1417 | "dev": true, 1418 | "requires": { 1419 | "ansi-regex": "^2.0.0" 1420 | } 1421 | }, 1422 | "has-flag": { 1423 | "version": "1.0.0", 1424 | "bundled": true, 1425 | "dev": true 1426 | }, 1427 | "has-value": { 1428 | "version": "1.0.0", 1429 | "bundled": true, 1430 | "dev": true, 1431 | "requires": { 1432 | "get-value": "^2.0.6", 1433 | "has-values": "^1.0.0", 1434 | "isobject": "^3.0.0" 1435 | }, 1436 | "dependencies": { 1437 | "isobject": { 1438 | "version": "3.0.1", 1439 | "bundled": true, 1440 | "dev": true 1441 | } 1442 | } 1443 | }, 1444 | "has-values": { 1445 | "version": "1.0.0", 1446 | "bundled": true, 1447 | "dev": true, 1448 | "requires": { 1449 | "is-number": "^3.0.0", 1450 | "kind-of": "^4.0.0" 1451 | }, 1452 | "dependencies": { 1453 | "is-number": { 1454 | "version": "3.0.0", 1455 | "bundled": true, 1456 | "dev": true, 1457 | "requires": { 1458 | "kind-of": "^3.0.2" 1459 | }, 1460 | "dependencies": { 1461 | "kind-of": { 1462 | "version": "3.2.2", 1463 | "bundled": true, 1464 | "dev": true, 1465 | "requires": { 1466 | "is-buffer": "^1.1.5" 1467 | } 1468 | } 1469 | } 1470 | }, 1471 | "kind-of": { 1472 | "version": "4.0.0", 1473 | "bundled": true, 1474 | "dev": true, 1475 | "requires": { 1476 | "is-buffer": "^1.1.5" 1477 | } 1478 | } 1479 | } 1480 | }, 1481 | "hosted-git-info": { 1482 | "version": "2.6.0", 1483 | "bundled": true, 1484 | "dev": true 1485 | }, 1486 | "imurmurhash": { 1487 | "version": "0.1.4", 1488 | "bundled": true, 1489 | "dev": true 1490 | }, 1491 | "inflight": { 1492 | "version": "1.0.6", 1493 | "bundled": true, 1494 | "dev": true, 1495 | "requires": { 1496 | "once": "^1.3.0", 1497 | "wrappy": "1" 1498 | } 1499 | }, 1500 | "inherits": { 1501 | "version": "2.0.3", 1502 | "bundled": true, 1503 | "dev": true 1504 | }, 1505 | "invariant": { 1506 | "version": "2.2.4", 1507 | "bundled": true, 1508 | "dev": true, 1509 | "requires": { 1510 | "loose-envify": "^1.0.0" 1511 | } 1512 | }, 1513 | "invert-kv": { 1514 | "version": "1.0.0", 1515 | "bundled": true, 1516 | "dev": true 1517 | }, 1518 | "is-accessor-descriptor": { 1519 | "version": "0.1.6", 1520 | "bundled": true, 1521 | "dev": true, 1522 | "requires": { 1523 | "kind-of": "^3.0.2" 1524 | } 1525 | }, 1526 | "is-arrayish": { 1527 | "version": "0.2.1", 1528 | "bundled": true, 1529 | "dev": true 1530 | }, 1531 | "is-buffer": { 1532 | "version": "1.1.6", 1533 | "bundled": true, 1534 | "dev": true 1535 | }, 1536 | "is-builtin-module": { 1537 | "version": "1.0.0", 1538 | "bundled": true, 1539 | "dev": true, 1540 | "requires": { 1541 | "builtin-modules": "^1.0.0" 1542 | } 1543 | }, 1544 | "is-data-descriptor": { 1545 | "version": "0.1.4", 1546 | "bundled": true, 1547 | "dev": true, 1548 | "requires": { 1549 | "kind-of": "^3.0.2" 1550 | } 1551 | }, 1552 | "is-descriptor": { 1553 | "version": "0.1.6", 1554 | "bundled": true, 1555 | "dev": true, 1556 | "requires": { 1557 | "is-accessor-descriptor": "^0.1.6", 1558 | "is-data-descriptor": "^0.1.4", 1559 | "kind-of": "^5.0.0" 1560 | }, 1561 | "dependencies": { 1562 | "kind-of": { 1563 | "version": "5.1.0", 1564 | "bundled": true, 1565 | "dev": true 1566 | } 1567 | } 1568 | }, 1569 | "is-extendable": { 1570 | "version": "0.1.1", 1571 | "bundled": true, 1572 | "dev": true 1573 | }, 1574 | "is-finite": { 1575 | "version": "1.0.2", 1576 | "bundled": true, 1577 | "dev": true, 1578 | "requires": { 1579 | "number-is-nan": "^1.0.0" 1580 | } 1581 | }, 1582 | "is-fullwidth-code-point": { 1583 | "version": "2.0.0", 1584 | "bundled": true, 1585 | "dev": true 1586 | }, 1587 | "is-number": { 1588 | "version": "3.0.0", 1589 | "bundled": true, 1590 | "dev": true, 1591 | "requires": { 1592 | "kind-of": "^3.0.2" 1593 | } 1594 | }, 1595 | "is-odd": { 1596 | "version": "2.0.0", 1597 | "bundled": true, 1598 | "dev": true, 1599 | "requires": { 1600 | "is-number": "^4.0.0" 1601 | }, 1602 | "dependencies": { 1603 | "is-number": { 1604 | "version": "4.0.0", 1605 | "bundled": true, 1606 | "dev": true 1607 | } 1608 | } 1609 | }, 1610 | "is-plain-object": { 1611 | "version": "2.0.4", 1612 | "bundled": true, 1613 | "dev": true, 1614 | "requires": { 1615 | "isobject": "^3.0.1" 1616 | }, 1617 | "dependencies": { 1618 | "isobject": { 1619 | "version": "3.0.1", 1620 | "bundled": true, 1621 | "dev": true 1622 | } 1623 | } 1624 | }, 1625 | "is-stream": { 1626 | "version": "1.1.0", 1627 | "bundled": true, 1628 | "dev": true 1629 | }, 1630 | "is-utf8": { 1631 | "version": "0.2.1", 1632 | "bundled": true, 1633 | "dev": true 1634 | }, 1635 | "is-windows": { 1636 | "version": "1.0.2", 1637 | "bundled": true, 1638 | "dev": true 1639 | }, 1640 | "isarray": { 1641 | "version": "1.0.0", 1642 | "bundled": true, 1643 | "dev": true 1644 | }, 1645 | "isexe": { 1646 | "version": "2.0.0", 1647 | "bundled": true, 1648 | "dev": true 1649 | }, 1650 | "isobject": { 1651 | "version": "3.0.1", 1652 | "bundled": true, 1653 | "dev": true 1654 | }, 1655 | "istanbul-lib-coverage": { 1656 | "version": "1.2.0", 1657 | "bundled": true, 1658 | "dev": true 1659 | }, 1660 | "istanbul-lib-hook": { 1661 | "version": "1.1.0", 1662 | "bundled": true, 1663 | "dev": true, 1664 | "requires": { 1665 | "append-transform": "^0.4.0" 1666 | } 1667 | }, 1668 | "istanbul-lib-instrument": { 1669 | "version": "1.10.1", 1670 | "bundled": true, 1671 | "dev": true, 1672 | "requires": { 1673 | "babel-generator": "^6.18.0", 1674 | "babel-template": "^6.16.0", 1675 | "babel-traverse": "^6.18.0", 1676 | "babel-types": "^6.18.0", 1677 | "babylon": "^6.18.0", 1678 | "istanbul-lib-coverage": "^1.2.0", 1679 | "semver": "^5.3.0" 1680 | } 1681 | }, 1682 | "istanbul-lib-report": { 1683 | "version": "1.1.3", 1684 | "bundled": true, 1685 | "dev": true, 1686 | "requires": { 1687 | "istanbul-lib-coverage": "^1.1.2", 1688 | "mkdirp": "^0.5.1", 1689 | "path-parse": "^1.0.5", 1690 | "supports-color": "^3.1.2" 1691 | }, 1692 | "dependencies": { 1693 | "supports-color": { 1694 | "version": "3.2.3", 1695 | "bundled": true, 1696 | "dev": true, 1697 | "requires": { 1698 | "has-flag": "^1.0.0" 1699 | } 1700 | } 1701 | } 1702 | }, 1703 | "istanbul-lib-source-maps": { 1704 | "version": "1.2.3", 1705 | "bundled": true, 1706 | "dev": true, 1707 | "requires": { 1708 | "debug": "^3.1.0", 1709 | "istanbul-lib-coverage": "^1.1.2", 1710 | "mkdirp": "^0.5.1", 1711 | "rimraf": "^2.6.1", 1712 | "source-map": "^0.5.3" 1713 | }, 1714 | "dependencies": { 1715 | "debug": { 1716 | "version": "3.1.0", 1717 | "bundled": true, 1718 | "dev": true, 1719 | "requires": { 1720 | "ms": "2.0.0" 1721 | } 1722 | } 1723 | } 1724 | }, 1725 | "istanbul-reports": { 1726 | "version": "1.4.0", 1727 | "bundled": true, 1728 | "dev": true, 1729 | "requires": { 1730 | "handlebars": "^4.0.3" 1731 | } 1732 | }, 1733 | "js-tokens": { 1734 | "version": "3.0.2", 1735 | "bundled": true, 1736 | "dev": true 1737 | }, 1738 | "jsesc": { 1739 | "version": "1.3.0", 1740 | "bundled": true, 1741 | "dev": true 1742 | }, 1743 | "kind-of": { 1744 | "version": "3.2.2", 1745 | "bundled": true, 1746 | "dev": true, 1747 | "requires": { 1748 | "is-buffer": "^1.1.5" 1749 | } 1750 | }, 1751 | "lazy-cache": { 1752 | "version": "1.0.4", 1753 | "bundled": true, 1754 | "dev": true, 1755 | "optional": true 1756 | }, 1757 | "lcid": { 1758 | "version": "1.0.0", 1759 | "bundled": true, 1760 | "dev": true, 1761 | "requires": { 1762 | "invert-kv": "^1.0.0" 1763 | } 1764 | }, 1765 | "load-json-file": { 1766 | "version": "1.1.0", 1767 | "bundled": true, 1768 | "dev": true, 1769 | "requires": { 1770 | "graceful-fs": "^4.1.2", 1771 | "parse-json": "^2.2.0", 1772 | "pify": "^2.0.0", 1773 | "pinkie-promise": "^2.0.0", 1774 | "strip-bom": "^2.0.0" 1775 | } 1776 | }, 1777 | "locate-path": { 1778 | "version": "2.0.0", 1779 | "bundled": true, 1780 | "dev": true, 1781 | "requires": { 1782 | "p-locate": "^2.0.0", 1783 | "path-exists": "^3.0.0" 1784 | }, 1785 | "dependencies": { 1786 | "path-exists": { 1787 | "version": "3.0.0", 1788 | "bundled": true, 1789 | "dev": true 1790 | } 1791 | } 1792 | }, 1793 | "lodash": { 1794 | "version": "4.17.10", 1795 | "bundled": true, 1796 | "dev": true 1797 | }, 1798 | "longest": { 1799 | "version": "1.0.1", 1800 | "bundled": true, 1801 | "dev": true 1802 | }, 1803 | "loose-envify": { 1804 | "version": "1.3.1", 1805 | "bundled": true, 1806 | "dev": true, 1807 | "requires": { 1808 | "js-tokens": "^3.0.0" 1809 | } 1810 | }, 1811 | "lru-cache": { 1812 | "version": "4.1.3", 1813 | "bundled": true, 1814 | "dev": true, 1815 | "requires": { 1816 | "pseudomap": "^1.0.2", 1817 | "yallist": "^2.1.2" 1818 | } 1819 | }, 1820 | "map-cache": { 1821 | "version": "0.2.2", 1822 | "bundled": true, 1823 | "dev": true 1824 | }, 1825 | "map-visit": { 1826 | "version": "1.0.0", 1827 | "bundled": true, 1828 | "dev": true, 1829 | "requires": { 1830 | "object-visit": "^1.0.0" 1831 | } 1832 | }, 1833 | "md5-hex": { 1834 | "version": "1.3.0", 1835 | "bundled": true, 1836 | "dev": true, 1837 | "requires": { 1838 | "md5-o-matic": "^0.1.1" 1839 | } 1840 | }, 1841 | "md5-o-matic": { 1842 | "version": "0.1.1", 1843 | "bundled": true, 1844 | "dev": true 1845 | }, 1846 | "mem": { 1847 | "version": "1.1.0", 1848 | "bundled": true, 1849 | "dev": true, 1850 | "requires": { 1851 | "mimic-fn": "^1.0.0" 1852 | } 1853 | }, 1854 | "merge-source-map": { 1855 | "version": "1.1.0", 1856 | "bundled": true, 1857 | "dev": true, 1858 | "requires": { 1859 | "source-map": "^0.6.1" 1860 | }, 1861 | "dependencies": { 1862 | "source-map": { 1863 | "version": "0.6.1", 1864 | "bundled": true, 1865 | "dev": true 1866 | } 1867 | } 1868 | }, 1869 | "micromatch": { 1870 | "version": "3.1.10", 1871 | "bundled": true, 1872 | "dev": true, 1873 | "requires": { 1874 | "arr-diff": "^4.0.0", 1875 | "array-unique": "^0.3.2", 1876 | "braces": "^2.3.1", 1877 | "define-property": "^2.0.2", 1878 | "extend-shallow": "^3.0.2", 1879 | "extglob": "^2.0.4", 1880 | "fragment-cache": "^0.2.1", 1881 | "kind-of": "^6.0.2", 1882 | "nanomatch": "^1.2.9", 1883 | "object.pick": "^1.3.0", 1884 | "regex-not": "^1.0.0", 1885 | "snapdragon": "^0.8.1", 1886 | "to-regex": "^3.0.2" 1887 | }, 1888 | "dependencies": { 1889 | "kind-of": { 1890 | "version": "6.0.2", 1891 | "bundled": true, 1892 | "dev": true 1893 | } 1894 | } 1895 | }, 1896 | "mimic-fn": { 1897 | "version": "1.2.0", 1898 | "bundled": true, 1899 | "dev": true 1900 | }, 1901 | "minimatch": { 1902 | "version": "3.0.4", 1903 | "bundled": true, 1904 | "dev": true, 1905 | "requires": { 1906 | "brace-expansion": "^1.1.7" 1907 | } 1908 | }, 1909 | "minimist": { 1910 | "version": "0.0.8", 1911 | "bundled": true, 1912 | "dev": true 1913 | }, 1914 | "mixin-deep": { 1915 | "version": "1.3.1", 1916 | "bundled": true, 1917 | "dev": true, 1918 | "requires": { 1919 | "for-in": "^1.0.2", 1920 | "is-extendable": "^1.0.1" 1921 | }, 1922 | "dependencies": { 1923 | "is-extendable": { 1924 | "version": "1.0.1", 1925 | "bundled": true, 1926 | "dev": true, 1927 | "requires": { 1928 | "is-plain-object": "^2.0.4" 1929 | } 1930 | } 1931 | } 1932 | }, 1933 | "mkdirp": { 1934 | "version": "0.5.1", 1935 | "bundled": true, 1936 | "dev": true, 1937 | "requires": { 1938 | "minimist": "0.0.8" 1939 | } 1940 | }, 1941 | "ms": { 1942 | "version": "2.0.0", 1943 | "bundled": true, 1944 | "dev": true 1945 | }, 1946 | "nanomatch": { 1947 | "version": "1.2.9", 1948 | "bundled": true, 1949 | "dev": true, 1950 | "requires": { 1951 | "arr-diff": "^4.0.0", 1952 | "array-unique": "^0.3.2", 1953 | "define-property": "^2.0.2", 1954 | "extend-shallow": "^3.0.2", 1955 | "fragment-cache": "^0.2.1", 1956 | "is-odd": "^2.0.0", 1957 | "is-windows": "^1.0.2", 1958 | "kind-of": "^6.0.2", 1959 | "object.pick": "^1.3.0", 1960 | "regex-not": "^1.0.0", 1961 | "snapdragon": "^0.8.1", 1962 | "to-regex": "^3.0.1" 1963 | }, 1964 | "dependencies": { 1965 | "arr-diff": { 1966 | "version": "4.0.0", 1967 | "bundled": true, 1968 | "dev": true 1969 | }, 1970 | "array-unique": { 1971 | "version": "0.3.2", 1972 | "bundled": true, 1973 | "dev": true 1974 | }, 1975 | "kind-of": { 1976 | "version": "6.0.2", 1977 | "bundled": true, 1978 | "dev": true 1979 | } 1980 | } 1981 | }, 1982 | "normalize-package-data": { 1983 | "version": "2.4.0", 1984 | "bundled": true, 1985 | "dev": true, 1986 | "requires": { 1987 | "hosted-git-info": "^2.1.4", 1988 | "is-builtin-module": "^1.0.0", 1989 | "semver": "2 || 3 || 4 || 5", 1990 | "validate-npm-package-license": "^3.0.1" 1991 | } 1992 | }, 1993 | "npm-run-path": { 1994 | "version": "2.0.2", 1995 | "bundled": true, 1996 | "dev": true, 1997 | "requires": { 1998 | "path-key": "^2.0.0" 1999 | } 2000 | }, 2001 | "number-is-nan": { 2002 | "version": "1.0.1", 2003 | "bundled": true, 2004 | "dev": true 2005 | }, 2006 | "object-assign": { 2007 | "version": "4.1.1", 2008 | "bundled": true, 2009 | "dev": true 2010 | }, 2011 | "object-copy": { 2012 | "version": "0.1.0", 2013 | "bundled": true, 2014 | "dev": true, 2015 | "requires": { 2016 | "copy-descriptor": "^0.1.0", 2017 | "define-property": "^0.2.5", 2018 | "kind-of": "^3.0.3" 2019 | }, 2020 | "dependencies": { 2021 | "define-property": { 2022 | "version": "0.2.5", 2023 | "bundled": true, 2024 | "dev": true, 2025 | "requires": { 2026 | "is-descriptor": "^0.1.0" 2027 | } 2028 | } 2029 | } 2030 | }, 2031 | "object-visit": { 2032 | "version": "1.0.1", 2033 | "bundled": true, 2034 | "dev": true, 2035 | "requires": { 2036 | "isobject": "^3.0.0" 2037 | }, 2038 | "dependencies": { 2039 | "isobject": { 2040 | "version": "3.0.1", 2041 | "bundled": true, 2042 | "dev": true 2043 | } 2044 | } 2045 | }, 2046 | "object.pick": { 2047 | "version": "1.3.0", 2048 | "bundled": true, 2049 | "dev": true, 2050 | "requires": { 2051 | "isobject": "^3.0.1" 2052 | }, 2053 | "dependencies": { 2054 | "isobject": { 2055 | "version": "3.0.1", 2056 | "bundled": true, 2057 | "dev": true 2058 | } 2059 | } 2060 | }, 2061 | "once": { 2062 | "version": "1.4.0", 2063 | "bundled": true, 2064 | "dev": true, 2065 | "requires": { 2066 | "wrappy": "1" 2067 | } 2068 | }, 2069 | "optimist": { 2070 | "version": "0.6.1", 2071 | "bundled": true, 2072 | "dev": true, 2073 | "requires": { 2074 | "minimist": "~0.0.1", 2075 | "wordwrap": "~0.0.2" 2076 | } 2077 | }, 2078 | "os-homedir": { 2079 | "version": "1.0.2", 2080 | "bundled": true, 2081 | "dev": true 2082 | }, 2083 | "os-locale": { 2084 | "version": "2.1.0", 2085 | "bundled": true, 2086 | "dev": true, 2087 | "requires": { 2088 | "execa": "^0.7.0", 2089 | "lcid": "^1.0.0", 2090 | "mem": "^1.1.0" 2091 | } 2092 | }, 2093 | "p-finally": { 2094 | "version": "1.0.0", 2095 | "bundled": true, 2096 | "dev": true 2097 | }, 2098 | "p-limit": { 2099 | "version": "1.2.0", 2100 | "bundled": true, 2101 | "dev": true, 2102 | "requires": { 2103 | "p-try": "^1.0.0" 2104 | } 2105 | }, 2106 | "p-locate": { 2107 | "version": "2.0.0", 2108 | "bundled": true, 2109 | "dev": true, 2110 | "requires": { 2111 | "p-limit": "^1.1.0" 2112 | } 2113 | }, 2114 | "p-try": { 2115 | "version": "1.0.0", 2116 | "bundled": true, 2117 | "dev": true 2118 | }, 2119 | "parse-json": { 2120 | "version": "2.2.0", 2121 | "bundled": true, 2122 | "dev": true, 2123 | "requires": { 2124 | "error-ex": "^1.2.0" 2125 | } 2126 | }, 2127 | "pascalcase": { 2128 | "version": "0.1.1", 2129 | "bundled": true, 2130 | "dev": true 2131 | }, 2132 | "path-exists": { 2133 | "version": "2.1.0", 2134 | "bundled": true, 2135 | "dev": true, 2136 | "requires": { 2137 | "pinkie-promise": "^2.0.0" 2138 | } 2139 | }, 2140 | "path-is-absolute": { 2141 | "version": "1.0.1", 2142 | "bundled": true, 2143 | "dev": true 2144 | }, 2145 | "path-key": { 2146 | "version": "2.0.1", 2147 | "bundled": true, 2148 | "dev": true 2149 | }, 2150 | "path-parse": { 2151 | "version": "1.0.5", 2152 | "bundled": true, 2153 | "dev": true 2154 | }, 2155 | "path-type": { 2156 | "version": "1.1.0", 2157 | "bundled": true, 2158 | "dev": true, 2159 | "requires": { 2160 | "graceful-fs": "^4.1.2", 2161 | "pify": "^2.0.0", 2162 | "pinkie-promise": "^2.0.0" 2163 | } 2164 | }, 2165 | "pify": { 2166 | "version": "2.3.0", 2167 | "bundled": true, 2168 | "dev": true 2169 | }, 2170 | "pinkie": { 2171 | "version": "2.0.4", 2172 | "bundled": true, 2173 | "dev": true 2174 | }, 2175 | "pinkie-promise": { 2176 | "version": "2.0.1", 2177 | "bundled": true, 2178 | "dev": true, 2179 | "requires": { 2180 | "pinkie": "^2.0.0" 2181 | } 2182 | }, 2183 | "pkg-dir": { 2184 | "version": "1.0.0", 2185 | "bundled": true, 2186 | "dev": true, 2187 | "requires": { 2188 | "find-up": "^1.0.0" 2189 | }, 2190 | "dependencies": { 2191 | "find-up": { 2192 | "version": "1.1.2", 2193 | "bundled": true, 2194 | "dev": true, 2195 | "requires": { 2196 | "path-exists": "^2.0.0", 2197 | "pinkie-promise": "^2.0.0" 2198 | } 2199 | } 2200 | } 2201 | }, 2202 | "posix-character-classes": { 2203 | "version": "0.1.1", 2204 | "bundled": true, 2205 | "dev": true 2206 | }, 2207 | "pseudomap": { 2208 | "version": "1.0.2", 2209 | "bundled": true, 2210 | "dev": true 2211 | }, 2212 | "read-pkg": { 2213 | "version": "1.1.0", 2214 | "bundled": true, 2215 | "dev": true, 2216 | "requires": { 2217 | "load-json-file": "^1.0.0", 2218 | "normalize-package-data": "^2.3.2", 2219 | "path-type": "^1.0.0" 2220 | } 2221 | }, 2222 | "read-pkg-up": { 2223 | "version": "1.0.1", 2224 | "bundled": true, 2225 | "dev": true, 2226 | "requires": { 2227 | "find-up": "^1.0.0", 2228 | "read-pkg": "^1.0.0" 2229 | }, 2230 | "dependencies": { 2231 | "find-up": { 2232 | "version": "1.1.2", 2233 | "bundled": true, 2234 | "dev": true, 2235 | "requires": { 2236 | "path-exists": "^2.0.0", 2237 | "pinkie-promise": "^2.0.0" 2238 | } 2239 | } 2240 | } 2241 | }, 2242 | "regenerator-runtime": { 2243 | "version": "0.11.1", 2244 | "bundled": true, 2245 | "dev": true 2246 | }, 2247 | "regex-not": { 2248 | "version": "1.0.2", 2249 | "bundled": true, 2250 | "dev": true, 2251 | "requires": { 2252 | "extend-shallow": "^3.0.2", 2253 | "safe-regex": "^1.1.0" 2254 | } 2255 | }, 2256 | "repeat-element": { 2257 | "version": "1.1.2", 2258 | "bundled": true, 2259 | "dev": true 2260 | }, 2261 | "repeat-string": { 2262 | "version": "1.6.1", 2263 | "bundled": true, 2264 | "dev": true 2265 | }, 2266 | "repeating": { 2267 | "version": "2.0.1", 2268 | "bundled": true, 2269 | "dev": true, 2270 | "requires": { 2271 | "is-finite": "^1.0.0" 2272 | } 2273 | }, 2274 | "require-directory": { 2275 | "version": "2.1.1", 2276 | "bundled": true, 2277 | "dev": true 2278 | }, 2279 | "require-main-filename": { 2280 | "version": "1.0.1", 2281 | "bundled": true, 2282 | "dev": true 2283 | }, 2284 | "resolve-from": { 2285 | "version": "2.0.0", 2286 | "bundled": true, 2287 | "dev": true 2288 | }, 2289 | "resolve-url": { 2290 | "version": "0.2.1", 2291 | "bundled": true, 2292 | "dev": true 2293 | }, 2294 | "ret": { 2295 | "version": "0.1.15", 2296 | "bundled": true, 2297 | "dev": true 2298 | }, 2299 | "right-align": { 2300 | "version": "0.1.3", 2301 | "bundled": true, 2302 | "dev": true, 2303 | "optional": true, 2304 | "requires": { 2305 | "align-text": "^0.1.1" 2306 | } 2307 | }, 2308 | "rimraf": { 2309 | "version": "2.6.2", 2310 | "bundled": true, 2311 | "dev": true, 2312 | "requires": { 2313 | "glob": "^7.0.5" 2314 | } 2315 | }, 2316 | "safe-regex": { 2317 | "version": "1.1.0", 2318 | "bundled": true, 2319 | "dev": true, 2320 | "requires": { 2321 | "ret": "~0.1.10" 2322 | } 2323 | }, 2324 | "semver": { 2325 | "version": "5.5.0", 2326 | "bundled": true, 2327 | "dev": true 2328 | }, 2329 | "set-blocking": { 2330 | "version": "2.0.0", 2331 | "bundled": true, 2332 | "dev": true 2333 | }, 2334 | "set-value": { 2335 | "version": "2.0.0", 2336 | "bundled": true, 2337 | "dev": true, 2338 | "requires": { 2339 | "extend-shallow": "^2.0.1", 2340 | "is-extendable": "^0.1.1", 2341 | "is-plain-object": "^2.0.3", 2342 | "split-string": "^3.0.1" 2343 | }, 2344 | "dependencies": { 2345 | "extend-shallow": { 2346 | "version": "2.0.1", 2347 | "bundled": true, 2348 | "dev": true, 2349 | "requires": { 2350 | "is-extendable": "^0.1.0" 2351 | } 2352 | } 2353 | } 2354 | }, 2355 | "shebang-command": { 2356 | "version": "1.2.0", 2357 | "bundled": true, 2358 | "dev": true, 2359 | "requires": { 2360 | "shebang-regex": "^1.0.0" 2361 | } 2362 | }, 2363 | "shebang-regex": { 2364 | "version": "1.0.0", 2365 | "bundled": true, 2366 | "dev": true 2367 | }, 2368 | "signal-exit": { 2369 | "version": "3.0.2", 2370 | "bundled": true, 2371 | "dev": true 2372 | }, 2373 | "slide": { 2374 | "version": "1.1.6", 2375 | "bundled": true, 2376 | "dev": true 2377 | }, 2378 | "snapdragon": { 2379 | "version": "0.8.2", 2380 | "bundled": true, 2381 | "dev": true, 2382 | "requires": { 2383 | "base": "^0.11.1", 2384 | "debug": "^2.2.0", 2385 | "define-property": "^0.2.5", 2386 | "extend-shallow": "^2.0.1", 2387 | "map-cache": "^0.2.2", 2388 | "source-map": "^0.5.6", 2389 | "source-map-resolve": "^0.5.0", 2390 | "use": "^3.1.0" 2391 | }, 2392 | "dependencies": { 2393 | "define-property": { 2394 | "version": "0.2.5", 2395 | "bundled": true, 2396 | "dev": true, 2397 | "requires": { 2398 | "is-descriptor": "^0.1.0" 2399 | } 2400 | }, 2401 | "extend-shallow": { 2402 | "version": "2.0.1", 2403 | "bundled": true, 2404 | "dev": true, 2405 | "requires": { 2406 | "is-extendable": "^0.1.0" 2407 | } 2408 | } 2409 | } 2410 | }, 2411 | "snapdragon-node": { 2412 | "version": "2.1.1", 2413 | "bundled": true, 2414 | "dev": true, 2415 | "requires": { 2416 | "define-property": "^1.0.0", 2417 | "isobject": "^3.0.0", 2418 | "snapdragon-util": "^3.0.1" 2419 | }, 2420 | "dependencies": { 2421 | "define-property": { 2422 | "version": "1.0.0", 2423 | "bundled": true, 2424 | "dev": true, 2425 | "requires": { 2426 | "is-descriptor": "^1.0.0" 2427 | } 2428 | }, 2429 | "is-accessor-descriptor": { 2430 | "version": "1.0.0", 2431 | "bundled": true, 2432 | "dev": true, 2433 | "requires": { 2434 | "kind-of": "^6.0.0" 2435 | } 2436 | }, 2437 | "is-data-descriptor": { 2438 | "version": "1.0.0", 2439 | "bundled": true, 2440 | "dev": true, 2441 | "requires": { 2442 | "kind-of": "^6.0.0" 2443 | } 2444 | }, 2445 | "is-descriptor": { 2446 | "version": "1.0.2", 2447 | "bundled": true, 2448 | "dev": true, 2449 | "requires": { 2450 | "is-accessor-descriptor": "^1.0.0", 2451 | "is-data-descriptor": "^1.0.0", 2452 | "kind-of": "^6.0.2" 2453 | } 2454 | }, 2455 | "isobject": { 2456 | "version": "3.0.1", 2457 | "bundled": true, 2458 | "dev": true 2459 | }, 2460 | "kind-of": { 2461 | "version": "6.0.2", 2462 | "bundled": true, 2463 | "dev": true 2464 | } 2465 | } 2466 | }, 2467 | "snapdragon-util": { 2468 | "version": "3.0.1", 2469 | "bundled": true, 2470 | "dev": true, 2471 | "requires": { 2472 | "kind-of": "^3.2.0" 2473 | } 2474 | }, 2475 | "source-map": { 2476 | "version": "0.5.7", 2477 | "bundled": true, 2478 | "dev": true 2479 | }, 2480 | "source-map-resolve": { 2481 | "version": "0.5.1", 2482 | "bundled": true, 2483 | "dev": true, 2484 | "requires": { 2485 | "atob": "^2.0.0", 2486 | "decode-uri-component": "^0.2.0", 2487 | "resolve-url": "^0.2.1", 2488 | "source-map-url": "^0.4.0", 2489 | "urix": "^0.1.0" 2490 | } 2491 | }, 2492 | "source-map-url": { 2493 | "version": "0.4.0", 2494 | "bundled": true, 2495 | "dev": true 2496 | }, 2497 | "spawn-wrap": { 2498 | "version": "1.4.2", 2499 | "bundled": true, 2500 | "dev": true, 2501 | "requires": { 2502 | "foreground-child": "^1.5.6", 2503 | "mkdirp": "^0.5.0", 2504 | "os-homedir": "^1.0.1", 2505 | "rimraf": "^2.6.2", 2506 | "signal-exit": "^3.0.2", 2507 | "which": "^1.3.0" 2508 | } 2509 | }, 2510 | "spdx-correct": { 2511 | "version": "3.0.0", 2512 | "bundled": true, 2513 | "dev": true, 2514 | "requires": { 2515 | "spdx-expression-parse": "^3.0.0", 2516 | "spdx-license-ids": "^3.0.0" 2517 | } 2518 | }, 2519 | "spdx-exceptions": { 2520 | "version": "2.1.0", 2521 | "bundled": true, 2522 | "dev": true 2523 | }, 2524 | "spdx-expression-parse": { 2525 | "version": "3.0.0", 2526 | "bundled": true, 2527 | "dev": true, 2528 | "requires": { 2529 | "spdx-exceptions": "^2.1.0", 2530 | "spdx-license-ids": "^3.0.0" 2531 | } 2532 | }, 2533 | "spdx-license-ids": { 2534 | "version": "3.0.0", 2535 | "bundled": true, 2536 | "dev": true 2537 | }, 2538 | "split-string": { 2539 | "version": "3.1.0", 2540 | "bundled": true, 2541 | "dev": true, 2542 | "requires": { 2543 | "extend-shallow": "^3.0.0" 2544 | } 2545 | }, 2546 | "static-extend": { 2547 | "version": "0.1.2", 2548 | "bundled": true, 2549 | "dev": true, 2550 | "requires": { 2551 | "define-property": "^0.2.5", 2552 | "object-copy": "^0.1.0" 2553 | }, 2554 | "dependencies": { 2555 | "define-property": { 2556 | "version": "0.2.5", 2557 | "bundled": true, 2558 | "dev": true, 2559 | "requires": { 2560 | "is-descriptor": "^0.1.0" 2561 | } 2562 | } 2563 | } 2564 | }, 2565 | "string-width": { 2566 | "version": "2.1.1", 2567 | "bundled": true, 2568 | "dev": true, 2569 | "requires": { 2570 | "is-fullwidth-code-point": "^2.0.0", 2571 | "strip-ansi": "^4.0.0" 2572 | }, 2573 | "dependencies": { 2574 | "ansi-regex": { 2575 | "version": "3.0.0", 2576 | "bundled": true, 2577 | "dev": true 2578 | }, 2579 | "strip-ansi": { 2580 | "version": "4.0.0", 2581 | "bundled": true, 2582 | "dev": true, 2583 | "requires": { 2584 | "ansi-regex": "^3.0.0" 2585 | } 2586 | } 2587 | } 2588 | }, 2589 | "strip-ansi": { 2590 | "version": "3.0.1", 2591 | "bundled": true, 2592 | "dev": true, 2593 | "requires": { 2594 | "ansi-regex": "^2.0.0" 2595 | } 2596 | }, 2597 | "strip-bom": { 2598 | "version": "2.0.0", 2599 | "bundled": true, 2600 | "dev": true, 2601 | "requires": { 2602 | "is-utf8": "^0.2.0" 2603 | } 2604 | }, 2605 | "strip-eof": { 2606 | "version": "1.0.0", 2607 | "bundled": true, 2608 | "dev": true 2609 | }, 2610 | "supports-color": { 2611 | "version": "2.0.0", 2612 | "bundled": true, 2613 | "dev": true 2614 | }, 2615 | "test-exclude": { 2616 | "version": "4.2.1", 2617 | "bundled": true, 2618 | "dev": true, 2619 | "requires": { 2620 | "arrify": "^1.0.1", 2621 | "micromatch": "^3.1.8", 2622 | "object-assign": "^4.1.0", 2623 | "read-pkg-up": "^1.0.1", 2624 | "require-main-filename": "^1.0.1" 2625 | }, 2626 | "dependencies": { 2627 | "arr-diff": { 2628 | "version": "4.0.0", 2629 | "bundled": true, 2630 | "dev": true 2631 | }, 2632 | "array-unique": { 2633 | "version": "0.3.2", 2634 | "bundled": true, 2635 | "dev": true 2636 | }, 2637 | "braces": { 2638 | "version": "2.3.2", 2639 | "bundled": true, 2640 | "dev": true, 2641 | "requires": { 2642 | "arr-flatten": "^1.1.0", 2643 | "array-unique": "^0.3.2", 2644 | "extend-shallow": "^2.0.1", 2645 | "fill-range": "^4.0.0", 2646 | "isobject": "^3.0.1", 2647 | "repeat-element": "^1.1.2", 2648 | "snapdragon": "^0.8.1", 2649 | "snapdragon-node": "^2.0.1", 2650 | "split-string": "^3.0.2", 2651 | "to-regex": "^3.0.1" 2652 | }, 2653 | "dependencies": { 2654 | "extend-shallow": { 2655 | "version": "2.0.1", 2656 | "bundled": true, 2657 | "dev": true, 2658 | "requires": { 2659 | "is-extendable": "^0.1.0" 2660 | } 2661 | } 2662 | } 2663 | }, 2664 | "expand-brackets": { 2665 | "version": "2.1.4", 2666 | "bundled": true, 2667 | "dev": true, 2668 | "requires": { 2669 | "debug": "^2.3.3", 2670 | "define-property": "^0.2.5", 2671 | "extend-shallow": "^2.0.1", 2672 | "posix-character-classes": "^0.1.0", 2673 | "regex-not": "^1.0.0", 2674 | "snapdragon": "^0.8.1", 2675 | "to-regex": "^3.0.1" 2676 | }, 2677 | "dependencies": { 2678 | "define-property": { 2679 | "version": "0.2.5", 2680 | "bundled": true, 2681 | "dev": true, 2682 | "requires": { 2683 | "is-descriptor": "^0.1.0" 2684 | } 2685 | }, 2686 | "extend-shallow": { 2687 | "version": "2.0.1", 2688 | "bundled": true, 2689 | "dev": true, 2690 | "requires": { 2691 | "is-extendable": "^0.1.0" 2692 | } 2693 | }, 2694 | "is-accessor-descriptor": { 2695 | "version": "0.1.6", 2696 | "bundled": true, 2697 | "dev": true, 2698 | "requires": { 2699 | "kind-of": "^3.0.2" 2700 | }, 2701 | "dependencies": { 2702 | "kind-of": { 2703 | "version": "3.2.2", 2704 | "bundled": true, 2705 | "dev": true, 2706 | "requires": { 2707 | "is-buffer": "^1.1.5" 2708 | } 2709 | } 2710 | } 2711 | }, 2712 | "is-data-descriptor": { 2713 | "version": "0.1.4", 2714 | "bundled": true, 2715 | "dev": true, 2716 | "requires": { 2717 | "kind-of": "^3.0.2" 2718 | }, 2719 | "dependencies": { 2720 | "kind-of": { 2721 | "version": "3.2.2", 2722 | "bundled": true, 2723 | "dev": true, 2724 | "requires": { 2725 | "is-buffer": "^1.1.5" 2726 | } 2727 | } 2728 | } 2729 | }, 2730 | "is-descriptor": { 2731 | "version": "0.1.6", 2732 | "bundled": true, 2733 | "dev": true, 2734 | "requires": { 2735 | "is-accessor-descriptor": "^0.1.6", 2736 | "is-data-descriptor": "^0.1.4", 2737 | "kind-of": "^5.0.0" 2738 | } 2739 | }, 2740 | "kind-of": { 2741 | "version": "5.1.0", 2742 | "bundled": true, 2743 | "dev": true 2744 | } 2745 | } 2746 | }, 2747 | "extglob": { 2748 | "version": "2.0.4", 2749 | "bundled": true, 2750 | "dev": true, 2751 | "requires": { 2752 | "array-unique": "^0.3.2", 2753 | "define-property": "^1.0.0", 2754 | "expand-brackets": "^2.1.4", 2755 | "extend-shallow": "^2.0.1", 2756 | "fragment-cache": "^0.2.1", 2757 | "regex-not": "^1.0.0", 2758 | "snapdragon": "^0.8.1", 2759 | "to-regex": "^3.0.1" 2760 | }, 2761 | "dependencies": { 2762 | "define-property": { 2763 | "version": "1.0.0", 2764 | "bundled": true, 2765 | "dev": true, 2766 | "requires": { 2767 | "is-descriptor": "^1.0.0" 2768 | } 2769 | }, 2770 | "extend-shallow": { 2771 | "version": "2.0.1", 2772 | "bundled": true, 2773 | "dev": true, 2774 | "requires": { 2775 | "is-extendable": "^0.1.0" 2776 | } 2777 | } 2778 | } 2779 | }, 2780 | "fill-range": { 2781 | "version": "4.0.0", 2782 | "bundled": true, 2783 | "dev": true, 2784 | "requires": { 2785 | "extend-shallow": "^2.0.1", 2786 | "is-number": "^3.0.0", 2787 | "repeat-string": "^1.6.1", 2788 | "to-regex-range": "^2.1.0" 2789 | }, 2790 | "dependencies": { 2791 | "extend-shallow": { 2792 | "version": "2.0.1", 2793 | "bundled": true, 2794 | "dev": true, 2795 | "requires": { 2796 | "is-extendable": "^0.1.0" 2797 | } 2798 | } 2799 | } 2800 | }, 2801 | "is-accessor-descriptor": { 2802 | "version": "1.0.0", 2803 | "bundled": true, 2804 | "dev": true, 2805 | "requires": { 2806 | "kind-of": "^6.0.0" 2807 | } 2808 | }, 2809 | "is-data-descriptor": { 2810 | "version": "1.0.0", 2811 | "bundled": true, 2812 | "dev": true, 2813 | "requires": { 2814 | "kind-of": "^6.0.0" 2815 | } 2816 | }, 2817 | "is-descriptor": { 2818 | "version": "1.0.2", 2819 | "bundled": true, 2820 | "dev": true, 2821 | "requires": { 2822 | "is-accessor-descriptor": "^1.0.0", 2823 | "is-data-descriptor": "^1.0.0", 2824 | "kind-of": "^6.0.2" 2825 | } 2826 | }, 2827 | "is-number": { 2828 | "version": "3.0.0", 2829 | "bundled": true, 2830 | "dev": true, 2831 | "requires": { 2832 | "kind-of": "^3.0.2" 2833 | }, 2834 | "dependencies": { 2835 | "kind-of": { 2836 | "version": "3.2.2", 2837 | "bundled": true, 2838 | "dev": true, 2839 | "requires": { 2840 | "is-buffer": "^1.1.5" 2841 | } 2842 | } 2843 | } 2844 | }, 2845 | "isobject": { 2846 | "version": "3.0.1", 2847 | "bundled": true, 2848 | "dev": true 2849 | }, 2850 | "kind-of": { 2851 | "version": "6.0.2", 2852 | "bundled": true, 2853 | "dev": true 2854 | }, 2855 | "micromatch": { 2856 | "version": "3.1.10", 2857 | "bundled": true, 2858 | "dev": true, 2859 | "requires": { 2860 | "arr-diff": "^4.0.0", 2861 | "array-unique": "^0.3.2", 2862 | "braces": "^2.3.1", 2863 | "define-property": "^2.0.2", 2864 | "extend-shallow": "^3.0.2", 2865 | "extglob": "^2.0.4", 2866 | "fragment-cache": "^0.2.1", 2867 | "kind-of": "^6.0.2", 2868 | "nanomatch": "^1.2.9", 2869 | "object.pick": "^1.3.0", 2870 | "regex-not": "^1.0.0", 2871 | "snapdragon": "^0.8.1", 2872 | "to-regex": "^3.0.2" 2873 | } 2874 | } 2875 | } 2876 | }, 2877 | "to-fast-properties": { 2878 | "version": "1.0.3", 2879 | "bundled": true, 2880 | "dev": true 2881 | }, 2882 | "to-object-path": { 2883 | "version": "0.3.0", 2884 | "bundled": true, 2885 | "dev": true, 2886 | "requires": { 2887 | "kind-of": "^3.0.2" 2888 | } 2889 | }, 2890 | "to-regex": { 2891 | "version": "3.0.2", 2892 | "bundled": true, 2893 | "dev": true, 2894 | "requires": { 2895 | "define-property": "^2.0.2", 2896 | "extend-shallow": "^3.0.2", 2897 | "regex-not": "^1.0.2", 2898 | "safe-regex": "^1.1.0" 2899 | } 2900 | }, 2901 | "to-regex-range": { 2902 | "version": "2.1.1", 2903 | "bundled": true, 2904 | "dev": true, 2905 | "requires": { 2906 | "is-number": "^3.0.0", 2907 | "repeat-string": "^1.6.1" 2908 | }, 2909 | "dependencies": { 2910 | "is-number": { 2911 | "version": "3.0.0", 2912 | "bundled": true, 2913 | "dev": true, 2914 | "requires": { 2915 | "kind-of": "^3.0.2" 2916 | } 2917 | } 2918 | } 2919 | }, 2920 | "trim-right": { 2921 | "version": "1.0.1", 2922 | "bundled": true, 2923 | "dev": true 2924 | }, 2925 | "uglify-js": { 2926 | "version": "2.8.29", 2927 | "bundled": true, 2928 | "dev": true, 2929 | "optional": true, 2930 | "requires": { 2931 | "source-map": "~0.5.1", 2932 | "uglify-to-browserify": "~1.0.0", 2933 | "yargs": "~3.10.0" 2934 | }, 2935 | "dependencies": { 2936 | "yargs": { 2937 | "version": "3.10.0", 2938 | "bundled": true, 2939 | "dev": true, 2940 | "optional": true, 2941 | "requires": { 2942 | "camelcase": "^1.0.2", 2943 | "cliui": "^2.1.0", 2944 | "decamelize": "^1.0.0", 2945 | "window-size": "0.1.0" 2946 | } 2947 | } 2948 | } 2949 | }, 2950 | "uglify-to-browserify": { 2951 | "version": "1.0.2", 2952 | "bundled": true, 2953 | "dev": true, 2954 | "optional": true 2955 | }, 2956 | "union-value": { 2957 | "version": "1.0.0", 2958 | "bundled": true, 2959 | "dev": true, 2960 | "requires": { 2961 | "arr-union": "^3.1.0", 2962 | "get-value": "^2.0.6", 2963 | "is-extendable": "^0.1.1", 2964 | "set-value": "^0.4.3" 2965 | }, 2966 | "dependencies": { 2967 | "extend-shallow": { 2968 | "version": "2.0.1", 2969 | "bundled": true, 2970 | "dev": true, 2971 | "requires": { 2972 | "is-extendable": "^0.1.0" 2973 | } 2974 | }, 2975 | "set-value": { 2976 | "version": "0.4.3", 2977 | "bundled": true, 2978 | "dev": true, 2979 | "requires": { 2980 | "extend-shallow": "^2.0.1", 2981 | "is-extendable": "^0.1.1", 2982 | "is-plain-object": "^2.0.1", 2983 | "to-object-path": "^0.3.0" 2984 | } 2985 | } 2986 | } 2987 | }, 2988 | "unset-value": { 2989 | "version": "1.0.0", 2990 | "bundled": true, 2991 | "dev": true, 2992 | "requires": { 2993 | "has-value": "^0.3.1", 2994 | "isobject": "^3.0.0" 2995 | }, 2996 | "dependencies": { 2997 | "has-value": { 2998 | "version": "0.3.1", 2999 | "bundled": true, 3000 | "dev": true, 3001 | "requires": { 3002 | "get-value": "^2.0.3", 3003 | "has-values": "^0.1.4", 3004 | "isobject": "^2.0.0" 3005 | }, 3006 | "dependencies": { 3007 | "isobject": { 3008 | "version": "2.1.0", 3009 | "bundled": true, 3010 | "dev": true, 3011 | "requires": { 3012 | "isarray": "1.0.0" 3013 | } 3014 | } 3015 | } 3016 | }, 3017 | "has-values": { 3018 | "version": "0.1.4", 3019 | "bundled": true, 3020 | "dev": true 3021 | }, 3022 | "isobject": { 3023 | "version": "3.0.1", 3024 | "bundled": true, 3025 | "dev": true 3026 | } 3027 | } 3028 | }, 3029 | "urix": { 3030 | "version": "0.1.0", 3031 | "bundled": true, 3032 | "dev": true 3033 | }, 3034 | "use": { 3035 | "version": "3.1.0", 3036 | "bundled": true, 3037 | "dev": true, 3038 | "requires": { 3039 | "kind-of": "^6.0.2" 3040 | }, 3041 | "dependencies": { 3042 | "kind-of": { 3043 | "version": "6.0.2", 3044 | "bundled": true, 3045 | "dev": true 3046 | } 3047 | } 3048 | }, 3049 | "validate-npm-package-license": { 3050 | "version": "3.0.3", 3051 | "bundled": true, 3052 | "dev": true, 3053 | "requires": { 3054 | "spdx-correct": "^3.0.0", 3055 | "spdx-expression-parse": "^3.0.0" 3056 | } 3057 | }, 3058 | "which": { 3059 | "version": "1.3.0", 3060 | "bundled": true, 3061 | "dev": true, 3062 | "requires": { 3063 | "isexe": "^2.0.0" 3064 | } 3065 | }, 3066 | "which-module": { 3067 | "version": "2.0.0", 3068 | "bundled": true, 3069 | "dev": true 3070 | }, 3071 | "window-size": { 3072 | "version": "0.1.0", 3073 | "bundled": true, 3074 | "dev": true, 3075 | "optional": true 3076 | }, 3077 | "wordwrap": { 3078 | "version": "0.0.3", 3079 | "bundled": true, 3080 | "dev": true 3081 | }, 3082 | "wrap-ansi": { 3083 | "version": "2.1.0", 3084 | "bundled": true, 3085 | "dev": true, 3086 | "requires": { 3087 | "string-width": "^1.0.1", 3088 | "strip-ansi": "^3.0.1" 3089 | }, 3090 | "dependencies": { 3091 | "is-fullwidth-code-point": { 3092 | "version": "1.0.0", 3093 | "bundled": true, 3094 | "dev": true, 3095 | "requires": { 3096 | "number-is-nan": "^1.0.0" 3097 | } 3098 | }, 3099 | "string-width": { 3100 | "version": "1.0.2", 3101 | "bundled": true, 3102 | "dev": true, 3103 | "requires": { 3104 | "code-point-at": "^1.0.0", 3105 | "is-fullwidth-code-point": "^1.0.0", 3106 | "strip-ansi": "^3.0.0" 3107 | } 3108 | } 3109 | } 3110 | }, 3111 | "wrappy": { 3112 | "version": "1.0.2", 3113 | "bundled": true, 3114 | "dev": true 3115 | }, 3116 | "write-file-atomic": { 3117 | "version": "1.3.4", 3118 | "bundled": true, 3119 | "dev": true, 3120 | "requires": { 3121 | "graceful-fs": "^4.1.11", 3122 | "imurmurhash": "^0.1.4", 3123 | "slide": "^1.1.5" 3124 | } 3125 | }, 3126 | "y18n": { 3127 | "version": "3.2.1", 3128 | "bundled": true, 3129 | "dev": true 3130 | }, 3131 | "yallist": { 3132 | "version": "2.1.2", 3133 | "bundled": true, 3134 | "dev": true 3135 | }, 3136 | "yargs": { 3137 | "version": "11.1.0", 3138 | "bundled": true, 3139 | "dev": true, 3140 | "requires": { 3141 | "cliui": "^4.0.0", 3142 | "decamelize": "^1.1.1", 3143 | "find-up": "^2.1.0", 3144 | "get-caller-file": "^1.0.1", 3145 | "os-locale": "^2.0.0", 3146 | "require-directory": "^2.1.1", 3147 | "require-main-filename": "^1.0.1", 3148 | "set-blocking": "^2.0.0", 3149 | "string-width": "^2.0.0", 3150 | "which-module": "^2.0.0", 3151 | "y18n": "^3.2.1", 3152 | "yargs-parser": "^9.0.2" 3153 | }, 3154 | "dependencies": { 3155 | "ansi-regex": { 3156 | "version": "3.0.0", 3157 | "bundled": true, 3158 | "dev": true 3159 | }, 3160 | "camelcase": { 3161 | "version": "4.1.0", 3162 | "bundled": true, 3163 | "dev": true 3164 | }, 3165 | "cliui": { 3166 | "version": "4.1.0", 3167 | "bundled": true, 3168 | "dev": true, 3169 | "requires": { 3170 | "string-width": "^2.1.1", 3171 | "strip-ansi": "^4.0.0", 3172 | "wrap-ansi": "^2.0.0" 3173 | } 3174 | }, 3175 | "strip-ansi": { 3176 | "version": "4.0.0", 3177 | "bundled": true, 3178 | "dev": true, 3179 | "requires": { 3180 | "ansi-regex": "^3.0.0" 3181 | } 3182 | }, 3183 | "yargs-parser": { 3184 | "version": "9.0.2", 3185 | "bundled": true, 3186 | "dev": true, 3187 | "requires": { 3188 | "camelcase": "^4.1.0" 3189 | } 3190 | } 3191 | } 3192 | }, 3193 | "yargs-parser": { 3194 | "version": "8.1.0", 3195 | "bundled": true, 3196 | "dev": true, 3197 | "requires": { 3198 | "camelcase": "^4.1.0" 3199 | }, 3200 | "dependencies": { 3201 | "camelcase": { 3202 | "version": "4.1.0", 3203 | "bundled": true, 3204 | "dev": true 3205 | } 3206 | } 3207 | } 3208 | } 3209 | }, 3210 | "oauth-sign": { 3211 | "version": "0.9.0", 3212 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 3213 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 3214 | "dev": true 3215 | }, 3216 | "once": { 3217 | "version": "1.4.0", 3218 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 3219 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 3220 | "dev": true, 3221 | "requires": { 3222 | "wrappy": "1" 3223 | } 3224 | }, 3225 | "opener": { 3226 | "version": "1.5.1", 3227 | "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", 3228 | "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", 3229 | "dev": true 3230 | }, 3231 | "os-homedir": { 3232 | "version": "1.0.2", 3233 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 3234 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 3235 | "dev": true 3236 | }, 3237 | "own-or": { 3238 | "version": "1.0.0", 3239 | "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", 3240 | "integrity": "sha1-Tod/vtqaLsgAD7wLyuOWRe6L+Nw=", 3241 | "dev": true 3242 | }, 3243 | "own-or-env": { 3244 | "version": "1.0.1", 3245 | "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.1.tgz", 3246 | "integrity": "sha512-y8qULRbRAlL6x2+M0vIe7jJbJx/kmUTzYonRAa2ayesR2qWLswninkVyeJe4x3IEXhdgoNodzjQRKAoEs6Fmrw==", 3247 | "dev": true, 3248 | "requires": { 3249 | "own-or": "^1.0.0" 3250 | } 3251 | }, 3252 | "path-is-absolute": { 3253 | "version": "1.0.1", 3254 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 3255 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 3256 | "dev": true 3257 | }, 3258 | "performance-now": { 3259 | "version": "2.1.0", 3260 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 3261 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 3262 | "dev": true 3263 | }, 3264 | "process-nextick-args": { 3265 | "version": "2.0.0", 3266 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 3267 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 3268 | "dev": true, 3269 | "optional": true 3270 | }, 3271 | "pseudomap": { 3272 | "version": "1.0.2", 3273 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 3274 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 3275 | "dev": true 3276 | }, 3277 | "psl": { 3278 | "version": "1.1.29", 3279 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", 3280 | "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", 3281 | "dev": true 3282 | }, 3283 | "punycode": { 3284 | "version": "1.4.1", 3285 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 3286 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 3287 | "dev": true 3288 | }, 3289 | "qs": { 3290 | "version": "6.5.2", 3291 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 3292 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 3293 | "dev": true 3294 | }, 3295 | "readable-stream": { 3296 | "version": "2.3.6", 3297 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 3298 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 3299 | "dev": true, 3300 | "optional": true, 3301 | "requires": { 3302 | "core-util-is": "~1.0.0", 3303 | "inherits": "~2.0.3", 3304 | "isarray": "~1.0.0", 3305 | "process-nextick-args": "~2.0.0", 3306 | "safe-buffer": "~5.1.1", 3307 | "string_decoder": "~1.1.1", 3308 | "util-deprecate": "~1.0.1" 3309 | } 3310 | }, 3311 | "request": { 3312 | "version": "2.88.0", 3313 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 3314 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 3315 | "dev": true, 3316 | "requires": { 3317 | "aws-sign2": "~0.7.0", 3318 | "aws4": "^1.8.0", 3319 | "caseless": "~0.12.0", 3320 | "combined-stream": "~1.0.6", 3321 | "extend": "~3.0.2", 3322 | "forever-agent": "~0.6.1", 3323 | "form-data": "~2.3.2", 3324 | "har-validator": "~5.1.0", 3325 | "http-signature": "~1.2.0", 3326 | "is-typedarray": "~1.0.0", 3327 | "isstream": "~0.1.2", 3328 | "json-stringify-safe": "~5.0.1", 3329 | "mime-types": "~2.1.19", 3330 | "oauth-sign": "~0.9.0", 3331 | "performance-now": "^2.1.0", 3332 | "qs": "~6.5.2", 3333 | "safe-buffer": "^5.1.2", 3334 | "tough-cookie": "~2.4.3", 3335 | "tunnel-agent": "^0.6.0", 3336 | "uuid": "^3.3.2" 3337 | } 3338 | }, 3339 | "rimraf": { 3340 | "version": "2.6.2", 3341 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 3342 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 3343 | "dev": true, 3344 | "requires": { 3345 | "glob": "^7.0.5" 3346 | } 3347 | }, 3348 | "safe-buffer": { 3349 | "version": "5.1.2", 3350 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 3351 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 3352 | "dev": true 3353 | }, 3354 | "safer-buffer": { 3355 | "version": "2.1.2", 3356 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 3357 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 3358 | "dev": true 3359 | }, 3360 | "signal-exit": { 3361 | "version": "3.0.2", 3362 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 3363 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 3364 | "dev": true 3365 | }, 3366 | "source-map": { 3367 | "version": "0.6.1", 3368 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3369 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3370 | "dev": true 3371 | }, 3372 | "source-map-support": { 3373 | "version": "0.5.9", 3374 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", 3375 | "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", 3376 | "dev": true, 3377 | "requires": { 3378 | "buffer-from": "^1.0.0", 3379 | "source-map": "^0.6.0" 3380 | } 3381 | }, 3382 | "sprintf-js": { 3383 | "version": "1.0.3", 3384 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 3385 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 3386 | "dev": true 3387 | }, 3388 | "sshpk": { 3389 | "version": "1.15.2", 3390 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", 3391 | "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", 3392 | "dev": true, 3393 | "requires": { 3394 | "asn1": "~0.2.3", 3395 | "assert-plus": "^1.0.0", 3396 | "bcrypt-pbkdf": "^1.0.0", 3397 | "dashdash": "^1.12.0", 3398 | "ecc-jsbn": "~0.1.1", 3399 | "getpass": "^0.1.1", 3400 | "jsbn": "~0.1.0", 3401 | "safer-buffer": "^2.0.2", 3402 | "tweetnacl": "~0.14.0" 3403 | } 3404 | }, 3405 | "stack-utils": { 3406 | "version": "1.0.1", 3407 | "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", 3408 | "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", 3409 | "dev": true 3410 | }, 3411 | "string_decoder": { 3412 | "version": "1.1.1", 3413 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 3414 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 3415 | "dev": true, 3416 | "optional": true, 3417 | "requires": { 3418 | "safe-buffer": "~5.1.0" 3419 | } 3420 | }, 3421 | "strip-ansi": { 3422 | "version": "3.0.1", 3423 | "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 3424 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 3425 | "dev": true, 3426 | "requires": { 3427 | "ansi-regex": "^2.0.0" 3428 | } 3429 | }, 3430 | "tap": { 3431 | "version": "12.0.1", 3432 | "resolved": "https://registry.npmjs.org/tap/-/tap-12.0.1.tgz", 3433 | "integrity": "sha512-iEJytWaZy8risvfRjuV4+ST+Lrrui/MW2ZCWn01ZaMn0NKFej4+PpBy6bXGOg9+cEGNmI7d3Sdka/zTUZUGidA==", 3434 | "dev": true, 3435 | "requires": { 3436 | "bind-obj-methods": "^2.0.0", 3437 | "bluebird": "^3.5.1", 3438 | "clean-yaml-object": "^0.1.0", 3439 | "color-support": "^1.1.0", 3440 | "coveralls": "^3.0.1", 3441 | "foreground-child": "^1.3.3", 3442 | "fs-exists-cached": "^1.0.0", 3443 | "function-loop": "^1.0.1", 3444 | "glob": "^7.0.0", 3445 | "isexe": "^2.0.0", 3446 | "js-yaml": "^3.11.0", 3447 | "minipass": "^2.3.0", 3448 | "mkdirp": "^0.5.1", 3449 | "nyc": "^11.8.0", 3450 | "opener": "^1.4.1", 3451 | "os-homedir": "^1.0.2", 3452 | "own-or": "^1.0.0", 3453 | "own-or-env": "^1.0.1", 3454 | "rimraf": "^2.6.2", 3455 | "signal-exit": "^3.0.0", 3456 | "source-map-support": "^0.5.6", 3457 | "stack-utils": "^1.0.0", 3458 | "tap-mocha-reporter": "^3.0.7", 3459 | "tap-parser": "^7.0.0", 3460 | "tmatch": "^4.0.0", 3461 | "trivial-deferred": "^1.0.1", 3462 | "tsame": "^2.0.0", 3463 | "write-file-atomic": "^2.3.0", 3464 | "yapool": "^1.0.0" 3465 | } 3466 | }, 3467 | "tap-mocha-reporter": { 3468 | "version": "3.0.7", 3469 | "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-3.0.7.tgz", 3470 | "integrity": "sha512-GHVXJ38C3oPRpM3YUc43JlGdpVZYiKeT1fmAd3HH2+J+ZWwsNAUFvRRdoGsXLw9+gU9o+zXpBqhS/oXyRQYwlA==", 3471 | "dev": true, 3472 | "requires": { 3473 | "color-support": "^1.1.0", 3474 | "debug": "^2.1.3", 3475 | "diff": "^1.3.2", 3476 | "escape-string-regexp": "^1.0.3", 3477 | "glob": "^7.0.5", 3478 | "js-yaml": "^3.3.1", 3479 | "readable-stream": "^2.1.5", 3480 | "tap-parser": "^5.1.0", 3481 | "unicode-length": "^1.0.0" 3482 | }, 3483 | "dependencies": { 3484 | "tap-parser": { 3485 | "version": "5.4.0", 3486 | "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-5.4.0.tgz", 3487 | "integrity": "sha512-BIsIaGqv7uTQgTW1KLTMNPSEQf4zDDPgYOBRdgOfuB+JFOLRBfEu6cLa/KvMvmqggu1FKXDfitjLwsq4827RvA==", 3488 | "dev": true, 3489 | "requires": { 3490 | "events-to-array": "^1.0.1", 3491 | "js-yaml": "^3.2.7", 3492 | "readable-stream": "^2" 3493 | } 3494 | } 3495 | } 3496 | }, 3497 | "tap-parser": { 3498 | "version": "7.0.0", 3499 | "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-7.0.0.tgz", 3500 | "integrity": "sha512-05G8/LrzqOOFvZhhAk32wsGiPZ1lfUrl+iV7+OkKgfofZxiceZWMHkKmow71YsyVQ8IvGBP2EjcIjE5gL4l5lA==", 3501 | "dev": true, 3502 | "requires": { 3503 | "events-to-array": "^1.0.1", 3504 | "js-yaml": "^3.2.7", 3505 | "minipass": "^2.2.0" 3506 | } 3507 | }, 3508 | "tmatch": { 3509 | "version": "4.0.0", 3510 | "resolved": "https://registry.npmjs.org/tmatch/-/tmatch-4.0.0.tgz", 3511 | "integrity": "sha512-Ynn2Gsp+oCvYScQXeV+cCs7citRDilq0qDXA6tuvFwDgiYyyaq7D5vKUlAPezzZR5NDobc/QMeN6e5guOYmvxg==", 3512 | "dev": true 3513 | }, 3514 | "tough-cookie": { 3515 | "version": "2.4.3", 3516 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 3517 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 3518 | "dev": true, 3519 | "requires": { 3520 | "psl": "^1.1.24", 3521 | "punycode": "^1.4.1" 3522 | } 3523 | }, 3524 | "trivial-deferred": { 3525 | "version": "1.0.1", 3526 | "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", 3527 | "integrity": "sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM=", 3528 | "dev": true 3529 | }, 3530 | "tsame": { 3531 | "version": "2.0.0", 3532 | "resolved": "https://registry.npmjs.org/tsame/-/tsame-2.0.0.tgz", 3533 | "integrity": "sha512-dAuzcnOPdqZYojylFQzEes95UDjve3HqKrlTCeLZKSDPMTsn3smzHZqsJj/sWD8wOUkg0RD++B11evyLn2+bIw==", 3534 | "dev": true 3535 | }, 3536 | "tunnel-agent": { 3537 | "version": "0.6.0", 3538 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 3539 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 3540 | "dev": true, 3541 | "requires": { 3542 | "safe-buffer": "^5.0.1" 3543 | } 3544 | }, 3545 | "tweetnacl": { 3546 | "version": "0.14.5", 3547 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 3548 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 3549 | "dev": true 3550 | }, 3551 | "unicode-length": { 3552 | "version": "1.0.3", 3553 | "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-1.0.3.tgz", 3554 | "integrity": "sha1-Wtp6f+1RhBpBijKM8UlHisg1irs=", 3555 | "dev": true, 3556 | "requires": { 3557 | "punycode": "^1.3.2", 3558 | "strip-ansi": "^3.0.1" 3559 | } 3560 | }, 3561 | "util-deprecate": { 3562 | "version": "1.0.2", 3563 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3564 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 3565 | "dev": true, 3566 | "optional": true 3567 | }, 3568 | "uuid": { 3569 | "version": "3.3.2", 3570 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 3571 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 3572 | "dev": true 3573 | }, 3574 | "verror": { 3575 | "version": "1.10.0", 3576 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 3577 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 3578 | "dev": true, 3579 | "requires": { 3580 | "assert-plus": "^1.0.0", 3581 | "core-util-is": "1.0.2", 3582 | "extsprintf": "^1.2.0" 3583 | } 3584 | }, 3585 | "which": { 3586 | "version": "1.3.1", 3587 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 3588 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 3589 | "dev": true, 3590 | "requires": { 3591 | "isexe": "^2.0.0" 3592 | } 3593 | }, 3594 | "wrappy": { 3595 | "version": "1.0.2", 3596 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3597 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 3598 | "dev": true 3599 | }, 3600 | "write-file-atomic": { 3601 | "version": "2.3.0", 3602 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", 3603 | "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", 3604 | "dev": true, 3605 | "requires": { 3606 | "graceful-fs": "^4.1.11", 3607 | "imurmurhash": "^0.1.4", 3608 | "signal-exit": "^3.0.2" 3609 | } 3610 | }, 3611 | "yallist": { 3612 | "version": "2.1.2", 3613 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 3614 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 3615 | "dev": true 3616 | }, 3617 | "yapool": { 3618 | "version": "1.0.0", 3619 | "resolved": "https://registry.npmjs.org/yapool/-/yapool-1.0.0.tgz", 3620 | "integrity": "sha1-9pPymjFbUNmp2iZGp6ZkXJaYW2o=", 3621 | "dev": true 3622 | } 3623 | } 3624 | } 3625 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "contextify", 3 | "version": "1.0.0", 4 | "description": "Turn an object into a persistent execution context.", 5 | "author": "Brian McDaniel ", 6 | "contributors": [ 7 | "Assaf Arkin (http://labnotes.org/)", 8 | "Benjamin Byholm (https://research.it.abo.fi/people/bbyholm)", 9 | "Marshall Roch ", 10 | "Nathan Rajlich (http://n8.io)", 11 | "Paul Tan (https://github.com/pyokagan)", 12 | "Jeremy Stashewsky ", 13 | "Rex Morgan (http://www.rexflex.net/)", 14 | "Tom Gallacher (http://tomg.co)", 15 | "Kevin Decker (http://www.incaseofstairs.com)", 16 | "Sergei Ianovich (https://github.com/yanovich)", 17 | "Andrew Paprocki (https://github.com/apaprocki)", 18 | "Trygve Lie (https://github.com/trygve-lie)", 19 | "Ido Ben-Yair (https://github.com/idoby)", 20 | "Rod Vagg (https://r.va.gg/)", 21 | "Tomoaki Abe (https://github.com/abetomo)" 22 | ], 23 | "keywords": [ 24 | "context", 25 | "vm" 26 | ], 27 | "repository": { 28 | "type": "git", 29 | "url": "https://github.com/brianmcd/contextify.git" 30 | }, 31 | "main": "./lib/contextify", 32 | "scripts": { 33 | "test": "nodeunit test/" 34 | }, 35 | "engines": { 36 | "node": ">=6.0.0" 37 | }, 38 | "license": "MIT", 39 | "licenses": [ 40 | { 41 | "type": "MIT", 42 | "url": "http://github.com/brianmcd/contextify/blob/master/LICENSE.txt" 43 | } 44 | ], 45 | "dependencies": { 46 | "bindings": "^1.3.0", 47 | "nan": "^2.11.1" 48 | }, 49 | "devDependencies": { 50 | "nodeunit": "^0.11.3" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/contextify.cc: -------------------------------------------------------------------------------- 1 | #include "nan.h" 2 | 3 | using namespace v8; 4 | using namespace node; 5 | 6 | class ContextWrap; 7 | 8 | class ContextifyContext : public Nan::ObjectWrap { 9 | public: 10 | Nan::Persistent context; 11 | Nan::Persistent sandbox; 12 | Nan::Persistent proxyGlobal; 13 | 14 | static Nan::Persistent jsTmpl; 15 | 16 | ContextifyContext(Local sbox) { 17 | Nan::HandleScope scope; 18 | sandbox.Reset(sbox); 19 | } 20 | 21 | ~ContextifyContext() { 22 | context.Reset(); 23 | proxyGlobal.Reset(); 24 | sandbox.Reset(); 25 | 26 | // Provide a GC hint that the context has gone away. Without this call it 27 | // does not seem that the collector will touch the context until under extreme 28 | // stress. 29 | Nan::ContextDisposedNotification(); 30 | } 31 | 32 | // We override ObjectWrap::Wrap so that we can create our context after 33 | // we have a reference to our "host" JavaScript object. If we try to use 34 | // handle_ in the ContextifyContext constructor, it will be empty since it's 35 | // set in ObjectWrap::Wrap. 36 | void Wrap(Local handle); 37 | 38 | static void Init(Local target) { 39 | Nan::HandleScope scope; 40 | 41 | Local className = Nan::New("ContextifyContext").ToLocalChecked(); 42 | 43 | Local ljsTmpl = Nan::New(New); 44 | ljsTmpl->InstanceTemplate()->SetInternalFieldCount(1); 45 | ljsTmpl->SetClassName(className); 46 | Nan::SetPrototypeMethod(ljsTmpl, "run", ContextifyContext::Run); 47 | Nan::SetPrototypeMethod(ljsTmpl, "getGlobal", ContextifyContext::GetGlobal); 48 | 49 | jsTmpl.Reset(ljsTmpl); 50 | target->Set(className, ljsTmpl->GetFunction()); 51 | } 52 | 53 | static NAN_METHOD(New) { 54 | if (info.Length() < 1) 55 | return Nan::ThrowError("Wrong number of arguments passed to ContextifyContext constructor"); 56 | 57 | if (!info[0]->IsObject()) 58 | return Nan::ThrowTypeError("Argument to ContextifyContext constructor must be an object."); 59 | 60 | ContextifyContext* ctx = new ContextifyContext(info[0]->ToObject()); 61 | ctx->Wrap(info.This()); 62 | info.GetReturnValue().Set(info.This()); 63 | } 64 | 65 | static NAN_METHOD(Run) { 66 | if (info.Length() == 0) 67 | return Nan::ThrowError("Must supply at least 1 argument to run"); 68 | 69 | if (!info[0]->IsString()) 70 | return Nan::ThrowTypeError("First argument to run must be a String."); 71 | 72 | ContextifyContext* ctx = Nan::ObjectWrap::Unwrap(info.This()); 73 | Local lcontext = Nan::New(ctx->context); 74 | Context::Scope ctxScope(lcontext); 75 | Local code = info[0]->ToString(); 76 | 77 | Nan::TryCatch trycatch; 78 | Nan::MaybeLocal script; 79 | 80 | if (info.Length() > 1 && info[1]->IsString()) { 81 | ScriptOrigin origin(info[1]->ToString()); 82 | script = Nan::CompileScript(code, origin); 83 | } else { 84 | script = Nan::CompileScript(code); 85 | } 86 | 87 | if (script.IsEmpty()) { 88 | trycatch.ReThrow(); 89 | return; 90 | } 91 | 92 | Nan::MaybeLocal result = Nan::RunScript(script.ToLocalChecked()); 93 | 94 | if (result.IsEmpty()) { 95 | trycatch.ReThrow(); 96 | } else { 97 | info.GetReturnValue().Set(result.ToLocalChecked()); 98 | } 99 | } 100 | 101 | static bool InstanceOf(Local value) { 102 | return Nan::New(jsTmpl)->HasInstance(value); 103 | } 104 | 105 | static NAN_METHOD(GetGlobal) { 106 | ContextifyContext* ctx = Nan::ObjectWrap::Unwrap(info.This()); 107 | info.GetReturnValue().Set(Nan::New(ctx->proxyGlobal)); 108 | } 109 | }; 110 | 111 | // This is an object that just keeps an internal pointer to this 112 | // ContextifyContext. It's passed to the NamedPropertyHandler. If we 113 | // pass the main JavaScript context object we're embedded in, then the 114 | // NamedPropertyHandler will store a reference to it forever and keep it 115 | // from getting gc'd. 116 | class ContextWrap : public Nan::ObjectWrap { 117 | public: 118 | static void Init(void) { 119 | Nan::HandleScope scope; 120 | 121 | Local tmpl = Nan::New(); 122 | tmpl->InstanceTemplate()->SetInternalFieldCount(1); 123 | functionTemplate.Reset(tmpl); 124 | constructor.Reset(tmpl->GetFunction()); 125 | } 126 | 127 | static Local createV8Context(Local jsContextify) { 128 | Nan::EscapableHandleScope scope; 129 | Local wrapper = Nan::NewInstance(Nan::New(constructor)).ToLocalChecked(); 130 | 131 | ContextWrap *contextWrapper = new ContextWrap(); 132 | contextWrapper->Wrap(wrapper); 133 | 134 | Nan::Persistent(jsContextify).SetWeak(contextWrapper, 135 | &ContextWrap::weakCallback, 136 | Nan::WeakCallbackType::kParameter); 137 | contextWrapper->ctx = Nan::ObjectWrap::Unwrap(jsContextify); 138 | 139 | Local ftmpl = Nan::New(); 140 | ftmpl->SetHiddenPrototype(true); 141 | ftmpl->SetClassName(Nan::New(contextWrapper->ctx->sandbox)->GetConstructorName()); 142 | Local otmpl = ftmpl->InstanceTemplate(); 143 | Nan::SetNamedPropertyHandler(otmpl, 144 | GlobalPropertyGetter, 145 | GlobalPropertySetter, 146 | GlobalPropertyQuery, 147 | GlobalPropertyDeleter, 148 | GlobalPropertyEnumerator, 149 | wrapper); 150 | #if NODE_MODULE_VERSION <= NODE_6_0_MODULE_VERSION 151 | otmpl->SetAccessCheckCallbacks(GlobalPropertyNamedAccessCheck, 152 | GlobalPropertyIndexedAccessCheck); 153 | #else 154 | NamedPropertyHandlerConfiguration namedPropertyHandlerConfiguration; 155 | IndexedPropertyHandlerConfiguration indexedPropertyHandlerConfiguration; 156 | otmpl->SetAccessCheckCallbackAndHandler(AccessCheckCallback, 157 | namedPropertyHandlerConfiguration, 158 | indexedPropertyHandlerConfiguration); 159 | #endif 160 | return scope.Escape(Nan::New(static_cast(NULL), otmpl)); 161 | } 162 | 163 | private: 164 | ContextWrap() :ctx(NULL) {} 165 | 166 | ~ContextWrap() { 167 | } 168 | 169 | #if NODE_MODULE_VERSION <= NODE_6_0_MODULE_VERSION 170 | static bool GlobalPropertyNamedAccessCheck(Local host, 171 | Local key, 172 | AccessType type, 173 | Local data) { 174 | return true; 175 | } 176 | 177 | static bool GlobalPropertyIndexedAccessCheck(Local host, 178 | uint32_t key, 179 | AccessType type, 180 | Local data) { 181 | return true; 182 | } 183 | #else 184 | static bool AccessCheckCallback(Local accessing_context, 185 | Local accessed_object, 186 | Local data) { 187 | return true; 188 | } 189 | #endif 190 | 191 | static void GlobalPropertyGetter(Local property, 192 | const Nan::PropertyCallbackInfo& info) { 193 | Local data = info.Data()->ToObject(); 194 | ContextifyContext* ctx = Nan::ObjectWrap::Unwrap(data)->ctx; 195 | 196 | if (!ctx) 197 | return; 198 | 199 | Nan::MaybeLocal rv = Nan::GetRealNamedProperty(Nan::New(ctx->sandbox), 200 | property); 201 | if (rv.IsEmpty()) 202 | return; 203 | 204 | info.GetReturnValue().Set(rv.ToLocalChecked()); 205 | } 206 | 207 | static void GlobalPropertySetter(Local property, Local value, 208 | const Nan::PropertyCallbackInfo& info) { 209 | Local data = info.Data()->ToObject(); 210 | ContextifyContext* ctx = Nan::ObjectWrap::Unwrap(data)->ctx; 211 | 212 | if (!ctx) 213 | return; 214 | 215 | Nan::New(ctx->sandbox)->Set(property, value); 216 | info.GetReturnValue().Set(value); 217 | } 218 | 219 | static void GlobalPropertyQuery(Local property, 220 | const Nan::PropertyCallbackInfo& info) { 221 | Local data = info.Data()->ToObject(); 222 | ContextifyContext* ctx = Nan::ObjectWrap::Unwrap(data)->ctx; 223 | 224 | if (!ctx) 225 | return info.GetReturnValue().Set(Nan::New(None)); 226 | 227 | if (!Nan::GetRealNamedProperty(Nan::New(ctx->sandbox), property).IsEmpty() || 228 | !Nan::GetRealNamedProperty(Nan::New(ctx->proxyGlobal), property).IsEmpty()) { 229 | info.GetReturnValue().Set(Nan::New(None)); 230 | } else { 231 | info.GetReturnValue().Set(Local()); 232 | } 233 | } 234 | 235 | static void GlobalPropertyDeleter(Local property, 236 | const Nan::PropertyCallbackInfo& info) { 237 | Local data = info.Data()->ToObject(); 238 | ContextifyContext* ctx = Nan::ObjectWrap::Unwrap(data)->ctx; 239 | 240 | if (!ctx) 241 | return info.GetReturnValue().Set(Nan::New(false)); 242 | 243 | bool success = Nan::New(ctx->sandbox)->Delete(property); 244 | info.GetReturnValue().Set(Nan::New(success)); 245 | } 246 | 247 | static void GlobalPropertyEnumerator(const Nan::PropertyCallbackInfo& info) { 248 | Local data = info.Data()->ToObject(); 249 | ContextifyContext* ctx = Nan::ObjectWrap::Unwrap(data)->ctx; 250 | 251 | if (!ctx) { 252 | Local blank = Array::New(0); 253 | return info.GetReturnValue().Set(blank); 254 | } 255 | 256 | info.GetReturnValue().Set(Nan::New(ctx->sandbox)->GetPropertyNames()); 257 | } 258 | 259 | static void weakCallback(const Nan::WeakCallbackInfo& data) { 260 | ContextWrap *self = data.GetParameter(); 261 | self->ctx = NULL; 262 | } 263 | 264 | static Nan::Persistent functionTemplate; 265 | static Nan::Persistent constructor; 266 | ContextifyContext *ctx; 267 | }; 268 | 269 | Nan::Persistent ContextWrap::functionTemplate; 270 | Nan::Persistent ContextWrap::constructor; 271 | 272 | void ContextifyContext::Wrap(Local handle) { 273 | Nan::ObjectWrap::Wrap(handle); 274 | Local lcontext = ContextWrap::createV8Context(handle); 275 | context.Reset(lcontext); 276 | proxyGlobal.Reset(lcontext->Global()); 277 | } 278 | 279 | class ContextifyScript : public Nan::ObjectWrap { 280 | public: 281 | static Nan::Persistent scriptTmpl; 282 | Nan::Persistent script; 283 | 284 | static void Init(Local target) { 285 | Nan::HandleScope scope; 286 | 287 | Local className = Nan::New("ContextifyScript").ToLocalChecked(); 288 | 289 | Local lscriptTmpl = Nan::New(New); 290 | lscriptTmpl->InstanceTemplate()->SetInternalFieldCount(1); 291 | lscriptTmpl->SetClassName(className); 292 | 293 | Nan::SetPrototypeMethod(lscriptTmpl, "runInContext", RunInContext); 294 | 295 | scriptTmpl.Reset(lscriptTmpl); 296 | target->Set(className, lscriptTmpl->GetFunction()); 297 | } 298 | static NAN_METHOD(New) { 299 | ContextifyScript *contextify_script = new ContextifyScript(); 300 | contextify_script->Wrap(info.Holder()); 301 | 302 | if (info.Length() < 1) 303 | return Nan::ThrowTypeError("needs at least 'code' argument."); 304 | 305 | Local code = info[0]->ToString(); 306 | 307 | Nan::TryCatch trycatch; 308 | 309 | Nan::MaybeLocal filename = info.Length() > 1 310 | ? info[1]->ToString() 311 | : Nan::New("ContextifyScript."); 312 | 313 | if (filename.IsEmpty()) { 314 | trycatch.ReThrow(); 315 | return; 316 | } 317 | 318 | Local context = Nan::GetCurrentContext(); 319 | Context::Scope context_scope(context); 320 | 321 | ScriptOrigin origin(filename.ToLocalChecked()); 322 | Nan::MaybeLocal v8_script = Nan::New(code, origin); 323 | 324 | if (v8_script.IsEmpty()) { 325 | trycatch.ReThrow(); 326 | return; 327 | } 328 | 329 | contextify_script->script.Reset(v8_script.ToLocalChecked()); 330 | 331 | info.GetReturnValue().Set(info.This()); 332 | } 333 | 334 | static NAN_METHOD(RunInContext) { 335 | if (info.Length() == 0) 336 | return Nan::ThrowError("Must supply at least 1 argument to runInContext"); 337 | 338 | if (!ContextifyContext::InstanceOf(info[0]->ToObject())) 339 | return Nan::ThrowTypeError("First argument must be a ContextifyContext."); 340 | 341 | ContextifyContext* ctx = Nan::ObjectWrap::Unwrap(info[0]->ToObject()); 342 | Local lcontext = Nan::New(ctx->context); 343 | 344 | Context::Scope scope(lcontext); 345 | 346 | ContextifyScript* wrapped_script = Nan::ObjectWrap::Unwrap(info.This()); 347 | Nan::MaybeLocal script = Nan::New(wrapped_script->script); 348 | 349 | Nan::TryCatch trycatch; 350 | 351 | if (script.IsEmpty()) { 352 | trycatch.ReThrow(); 353 | return; 354 | } 355 | 356 | Nan::MaybeLocal result = Nan::RunScript(script.ToLocalChecked()); 357 | 358 | if (result.IsEmpty()) { 359 | trycatch.ReThrow(); 360 | } else { 361 | info.GetReturnValue().Set(result.ToLocalChecked()); 362 | } 363 | } 364 | 365 | ~ContextifyScript() { 366 | script.Reset(); 367 | } 368 | }; 369 | 370 | Nan::Persistent ContextifyContext::jsTmpl; 371 | Nan::Persistent ContextifyScript::scriptTmpl; 372 | 373 | extern "C" { 374 | static void init(Local target) { 375 | ContextifyContext::Init(target); 376 | ContextifyScript::Init(target); 377 | ContextWrap::Init(); 378 | } 379 | 380 | NODE_MODULE(contextify, init) 381 | }; 382 | -------------------------------------------------------------------------------- /test/contextify.js: -------------------------------------------------------------------------------- 1 | var Contextify = require('../lib/contextify.js'); 2 | 3 | exports['basic tests'] = { 4 | // Creating a context shouldn't fail. 5 | 'blank context' : function (test) { 6 | var ctx = Contextify({}); 7 | test.notEqual(ctx, null); 8 | test.notEqual(ctx, undefined); 9 | test.done(); 10 | }, 11 | 12 | // Creating a context with sandbox shouldn't change existing sandbox 13 | // properties. 14 | 'basic context' : function (test) { 15 | var sandbox = { 16 | prop1 : 'prop1', 17 | prop2 : 'prop2' 18 | }; 19 | Contextify(sandbox); 20 | test.equal(sandbox.prop1, 'prop1'); 21 | test.equal(sandbox.prop2, 'prop2'); 22 | test.done(); 23 | }, 24 | 25 | 'basic createContext' : function (test) { 26 | var sandbox = { 27 | prop1: 'prop1', 28 | prop2: 'prop2' 29 | }; 30 | var context = Contextify.createContext(sandbox); 31 | test.equal(sandbox.prop1, 'prop1'); 32 | test.equal(sandbox.prop2, 'prop2'); 33 | test.done(); 34 | }, 35 | 36 | // Ensure that the correct properties exist on a wrapped sandbox. 37 | 'test contextified object extra properties' : function (test) { 38 | var sandbox = Contextify({}); 39 | test.notEqual(sandbox.run, undefined); 40 | test.notEqual(sandbox.getGlobal, undefined); 41 | test.notEqual(sandbox.dispose, undefined); 42 | test.done(); 43 | }, 44 | 45 | 'createContext should not modify the sandbox' : function (test) { 46 | var sandbox = {}; 47 | Contextify.createContext(sandbox); 48 | test.equal(sandbox.run, undefined); 49 | test.equal(sandbox.getGlobal, undefined); 50 | test.equal(sandbox.dispose, undefined); 51 | test.done(); 52 | }, 53 | 54 | // Passing undefined should create an empty context. 55 | 'test undefined sandbox' : function (test) { 56 | // Should return an empty object. 57 | test.notEqual(Contextify(undefined, undefined), undefined); 58 | test.notEqual(Contextify(), undefined); 59 | test.done(); 60 | }, 61 | 62 | 'sandbox prototype properties should be searched' : function (test) { 63 | var sandbox = {}; 64 | sandbox.__proto__ = { 65 | prop1 : 'test' 66 | }; 67 | Contextify(sandbox); 68 | test.equal(sandbox.getGlobal().prop1, 'test'); 69 | test.done(); 70 | }, 71 | 72 | // Make sure properties that aren't there...aren't there. 73 | 'test for nonexistent properties' : function (test) { 74 | var global = Contextify({}).getGlobal(); 75 | test.equal(global.test1, undefined); 76 | test.done(); 77 | }, 78 | 79 | // Make sure properties with value "undefined" are there. 80 | 'test for "undefined" properties' : function (test) { 81 | var sandbox = { x: undefined }; 82 | Contextify(sandbox); 83 | sandbox.run("_x = x"); 84 | test.equal(sandbox._x, undefined); 85 | test.done(); 86 | }, 87 | 88 | 'test for "undefined" properties with createContext' : function (test) { 89 | var sandbox = { x: undefined }; 90 | var context = Contextify.createContext(sandbox); 91 | context.run("_x = x"); 92 | test.equal(sandbox._x, undefined); 93 | test.done(); 94 | }, 95 | 96 | 'test for "undefined" variables' : function (test) { 97 | var sandbox = { }; 98 | Contextify(sandbox); 99 | // In JavaScript a declared variable is set to 'undefined'. 100 | sandbox.run("var y; (function() { var _y ; y = _y })()"); 101 | test.equal(sandbox._y, undefined); 102 | // This should apply to top-level variables (global properties). 103 | sandbox.run("var z; _z = z"); 104 | test.equal(sandbox._z, undefined); 105 | // Make sure nothing wacky happens when accessing global declared but 106 | // undefined variables. 107 | test.equal(sandbox.getGlobal().z, undefined); 108 | test.done(); 109 | }, 110 | 111 | // Make sure run can be called with a filename parameter. 112 | 'test run with filename' : function (test) { 113 | var sandbox = Contextify(); 114 | sandbox.run('var x = 3', "test.js"); 115 | test.equal(sandbox.x, 3); 116 | test.done(); 117 | }, 118 | 119 | // Make sure run can be called on a context 120 | 'test run with createContext' : function (test) { 121 | var sandbox = {}; 122 | var context = Contextify.createContext(sandbox); 123 | context.run('var x = 3', "test.js"); 124 | test.equal(sandbox.x, 3); 125 | test.done(); 126 | }, 127 | 128 | // Make sure getters/setters on the sandbox object are used. 129 | 'test accessors on sandbox' : function (test) { 130 | var sandbox = {}; 131 | sandbox.__defineGetter__('test', function () { return 3;}); 132 | sandbox.__defineSetter__('test2', function (val) { this.x = val;}); 133 | Contextify(sandbox); 134 | var global = sandbox.getGlobal(); 135 | test.equal(global.test, 3); 136 | sandbox.test2 = 5; 137 | test.equal(sandbox.x, 5); 138 | global.test2 = 7; 139 | test.equal(global.x, 7); 140 | test.equal(sandbox.x, 7); 141 | test.done(); 142 | }, 143 | 144 | // Make sure dispose cleans up the sandbox. 145 | 'test dispose' : function (test) { 146 | var sandbox = Contextify(); 147 | test.notEqual(sandbox.run, undefined); 148 | test.notEqual(sandbox.getGlobal, undefined); 149 | test.notEqual(sandbox.dispose, undefined); 150 | sandbox.dispose(); 151 | test.throws(function () { 152 | sandbox.run(); 153 | }, Error); 154 | test.throws(function () { 155 | sandbox.getGlobal(); 156 | }, Error); 157 | test.throws(function () { 158 | sandbox.dispose(); 159 | }, Error); 160 | test.done(); 161 | } 162 | }; 163 | 164 | exports['synchronous script tests'] = { 165 | // Synchronous context script execution: 166 | // Ensure that global variables are put on the sandbox object. 167 | 'global variables in scripts should go on sandbox' : function (test) { 168 | var sandbox = { 169 | prop1 : 'prop1', 170 | prop2 : 'prop2' 171 | }; 172 | Contextify(sandbox); 173 | sandbox.run('x = 3'); 174 | test.equal(sandbox.x, 3); 175 | test.done(); 176 | }, 177 | 178 | // Synchronous context script execution: 179 | // Ensure that sandbox properties can be accessed as global variables. 180 | 'sandbox properties should be globals' : function (test) { 181 | var sandbox = { 182 | prop1 : 'prop1', 183 | prop2 : 'prop2' 184 | }; 185 | Contextify(sandbox); 186 | sandbox.run("test1 = (prop1 == 'prop1');" + 187 | "test2 = (prop2 == 'prop2');"); 188 | test.ok(sandbox.test1); 189 | test.ok(sandbox.test2); 190 | test.done(); 191 | } 192 | }; 193 | 194 | exports['asynchronous script tests'] = { 195 | // Asynchronous context script execution: 196 | // Ensure that global variables are put on the sandbox object. 197 | 'global variables in scripts should go on sandbox' : function (test) { 198 | var sandbox = { 199 | setTimeout : setTimeout, 200 | prop1 : 'prop1', 201 | prop2 : 'prop2' 202 | }; 203 | Contextify(sandbox); 204 | sandbox.run('setTimeout(function () {x = 3}, 0);'); 205 | test.equal(sandbox.x, undefined); 206 | setTimeout(function () { 207 | test.equal(sandbox.x, 3); 208 | test.done(); 209 | }, 0); 210 | }, 211 | 212 | // Asynchronous context script execution: 213 | // Ensure that sandbox properties can be accessed as global variables. 214 | 'sandbox properties should be globals' : function (test) { 215 | var sandbox = { 216 | setTimeout : setTimeout, 217 | prop1 : 'prop1', 218 | prop2 : 'prop2' 219 | }; 220 | Contextify(sandbox); 221 | sandbox.run("setTimeout(function () {" + 222 | "test1 = (prop1 == 'prop1');" + 223 | "test2 = (prop2 == 'prop2');" + 224 | "}, 0)"); 225 | test.equal(sandbox.test1, undefined); 226 | test.equal(sandbox.test2, undefined); 227 | setTimeout(function () { 228 | test.ok(sandbox.test1); 229 | test.ok(sandbox.test2); 230 | test.done(); 231 | }, 0); 232 | }, 233 | 234 | // Asynchronous context script execution: 235 | // Ensure that sandbox properties can be accessed as global variables. 236 | 'createContext: sandbox properties should be globals' : function (test) { 237 | var sandbox = { 238 | setTimeout : setTimeout, 239 | prop1 : 'prop1', 240 | prop2 : 'prop2' 241 | }; 242 | var context = Contextify.createContext(sandbox); 243 | context.run("setTimeout(function () {" + 244 | "test1 = (prop1 == 'prop1');" + 245 | "test2 = (prop2 == 'prop2');" + 246 | "}, 0)"); 247 | test.equal(sandbox.test1, undefined); 248 | test.equal(sandbox.test2, undefined); 249 | setTimeout(function () { 250 | test.ok(sandbox.test1); 251 | test.ok(sandbox.test2); 252 | test.done(); 253 | }, 0); 254 | }, 255 | 256 | // Asynchronous context script execution: 257 | // Ensure that async execution is safely executed after dispose 258 | 'setTimeout should not fail after dispose' : function (test) { 259 | var sandbox = { 260 | test: test, 261 | setTimeout : setTimeout, 262 | prop1 : 'prop1', 263 | prop2 : 'prop2' 264 | }; 265 | Contextify(sandbox); 266 | sandbox.run("setTimeout(function () {" + 267 | "test.ok(prop1 == 'prop1');" + 268 | "test.ok(prop2 == 'prop2');" + 269 | "test.done();" + 270 | "}, 10)"); 271 | test.equal(sandbox.test1, undefined); 272 | test.equal(sandbox.test2, undefined); 273 | sandbox.dispose(); 274 | } 275 | }; 276 | 277 | exports['test global'] = { 278 | // Make sure getGlobal() works. 279 | 'basic test' : function (test) { 280 | var sandbox = { 281 | prop1 : 'prop1', 282 | prop2 : 'prop2' 283 | }; 284 | Contextify(sandbox); 285 | var global = sandbox.getGlobal(); 286 | test.notEqual(global, null); 287 | test.notEqual(global, undefined); 288 | // Make sure global is forwarding properly. 289 | test.equal(global.prop1, 'prop1'); 290 | test.equal(global.prop2, 'prop2'); 291 | global.prop3 = 'prop3'; 292 | test.equal(sandbox.prop3, 'prop3'); 293 | test.done(); 294 | }, 295 | 296 | // Make sure that references to the global are correct. 297 | 'self references to the global object' : function (test) { 298 | var sandbox = Contextify({}); 299 | var global = sandbox.getGlobal(); 300 | sandbox.ref1 = global; 301 | sandbox.ref2 = { 302 | ref2 : global 303 | }; 304 | sandbox.run("test1 = (this == ref1);" + 305 | "test2 = (this == ref2.ref2);"); 306 | test.ok(sandbox.test1); 307 | test.ok(sandbox.test2); 308 | test.done(); 309 | }, 310 | 311 | // Make sure the enumerator is enumerating correctly. 312 | 'test enumerator' : function (test) { 313 | var sandbox = { 314 | prop1 : 'prop1', 315 | prop2 : 'prop2' 316 | }; 317 | var global = Contextify(sandbox).getGlobal(); 318 | var globalProps = Object.keys(global); 319 | test.equal(globalProps.length, 5); 320 | test.ok(globalProps.indexOf('prop1') != -1); 321 | test.ok(globalProps.indexOf('prop2') != -1); 322 | test.ok(globalProps.indexOf('run') != -1); 323 | test.ok(globalProps.indexOf('getGlobal') != -1); 324 | test.ok(globalProps.indexOf('dispose') != -1); 325 | test.done(); 326 | }, 327 | 328 | // Make sure deleter is working. 329 | 'test deleter' : function (test) { 330 | var sandbox = { 331 | prop1 : 'prop1', 332 | prop2 : 'prop2' 333 | }; 334 | var global = Contextify(sandbox).getGlobal(); 335 | test.equal(Object.keys(global).length, 5); 336 | test.equal(Object.keys(sandbox).length, 5); 337 | delete global.prop1; 338 | test.equal(Object.keys(global).length, 4); 339 | test.equal(Object.keys(sandbox).length, 4); 340 | delete global.prop2; 341 | test.equal(Object.keys(global).length, 3); 342 | test.equal(Object.keys(sandbox).length, 3); 343 | delete global.run; 344 | test.equal(Object.keys(global).length, 2); 345 | test.equal(Object.keys(sandbox).length, 2); 346 | delete global.getGlobal; 347 | test.equal(Object.keys(global).length, 1); 348 | test.equal(Object.keys(sandbox).length, 1); 349 | delete global.dispose; 350 | test.equal(Object.keys(global).length, 0); 351 | test.equal(Object.keys(sandbox).length, 0); 352 | test.done(); 353 | }, 354 | 355 | // Make sure the global's class name is the same as the sandbox. 356 | 'test global class name' : function (test) { 357 | function DOMWindow () {}; 358 | var sandbox = Contextify(new DOMWindow()); 359 | var global = sandbox.getGlobal(); 360 | test.equal(sandbox.constructor.name, 'DOMWindow'); 361 | test.equal(sandbox.constructor.name, global.constructor.name); 362 | sandbox.run('thisName = this.constructor.name'); 363 | test.equal(sandbox.thisName, sandbox.constructor.name); 364 | test.done(); 365 | }, 366 | 367 | // Make sure functions in global scope are accessible through global. 368 | 'test global functions' : function (test) { 369 | var sandbox = Contextify(); 370 | var global = sandbox.getGlobal(); 371 | sandbox.run("function testing () {}"); 372 | test.notEqual(global.testing, undefined); 373 | test.done(); 374 | }, 375 | 376 | // Make sure global can be a receiver for run(). 377 | 'test global.run()' : function (test) { 378 | var global = Contextify().getGlobal(); 379 | global.run("x = 5"); 380 | test.equal(global.x, 5); 381 | test.done(); 382 | }, 383 | 384 | // Make sure global can be a receiver for getGlobal(). 385 | 'test global.getGlobal()' : function (test) { 386 | var global = Contextify().getGlobal(); 387 | test.deepEqual(global, global.getGlobal()); 388 | test.done(); 389 | }, 390 | 391 | //Make sure global can be a receiver for dispose(). 392 | 'test global.dispose()' : function (test) { 393 | var sandbox = Contextify(); 394 | var global = sandbox.getGlobal(); 395 | test.notEqual(global.run, undefined); 396 | test.notEqual(global.getGlobal, undefined); 397 | test.notEqual(global.dispose, undefined); 398 | global.dispose(); 399 | // It's not safe to use the global after disposing. 400 | test.throws(function () { 401 | sandbox.run(); 402 | }, Error); 403 | test.throws(function () { 404 | sandbox.getGlobal(); 405 | }, Error); 406 | test.throws(function () { 407 | sandbox.dispose(); 408 | }, Error); 409 | test.done(); 410 | }, 411 | 412 | 'test context delete global' : function (test) { 413 | var sandbox = Contextify({}); 414 | sandbox.global = sandbox.getGlobal(); 415 | sandbox.run('delete global.global;'); 416 | test.ok(!sandbox.global); 417 | sandbox.dispose(); 418 | test.done(); 419 | }, 420 | 421 | 'test context delete unwritable global' : function (test) { 422 | var sandbox = Contextify({}); 423 | Object.defineProperty(sandbox, 'global', { 424 | enumerable: false, 425 | configurable: false, 426 | writable: false, 427 | value: sandbox.getGlobal() 428 | }); 429 | 430 | sandbox.run('delete global.global;'); 431 | test.ok(sandbox.global); 432 | test.ok(sandbox.global.global); 433 | sandbox.dispose(); 434 | test.done(); 435 | } 436 | }; 437 | 438 | 439 | // Test that multiple contexts don't interfere with each other. 440 | exports['test multiple contexts'] = function (test) { 441 | var sandbox1 = { 442 | prop1 : 'prop1', 443 | prop2 : 'prop2' 444 | }; 445 | var sandbox2 = { 446 | prop1 : 'prop1', 447 | prop2 : 'prop2' 448 | }; 449 | var global1 = Contextify(sandbox1).getGlobal(); 450 | var global2 = Contextify(sandbox2).getGlobal(); 451 | test.equal(global1.prop1, 'prop1'); 452 | test.equal(global2.prop1, 'prop1'); 453 | sandbox1.run('test = 3'); 454 | sandbox2.run('test = 4'); 455 | test.equal(sandbox1.test, 3); 456 | test.equal(global1.test, 3); 457 | test.equal(sandbox2.test, 4); 458 | test.equal(global2.test, 4); 459 | test.done(); 460 | }; 461 | 462 | // Test console - segfaults in REPL. 463 | exports['test console'] = function (test) { 464 | var sandbox = { 465 | console : console, 466 | prop1 : 'prop1' 467 | }; 468 | Contextify(sandbox); 469 | test.doesNotThrow(function () { 470 | sandbox.run('console.log(prop1);'); 471 | }); 472 | test.done(); 473 | }; 474 | 475 | 476 | // Test eval scope. 477 | exports['test eval'] = { 478 | 'basic test' : function (test) { 479 | var sandbox = Contextify(); 480 | sandbox.run('eval("test1 = 1")'); 481 | test.equal(sandbox.test1, 1); 482 | sandbox.run('(function() { eval("test2 = 2") })()'); 483 | test.equal(sandbox.test2, 2); 484 | test.done(); 485 | }, 486 | 487 | 'this test' : function (test) { 488 | var sandbox = Contextify(); 489 | sandbox.run('e = eval ; e("test1 = 1")'); 490 | test.equal(sandbox.test1, 1); 491 | sandbox.run('var t = 1 ; (function() { var t = 2; test2 = eval("t") })()'); 492 | test.equal(sandbox.test2, 2); 493 | sandbox.run('t = 1 ; (function() { var t = 2; e = eval; test3 = e("t") })()'); 494 | test.equal(sandbox.test3, 1); 495 | sandbox.run('var t = 1 ; global = this; (function() { var t = 2; e = eval; test4 = global.eval.call(global, "t") })()'); 496 | test.equal(sandbox.test4, 1); 497 | test.done(); 498 | } 499 | }; 500 | 501 | 502 | // Make sure exceptions get thrown for invalid scripts. 503 | exports['test exceptions'] = { 504 | 'basic test' : function (test) { 505 | var sandbox = Contextify(); 506 | // Exceptions thrown from "run" will be from the Contextified context. 507 | var ReferenceError = sandbox.run('ReferenceError'); 508 | var SyntaxError = sandbox.run('SyntaxError'); 509 | test.throws(function () { 510 | sandbox.run('doh'); 511 | }, ReferenceError); 512 | test.throws(function () { 513 | sandbox.run('x = y'); 514 | }, ReferenceError); 515 | test.throws(function () { 516 | sandbox.run('function ( { (( }{);'); 517 | }, SyntaxError); 518 | test.done(); 519 | }, 520 | 521 | 'test double dispose() - sandbox' : function (test) { 522 | var sandbox = Contextify(); 523 | test.doesNotThrow(function () { 524 | sandbox.dispose(); 525 | }); 526 | test.throws(function () { 527 | sandbox.dispose(); 528 | }, 'Called dispose() twice.'); 529 | test.done(); 530 | }, 531 | 532 | 'test double dispose - global' : function (test) { 533 | var sandbox = Contextify(); 534 | var global = sandbox.getGlobal(); 535 | test.doesNotThrow(function () { 536 | global.dispose(); 537 | }); 538 | test.throws(function () { 539 | global.dispose(); 540 | }, 'Called dispose() twice.'); 541 | test.done(); 542 | }, 543 | 544 | 'test run() after dispose()' : function (test) { 545 | var sandbox = Contextify(); 546 | test.doesNotThrow(function () { 547 | sandbox.dispose(); 548 | }); 549 | test.throws(function () { 550 | sandbox.run('var x = 3'); 551 | }, 'Called run() after dispose().'); 552 | test.done(); 553 | }, 554 | 555 | 'test getGlobal() after dispose()' : function (test) { 556 | var sandbox = Contextify(); 557 | test.doesNotThrow(function () { 558 | sandbox.dispose(); 559 | }); 560 | test.throws(function () { 561 | var g = sandbox.getGlobal(); 562 | }, 'Called getGlobal() after dispose().'); 563 | test.done(); 564 | } 565 | }; 566 | 567 | exports['test scripts'] = { 568 | 'test createScript()' : function (test) { 569 | var script = Contextify.createScript('var x = 3', 'test.js'); 570 | test.equal(typeof script.runInContext, 'function'); 571 | test.done(); 572 | }, 573 | 574 | 'test createScript() without code' : function (test) { 575 | test.throws(function () { 576 | Contextify.createScript(); 577 | }); 578 | test.throws(function () { 579 | Contextify.createScript(true); 580 | }); 581 | test.throws(function () { 582 | Contextify.createScript(null); 583 | }); 584 | test.throws(function () { 585 | Contextify.createScript(1); 586 | }); 587 | test.done(); 588 | }, 589 | 590 | 'test runInContext' : function (test) { 591 | var sandbox = {}; 592 | var script = Contextify.createScript('var x = 3', 'test.js'); 593 | var context = Contextify.createContext(sandbox); 594 | script.runInContext(context); 595 | test.equal(sandbox.x, 3); 596 | test.done(); 597 | } 598 | }; 599 | --------------------------------------------------------------------------------