├── .beautifyrc ├── .gitignore ├── .jscsrc ├── .jshintrc ├── .npmignore ├── .vscode ├── launch.json └── settings.json ├── Gruntfile.js ├── LICENSE ├── README.md ├── appveyor.yml ├── elevate.gif ├── fileassoc.jpg ├── index.js ├── jsconfig.json ├── lib ├── error.js ├── key.js ├── native │ ├── adv_api.js │ └── shell32.js ├── registry.js ├── types.js ├── utils.js └── windef.js ├── package-lock.json ├── package.json └── test ├── key.js ├── mock ├── adv_api.js ├── ffi.js └── shell32.js ├── registry.js ├── test_helper.js └── utils.js /.beautifyrc: -------------------------------------------------------------------------------- 1 | { 2 | "js": { 3 | "indentChar": " ", 4 | "indentLevel": 0, 5 | "indentSize": 4, 6 | "indentWithTabs": false, 7 | "space_after_anon_function": "true" 8 | } 9 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # node-waf configuration 20 | .lock-wscript 21 | 22 | # Compiled binary addons (http://nodejs.org/api/addons.html) 23 | build/Release 24 | 25 | # Dependency directory 26 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 27 | node_modules 28 | -------------------------------------------------------------------------------- /.jscsrc: -------------------------------------------------------------------------------- 1 | { 2 | "disallowEmptyBlocks": true, 3 | "disallowKeywords": [ 4 | "with" 5 | ], 6 | "disallowKeywordsOnNewLine": [ 7 | "else" 8 | ], 9 | "disallowMixedSpacesAndTabs": true, 10 | "disallowMultipleLineBreaks": true, 11 | "disallowNewlineBeforeBlockStatements": true, 12 | "disallowPaddingNewlinesInBlocks": true, 13 | "disallowQuotedKeysInObjects": true, 14 | "disallowSpaceAfterObjectKeys": true, 15 | "disallowSpaceAfterPrefixUnaryOperators": true, 16 | "disallowSpaceBeforeBinaryOperators": [ 17 | ], 18 | "disallowSpaceBeforePostfixUnaryOperators": true, 19 | "disallowSpacesInFunctionDeclaration": { 20 | "beforeOpeningRoundBrace": true 21 | }, 22 | "disallowSpacesInNamedFunctionExpression": { 23 | "beforeOpeningRoundBrace": true 24 | }, 25 | "disallowSpacesInsideArrayBrackets": true, 26 | "disallowSpacesInsideObjectBrackets": "all", 27 | "disallowSpacesInsideParentheses": true, 28 | "disallowTrailingComma": true, 29 | "disallowTrailingWhitespace": true, 30 | "disallowYodaConditions": true, 31 | "requireBlocksOnNewline": 1, 32 | "requireCamelCaseOrUpperCaseIdentifiers": "ignoreProperties", 33 | "requireCapitalizedConstructors": true, 34 | "requireCommaBeforeLineBreak": true, 35 | "requireCurlyBraces": [ 36 | "if", 37 | "else", 38 | "for", 39 | "while", 40 | "do", 41 | "try", 42 | "catch" 43 | ], 44 | "requireDotNotation": true, 45 | "requireLineFeedAtFileEnd": true, 46 | "requireParenthesesAroundIIFE": true, 47 | "requireSpaceAfterBinaryOperators": true, 48 | "requireSpaceAfterKeywords": [ 49 | "else", 50 | "for", 51 | "while", 52 | "do", 53 | "switch", 54 | "case", 55 | "return", 56 | "try", 57 | "function", 58 | "typeof" 59 | ], 60 | "requireSpaceAfterLineComment": "allowSlash", 61 | "requireSpaceBeforeBinaryOperators": true, 62 | "requireSpaceBeforeBlockStatements": true, 63 | "requireSpacesInAnonymousFunctionExpression": { 64 | "beforeOpeningRoundBrace": true 65 | }, 66 | "requireSpacesInConditionalExpression": true, 67 | "safeContextKeyword": [ 68 | "self" 69 | ], 70 | "validateIndentation": 4, 71 | "validateQuoteMarks": "'", 72 | "esnext": true 73 | } 74 | 75 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "esnext": true, 3 | "node": true, 4 | "browser": true, 5 | "nomen": false, 6 | "bitwise": true, 7 | "eqeqeq": true, 8 | "forin": true, 9 | "immed": true, 10 | "latedef": true, 11 | "newcap": true, 12 | "noarg": true, 13 | "noempty": true, 14 | "nonew": true, 15 | "plusplus": true, 16 | "regexp": true, 17 | "undef": true, 18 | "unused": true, 19 | "trailing": true, 20 | "indent": 4, 21 | "onevar": true, 22 | "white": true, 23 | "quotmark": "single", 24 | "predef": { 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | test 3 | .beautifyrc 4 | .jscsrc 5 | .jshintrc 6 | .npmignore 7 | appveyor.yml 8 | *.gif 9 | *.jpg 10 | Gruntfile.js 11 | jsconfig.json 12 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.1.0", 3 | // List of configurations. Add new configurations or edit existing ones. 4 | // ONLY "node" and "mono" are supported, change "type" to switch. 5 | "configurations": [ 6 | { 7 | // Name of configuration; appears in the launch configuration drop down menu. 8 | "name": "Launch index.js", 9 | // Type of configuration. Possible values: "node", "mono". 10 | "type": "node", 11 | // Workspace relative or absolute path to the program. 12 | "program": "node_modules\\grunt-cli\\bin\\grunt", 13 | // Automatically stop program after launch. 14 | "stopOnEntry": true, 15 | // Command line arguments passed to the program. 16 | "args": ["unitTest"], 17 | // Workspace relative or absolute path to the working directory of the program being debugged. Default is the current workspace. 18 | "cwd": ".", 19 | // Workspace relative or absolute path to the runtime executable to be used. Default is the runtime executable on the PATH. 20 | "runtimeExecutable": null, 21 | // Optional arguments passed to the runtime executable. 22 | "runtimeArgs": ["--nolazy"], 23 | // Environment variables passed to the program. 24 | "env": { 25 | "NODE_ENV": "development" 26 | }, 27 | // Use JavaScript source maps (if they exist). 28 | "sourceMaps": false, 29 | // If JavaScript source maps are enabled, the generated code is expected in this directory. 30 | "outDir": null 31 | }, 32 | { 33 | "name": "Attach", 34 | "type": "node", 35 | // TCP/IP address. Default is "localhost". 36 | "address": "localhost", 37 | // Port to attach to. 38 | "port": 5858, 39 | "sourceMaps": false 40 | } 41 | ] 42 | } 43 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "search.excludeFolders": [ 4 | ".git", 5 | "node_modules", 6 | "bower_components", 7 | "dist", 8 | "cache", 9 | "tmp" 10 | ], 11 | "editor.tabSize": 4, 12 | "editor.insertSpaces": true 13 | } 14 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | var grunt = require('grunt'); 2 | require('load-grunt-tasks')(grunt); 3 | var files = ['lib/**/*.js', 'app.js', 'test/**/*.js']; 4 | 5 | grunt.initConfig({ 6 | mochacli: { 7 | options: { 8 | timeout: 2000, 9 | reporter: 'spec', 10 | bail: true 11 | }, 12 | all: ['test/*.js'] 13 | }, 14 | jshint: { 15 | files: files, 16 | options: { 17 | jshintrc: './.jshintrc' 18 | } 19 | }, 20 | jscs: { 21 | files: { 22 | src: files 23 | }, 24 | options: { 25 | config: '.jscsrc', 26 | esnext: true 27 | } 28 | }, 29 | jsbeautifier: { 30 | test: { 31 | files: { 32 | src: files 33 | }, 34 | options: { 35 | mode: 'VERIFY_ONLY', 36 | config: '.beautifyrc' 37 | } 38 | }, 39 | write: { 40 | files: { 41 | src: files 42 | }, 43 | options: { 44 | config: '.beautifyrc' 45 | } 46 | } 47 | }, 48 | watch: { 49 | scripts: { 50 | files: files, 51 | tasks: ['test'], 52 | options: { 53 | spawn: false, 54 | }, 55 | }, 56 | } 57 | }); 58 | grunt.registerTask('test', ['jshint', 'jscs', 'mochacli:all']); 59 | grunt.registerTask('unitTest', ['mochacli:all']); 60 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Catalyst Code 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # windows-registry-node 2 | 3 | [![Build status](https://ci.appveyor.com/api/projects/status/ot69wbkyrcv7ig3p/branch/master?svg=true)](https://ci.appveyor.com/project/sedouard/windows-registry-node/branch/master) 4 | 5 | Read and Write to the Windows registry in-process from Node.js. Easily set application file associations and launch processes as an Administrator. 6 | 7 | ## Install 8 | 9 | This library interacts with native Windows APIs. To add this module to your Node application, install the package: 10 | 11 | ``` 12 | npm install windows-registry 13 | 14 | ``` 15 | 16 | To install node modules that require compilation on Windows, make sure you have installed the [necessary build tools](https://github.com/nodejs/node-gyp#installation). Specifically, we need `npm install -g node-gyp`, a cross-platform cli written in Node.js for native addon modules for Node.js. 17 | 18 | To install `node-gyp`, install [python v2.7.3](http://www.python.org/download/releases/2.7.3#download) and [Visual Studio 2013 build tools](http://www.microsoft.com/en-gb/download/details.aspx?id=44914). You do not need to install the full Visual Studio, only the build tools are required. Once the build tools are installed, you should be able to do `npm install -g node-gyp`. 19 | 20 | ## Creating File Associations 21 | 22 | To create a file association, you can call the `fileAssociation.associateExeForFile` API, which will make windows assign a default program for an arbitrary file extension: 23 | 24 | ```js 25 | var utils = require('windows-registry').utils; 26 | utils.associateExeForFile('myTestHandler', 'A test handler for unit tests', 'C:\\path\\to\\icon', 'C:\\Program Files\\nodejs\\node.exe %1', '.zzz'); 27 | 28 | ``` 29 | After running the code above, you will see files with the extension of `.zzz` will be automatically associated with the Node program and their file icon will be changed to the Node file icon. 30 | 31 | !['GIF showing file association'](https://github.com/CatalystCode/windows-registry-node/blob/readmeblob/fileassoc.jpg) 32 | 33 | ## Reading and Writing to the Windows Registry 34 | 35 | This library implements only a few of the basic registry commands, which allow you to do basic CRUD 36 | operations for keys in the registry. 37 | 38 | ### Opening a Registry Key 39 | 40 | Registry keys can be opened by either opening a predefined registry key defined in the [windef](lib/windef.js) module: 41 | 42 | ```js 43 | var Key = require('windows-registry').Key; 44 | var key = new Key(windef.HKEY.HKEY_CLASSES_ROOT, '.txt', windef.KEY_ACCESS.KEY_ALL_ACCESS); 45 | 46 | ``` 47 | 48 | Or you can open a sub key from an already opened key: 49 | 50 | ```js 51 | var Key = require('windows-registry').Key; 52 | var key = new Key(windef.HKEY.HKEY_CLASSES_ROOT, '', windef.KEY_ACCESS.KEY_ALL_ACCESS); 53 | var key2 = key.openSubKey('.txt', windef.KEY_ACCESS.KEY_ALL_ACCESS); 54 | 55 | ``` 56 | 57 | And don't forget to close your key when you're done. Otherwise, you will leak native resources: 58 | 59 | ```js 60 | key.close(); 61 | 62 | ``` 63 | 64 | ### Creating a Key 65 | 66 | Creating a key just requires that you have a [Key](lib/key.js) object by either using the [predefined keys](https://github.com/CatalystCode/windows-registry-node/blob/master/lib/windef.js#L27) within the `windef.HKEY` or opening a subkey from an existing key. 67 | 68 | ```js 69 | var Key = require('windows-registry').Key; 70 | // predefined key 71 | var key = new Key(windef.HKEY.HKEY_CLASSES_ROOT, '', windef.KEY_ACCESS.KEY_ALL_ACCESS); 72 | var createdKey = key.createSubKey('\test_key_name', windef.KEY_ACCESS.KEY_ALL_ACCESS); 73 | 74 | ``` 75 | 76 | ### Deleting a Key 77 | To delete a key just call the `Key.deleteKey()` function. 78 | 79 | ```js 80 | createdKey.deleteKey(); 81 | 82 | ``` 83 | 84 | ### Writing a Value to a Key 85 | 86 | To write a value, you will again need a [Key](lib/key.js) object and just need to call the `Key.setValue` function: 87 | 88 | ```js 89 | var Key = require('windows-registry').Key, 90 | windef = require('windows-registry').windef; 91 | 92 | var key = new Key(windef.HKEY.HKEY_CLASSES_ROOT, '.txt', windef.KEY_ACCESS.KEY_ALL_ACCESS); 93 | key.setValue('test_value_name', windef.REG_VALUE_TYPE.REG_SZ, 'test_value'); 94 | 95 | ``` 96 | 97 | ### Get a Value From a Key 98 | 99 | To get a value from a key, just call `Key.getValue`: 100 | 101 | ```js 102 | var value = key.getValue('test_value_name'); 103 | ``` 104 | 105 | The return value depends on the type of the key (REG_SZ for example will give you a string). 106 | 107 | ## Launching a Process as an Admin 108 | 109 | To launch a process as an Administrator, you can call the `utils.elevate` API, which will launch a process as an Administrator causing the UAC (User Account Control) elevation prompt to appear if required. This is similar to the Windows Explorer command "Run as administrator". Pass in `FILEPATH` to the process you want to elevate. Pass in any`PARAMETERS` to run with the process. Since this is an asynchronous call, pass in a callback to handle user's selection. 110 | 111 | ```js 112 | var utils = require('windows-registry').utils; 113 | utils.elevate('C:\\Program Files\\nodejs\\node.exe', 'index.js', function (err, result){console.log(result);}); 114 | 115 | ``` 116 | The process you want to launch with admin access will only be launched after the callback is called and only if the user clicks Yes in the UAC prompt. Otherwise, the process will not be launched. If the user is already running as an admin, the UAC prompt will not be triggered and the process you provided will be launched as an administrator automatically. 117 | 118 | !['GIF showing launch process as an admin'](https://github.com/CatalystCode/windows-registry-node/blob/readmeblob/elevate.gif) 119 | 120 | ## More Docs? 121 | 122 | Make your way over to the [tests section](test) to see how the module can be used. 123 | 124 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | # Test against this version of Node.js 2 | environment: 3 | nodejs_version: "4.1.2" 4 | 5 | # Install scripts. (runs after repo cloning) 6 | install: 7 | # Get the latest stable version of Node.js or io.js 8 | - ps: Install-Product node $env:nodejs_version 9 | # Upgrade npm 10 | - npm install -g npm@3 11 | # install modules 12 | - npm install 13 | - npm install grunt-cli -g 14 | - npm install mocha -g 15 | 16 | # Post-install test scripts. 17 | test_script: 18 | # Output useful info for debugging. 19 | - node --version 20 | - npm --version 21 | # run tests 22 | - npm test 23 | 24 | # Don't actually build. 25 | build: off 26 | -------------------------------------------------------------------------------- /elevate.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CatalystCode/windows-registry-node/786ce063025a5d431bdb2ce5f141db5ac2a65453/elevate.gif -------------------------------------------------------------------------------- /fileassoc.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CatalystCode/windows-registry-node/786ce063025a5d431bdb2ce5f141db5ac2a65453/fileassoc.jpg -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | registry: require('./lib/registry'), 3 | error: require('./lib/error'), 4 | types: require('./lib/types'), 5 | windef: require('./lib/windef'), 6 | Key: require('./lib/key'), 7 | utils: require('./lib/utils') 8 | }; -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES6" 4 | } 5 | } -------------------------------------------------------------------------------- /lib/error.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 0x2: 'ERROR_FILE_NOT_FOUND', 3 | 0x3: 'ERROR_PATH_NOT_FOUND', 4 | 0x6: 'ERROR_INVALID_HANDLE' 5 | }; 6 | -------------------------------------------------------------------------------- /lib/key.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | /** 3 | * An object wrapper for easier use of registry api 4 | */ 5 | class Key { 6 | constructor (pHKeyOrPredefined, path, accessLevel) { 7 | var isPredefined = false; 8 | this._registry = require('./registry'); 9 | this._windef = require('./windef'); 10 | for (var k in this._windef.HKEY) { 11 | if (this._windef.HKEY[k] === pHKeyOrPredefined) { 12 | isPredefined = true; 13 | break; 14 | } 15 | } 16 | 17 | // this is a predefined key 18 | if (isPredefined) { 19 | return this._registry.openKeyFromPredefined(pHKeyOrPredefined, path, accessLevel); 20 | } 21 | 22 | this.handle = pHKeyOrPredefined; 23 | this.path = path; 24 | } 25 | 26 | /** 27 | * Closes this Key, releasing the native OS handle 28 | * all the containers matching the query. Automatically closes current key 29 | */ 30 | close () { 31 | this._registry.closeKey(this); 32 | } 33 | 34 | deleteKey () { 35 | this._registry.deleteKey(this); 36 | } 37 | 38 | /** 39 | * Deletes a value from a key 40 | */ 41 | deleteValue (value) { 42 | this._registry.deleteValue(this, value); 43 | } 44 | 45 | /** 46 | * Sets a value for a value name on this key 47 | * all the containers matching the query. 48 | * @param {DS.Record Container} selectedContainer - The container to be selected 49 | */ 50 | setValue (valueName, valueType, value) { 51 | this._registry.setValueForKeyObject(this, valueName, valueType, value); 52 | } 53 | 54 | getValue (valueName) { 55 | return this._registry.queryValueForKeyObject(this, valueName); 56 | } 57 | 58 | /** 59 | * Returns a new Key object given a subkeyName 60 | * @param {string} subKeyName - The container to be selected 61 | * @param {string} accessLevel - The container to be selected 62 | * @return {Key} 63 | */ 64 | openSubKey (subKeyName, accessLevel) { 65 | var key = this._registry.openKeyFromKeyObject(this, subKeyName, accessLevel); 66 | return key; 67 | } 68 | 69 | createSubKey (subKeyName, accessLevel) { 70 | this._registry.createKey(this, subKeyName, accessLevel); 71 | 72 | return new Key(this.handle, subKeyName, accessLevel); 73 | } 74 | 75 | /** 76 | * Returns the string representing this Key 77 | */ 78 | toString () { 79 | return this.path; 80 | } 81 | } 82 | 83 | module.exports = Key; 84 | -------------------------------------------------------------------------------- /lib/native/adv_api.js: -------------------------------------------------------------------------------- 1 | // Minimal wrappers for Advapi32.dll to support basic registry manipulations 2 | 3 | 'use strict'; 4 | var ffi = require('ffi'), 5 | types = require('../types'); 6 | 7 | // Javascript bindings for native Win32 registry APIs 8 | var advApi = ffi.Library('Advapi32', { 9 | /* 10 | LONG WINAPI RegOpenCurrentUser( 11 | _In_ REGSAM samDesired, 12 | _Out_ PHKEY phkResult 13 | ); 14 | */ 15 | RegOpenCurrentUser: ['long', [types.REGSAM, types.PHKEY]], 16 | /* 17 | LONG WINAPI RegQueryValueEx( 18 | _In_ HKEY hKey, 19 | _In_opt_ LPCTSTR lpValueName, 20 | _Reserved_ LPDWORD lpReserved, 21 | _Out_opt_ LPDWORD lpType, 22 | _Out_opt_ LPBYTE lpData, 23 | _Inout_opt_ LPDWORD lpcbDataRegOpenKeyExA 24 | ); 25 | */ 26 | RegQueryValueExA: ['long', [types.HKEY, 'string', 'pointer', types.LPDWORD, types.LPBYTE, types.LPDWORD]], 27 | /* 28 | LONG WINAPI RegOpenKeyEx( 29 | _In_ HKEY hKey, 30 | _In_opt_ LPCTSTR lpSubKey, 31 | _In_ DWORD ulOptions, 32 | _In_ REGSAM samDesired, 33 | _Out_ PHKEY phkResult 34 | ); 35 | */ 36 | RegOpenKeyExA: ['long', ['longlong', 'string', types.DWORD, types.REGSAM, types.PHKEY]], 37 | /* 38 | LONG WINAPI RegSetValueEx( 39 | _In_ HKEY hKey, 40 | _In_opt_ LPCTSTR lpValueName, 41 | _Reserved_ DWORD Reserved, 42 | _In_ DWORD dwType, 43 | _In_ const BYTE *lpData, 44 | _In_ DWORD cbData 45 | ); 46 | */ 47 | RegSetValueExA: ['long', [types.HKEY, 'string', 'pointer', types.DWORD, types.LPBYTE, types.DWORD]], 48 | /** 49 | * LONG WINAPI RegCreateKeyEx( 50 | _In_ HKEY hKey, 51 | _In_ LPCTSTR lpSubKey, 52 | _Reserved_ DWORD Reserved, 53 | _In_opt_ LPTSTR lpClass, 54 | _In_ DWORD dwOptions, 55 | _In_ REGSAM samDesired, 56 | _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, 57 | _Out_ PHKEY phkResult, 58 | _Out_opt_ LPDWORD lpdwDisposition 59 | ); 60 | */ 61 | RegCreateKeyExA: ['long', [types.HKEY, 'string', 'pointer', 'pointer', types.DWORD, types.REGSAM, 'pointer', types.PHKEY, 'pointer']], 62 | /* 63 | LONG WINAPI RegDeleteTree( 64 | _In_ HKEY hKey, 65 | _In_opt_ LPCTSTR lpSubKey 66 | ); 67 | */ 68 | RegDeleteTreeA: ['long', [types.HKEY, 'string']], 69 | /* 70 | LONG WINAPI RegDeleteValue( 71 | _In_ HKEY hKey, 72 | _In_opt_ LPCTSTR lpValueName 73 | ); 74 | */ 75 | 76 | RegDeleteValueA: ['long', [types.HKEY, 'string']], 77 | /* 78 | LONG WINAPI RegCloseKey( 79 | _In_ HKEY hKey 80 | ); 81 | */ 82 | RegCloseKey: ['long', [types.HKEY]] 83 | }); 84 | 85 | module.exports = advApi; 86 | -------------------------------------------------------------------------------- /lib/native/shell32.js: -------------------------------------------------------------------------------- 1 | // Minimnal wrappers for shell32.js 2 | var windef = require('../windef'), 3 | ffi = require('ffi'), 4 | ref = require('ref'); 5 | 6 | var SHELLEXECUTEINFOPtr = ref.refType(windef.SHELLEXECUTEINFO); 7 | var shell32 = new ffi.Library('Shell32', { 8 | /* 9 | BOOL ShellExecuteEx( 10 | _Inout_ SHELLEXECUTEINFO *pExecInfo 11 | ); 12 | */ 13 | ShellExecuteExA: ['bool', [SHELLEXECUTEINFOPtr]] 14 | }); 15 | 16 | module.exports = shell32; 17 | -------------------------------------------------------------------------------- /lib/registry.js: -------------------------------------------------------------------------------- 1 | /* global Buffer */ 2 | 'use strict'; 3 | var ffi = require('ffi'), 4 | types = require('./types'), 5 | advApi = require('./native/adv_api'), 6 | Key = require('./key'), 7 | ref = require('ref'), 8 | error = require('./error'), 9 | windef = require('./windef'), 10 | debug = require('debug')('windows-registry'); 11 | 12 | var api = { 13 | openKeyFromPredefined: function (preDefinedKey, subKeyName, accessLevel) { 14 | if (preDefinedKey < 0x80000000 || preDefinedKey > 0x80000006) { 15 | throw 'The key ' + preDefinedKey + ' is not valid. Use the windef module for the list of predefined keys'; 16 | } 17 | 18 | var pHkey = ref.alloc(types.PHKEY, new Buffer(ref.sizeof.pointer)); 19 | debug('PHKEY LENGTH: ' + pHkey.deref().length); 20 | var result = advApi.RegOpenKeyExA(preDefinedKey, subKeyName, 0, accessLevel, pHkey); 21 | debug('result:' + result); 22 | if (result !== 0) { 23 | throw 'Failed to open key error: ' + error[result]; 24 | } 25 | 26 | return new Key(pHkey, subKeyName); 27 | }, 28 | openKeyFromKeyObject: function (keyObject, subKeyName, accessLevel) { 29 | var pHkey = ref.alloc(types.PHKEY, new Buffer(ref.sizeof.pointer)); 30 | 31 | // RegOpenKeyEx can also take an HKEY in addition to a predefined value 32 | var advApi2 = ffi.Library('Advapi32', { 33 | RegOpenKeyExA: ['long', [types.HKEY, 'string', types.DWORD, types.REGSAM, types.PHKEY]] 34 | }); 35 | var result = advApi2.RegOpenKeyExA(keyObject.handle.deref(), subKeyName, 0, accessLevel, pHkey); 36 | 37 | if (result !== 0) { 38 | throw 'Failed to open key error: ' + error[result]; 39 | } 40 | 41 | return new Key(pHkey, subKeyName); 42 | }, 43 | queryValueForKeyObject: function (key, valueName) { 44 | var pKeyDataLength = ref.alloc(types.LPDWORD, new Buffer(ref.sizeof.pointer)), 45 | pKeyType = ref.alloc(types.LPDWORD, new Buffer(ref.sizeof.pointer)); 46 | // QUERY FOR VALUE SIZE & TYPE 47 | var result = advApi.RegQueryValueExA(key.handle.deref(), valueName, null, pKeyType, null, pKeyDataLength); 48 | // READ VALUE 49 | var value = new Buffer(pKeyDataLength.readUInt32LE()), 50 | valueType = pKeyType.readUInt32LE(); 51 | switch (valueType) { 52 | case windef.REG_VALUE_TYPE.REG_SZ: 53 | case windef.REG_VALUE_TYPE.REG_EXPAND_SZ: 54 | case windef.REG_VALUE_TYPE.REG_LINK: 55 | value.type = types.LPCTSR; 56 | break; 57 | case windef.REG_VALUE_TYPE.REG_BINARY: 58 | value.type = types.PVOID; 59 | break; 60 | case windef.REG_VALUE_TYPE.REG_DWORD: 61 | case windef.REG_VALUE_TYPE.REG_DWORD_BIG_ENDIAN: 62 | case windef.REG_VALUE_TYPE.REG_DWORD_LITTLE_ENDIAN: 63 | value.type = types.DWORD; 64 | break; 65 | default: 66 | throw 'The Value Type: ' + valueType + ' is currently unsupported'; 67 | } 68 | 69 | // READ VALUE 70 | result = advApi.RegQueryValueExA(key.handle.deref(), valueName, null, pKeyType, value, pKeyDataLength); 71 | 72 | if (result !== 0) { 73 | throw 'Failed to open key error: ' + error[result]; 74 | } 75 | 76 | if (value.type === types.LPTSR) { 77 | // TODO not sure why buffer's utf8 parsing leaves in the unicode null 78 | // escape sequence. This is a work-around (at least on node 4.1) 79 | value = value.toString().replace('\u0000', ''); 80 | } 81 | 82 | return value; 83 | }, 84 | setValueForKeyObject: function (key, valueName, valueType, value) { 85 | if (valueType < 1 || valueType > 8) { 86 | throw 'Invalid valueType parameter: ' + valueType + ' use values from windef.REG_VALUE_TYPE'; 87 | } 88 | var buffer, 89 | byte, 90 | result; 91 | 92 | switch (valueType) { 93 | case windef.REG_VALUE_TYPE.REG_SZ: 94 | case windef.REG_VALUE_TYPE.REG_EXPAND_SZ: 95 | case windef.REG_VALUE_TYPE.REG_LINK: 96 | buffer = new Buffer(value, 'utf8'); 97 | byte = ref.alloc(types.LPBYTE, buffer); 98 | debug('content length:' + Buffer.byteLength(value, 'utf8')); 99 | debug(value); 100 | debug(buffer.length); 101 | result = advApi.RegSetValueExA(key.handle.deref(), valueName, null, valueType, byte.deref(), Buffer.byteLength(value, 'utf8')); 102 | break; 103 | case windef.REG_VALUE_TYPE.REG_BINARY: 104 | // we assume that the value is a buffer since it should be binary data 105 | buffer = value; 106 | byte = ref.alloc(types.LPBYTE, buffer); 107 | result = advApi.RegSetValueExA(key.handle.deref(), valueName, null, valueType, byte.deref(), buffer.length); 108 | break; 109 | case windef.REG_VALUE_TYPE.REG_DWORD: 110 | case windef.REG_VALUE_TYPE.REG_DWORD_BIG_ENDIAN: 111 | case windef.REG_VALUE_TYPE.REG_DWORD_LITTLE_ENDIAN: 112 | buffer = new Buffer(4, value); 113 | result = advApi.RegSetValueExA(key.handle.deref(), valueName, null, valueType, byte.deref(), buffer.length); 114 | break; 115 | default: 116 | throw 'The type ' + valueType + ' is currently unsupported'; 117 | } 118 | 119 | if (result !== 0) { 120 | throw 'Failed to open key error: ' + error[result]; 121 | } 122 | }, 123 | createKey: function (key, subKeyName, accessLevel) { 124 | var pHkey = ref.alloc(types.PHKEY, new Buffer(ref.sizeof.pointer)); 125 | 126 | var result = advApi.RegCreateKeyExA(key.handle.deref(), subKeyName, null, null, windef.REG_OPTION_NON_VOLATILE, accessLevel, null, pHkey, null); 127 | 128 | if (result !== 0) { 129 | throw 'Failed to open key error: ' + error[result]; 130 | } 131 | }, 132 | deleteKey: function (key, subKeyName) { 133 | var result = advApi.RegDeleteTreeA(key.handle.deref(), subKeyName); 134 | 135 | if (result !== 0) { 136 | throw 'Failed to open key error ' + result + ':' + error[result]; 137 | } 138 | }, 139 | deleteValue: function (key, value) { 140 | var result = advApi.RegDeleteValueA(key.handle.deref(), value); 141 | 142 | if (result !== 0) { 143 | throw 'Failed to delete value error ' + result + ':' + error[result]; 144 | } 145 | }, 146 | closeKey: function (key) { 147 | var result = advApi.RegCloseKey(key.handle.deref()); 148 | 149 | if (result !== 0) { 150 | throw 'Failed to open key error ' + result + ':' + error[result]; 151 | } 152 | } 153 | }; 154 | 155 | module.exports = api; 156 | -------------------------------------------------------------------------------- /lib/types.js: -------------------------------------------------------------------------------- 1 | var ref = require('ref'); 2 | 3 | var types = { 4 | REGSAM: ref.types.ulong, 5 | DWORD: ref.types.uint32, 6 | ULONG: ref.types.ulong, 7 | HWND: ref.refType(ref.types.void), 8 | BYTE: ref.types.uint8, 9 | HKEY: ref.refType(ref.types.void), 10 | PVOID: ref.refType('pointer'), 11 | HANDLE: ref.refType(ref.types.void), 12 | HINSTANCE: ref.refType(ref.types.void), 13 | LPCTSTR: ref.refType(ref.types.CString), 14 | STRING: ref.types.CString, 15 | INT: ref.types.int, 16 | LPVOID: ref.refType(ref.types.void) 17 | }; 18 | 19 | types.PHKEY = ref.refType(types.HKEY); 20 | types.LPBYTE = ref.refType(types.BYTE); 21 | types.LPDWORD = ref.refType(types.DWORD); 22 | module.exports = types; 23 | -------------------------------------------------------------------------------- /lib/utils.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var ref = require('ref'), 3 | types = require('./types'), 4 | shell32 = require('./native/shell32'), 5 | windef = require('./windef'), 6 | debug = require('debug')('windows-registry'), 7 | registry = require('./registry'), 8 | debug = require('debug')('windows-registry'); 9 | 10 | // pass in default values for members 11 | var lpVerb = 'runas'; 12 | var hInstApp = ref.alloc(types.HINSTANCE); 13 | var SW_SHOWNORMAL = 0x1; 14 | 15 | module.exports = { 16 | elevate: function (filepath, parameters, callback) { 17 | if(!filepath) { 18 | debug('Missing filepath'); 19 | callback('Missing filepath'); 20 | return; 21 | } 22 | var shellexecuteinfoval = new windef.SHELLEXECUTEINFO({ 23 | cbSize: windef.SHELLEXECUTEINFO.size, 24 | fMask: 0x00000000, 25 | hwnd: null, 26 | lpVerb: lpVerb, 27 | lpFile: filepath, 28 | lpParameters: parameters, 29 | lpDirectory: null, 30 | nShow: SW_SHOWNORMAL, 31 | hInstApp: hInstApp, 32 | lpIDList: null, 33 | lpCLass: null, 34 | hkeyClass: null, 35 | dwHotKey: null, 36 | DUMMYUNIONNAME: { 37 | hIcon: null, 38 | hMonitor: null 39 | }, 40 | hProcess: ref.alloc(types.HANDLE) 41 | }); 42 | 43 | shell32.ShellExecuteExA.async(shellexecuteinfoval.ref(), callback); 44 | }, 45 | associateExeForFile: function (handlerName, handlerDescription, iconPath, exePath, extensionName) { 46 | var key = registry.openKeyFromPredefined(windef.HKEY.HKEY_CLASSES_ROOT, '', windef.KEY_ACCESS.KEY_ALL_ACCESS); 47 | 48 | registry.createKey(key, extensionName, windef.KEY_ACCESS.KEY_ALL_ACCESS); 49 | 50 | var appKey = registry.openKeyFromKeyObject(key, extensionName, windef.KEY_ACCESS.KEY_ALL_ACCESS); 51 | 52 | registry.setValueForKeyObject(appKey, '', windef.REG_VALUE_TYPE.REG_SZ, handlerName); 53 | appKey.close(); 54 | 55 | registry.createKey(key, handlerName, windef.KEY_ACCESS.KEY_ALL_ACCESS); 56 | var handlerKey = registry.openKeyFromKeyObject(key, handlerName, windef.KEY_ACCESS.KEY_ALL_ACCESS); 57 | 58 | registry.setValueForKeyObject(handlerKey, '', windef.REG_VALUE_TYPE.REG_SZ, handlerDescription); 59 | registry.createKey(handlerKey, 'DefaultIcon', windef.KEY_ACCESS.KEY_ALL_ACCESS); 60 | 61 | var defaultIconKey = registry.openKeyFromKeyObject(handlerKey, 'DefaultIcon', windef.KEY_ACCESS.KEY_ALL_ACCESS); 62 | 63 | registry.setValueForKeyObject(defaultIconKey, '', windef.REG_VALUE_TYPE.REG_SZ, iconPath); 64 | 65 | registry.createKey(handlerKey, 'shell\\Open\\Command', windef.KEY_ACCESS.KEY_ALL_ACCESS); 66 | 67 | var commandKey = registry.openKeyFromKeyObject(handlerKey, 'shell\\Open\\Command', windef.KEY_ACCESS.KEY_ALL_ACCESS); 68 | registry.setValueForKeyObject(commandKey, '', windef.REG_VALUE_TYPE.REG_SZ, exePath); 69 | 70 | commandKey.close(); 71 | handlerKey.close(); 72 | key.close(); 73 | } 74 | }; 75 | -------------------------------------------------------------------------------- /lib/windef.js: -------------------------------------------------------------------------------- 1 | var types = require('./types'), 2 | struct = require('ref-struct'), 3 | uniontype = require('ref-union'); 4 | 5 | // yes, this is the name in the official MSDN doc 6 | var DUMMYUNIONNAME = uniontype({ 7 | hIcon: types.HANDLE, 8 | hMonitor: types.HANDLE 9 | }); 10 | 11 | // https://msdn.microsoft.com/en-us/library/windows/desktop/ms724878(v=vs.85).aspx 12 | module.exports = { 13 | KEY_ACCESS: { 14 | KEY_ALL_ACCESS: 0xF003F, 15 | KEY_CREATE_LINK: 0x0020, 16 | KEY_CREATE_SUB_KEY: 0x0004, 17 | KEY_ENUMERATE_SUB_KEYS: 0x0008, 18 | KEY_EXECUTE: 0x20019, 19 | KEY_NOTIFY: 0x0010, 20 | KEY_QUERY_VALUE: 0x0001, 21 | KEY_READ: 0x20019, 22 | KEY_SET_VALUE: 0x0002, 23 | KEY_WOW64_32KEY: 0x0200, 24 | KEY_WOW64_64KEY: 0x0100, 25 | KEY_WRITE: 0x20006 26 | }, 27 | HKEY: { 28 | HKEY_CLASSES_ROOT: 0x80000000, 29 | HKEY_CURRENT_USER: 0x80000001, 30 | HKEY_LOCAL_MACHINE: 0x80000002, 31 | HKEY_USERS: 0x80000003, 32 | HKEY_PERFORMANCE_DATA: 0x80000004, 33 | HKEY_CURRENT_CONFIG: 0x80000005, 34 | HKEY_DYN_DATA: 0X80000006 35 | }, 36 | REG_VALUE_TYPE: { 37 | REG_SZ: 1, 38 | REG_EXPAND_SZ: 2, 39 | REG_BINARY: 3, 40 | REG_DWORD: 4, 41 | REG_DWORD_BIG_ENDIAN: 5, 42 | REG_DWORD_LITTLE_ENDIAN: 4, 43 | REG_LINK: 6, 44 | REG_MULTI_SZ: 7, 45 | REG_RESOURCE_LIST: 8 46 | }, 47 | REG_OPTION_NON_VOLATILE: 0, 48 | /* 49 | typedef struct _SHELLEXECUTEINFO { 50 | DWORD cbSize; 51 | ULONG fMask; 52 | HWND hwnd; 53 | LPCTSTR lpVerb; 54 | LPCTSTR lpFile; 55 | LPCTSTR lpParameters; 56 | LPCTSTR lpDirectory; 57 | int nShow; 58 | HINSTANCE hInstApp; 59 | LPVOID lpIDList; 60 | LPCTSTR lpClass; 61 | HKEY hkeyClass; 62 | DWORD dwHotKey; 63 | union { 64 | HANDLE hIcon; 65 | HANDLE hMonitor; 66 | } DUMMYUNIONNAME; 67 | HANDLE hProcess; 68 | } SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO; 69 | */ 70 | SHELLEXECUTEINFO: struct({ 71 | cbSize: types.DWORD, 72 | fMask: types.ULONG, 73 | hwnd: types.HWND, 74 | lpVerb: types.STRING, 75 | lpFile: types.STRING, 76 | lpParameters: types.STRING, 77 | lpDirectory: types.STRING, 78 | nShow: types.INT, 79 | hInstApp: types.HINSTANCE, 80 | lpIDList: types.LPVOID, 81 | lpClass: types.STRING, 82 | hkeyClass: types.HKEY, 83 | dwHotKey: types.DWORD, 84 | DUMMYUNIONNAME: DUMMYUNIONNAME, 85 | hProcess: types.HANDLE 86 | }) 87 | }; 88 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "windows-registry", 3 | "version": "0.1.3", 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "abbrev": { 7 | "version": "1.1.0", 8 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", 9 | "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", 10 | "dev": true 11 | }, 12 | "acorn": { 13 | "version": "4.0.13", 14 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", 15 | "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", 16 | "dev": true 17 | }, 18 | "align-text": { 19 | "version": "0.1.4", 20 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 21 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", 22 | "dev": true 23 | }, 24 | "alter": { 25 | "version": "0.2.0", 26 | "resolved": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz", 27 | "integrity": "sha1-x1iICGF1cgNKrmJICvJrHU0cs80=", 28 | "dev": true 29 | }, 30 | "amdefine": { 31 | "version": "1.0.1", 32 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 33 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", 34 | "dev": true 35 | }, 36 | "ansi-regex": { 37 | "version": "2.1.1", 38 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 39 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 40 | "dev": true 41 | }, 42 | "ansi-styles": { 43 | "version": "2.2.1", 44 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 45 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 46 | "dev": true 47 | }, 48 | "argparse": { 49 | "version": "0.1.16", 50 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", 51 | "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", 52 | "dev": true, 53 | "dependencies": { 54 | "underscore.string": { 55 | "version": "2.4.0", 56 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", 57 | "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=", 58 | "dev": true 59 | } 60 | } 61 | }, 62 | "array-differ": { 63 | "version": "1.0.0", 64 | "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", 65 | "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", 66 | "dev": true 67 | }, 68 | "array-union": { 69 | "version": "1.0.2", 70 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 71 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 72 | "dev": true 73 | }, 74 | "array-uniq": { 75 | "version": "1.0.3", 76 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 77 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", 78 | "dev": true 79 | }, 80 | "arrify": { 81 | "version": "1.0.1", 82 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 83 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 84 | "dev": true 85 | }, 86 | "ast-traverse": { 87 | "version": "0.1.1", 88 | "resolved": "https://registry.npmjs.org/ast-traverse/-/ast-traverse-0.1.1.tgz", 89 | "integrity": "sha1-ac8rg4bxnc2hux4F1o/jWdiJfeY=", 90 | "dev": true 91 | }, 92 | "ast-types": { 93 | "version": "0.9.6", 94 | "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", 95 | "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", 96 | "dev": true 97 | }, 98 | "async": { 99 | "version": "0.1.22", 100 | "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", 101 | "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=", 102 | "dev": true 103 | }, 104 | "babel-core": { 105 | "version": "5.8.38", 106 | "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", 107 | "integrity": "sha1-H8ruedfmG3ULALjlT238nQr4ZVg=", 108 | "dev": true, 109 | "dependencies": { 110 | "bluebird": { 111 | "version": "2.11.0", 112 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", 113 | "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", 114 | "dev": true 115 | }, 116 | "lodash": { 117 | "version": "3.10.1", 118 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", 119 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", 120 | "dev": true 121 | }, 122 | "minimatch": { 123 | "version": "2.0.10", 124 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", 125 | "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", 126 | "dev": true 127 | } 128 | } 129 | }, 130 | "babel-jscs": { 131 | "version": "2.0.5", 132 | "resolved": "https://registry.npmjs.org/babel-jscs/-/babel-jscs-2.0.5.tgz", 133 | "integrity": "sha1-CjRwRrSBRay8pW6MjtX3NrxU+dA=", 134 | "dev": true 135 | }, 136 | "babel-plugin-constant-folding": { 137 | "version": "1.0.1", 138 | "resolved": "https://registry.npmjs.org/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz", 139 | "integrity": "sha1-g2HTZMmORJw2kr26Ue/whEKQqo4=", 140 | "dev": true 141 | }, 142 | "babel-plugin-dead-code-elimination": { 143 | "version": "1.0.2", 144 | "resolved": "https://registry.npmjs.org/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz", 145 | "integrity": "sha1-X3xFEnTc18zNv7s+C4XdKBIfD2U=", 146 | "dev": true 147 | }, 148 | "babel-plugin-eval": { 149 | "version": "1.0.1", 150 | "resolved": "https://registry.npmjs.org/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz", 151 | "integrity": "sha1-ovrtJc5r5preS/7CY/cBaRlZUNo=", 152 | "dev": true 153 | }, 154 | "babel-plugin-inline-environment-variables": { 155 | "version": "1.0.1", 156 | "resolved": "https://registry.npmjs.org/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz", 157 | "integrity": "sha1-H1jOkSB61qgmqL9kX6/mj/X+P/4=", 158 | "dev": true 159 | }, 160 | "babel-plugin-jscript": { 161 | "version": "1.0.4", 162 | "resolved": "https://registry.npmjs.org/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz", 163 | "integrity": "sha1-jzQsOCduh6R9X6CovT1etsytj8w=", 164 | "dev": true 165 | }, 166 | "babel-plugin-member-expression-literals": { 167 | "version": "1.0.1", 168 | "resolved": "https://registry.npmjs.org/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz", 169 | "integrity": "sha1-zF7bD6qNyScXDnTW0cAkQAIWJNM=", 170 | "dev": true 171 | }, 172 | "babel-plugin-property-literals": { 173 | "version": "1.0.1", 174 | "resolved": "https://registry.npmjs.org/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz", 175 | "integrity": "sha1-AlIwGQAZKYCxwRjv6kjOk6q4MzY=", 176 | "dev": true 177 | }, 178 | "babel-plugin-proto-to-assign": { 179 | "version": "1.0.4", 180 | "resolved": "https://registry.npmjs.org/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz", 181 | "integrity": "sha1-xJ56/QL1d7xNoF6i3wAiUM980SM=", 182 | "dev": true, 183 | "dependencies": { 184 | "lodash": { 185 | "version": "3.10.1", 186 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", 187 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", 188 | "dev": true 189 | } 190 | } 191 | }, 192 | "babel-plugin-react-constant-elements": { 193 | "version": "1.0.3", 194 | "resolved": "https://registry.npmjs.org/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz", 195 | "integrity": "sha1-lGc26DeEKcvDSdz/YvUcFDs041o=", 196 | "dev": true 197 | }, 198 | "babel-plugin-react-display-name": { 199 | "version": "1.0.3", 200 | "resolved": "https://registry.npmjs.org/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz", 201 | "integrity": "sha1-dU/jiSboQkpOexWrbqYTne4FFPw=", 202 | "dev": true 203 | }, 204 | "babel-plugin-remove-console": { 205 | "version": "1.0.1", 206 | "resolved": "https://registry.npmjs.org/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz", 207 | "integrity": "sha1-2PJFVsOgUAXUKqqv0neH9T/wE6c=", 208 | "dev": true 209 | }, 210 | "babel-plugin-remove-debugger": { 211 | "version": "1.0.1", 212 | "resolved": "https://registry.npmjs.org/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz", 213 | "integrity": "sha1-/S6jzWGkKK0fO5yJiC/0KT6MFMc=", 214 | "dev": true 215 | }, 216 | "babel-plugin-runtime": { 217 | "version": "1.0.7", 218 | "resolved": "https://registry.npmjs.org/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz", 219 | "integrity": "sha1-v3x9lm3Vbs1cF/ocslPJrLflSq8=", 220 | "dev": true 221 | }, 222 | "babel-plugin-undeclared-variables-check": { 223 | "version": "1.0.2", 224 | "resolved": "https://registry.npmjs.org/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz", 225 | "integrity": "sha1-XPGqU52BP/ZOmWQSkK9iCWX2Xe4=", 226 | "dev": true 227 | }, 228 | "babel-plugin-undefined-to-void": { 229 | "version": "1.1.6", 230 | "resolved": "https://registry.npmjs.org/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz", 231 | "integrity": "sha1-f1eO+LeN+uYAM4XYQXph7aBuL4E=", 232 | "dev": true 233 | }, 234 | "babylon": { 235 | "version": "5.8.38", 236 | "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", 237 | "integrity": "sha1-7JsSCxG/bM1Bc6GL8hfmC3mFn/0=", 238 | "dev": true 239 | }, 240 | "balanced-match": { 241 | "version": "1.0.0", 242 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 243 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 244 | "dev": true 245 | }, 246 | "bindings": { 247 | "version": "1.2.1", 248 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", 249 | "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=" 250 | }, 251 | "bluebird": { 252 | "version": "3.5.0", 253 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", 254 | "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", 255 | "dev": true 256 | }, 257 | "brace-expansion": { 258 | "version": "1.1.8", 259 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 260 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 261 | "dev": true 262 | }, 263 | "breakable": { 264 | "version": "1.0.0", 265 | "resolved": "https://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz", 266 | "integrity": "sha1-eEp5eRWjjq0nutRWtVcstLuqeME=", 267 | "dev": true 268 | }, 269 | "camelcase": { 270 | "version": "1.2.1", 271 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 272 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", 273 | "dev": true 274 | }, 275 | "center-align": { 276 | "version": "0.1.3", 277 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 278 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 279 | "dev": true 280 | }, 281 | "chalk": { 282 | "version": "1.1.3", 283 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 284 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 285 | "dev": true 286 | }, 287 | "cli": { 288 | "version": "0.6.6", 289 | "resolved": "https://registry.npmjs.org/cli/-/cli-0.6.6.tgz", 290 | "integrity": "sha1-Aq1Eo4Cr8nraxebwzdewQ9dMU+M=", 291 | "dev": true, 292 | "dependencies": { 293 | "glob": { 294 | "version": "3.2.11", 295 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", 296 | "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", 297 | "dev": true 298 | }, 299 | "minimatch": { 300 | "version": "0.3.0", 301 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", 302 | "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", 303 | "dev": true 304 | } 305 | } 306 | }, 307 | "cli-table": { 308 | "version": "0.3.1", 309 | "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", 310 | "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", 311 | "dev": true, 312 | "dependencies": { 313 | "colors": { 314 | "version": "1.0.3", 315 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", 316 | "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", 317 | "dev": true 318 | } 319 | } 320 | }, 321 | "cliui": { 322 | "version": "2.1.0", 323 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 324 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 325 | "dev": true 326 | }, 327 | "coffee-script": { 328 | "version": "1.3.3", 329 | "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz", 330 | "integrity": "sha1-FQ1rTLUiiUNp7+1qIQHCC8f0pPQ=", 331 | "dev": true 332 | }, 333 | "colors": { 334 | "version": "0.6.2", 335 | "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", 336 | "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", 337 | "dev": true 338 | }, 339 | "commander": { 340 | "version": "2.11.0", 341 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", 342 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", 343 | "dev": true 344 | }, 345 | "comment-parser": { 346 | "version": "0.3.2", 347 | "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.3.2.tgz", 348 | "integrity": "sha1-PAPwd2uGo239mgosl8YwfzMggv4=", 349 | "dev": true, 350 | "dependencies": { 351 | "isarray": { 352 | "version": "1.0.0", 353 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 354 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 355 | "dev": true 356 | }, 357 | "readable-stream": { 358 | "version": "2.3.3", 359 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 360 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 361 | "dev": true 362 | }, 363 | "string_decoder": { 364 | "version": "1.0.3", 365 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 366 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 367 | "dev": true 368 | } 369 | } 370 | }, 371 | "commoner": { 372 | "version": "0.10.8", 373 | "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", 374 | "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=", 375 | "dev": true, 376 | "dependencies": { 377 | "esprima": { 378 | "version": "3.1.3", 379 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", 380 | "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", 381 | "dev": true 382 | }, 383 | "glob": { 384 | "version": "5.0.15", 385 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 386 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", 387 | "dev": true 388 | }, 389 | "graceful-fs": { 390 | "version": "4.1.11", 391 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 392 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 393 | "dev": true 394 | }, 395 | "iconv-lite": { 396 | "version": "0.4.18", 397 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", 398 | "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==", 399 | "dev": true 400 | }, 401 | "minimatch": { 402 | "version": "3.0.4", 403 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 404 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 405 | "dev": true 406 | }, 407 | "recast": { 408 | "version": "0.11.23", 409 | "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", 410 | "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", 411 | "dev": true 412 | } 413 | } 414 | }, 415 | "concat-map": { 416 | "version": "0.0.1", 417 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 418 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 419 | "dev": true 420 | }, 421 | "config-chain": { 422 | "version": "1.1.11", 423 | "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", 424 | "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", 425 | "dev": true 426 | }, 427 | "console-browserify": { 428 | "version": "1.1.0", 429 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", 430 | "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", 431 | "dev": true 432 | }, 433 | "convert-source-map": { 434 | "version": "1.5.0", 435 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", 436 | "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", 437 | "dev": true 438 | }, 439 | "core-js": { 440 | "version": "1.2.7", 441 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", 442 | "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", 443 | "dev": true 444 | }, 445 | "core-util-is": { 446 | "version": "1.0.2", 447 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 448 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 449 | "dev": true 450 | }, 451 | "cycle": { 452 | "version": "1.0.3", 453 | "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", 454 | "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=", 455 | "dev": true 456 | }, 457 | "d": { 458 | "version": "1.0.0", 459 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", 460 | "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", 461 | "dev": true 462 | }, 463 | "date-now": { 464 | "version": "0.1.4", 465 | "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", 466 | "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", 467 | "dev": true 468 | }, 469 | "dateformat": { 470 | "version": "1.0.2-1.2.3", 471 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz", 472 | "integrity": "sha1-sCIMAt6YYXQztyhRz0fePfLNvuk=", 473 | "dev": true 474 | }, 475 | "debug": { 476 | "version": "2.6.8", 477 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", 478 | "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=" 479 | }, 480 | "decamelize": { 481 | "version": "1.2.0", 482 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 483 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 484 | "dev": true 485 | }, 486 | "deep-equal": { 487 | "version": "1.0.1", 488 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 489 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", 490 | "dev": true 491 | }, 492 | "deep-extend": { 493 | "version": "0.4.2", 494 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", 495 | "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", 496 | "dev": true 497 | }, 498 | "defined": { 499 | "version": "1.0.0", 500 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 501 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 502 | "dev": true 503 | }, 504 | "defs": { 505 | "version": "1.1.1", 506 | "resolved": "https://registry.npmjs.org/defs/-/defs-1.1.1.tgz", 507 | "integrity": "sha1-siYJ8sehG6ej2xFoBcE5scr/qdI=", 508 | "dev": true, 509 | "dependencies": { 510 | "esprima-fb": { 511 | "version": "15001.1001.0-dev-harmony-fb", 512 | "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", 513 | "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=", 514 | "dev": true 515 | } 516 | } 517 | }, 518 | "detect-indent": { 519 | "version": "3.0.1", 520 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", 521 | "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", 522 | "dev": true, 523 | "dependencies": { 524 | "minimist": { 525 | "version": "1.2.0", 526 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 527 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 528 | "dev": true 529 | } 530 | } 531 | }, 532 | "detective": { 533 | "version": "4.5.0", 534 | "resolved": "https://registry.npmjs.org/detective/-/detective-4.5.0.tgz", 535 | "integrity": "sha1-blqMaybmx6JUsca210kNmOyR7dE=", 536 | "dev": true 537 | }, 538 | "diff": { 539 | "version": "1.4.0", 540 | "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", 541 | "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", 542 | "dev": true 543 | }, 544 | "dom-serializer": { 545 | "version": "0.1.0", 546 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", 547 | "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", 548 | "dev": true, 549 | "dependencies": { 550 | "domelementtype": { 551 | "version": "1.1.3", 552 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", 553 | "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", 554 | "dev": true 555 | }, 556 | "entities": { 557 | "version": "1.1.1", 558 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", 559 | "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", 560 | "dev": true 561 | } 562 | } 563 | }, 564 | "domelementtype": { 565 | "version": "1.3.0", 566 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", 567 | "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", 568 | "dev": true 569 | }, 570 | "domhandler": { 571 | "version": "2.3.0", 572 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", 573 | "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", 574 | "dev": true 575 | }, 576 | "domutils": { 577 | "version": "1.5.1", 578 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", 579 | "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", 580 | "dev": true 581 | }, 582 | "editorconfig": { 583 | "version": "0.13.2", 584 | "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.13.2.tgz", 585 | "integrity": "sha1-jleSbZ7mmrbLmZ8CfCFxRnrM6zU=", 586 | "dev": true, 587 | "dependencies": { 588 | "lru-cache": { 589 | "version": "3.2.0", 590 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz", 591 | "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=", 592 | "dev": true 593 | } 594 | } 595 | }, 596 | "entities": { 597 | "version": "1.0.0", 598 | "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", 599 | "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", 600 | "dev": true 601 | }, 602 | "es5-ext": { 603 | "version": "0.10.26", 604 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.26.tgz", 605 | "integrity": "sha1-UbISilMbcMT2dkCTpzy+u4IYY3I=", 606 | "dev": true 607 | }, 608 | "es6-iterator": { 609 | "version": "2.0.1", 610 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", 611 | "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", 612 | "dev": true 613 | }, 614 | "es6-map": { 615 | "version": "0.1.5", 616 | "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", 617 | "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", 618 | "dev": true 619 | }, 620 | "es6-set": { 621 | "version": "0.1.5", 622 | "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", 623 | "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", 624 | "dev": true 625 | }, 626 | "es6-symbol": { 627 | "version": "3.1.1", 628 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", 629 | "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", 630 | "dev": true 631 | }, 632 | "es6-weak-map": { 633 | "version": "2.0.2", 634 | "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", 635 | "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", 636 | "dev": true 637 | }, 638 | "escape-string-regexp": { 639 | "version": "1.0.5", 640 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 641 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 642 | "dev": true 643 | }, 644 | "escope": { 645 | "version": "3.6.0", 646 | "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", 647 | "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", 648 | "dev": true 649 | }, 650 | "esprima": { 651 | "version": "1.0.4", 652 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", 653 | "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", 654 | "dev": true 655 | }, 656 | "esrecurse": { 657 | "version": "4.2.0", 658 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", 659 | "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", 660 | "dev": true 661 | }, 662 | "estraverse": { 663 | "version": "4.2.0", 664 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 665 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 666 | "dev": true 667 | }, 668 | "esutils": { 669 | "version": "2.0.2", 670 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 671 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 672 | "dev": true 673 | }, 674 | "event-emitter": { 675 | "version": "0.3.5", 676 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", 677 | "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", 678 | "dev": true 679 | }, 680 | "eventemitter2": { 681 | "version": "0.4.14", 682 | "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", 683 | "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", 684 | "dev": true 685 | }, 686 | "exit": { 687 | "version": "0.1.2", 688 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 689 | "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", 690 | "dev": true 691 | }, 692 | "eyes": { 693 | "version": "0.1.8", 694 | "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", 695 | "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", 696 | "dev": true 697 | }, 698 | "faye-websocket": { 699 | "version": "0.4.4", 700 | "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.4.4.tgz", 701 | "integrity": "sha1-wUxbO/FNdBf/v9mQwKdJXNnzN7w=", 702 | "dev": true 703 | }, 704 | "ffi": { 705 | "version": "2.2.0", 706 | "resolved": "https://registry.npmjs.org/ffi/-/ffi-2.2.0.tgz", 707 | "integrity": "sha1-vxiwRmain3EiftVoldVDCvRwQvo=" 708 | }, 709 | "find-up": { 710 | "version": "1.1.2", 711 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 712 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 713 | "dev": true, 714 | "dependencies": { 715 | "path-exists": { 716 | "version": "2.1.0", 717 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 718 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 719 | "dev": true 720 | } 721 | } 722 | }, 723 | "findup-sync": { 724 | "version": "0.1.3", 725 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", 726 | "integrity": "sha1-fz56l7gjksZTvwZYm9hRkOk8NoM=", 727 | "dev": true, 728 | "dependencies": { 729 | "glob": { 730 | "version": "3.2.11", 731 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", 732 | "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", 733 | "dev": true 734 | }, 735 | "lodash": { 736 | "version": "2.4.2", 737 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", 738 | "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", 739 | "dev": true 740 | }, 741 | "minimatch": { 742 | "version": "0.3.0", 743 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", 744 | "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", 745 | "dev": true 746 | } 747 | } 748 | }, 749 | "fs-readdir-recursive": { 750 | "version": "0.1.2", 751 | "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz", 752 | "integrity": "sha1-MVtPuMHKW4xH3v7zGdBz2tNWgFk=", 753 | "dev": true 754 | }, 755 | "fs.realpath": { 756 | "version": "1.0.0", 757 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 758 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 759 | "dev": true 760 | }, 761 | "gaze": { 762 | "version": "0.5.2", 763 | "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", 764 | "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", 765 | "dev": true 766 | }, 767 | "get-stdin": { 768 | "version": "4.0.1", 769 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", 770 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", 771 | "dev": true 772 | }, 773 | "getobject": { 774 | "version": "0.1.0", 775 | "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", 776 | "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", 777 | "dev": true 778 | }, 779 | "glob": { 780 | "version": "3.1.21", 781 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", 782 | "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", 783 | "dev": true, 784 | "dependencies": { 785 | "inherits": { 786 | "version": "1.0.2", 787 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", 788 | "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", 789 | "dev": true 790 | } 791 | } 792 | }, 793 | "globals": { 794 | "version": "6.4.1", 795 | "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", 796 | "integrity": "sha1-hJgDKzttHMge68X3lpDY/in6v08=", 797 | "dev": true 798 | }, 799 | "globule": { 800 | "version": "0.1.0", 801 | "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", 802 | "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", 803 | "dev": true, 804 | "dependencies": { 805 | "lodash": { 806 | "version": "1.0.2", 807 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", 808 | "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", 809 | "dev": true 810 | } 811 | } 812 | }, 813 | "graceful-fs": { 814 | "version": "1.2.3", 815 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", 816 | "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", 817 | "dev": true 818 | }, 819 | "graceful-readlink": { 820 | "version": "1.0.1", 821 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", 822 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", 823 | "dev": true 824 | }, 825 | "growl": { 826 | "version": "1.9.2", 827 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", 828 | "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", 829 | "dev": true 830 | }, 831 | "grunt": { 832 | "version": "0.4.5", 833 | "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", 834 | "integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=", 835 | "dev": true 836 | }, 837 | "grunt-contrib-jshint": { 838 | "version": "0.11.3", 839 | "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-0.11.3.tgz", 840 | "integrity": "sha1-gDaBgdzNVRGG5bg4XAEc7iTWQKA=", 841 | "dev": true 842 | }, 843 | "grunt-contrib-watch": { 844 | "version": "0.6.1", 845 | "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-0.6.1.tgz", 846 | "integrity": "sha1-ZP3LolpjX1tNobbOb5DaCutuPxU=", 847 | "dev": true, 848 | "dependencies": { 849 | "async": { 850 | "version": "0.2.10", 851 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", 852 | "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", 853 | "dev": true 854 | }, 855 | "lodash": { 856 | "version": "2.4.2", 857 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", 858 | "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", 859 | "dev": true 860 | } 861 | } 862 | }, 863 | "grunt-jsbeautifier": { 864 | "version": "0.2.13", 865 | "resolved": "https://registry.npmjs.org/grunt-jsbeautifier/-/grunt-jsbeautifier-0.2.13.tgz", 866 | "integrity": "sha1-89QXOPy1+ZhO8pbVvuvEBIkQVkI=", 867 | "dev": true, 868 | "dependencies": { 869 | "async": { 870 | "version": "2.5.0", 871 | "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", 872 | "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", 873 | "dev": true 874 | }, 875 | "lodash": { 876 | "version": "4.17.4", 877 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 878 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", 879 | "dev": true 880 | }, 881 | "underscore.string": { 882 | "version": "3.3.4", 883 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz", 884 | "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=", 885 | "dev": true 886 | } 887 | } 888 | }, 889 | "grunt-jscs": { 890 | "version": "2.8.0", 891 | "resolved": "https://registry.npmjs.org/grunt-jscs/-/grunt-jscs-2.8.0.tgz", 892 | "integrity": "sha1-nc81LFY6Mi2Adl/pIsLNoqRkzto=", 893 | "dev": true, 894 | "dependencies": { 895 | "lodash": { 896 | "version": "4.6.1", 897 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.6.1.tgz", 898 | "integrity": "sha1-3wDBFkrSNrGDz8OIel6NOMxjy7w=", 899 | "dev": true 900 | } 901 | } 902 | }, 903 | "grunt-legacy-log": { 904 | "version": "0.1.3", 905 | "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", 906 | "integrity": "sha1-7ClCboAwIa9ZAp+H0vnNczWgVTE=", 907 | "dev": true, 908 | "dependencies": { 909 | "lodash": { 910 | "version": "2.4.2", 911 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", 912 | "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", 913 | "dev": true 914 | }, 915 | "underscore.string": { 916 | "version": "2.3.3", 917 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", 918 | "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", 919 | "dev": true 920 | } 921 | } 922 | }, 923 | "grunt-legacy-log-utils": { 924 | "version": "0.1.1", 925 | "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", 926 | "integrity": "sha1-wHBrndkGThFvNvI/5OawSGcsD34=", 927 | "dev": true, 928 | "dependencies": { 929 | "lodash": { 930 | "version": "2.4.2", 931 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", 932 | "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", 933 | "dev": true 934 | }, 935 | "underscore.string": { 936 | "version": "2.3.3", 937 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", 938 | "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", 939 | "dev": true 940 | } 941 | } 942 | }, 943 | "grunt-legacy-util": { 944 | "version": "0.2.0", 945 | "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", 946 | "integrity": "sha1-kzJIhNv343qf98Am3/RR2UqeVUs=", 947 | "dev": true 948 | }, 949 | "grunt-mocha-cli": { 950 | "version": "2.1.0", 951 | "resolved": "https://registry.npmjs.org/grunt-mocha-cli/-/grunt-mocha-cli-2.1.0.tgz", 952 | "integrity": "sha1-LkjUtm2WWY9k58j1xm/jjYNfx+E=", 953 | "dev": true 954 | }, 955 | "has-ansi": { 956 | "version": "2.0.0", 957 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 958 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 959 | "dev": true 960 | }, 961 | "has-color": { 962 | "version": "0.1.7", 963 | "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", 964 | "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", 965 | "dev": true 966 | }, 967 | "home-or-tmp": { 968 | "version": "1.0.0", 969 | "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", 970 | "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", 971 | "dev": true 972 | }, 973 | "hooker": { 974 | "version": "0.2.3", 975 | "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", 976 | "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", 977 | "dev": true 978 | }, 979 | "htmlparser2": { 980 | "version": "3.8.3", 981 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", 982 | "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", 983 | "dev": true 984 | }, 985 | "i": { 986 | "version": "0.3.5", 987 | "resolved": "https://registry.npmjs.org/i/-/i-0.3.5.tgz", 988 | "integrity": "sha1-HSuFQVjsgWkRPGy39raAHpniEdU=", 989 | "dev": true 990 | }, 991 | "iconv-lite": { 992 | "version": "0.2.11", 993 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", 994 | "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=", 995 | "dev": true 996 | }, 997 | "inflight": { 998 | "version": "1.0.6", 999 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1000 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1001 | "dev": true 1002 | }, 1003 | "inherit": { 1004 | "version": "2.2.6", 1005 | "resolved": "https://registry.npmjs.org/inherit/-/inherit-2.2.6.tgz", 1006 | "integrity": "sha1-8WFLBshUToEo5CKchjR9tzrZeI0=", 1007 | "dev": true 1008 | }, 1009 | "inherits": { 1010 | "version": "2.0.3", 1011 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1012 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 1013 | "dev": true 1014 | }, 1015 | "ini": { 1016 | "version": "1.3.4", 1017 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", 1018 | "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", 1019 | "dev": true 1020 | }, 1021 | "invert-kv": { 1022 | "version": "1.0.0", 1023 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 1024 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", 1025 | "dev": true 1026 | }, 1027 | "is-buffer": { 1028 | "version": "1.1.5", 1029 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", 1030 | "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", 1031 | "dev": true 1032 | }, 1033 | "is-finite": { 1034 | "version": "1.0.2", 1035 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 1036 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 1037 | "dev": true 1038 | }, 1039 | "is-integer": { 1040 | "version": "1.0.7", 1041 | "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.7.tgz", 1042 | "integrity": "sha1-a96Bqs3feLZZtmKdYpytxRqIbVw=", 1043 | "dev": true 1044 | }, 1045 | "is-utf8": { 1046 | "version": "0.2.1", 1047 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 1048 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", 1049 | "dev": true 1050 | }, 1051 | "isarray": { 1052 | "version": "0.0.1", 1053 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 1054 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 1055 | "dev": true 1056 | }, 1057 | "isstream": { 1058 | "version": "0.1.2", 1059 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1060 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 1061 | "dev": true 1062 | }, 1063 | "jade": { 1064 | "version": "0.26.3", 1065 | "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", 1066 | "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", 1067 | "dev": true, 1068 | "dependencies": { 1069 | "commander": { 1070 | "version": "0.6.1", 1071 | "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", 1072 | "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", 1073 | "dev": true 1074 | }, 1075 | "mkdirp": { 1076 | "version": "0.3.0", 1077 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", 1078 | "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", 1079 | "dev": true 1080 | } 1081 | } 1082 | }, 1083 | "js-beautify": { 1084 | "version": "1.6.14", 1085 | "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.6.14.tgz", 1086 | "integrity": "sha1-07j3Mi0CuSd9WL0jgmTDJ+WARM0=", 1087 | "dev": true, 1088 | "dependencies": { 1089 | "nopt": { 1090 | "version": "3.0.6", 1091 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", 1092 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", 1093 | "dev": true 1094 | } 1095 | } 1096 | }, 1097 | "js-tokens": { 1098 | "version": "1.0.1", 1099 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", 1100 | "integrity": "sha1-zENaXIuUrRWst5gxQPyAGCyJrq4=", 1101 | "dev": true 1102 | }, 1103 | "js-yaml": { 1104 | "version": "2.0.5", 1105 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", 1106 | "integrity": "sha1-olrmUJmZ6X3yeMZxnaEb0Gh3Q6g=", 1107 | "dev": true 1108 | }, 1109 | "jscs": { 1110 | "version": "2.11.0", 1111 | "resolved": "https://registry.npmjs.org/jscs/-/jscs-2.11.0.tgz", 1112 | "integrity": "sha1-bhHvDKqgdzH53MKysn2OzuHdvLY=", 1113 | "dev": true, 1114 | "dependencies": { 1115 | "argparse": { 1116 | "version": "1.0.9", 1117 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", 1118 | "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", 1119 | "dev": true 1120 | }, 1121 | "commander": { 1122 | "version": "2.9.0", 1123 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", 1124 | "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", 1125 | "dev": true 1126 | }, 1127 | "esprima": { 1128 | "version": "2.7.3", 1129 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", 1130 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", 1131 | "dev": true 1132 | }, 1133 | "glob": { 1134 | "version": "5.0.15", 1135 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 1136 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", 1137 | "dev": true 1138 | }, 1139 | "js-yaml": { 1140 | "version": "3.4.6", 1141 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.4.6.tgz", 1142 | "integrity": "sha1-a+GyP2JJ9T0pM3D9TRqqY84bTrA=", 1143 | "dev": true 1144 | }, 1145 | "lodash": { 1146 | "version": "3.10.1", 1147 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", 1148 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", 1149 | "dev": true 1150 | }, 1151 | "minimatch": { 1152 | "version": "3.0.4", 1153 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1154 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1155 | "dev": true 1156 | }, 1157 | "sprintf-js": { 1158 | "version": "1.0.3", 1159 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1160 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1161 | "dev": true 1162 | } 1163 | } 1164 | }, 1165 | "jscs-jsdoc": { 1166 | "version": "1.3.2", 1167 | "resolved": "https://registry.npmjs.org/jscs-jsdoc/-/jscs-jsdoc-1.3.2.tgz", 1168 | "integrity": "sha1-HyyCtqtLl1JNqVj0a05WLgMF+ac=", 1169 | "dev": true 1170 | }, 1171 | "jscs-preset-wikimedia": { 1172 | "version": "1.0.0", 1173 | "resolved": "https://registry.npmjs.org/jscs-preset-wikimedia/-/jscs-preset-wikimedia-1.0.0.tgz", 1174 | "integrity": "sha1-//VjNCA4/C6IJre7cwnDrjQG/H4=", 1175 | "dev": true 1176 | }, 1177 | "jsdoctypeparser": { 1178 | "version": "1.2.0", 1179 | "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-1.2.0.tgz", 1180 | "integrity": "sha1-597cFToRhJ/8UUEUSuhqfvDCU5I=", 1181 | "dev": true, 1182 | "dependencies": { 1183 | "lodash": { 1184 | "version": "3.10.1", 1185 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", 1186 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", 1187 | "dev": true 1188 | } 1189 | } 1190 | }, 1191 | "jsesc": { 1192 | "version": "0.5.0", 1193 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", 1194 | "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", 1195 | "dev": true 1196 | }, 1197 | "jshint": { 1198 | "version": "2.8.0", 1199 | "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.8.0.tgz", 1200 | "integrity": "sha1-HQmjvZE8TK36gb8Y1YK9hb/+DUQ=", 1201 | "dev": true, 1202 | "dependencies": { 1203 | "lodash": { 1204 | "version": "3.7.0", 1205 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", 1206 | "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=", 1207 | "dev": true 1208 | }, 1209 | "minimatch": { 1210 | "version": "2.0.10", 1211 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", 1212 | "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", 1213 | "dev": true 1214 | } 1215 | } 1216 | }, 1217 | "json5": { 1218 | "version": "0.4.0", 1219 | "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", 1220 | "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=", 1221 | "dev": true 1222 | }, 1223 | "jsonlint": { 1224 | "version": "1.6.2", 1225 | "resolved": "https://registry.npmjs.org/jsonlint/-/jsonlint-1.6.2.tgz", 1226 | "integrity": "sha1-VzcEUIX1XrRVxosf9OvAG9UOiDA=", 1227 | "dev": true 1228 | }, 1229 | "JSV": { 1230 | "version": "4.0.2", 1231 | "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz", 1232 | "integrity": "sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c=", 1233 | "dev": true 1234 | }, 1235 | "kind-of": { 1236 | "version": "3.2.2", 1237 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1238 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1239 | "dev": true 1240 | }, 1241 | "lazy-cache": { 1242 | "version": "1.0.4", 1243 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 1244 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", 1245 | "dev": true 1246 | }, 1247 | "lcid": { 1248 | "version": "1.0.0", 1249 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 1250 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 1251 | "dev": true 1252 | }, 1253 | "leven": { 1254 | "version": "1.0.2", 1255 | "resolved": "https://registry.npmjs.org/leven/-/leven-1.0.2.tgz", 1256 | "integrity": "sha1-kUS27ryl8dBoAWnxpncNzqYLdcM=", 1257 | "dev": true 1258 | }, 1259 | "load-grunt-tasks": { 1260 | "version": "3.5.2", 1261 | "resolved": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-3.5.2.tgz", 1262 | "integrity": "sha1-ByhWEYD9IP+KaSdQWFL8WKrqDIg=", 1263 | "dev": true 1264 | }, 1265 | "lodash": { 1266 | "version": "0.9.2", 1267 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", 1268 | "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=", 1269 | "dev": true 1270 | }, 1271 | "lodash._baseassign": { 1272 | "version": "3.2.0", 1273 | "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", 1274 | "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", 1275 | "dev": true 1276 | }, 1277 | "lodash._basecopy": { 1278 | "version": "3.0.1", 1279 | "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", 1280 | "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", 1281 | "dev": true 1282 | }, 1283 | "lodash._bindcallback": { 1284 | "version": "3.0.1", 1285 | "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", 1286 | "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", 1287 | "dev": true 1288 | }, 1289 | "lodash._createassigner": { 1290 | "version": "3.1.1", 1291 | "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", 1292 | "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", 1293 | "dev": true 1294 | }, 1295 | "lodash._getnative": { 1296 | "version": "3.9.1", 1297 | "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", 1298 | "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", 1299 | "dev": true 1300 | }, 1301 | "lodash._isiterateecall": { 1302 | "version": "3.0.9", 1303 | "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", 1304 | "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", 1305 | "dev": true 1306 | }, 1307 | "lodash.assign": { 1308 | "version": "3.2.0", 1309 | "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", 1310 | "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", 1311 | "dev": true 1312 | }, 1313 | "lodash.isarguments": { 1314 | "version": "3.1.0", 1315 | "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", 1316 | "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", 1317 | "dev": true 1318 | }, 1319 | "lodash.isarray": { 1320 | "version": "3.0.4", 1321 | "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", 1322 | "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", 1323 | "dev": true 1324 | }, 1325 | "lodash.keys": { 1326 | "version": "3.1.2", 1327 | "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", 1328 | "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", 1329 | "dev": true 1330 | }, 1331 | "lodash.restparam": { 1332 | "version": "3.6.1", 1333 | "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", 1334 | "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", 1335 | "dev": true 1336 | }, 1337 | "longest": { 1338 | "version": "1.0.1", 1339 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 1340 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", 1341 | "dev": true 1342 | }, 1343 | "lru-cache": { 1344 | "version": "2.7.3", 1345 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", 1346 | "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", 1347 | "dev": true 1348 | }, 1349 | "minimatch": { 1350 | "version": "0.2.14", 1351 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", 1352 | "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", 1353 | "dev": true 1354 | }, 1355 | "minimist": { 1356 | "version": "0.0.8", 1357 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1358 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1359 | "dev": true 1360 | }, 1361 | "mkdirp": { 1362 | "version": "0.5.1", 1363 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1364 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1365 | "dev": true 1366 | }, 1367 | "mocha": { 1368 | "version": "2.5.3", 1369 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", 1370 | "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", 1371 | "dev": true, 1372 | "dependencies": { 1373 | "commander": { 1374 | "version": "2.3.0", 1375 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", 1376 | "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", 1377 | "dev": true 1378 | }, 1379 | "debug": { 1380 | "version": "2.2.0", 1381 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 1382 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 1383 | "dev": true 1384 | }, 1385 | "escape-string-regexp": { 1386 | "version": "1.0.2", 1387 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", 1388 | "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", 1389 | "dev": true 1390 | }, 1391 | "glob": { 1392 | "version": "3.2.11", 1393 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", 1394 | "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", 1395 | "dev": true 1396 | }, 1397 | "minimatch": { 1398 | "version": "0.3.0", 1399 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", 1400 | "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", 1401 | "dev": true 1402 | }, 1403 | "ms": { 1404 | "version": "0.7.1", 1405 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 1406 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", 1407 | "dev": true 1408 | }, 1409 | "supports-color": { 1410 | "version": "1.2.0", 1411 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", 1412 | "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", 1413 | "dev": true 1414 | } 1415 | } 1416 | }, 1417 | "mockery": { 1418 | "version": "1.7.0", 1419 | "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", 1420 | "integrity": "sha1-9O3g2HUMHJcnwnLqLGBiniyaHE8=", 1421 | "dev": true 1422 | }, 1423 | "ms": { 1424 | "version": "2.0.0", 1425 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1426 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1427 | }, 1428 | "multimatch": { 1429 | "version": "2.1.0", 1430 | "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", 1431 | "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", 1432 | "dev": true, 1433 | "dependencies": { 1434 | "minimatch": { 1435 | "version": "3.0.4", 1436 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1437 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1438 | "dev": true 1439 | } 1440 | } 1441 | }, 1442 | "mute-stream": { 1443 | "version": "0.0.7", 1444 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 1445 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 1446 | "dev": true 1447 | }, 1448 | "nan": { 1449 | "version": "2.6.2", 1450 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", 1451 | "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=" 1452 | }, 1453 | "natural-compare": { 1454 | "version": "1.2.2", 1455 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.2.2.tgz", 1456 | "integrity": "sha1-H5bWDjFBysG20FZTzg2urHY69qo=", 1457 | "dev": true 1458 | }, 1459 | "ncp": { 1460 | "version": "0.4.2", 1461 | "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", 1462 | "integrity": "sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ=", 1463 | "dev": true 1464 | }, 1465 | "nomnom": { 1466 | "version": "1.8.1", 1467 | "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", 1468 | "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", 1469 | "dev": true, 1470 | "dependencies": { 1471 | "ansi-styles": { 1472 | "version": "1.0.0", 1473 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", 1474 | "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", 1475 | "dev": true 1476 | }, 1477 | "chalk": { 1478 | "version": "0.4.0", 1479 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", 1480 | "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", 1481 | "dev": true 1482 | }, 1483 | "strip-ansi": { 1484 | "version": "0.1.1", 1485 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", 1486 | "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", 1487 | "dev": true 1488 | }, 1489 | "underscore": { 1490 | "version": "1.6.0", 1491 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", 1492 | "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", 1493 | "dev": true 1494 | } 1495 | } 1496 | }, 1497 | "nopt": { 1498 | "version": "1.0.10", 1499 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 1500 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", 1501 | "dev": true 1502 | }, 1503 | "noptify": { 1504 | "version": "0.0.3", 1505 | "resolved": "https://registry.npmjs.org/noptify/-/noptify-0.0.3.tgz", 1506 | "integrity": "sha1-WPZUpz2XU98MUdlobckhBKZ/S7s=", 1507 | "dev": true, 1508 | "dependencies": { 1509 | "nopt": { 1510 | "version": "2.0.0", 1511 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.0.0.tgz", 1512 | "integrity": "sha1-ynQW8gpeP5w7hhgPlilfo9C1Lg0=", 1513 | "dev": true 1514 | } 1515 | } 1516 | }, 1517 | "number-is-nan": { 1518 | "version": "1.0.1", 1519 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1520 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 1521 | "dev": true 1522 | }, 1523 | "object-assign": { 1524 | "version": "4.1.1", 1525 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1526 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1527 | "dev": true 1528 | }, 1529 | "once": { 1530 | "version": "1.4.0", 1531 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1532 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1533 | "dev": true 1534 | }, 1535 | "os-locale": { 1536 | "version": "1.4.0", 1537 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", 1538 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", 1539 | "dev": true 1540 | }, 1541 | "os-tmpdir": { 1542 | "version": "1.0.2", 1543 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1544 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1545 | "dev": true 1546 | }, 1547 | "output-file-sync": { 1548 | "version": "1.1.2", 1549 | "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", 1550 | "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", 1551 | "dev": true, 1552 | "dependencies": { 1553 | "graceful-fs": { 1554 | "version": "4.1.11", 1555 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 1556 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 1557 | "dev": true 1558 | } 1559 | } 1560 | }, 1561 | "path-exists": { 1562 | "version": "1.0.0", 1563 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", 1564 | "integrity": "sha1-1aiZjrce83p0w06w2eum6HjuoIE=", 1565 | "dev": true 1566 | }, 1567 | "path-is-absolute": { 1568 | "version": "1.0.1", 1569 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1570 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1571 | "dev": true 1572 | }, 1573 | "path-parse": { 1574 | "version": "1.0.5", 1575 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 1576 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", 1577 | "dev": true 1578 | }, 1579 | "pathval": { 1580 | "version": "0.1.1", 1581 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-0.1.1.tgz", 1582 | "integrity": "sha1-CPkRzcqczllCiA2ngXvAtyO2bYI=", 1583 | "dev": true 1584 | }, 1585 | "pinkie": { 1586 | "version": "2.0.4", 1587 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1588 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 1589 | "dev": true 1590 | }, 1591 | "pinkie-promise": { 1592 | "version": "2.0.1", 1593 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1594 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1595 | "dev": true 1596 | }, 1597 | "pkg-up": { 1598 | "version": "1.0.0", 1599 | "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", 1600 | "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", 1601 | "dev": true 1602 | }, 1603 | "pkginfo": { 1604 | "version": "0.4.0", 1605 | "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.0.tgz", 1606 | "integrity": "sha1-NJ27f/04CB/K3AhT32h/DHdEzWU=", 1607 | "dev": true 1608 | }, 1609 | "private": { 1610 | "version": "0.1.7", 1611 | "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", 1612 | "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=", 1613 | "dev": true 1614 | }, 1615 | "process-nextick-args": { 1616 | "version": "1.0.7", 1617 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 1618 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 1619 | "dev": true 1620 | }, 1621 | "prompt": { 1622 | "version": "0.2.14", 1623 | "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz", 1624 | "integrity": "sha1-V3VPZPVD/XsIRXB8gY7OYY8F/9w=", 1625 | "dev": true 1626 | }, 1627 | "proto-list": { 1628 | "version": "1.2.4", 1629 | "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", 1630 | "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", 1631 | "dev": true 1632 | }, 1633 | "pseudomap": { 1634 | "version": "1.0.2", 1635 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1636 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 1637 | "dev": true 1638 | }, 1639 | "q": { 1640 | "version": "1.5.0", 1641 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", 1642 | "integrity": "sha1-3QG6ydBtMObyGa7LglPunr3DCPE=", 1643 | "dev": true 1644 | }, 1645 | "qs": { 1646 | "version": "0.5.6", 1647 | "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz", 1648 | "integrity": "sha1-MbGtBYVnZRxSaSFQa5qHk5EaA4Q=", 1649 | "dev": true 1650 | }, 1651 | "rc": { 1652 | "version": "1.2.1", 1653 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", 1654 | "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", 1655 | "dev": true, 1656 | "dependencies": { 1657 | "minimist": { 1658 | "version": "1.2.0", 1659 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1660 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 1661 | "dev": true 1662 | }, 1663 | "strip-json-comments": { 1664 | "version": "2.0.1", 1665 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1666 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1667 | "dev": true 1668 | } 1669 | } 1670 | }, 1671 | "read": { 1672 | "version": "1.0.7", 1673 | "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", 1674 | "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", 1675 | "dev": true 1676 | }, 1677 | "readable-stream": { 1678 | "version": "1.1.14", 1679 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 1680 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 1681 | "dev": true 1682 | }, 1683 | "recast": { 1684 | "version": "0.10.33", 1685 | "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.33.tgz", 1686 | "integrity": "sha1-lCgI96oBbx+nFCxGHX5XBKqo1pc=", 1687 | "dev": true, 1688 | "dependencies": { 1689 | "ast-types": { 1690 | "version": "0.8.12", 1691 | "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.12.tgz", 1692 | "integrity": "sha1-oNkOQ1G7iHcWyD/WN+v4GK9K38w=", 1693 | "dev": true 1694 | }, 1695 | "esprima-fb": { 1696 | "version": "15001.1001.0-dev-harmony-fb", 1697 | "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", 1698 | "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=", 1699 | "dev": true 1700 | } 1701 | } 1702 | }, 1703 | "ref": { 1704 | "version": "1.3.4", 1705 | "resolved": "https://registry.npmjs.org/ref/-/ref-1.3.4.tgz", 1706 | "integrity": "sha1-ck0r+KyF+MjbGU09hb5u/kFrweU=" 1707 | }, 1708 | "ref-struct": { 1709 | "version": "1.1.0", 1710 | "resolved": "https://registry.npmjs.org/ref-struct/-/ref-struct-1.1.0.tgz", 1711 | "integrity": "sha1-XV7mWtQc78Olxf60BYcmHkee3BM=" 1712 | }, 1713 | "ref-union": { 1714 | "version": "1.0.1", 1715 | "resolved": "https://registry.npmjs.org/ref-union/-/ref-union-1.0.1.tgz", 1716 | "integrity": "sha1-OiOX+GLx51Fx1ocmj0Oz8Xcp8SA=" 1717 | }, 1718 | "regenerate": { 1719 | "version": "1.3.2", 1720 | "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", 1721 | "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=", 1722 | "dev": true 1723 | }, 1724 | "regenerator": { 1725 | "version": "0.8.40", 1726 | "resolved": "https://registry.npmjs.org/regenerator/-/regenerator-0.8.40.tgz", 1727 | "integrity": "sha1-oORXxY69uuV1yfjNdRJ+k3VkNdg=", 1728 | "dev": true, 1729 | "dependencies": { 1730 | "esprima-fb": { 1731 | "version": "15001.1001.0-dev-harmony-fb", 1732 | "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", 1733 | "integrity": "sha1-Q761fsJujPI3092LM+QlM1d/Jlk=", 1734 | "dev": true 1735 | } 1736 | } 1737 | }, 1738 | "regexpu": { 1739 | "version": "1.3.0", 1740 | "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz", 1741 | "integrity": "sha1-5TTcmRqeWEYFDJjebX3UpVyeoW0=", 1742 | "dev": true, 1743 | "dependencies": { 1744 | "esprima": { 1745 | "version": "2.7.3", 1746 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", 1747 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", 1748 | "dev": true 1749 | } 1750 | } 1751 | }, 1752 | "regjsgen": { 1753 | "version": "0.2.0", 1754 | "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", 1755 | "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", 1756 | "dev": true 1757 | }, 1758 | "regjsparser": { 1759 | "version": "0.1.5", 1760 | "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", 1761 | "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", 1762 | "dev": true 1763 | }, 1764 | "repeat-string": { 1765 | "version": "1.6.1", 1766 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 1767 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 1768 | "dev": true 1769 | }, 1770 | "repeating": { 1771 | "version": "1.1.3", 1772 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", 1773 | "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", 1774 | "dev": true 1775 | }, 1776 | "reserved-words": { 1777 | "version": "0.1.1", 1778 | "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.1.tgz", 1779 | "integrity": "sha1-b3wV5eVhTFDalhYw2kat3IfAzvI=", 1780 | "dev": true 1781 | }, 1782 | "resolve": { 1783 | "version": "1.4.0", 1784 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", 1785 | "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", 1786 | "dev": true 1787 | }, 1788 | "resolve-from": { 1789 | "version": "2.0.0", 1790 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 1791 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", 1792 | "dev": true 1793 | }, 1794 | "resolve-pkg": { 1795 | "version": "0.1.0", 1796 | "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-0.1.0.tgz", 1797 | "integrity": "sha1-AsyZNBDik2livZcWahsHfalyVTE=", 1798 | "dev": true 1799 | }, 1800 | "revalidator": { 1801 | "version": "0.1.8", 1802 | "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", 1803 | "integrity": "sha1-/s5hv6DBtSoga9axgZgYS91SOjs=", 1804 | "dev": true 1805 | }, 1806 | "right-align": { 1807 | "version": "0.1.3", 1808 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 1809 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 1810 | "dev": true 1811 | }, 1812 | "rimraf": { 1813 | "version": "2.2.8", 1814 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", 1815 | "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", 1816 | "dev": true 1817 | }, 1818 | "safe-buffer": { 1819 | "version": "5.1.1", 1820 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 1821 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", 1822 | "dev": true 1823 | }, 1824 | "semver": { 1825 | "version": "5.4.1", 1826 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", 1827 | "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", 1828 | "dev": true 1829 | }, 1830 | "shebang-regex": { 1831 | "version": "1.0.0", 1832 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1833 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1834 | "dev": true 1835 | }, 1836 | "shelljs": { 1837 | "version": "0.3.0", 1838 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", 1839 | "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", 1840 | "dev": true 1841 | }, 1842 | "sigmund": { 1843 | "version": "1.0.1", 1844 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", 1845 | "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", 1846 | "dev": true 1847 | }, 1848 | "simple-fmt": { 1849 | "version": "0.1.0", 1850 | "resolved": "https://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz", 1851 | "integrity": "sha1-GRv1ZqWeZTBILLJatTtKjchcOms=", 1852 | "dev": true 1853 | }, 1854 | "simple-is": { 1855 | "version": "0.2.0", 1856 | "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz", 1857 | "integrity": "sha1-Krt1qt453rXMgVzhDmGRFkhQuvA=", 1858 | "dev": true 1859 | }, 1860 | "slash": { 1861 | "version": "1.0.0", 1862 | "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", 1863 | "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", 1864 | "dev": true 1865 | }, 1866 | "source-map": { 1867 | "version": "0.5.6", 1868 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", 1869 | "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", 1870 | "dev": true 1871 | }, 1872 | "source-map-support": { 1873 | "version": "0.2.10", 1874 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", 1875 | "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", 1876 | "dev": true, 1877 | "dependencies": { 1878 | "source-map": { 1879 | "version": "0.1.32", 1880 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", 1881 | "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", 1882 | "dev": true 1883 | } 1884 | } 1885 | }, 1886 | "sprintf-js": { 1887 | "version": "1.1.1", 1888 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", 1889 | "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=", 1890 | "dev": true 1891 | }, 1892 | "stable": { 1893 | "version": "0.1.6", 1894 | "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz", 1895 | "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=", 1896 | "dev": true 1897 | }, 1898 | "stack-trace": { 1899 | "version": "0.0.10", 1900 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 1901 | "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", 1902 | "dev": true 1903 | }, 1904 | "string_decoder": { 1905 | "version": "0.10.31", 1906 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1907 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 1908 | "dev": true 1909 | }, 1910 | "stringmap": { 1911 | "version": "0.2.2", 1912 | "resolved": "https://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz", 1913 | "integrity": "sha1-VWwTeyWPlCuHdvWy71gqoGnX0bE=", 1914 | "dev": true 1915 | }, 1916 | "stringset": { 1917 | "version": "0.2.1", 1918 | "resolved": "https://registry.npmjs.org/stringset/-/stringset-0.2.1.tgz", 1919 | "integrity": "sha1-7yWcTjSTRDd/zRyRPdLoSMnAQrU=", 1920 | "dev": true 1921 | }, 1922 | "strip-ansi": { 1923 | "version": "3.0.1", 1924 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1925 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1926 | "dev": true 1927 | }, 1928 | "strip-bom": { 1929 | "version": "2.0.0", 1930 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 1931 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", 1932 | "dev": true 1933 | }, 1934 | "strip-json-comments": { 1935 | "version": "1.0.4", 1936 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", 1937 | "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", 1938 | "dev": true 1939 | }, 1940 | "supports-color": { 1941 | "version": "2.0.0", 1942 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1943 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1944 | "dev": true 1945 | }, 1946 | "through": { 1947 | "version": "2.3.8", 1948 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1949 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1950 | "dev": true 1951 | }, 1952 | "tiny-lr-fork": { 1953 | "version": "0.0.5", 1954 | "resolved": "https://registry.npmjs.org/tiny-lr-fork/-/tiny-lr-fork-0.0.5.tgz", 1955 | "integrity": "sha1-Hpnh4qhGm3NquX2X7vqYxx927Qo=", 1956 | "dev": true, 1957 | "dependencies": { 1958 | "debug": { 1959 | "version": "0.7.4", 1960 | "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", 1961 | "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", 1962 | "dev": true 1963 | } 1964 | } 1965 | }, 1966 | "to-double-quotes": { 1967 | "version": "2.0.0", 1968 | "resolved": "https://registry.npmjs.org/to-double-quotes/-/to-double-quotes-2.0.0.tgz", 1969 | "integrity": "sha1-qvIx1vqUiUn4GTAburRITYWI5Kc=", 1970 | "dev": true 1971 | }, 1972 | "to-fast-properties": { 1973 | "version": "1.0.3", 1974 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", 1975 | "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", 1976 | "dev": true 1977 | }, 1978 | "to-iso-string": { 1979 | "version": "0.0.2", 1980 | "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", 1981 | "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", 1982 | "dev": true 1983 | }, 1984 | "to-single-quotes": { 1985 | "version": "2.0.1", 1986 | "resolved": "https://registry.npmjs.org/to-single-quotes/-/to-single-quotes-2.0.1.tgz", 1987 | "integrity": "sha1-fMKRUfD18sQZRvEZ9ZMv5VQXASU=", 1988 | "dev": true 1989 | }, 1990 | "trim-right": { 1991 | "version": "1.0.1", 1992 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", 1993 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", 1994 | "dev": true 1995 | }, 1996 | "try-resolve": { 1997 | "version": "1.0.1", 1998 | "resolved": "https://registry.npmjs.org/try-resolve/-/try-resolve-1.0.1.tgz", 1999 | "integrity": "sha1-z95vq9ctY+V5fPqrhzq76OcA6RI=", 2000 | "dev": true 2001 | }, 2002 | "tryor": { 2003 | "version": "0.1.2", 2004 | "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz", 2005 | "integrity": "sha1-gUXkynyv9ArN48z5Rui4u3W0Fys=", 2006 | "dev": true 2007 | }, 2008 | "underscore": { 2009 | "version": "1.7.0", 2010 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", 2011 | "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", 2012 | "dev": true 2013 | }, 2014 | "underscore.string": { 2015 | "version": "2.2.1", 2016 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", 2017 | "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=", 2018 | "dev": true 2019 | }, 2020 | "user-home": { 2021 | "version": "1.1.1", 2022 | "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", 2023 | "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", 2024 | "dev": true 2025 | }, 2026 | "util-deprecate": { 2027 | "version": "1.0.2", 2028 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2029 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 2030 | "dev": true 2031 | }, 2032 | "utile": { 2033 | "version": "0.2.1", 2034 | "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", 2035 | "integrity": "sha1-kwyI6ZCY1iIINMNWy9mncFItkNc=", 2036 | "dev": true, 2037 | "dependencies": { 2038 | "async": { 2039 | "version": "0.2.10", 2040 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", 2041 | "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", 2042 | "dev": true 2043 | } 2044 | } 2045 | }, 2046 | "uuid": { 2047 | "version": "2.0.3", 2048 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", 2049 | "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", 2050 | "dev": true 2051 | }, 2052 | "vow": { 2053 | "version": "0.4.16", 2054 | "resolved": "https://registry.npmjs.org/vow/-/vow-0.4.16.tgz", 2055 | "integrity": "sha1-u51U2TjV+AUg1linQOeoleMP7us=", 2056 | "dev": true 2057 | }, 2058 | "vow-fs": { 2059 | "version": "0.3.6", 2060 | "resolved": "https://registry.npmjs.org/vow-fs/-/vow-fs-0.3.6.tgz", 2061 | "integrity": "sha1-LUxZviLivyYY3fWXq0uqkjvnIA0=", 2062 | "dev": true, 2063 | "dependencies": { 2064 | "glob": { 2065 | "version": "7.1.2", 2066 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 2067 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 2068 | "dev": true 2069 | }, 2070 | "minimatch": { 2071 | "version": "3.0.4", 2072 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2073 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2074 | "dev": true 2075 | } 2076 | } 2077 | }, 2078 | "vow-queue": { 2079 | "version": "0.4.2", 2080 | "resolved": "https://registry.npmjs.org/vow-queue/-/vow-queue-0.4.2.tgz", 2081 | "integrity": "sha1-5/4XFg4Vx8QYTRtmapvGThjjAYQ=", 2082 | "dev": true 2083 | }, 2084 | "which": { 2085 | "version": "1.0.9", 2086 | "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", 2087 | "integrity": "sha1-RgwdoPgQED0DIam2M6+eV15kSG8=", 2088 | "dev": true 2089 | }, 2090 | "window-size": { 2091 | "version": "0.1.4", 2092 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", 2093 | "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", 2094 | "dev": true 2095 | }, 2096 | "winston": { 2097 | "version": "0.8.3", 2098 | "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", 2099 | "integrity": "sha1-ZLar9M0Brcrv1QCTk7HY6L7BnbA=", 2100 | "dev": true, 2101 | "dependencies": { 2102 | "async": { 2103 | "version": "0.2.10", 2104 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", 2105 | "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", 2106 | "dev": true 2107 | }, 2108 | "pkginfo": { 2109 | "version": "0.3.1", 2110 | "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", 2111 | "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=", 2112 | "dev": true 2113 | } 2114 | } 2115 | }, 2116 | "wordwrap": { 2117 | "version": "0.0.2", 2118 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 2119 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", 2120 | "dev": true 2121 | }, 2122 | "wrappy": { 2123 | "version": "1.0.2", 2124 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2125 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2126 | "dev": true 2127 | }, 2128 | "xmlbuilder": { 2129 | "version": "3.1.0", 2130 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-3.1.0.tgz", 2131 | "integrity": "sha1-LIaIjy1OrehQ+jjKf3Ij9yCVFuE=", 2132 | "dev": true, 2133 | "dependencies": { 2134 | "lodash": { 2135 | "version": "3.10.1", 2136 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", 2137 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", 2138 | "dev": true 2139 | } 2140 | } 2141 | }, 2142 | "y18n": { 2143 | "version": "3.2.1", 2144 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", 2145 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", 2146 | "dev": true 2147 | }, 2148 | "yargs": { 2149 | "version": "3.27.0", 2150 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz", 2151 | "integrity": "sha1-ISBUaTFuk5Ex1Z8toMbX+YIh6kA=", 2152 | "dev": true 2153 | } 2154 | } 2155 | } 2156 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "windows-registry", 3 | "version": "0.1.5", 4 | "description": "Read and Write to the Windows registry in-process from Node.js. Easily set application file associations and other goodies & such.", 5 | "main": "index.js", 6 | "directories": { 7 | "test": "test" 8 | }, 9 | "dependencies": { 10 | "debug": "^2.2.0", 11 | "ffi": "^2.0.0", 12 | "ref": "^1.2.0", 13 | "ref-struct": "^1.0.2", 14 | "ref-union": "^1.0.0" 15 | }, 16 | "devDependencies": { 17 | "grunt": "^0.4.5", 18 | "grunt-contrib-jshint": "^0.11.3", 19 | "grunt-contrib-watch": "^0.6.1", 20 | "grunt-jsbeautifier": "^0.2.10", 21 | "grunt-jscs": "^2.1.0", 22 | "grunt-mocha-cli": "^2.0.0", 23 | "load-grunt-tasks": "^3.3.0", 24 | "mockery": "^1.4.0" 25 | }, 26 | "scripts": { 27 | "test": "grunt test" 28 | }, 29 | "repository": { 30 | "type": "git", 31 | "url": "git+https://github.com/CatalystCode/windows-registry-node.git" 32 | }, 33 | "keywords": [ 34 | "Windows", 35 | "Registry", 36 | "regedit", 37 | "file", 38 | "uac", 39 | "association" 40 | ], 41 | "author": { 42 | "name": "Steven Edouard", 43 | "email": "sedouard@microsoft.com", 44 | "url": "http://stevenedouard.com" 45 | }, 46 | "contributors": [ 47 | { 48 | "name": "Rita Zhang", 49 | "email": "ritazh@microsoft.com", 50 | "url": "https://ritazh.com" 51 | } 52 | ], 53 | "license": "ISC", 54 | "bugs": { 55 | "url": "https://github.com/CatalystCode/windows-registry-node/issues" 56 | }, 57 | "homepage": "https://github.com/CatalystCode/windows-registry-node#readme" 58 | } 59 | -------------------------------------------------------------------------------- /test/key.js: -------------------------------------------------------------------------------- 1 | /* global describe, it */ 2 | 'use strict'; 3 | require('./test_helper'); 4 | var assert = require('assert'), 5 | windef = require('../index').windef, 6 | Key = require('../index').Key; 7 | 8 | describe('Key Open Tests', () => { 9 | it('Should create a key given a subkey', () => { 10 | var key = new Key(windef.HKEY.HKEY_CLASSES_ROOT, '.txt', windef.KEY_ACCESS.KEY_ALL_ACCESS); 11 | assert(key.handle !== null && key.handle !== undefined); 12 | key.close(); 13 | }); 14 | 15 | it('Should open a subkey provided a previously opened key', () => { 16 | var key = new Key(windef.HKEY.HKEY_CLASSES_ROOT, '', windef.KEY_ACCESS.KEY_ALL_ACCESS); 17 | var key2 = key.openSubKey('.txt', windef.KEY_ACCESS.KEY_ALL_ACCESS); 18 | assert(key2.handle !== null && key2.handle !== undefined); 19 | key.close(); 20 | key2.close(); 21 | }); 22 | 23 | it('Should properly close', () => { 24 | var key = new Key(windef.HKEY.HKEY_CLASSES_ROOT, '.txt', windef.KEY_ACCESS.KEY_ALL_ACCESS); 25 | key.close(); 26 | 27 | // ensure that the key is actually closed by trying to open a subkey 28 | // which should fail 29 | assert.throws(() => { 30 | key.openSubKey('OpenWithList', windef.KEY_ACCESS.KEY_ALL_ACCESS); 31 | }); 32 | }); 33 | }); 34 | 35 | describe('Create Key Tests', function () { 36 | it('Should create a new key and Delete it', () => { 37 | var key = new Key(windef.HKEY.HKEY_CLASSES_ROOT, '.txt', windef.KEY_ACCESS.KEY_ALL_ACCESS); 38 | 39 | assert(key.handle !== undefined); 40 | assert(key.handle !== null); 41 | 42 | var createdKey = key.createSubKey('\test_key_name', windef.KEY_ACCESS.KEY_ALL_ACCESS); 43 | 44 | assert(createdKey.handle !== undefined); 45 | assert(createdKey.handle !== null); 46 | assert(createdKey.path === '\test_key_name'); 47 | 48 | createdKey.deleteKey(); 49 | assert.throws(() => { 50 | key.openSubKey('\test_key_name', windef.KEY_ACCESS.KEY_ALL_ACCESS); 51 | }, (err) => { 52 | assert(err.indexOf('ERROR_FILE_NOT_FOUND') > -1); 53 | return true; 54 | }); 55 | 56 | key.close(); 57 | }); 58 | }); 59 | 60 | describe('Set / Query Value Tests', function () { 61 | it('Should set and read REG_SZ Value', () => { 62 | var key = new Key(windef.HKEY.HKEY_CLASSES_ROOT, '.txt', windef.KEY_ACCESS.KEY_ALL_ACCESS); 63 | 64 | assert(key.handle !== null && key.handle !== undefined); 65 | 66 | key.setValue('test_value_name', windef.REG_VALUE_TYPE.REG_SZ, 'test_value'); 67 | 68 | var value = key.getValue('test_value_name'); 69 | 70 | assert.equal(value, 'test_value'); 71 | key.close(); 72 | }); 73 | }); 74 | -------------------------------------------------------------------------------- /test/mock/adv_api.js: -------------------------------------------------------------------------------- 1 | /* globals Buffer */ 2 | /** 3 | * A very dumb minimal implementation of the Windows Registry. 4 | * Enough to run our tests 5 | */ 6 | 'use strict'; 7 | var assert = require('assert'), 8 | windef = require('../../lib/windef'), 9 | types = require('../../lib/types'), 10 | debug = require('debug')('windows-registry'), 11 | ref = require('ref'); 12 | 13 | /* 14 | * Dumb O(n) search for value inside object 15 | */ 16 | function findValueInHash(value, hash) { 17 | var found = false; 18 | for (let k in hash) { 19 | if (hash[k] === value) { 20 | found = true; 21 | break; 22 | } 23 | } 24 | return found; 25 | } 26 | 27 | var keys = { 28 | }; 29 | keys[windef.HKEY.HKEY_CLASSES_ROOT] = { 30 | predefValue: true, 31 | open: false, 32 | values: { 33 | } 34 | }; 35 | var mockIndex = 0x00000001; 36 | 37 | var advApi = { 38 | /* 39 | LONG WINAPI RegQueryValueEx( 40 | _In_ HKEY hKey, 41 | _In_opt_ LPCTSTR lpValueName, 42 | _Reserved_ LPDWORD lpReserved, 43 | _Out_opt_ LPDWORD lpType, 44 | _Out_opt_ LPBYTE lpData, 45 | _Inout_opt_ LPDWORD lpcbData 46 | ); 47 | */ 48 | RegQueryValueExA: function (hKey, valueName, shouldBeNull, lpType, lpData, lpcbData) { 49 | debug('RegQueryValueExA'); 50 | if (lpData === null) { 51 | debug(keys[hKey.address()].values.test_value_name); 52 | lpType.writeUInt32LE(windef.REG_VALUE_TYPE.REG_SZ, 0); 53 | lpcbData.writeUInt32LE(keys[hKey.address()].values[valueName].length, 0); 54 | return 0; 55 | } 56 | 57 | lpData.write(keys[hKey.address()].values[valueName].value, 'utf8'); 58 | lpType.writeUInt16LE(windef.REG_VALUE_TYPE.REG_SZ); 59 | return 0; 60 | }, 61 | /* 62 | LONG WINAPI RegOpenKeyEx( 63 | _In_ HKEY hKey, 64 | _In_opt_ LPCTSTR lpSubKey, 65 | _In_ DWORD ulOptions, 66 | _In_ REGSAM samDesired, 67 | _Out_ PHKEY phkResult 68 | ); 69 | */ 70 | RegOpenKeyExA: function (hKey, subKeyName, shouldBeZero, accessLevel, pHkey) { 71 | var accessLevelFound = findValueInHash(accessLevel, windef.KEY_ACCESS); 72 | debug('Mock: RegOpenKeyExA subkey: ' + subKeyName); 73 | if (hKey.address) { 74 | debug('Mock: hKey address:' + hKey.address()); 75 | } 76 | debug('keys:'); 77 | debug(keys); 78 | // predefined key 79 | ref.writeUInt64LE(pHkey.deref(), 0, mockIndex); 80 | mockIndex += 1; 81 | if (typeof hKey === 'number') { 82 | assert(findValueInHash(hKey, windef.HKEY), 'Mock: Invalid predefined key specified'); 83 | 84 | if (!keys[hKey]) { 85 | debug('failed to find key for ' + hKey + ' current keys:'); 86 | debug(keys); 87 | // FILE NOT FOUND 88 | return 2; 89 | } 90 | keys[pHkey.deref().address()] = { 91 | opened: true, 92 | values: { 93 | 94 | } 95 | }; 96 | } else { 97 | assert(hKey.constructor === Buffer); 98 | 99 | if (!keys[hKey.address()]) { 100 | debug('failed to find key for ' + hKey.address() + ' current keys:'); 101 | debug(keys); 102 | // FILE NOT FOUND 103 | return 2; 104 | } 105 | keys[hKey.address()].open = true; 106 | keys[pHkey.deref().address()] = keys[hKey.address()]; 107 | } 108 | 109 | assert(typeof subKeyName === 'string'); 110 | assert(shouldBeZero === 0); 111 | assert(accessLevelFound, 'Mock: Invalid access level specified'); 112 | assert(pHkey.deref().constructor === Buffer); 113 | 114 | return 0; 115 | }, 116 | /* 117 | LONG WINAPI RegSetValueEx( 118 | _In_ HKEY hKey, 119 | _In_opt_ LPCTSTR lpValueName, 120 | _Reserved_ DWORD Reserved, 121 | _In_ DWORD dwType, 122 | _In_ const BYTE *lpData, 123 | _In_ DWORD cbData 124 | ); 125 | */ 126 | RegSetValueExA: function (hKey, valueName, shouldBeNull, valueType, valueBuffer, bufferLength) { 127 | debug('Mock: RegSetValueExA'); 128 | // predefined key 129 | if (typeof hKey === 'number') { 130 | assert(findValueInHash(hKey, windef.HKEY), 'Mock: Invalid predefined key specified'); 131 | } else { 132 | assert(hKey.constructor === Buffer); 133 | } 134 | assert(typeof valueName === 'string'); 135 | assert(typeof valueType === 'number'); 136 | assert(valueBuffer.constructor === Buffer); 137 | assert(typeof bufferLength === 'number'); 138 | 139 | keys[hKey.address()].values[valueName] = { 140 | valueType: valueType, 141 | value: ref.readCString(valueBuffer), 142 | length: bufferLength 143 | }; 144 | return 0; 145 | }, 146 | /** 147 | * LONG WINAPI RegCreateKeyEx( 148 | _In_ HKEY hKey, 149 | _In_ LPCTSTR lpSubKey, 150 | _Reserved_ DWORD Reserved, 151 | _In_opt_ LPTSTR lpClass, 152 | _In_ DWORD dwOptions, 153 | _In_ REGSAM samDesired, 154 | _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, 155 | _Out_ PHKEY phkResult, 156 | _Out_opt_ LPDWORD lpdwDisposition 157 | ); 158 | */ 159 | RegCreateKeyExA: function (hKey, subKeyName, shouldBeNull, shouldBeNull2, securityAttributes, accessLevel, shouldBeNull3, pHkey, shouldBeNull4) { 160 | debug('Mock: RegCreateKeyExA'); 161 | assert(hKey.constructor === Buffer); 162 | assert(typeof subKeyName === 'string'); 163 | assert(shouldBeNull === null); 164 | assert(shouldBeNull2 === null); 165 | assert(shouldBeNull3 === null); 166 | assert(shouldBeNull4 === null); 167 | assert.equal(securityAttributes, 0, 'Mock: Security Attributes are not supported yet'); 168 | assert(findValueInHash(accessLevel, windef.KEY_ACCESS), 'Mock: Invalid access level specified'); 169 | assert(pHkey.deref().constructor === Buffer); 170 | debug('Mock: Writing: ' + mockIndex + ' 64 bit dummy pointer to buffer with length: ' + pHkey.deref().length); 171 | 172 | ref.writeUInt64LE(pHkey.deref(), 0, mockIndex); 173 | debug('Mock: Wrote 64 bit dummy pointer'); 174 | mockIndex += 1; 175 | debug('Mock: Creating fake key for: ' + hKey.address()); 176 | debug('Subkey: ' + subKeyName); 177 | keys[hKey.address()] = { 178 | opened: true, 179 | subkeys: { 180 | subKeyName: '' 181 | }, 182 | values: { 183 | 184 | } 185 | }; 186 | 187 | return 0; 188 | }, 189 | /* 190 | LONG WINAPI RegDeleteTree( 191 | _In_ HKEY hKey, 192 | _In_opt_ LPCTSTR lpSubKey 193 | ); 194 | */ 195 | RegDeleteTreeA: function (hKey, subKeyName) { 196 | if (typeof hKey === 'number') { 197 | assert(findValueInHash(hKey, windef.HKEY), 'Mock: Invalid predefined key specified'); 198 | } else { 199 | assert(hKey.constructor === Buffer, 'Mock: hKey should be of type buffer if not a number'); 200 | } 201 | 202 | assert(typeof subKeyName === 'string' || subKeyName === undefined); 203 | delete keys[hKey.address()]; 204 | return 0; 205 | }, 206 | /* 207 | LONG WINAPI RegCloseKey( 208 | _In_ HKEY hKey 209 | ); 210 | */ 211 | RegCloseKey: function (hKey) { 212 | debug('Mock: RegCloseKey'); 213 | assert.equal(hKey.indirections, types.HKEY.indirections); 214 | 215 | delete keys[hKey.address()]; 216 | return 0; 217 | } 218 | }; 219 | 220 | module.exports = advApi; 221 | -------------------------------------------------------------------------------- /test/mock/ffi.js: -------------------------------------------------------------------------------- 1 | var advApi = require('./adv_api'), 2 | assert = require('assert'), 3 | shell32 = require('./shell32'), 4 | types = require('../../lib/types'); 5 | 6 | module.exports = { 7 | Library: function (libFile, funcs) { 8 | var lib; 9 | switch (libFile) { 10 | case 'Advapi32': 11 | assert(funcs.RegOpenKeyExA.constructor === Array); 12 | if(funcs.RegOpenKeyExA[1][0].indirection === types.HKEY.indirection && 13 | funcs.RegOpenKeyExA[1][0].name === types.HKEY.name) { 14 | // this is redefition for the library only specifying 15 | // a different key type 16 | lib = advApi; 17 | break; 18 | } 19 | assert(funcs.RegQueryValueExA.constructor === Array); 20 | assert(funcs.RegCreateKeyExA.constructor === Array); 21 | assert(funcs.RegDeleteTreeA.constructor === Array); 22 | assert(funcs.RegCloseKey.constructor === Array); 23 | assert(funcs.RegSetValueExA.constructor === Array); 24 | assert(typeof funcs === 'object'); 25 | lib = advApi; 26 | break; 27 | case 'Shell32': 28 | lib = shell32; 29 | break; 30 | default: 31 | throw 'Please add asserts for this new library file'; 32 | } 33 | return lib; 34 | } 35 | }; 36 | -------------------------------------------------------------------------------- /test/mock/shell32.js: -------------------------------------------------------------------------------- 1 | /** 2 | * A mock implementation of the Windows shell execute API. 3 | * This is used for our tests 4 | */ 5 | 'use strict'; 6 | require('ref'); 7 | var debug = require('debug')('windows-registry'), 8 | assert = require('assert'), 9 | struct = require('ref-struct'), 10 | uniontype = require('ref-union'), 11 | types = require('../../lib/types'); 12 | 13 | var DUMMYUNIONNAME = uniontype({ 14 | hIcon: types.HANDLE, 15 | hMonitor: types.HANDLE 16 | }); 17 | 18 | var SHELLEXECUTEINFO = struct({ 19 | cbSize: types.DWORD, 20 | fMask: types.ULONG, 21 | hwnd: types.HWND, 22 | lpVerb: types.STRING, 23 | lpFile: types.STRING, 24 | lpParameters: types.STRING, 25 | lpDirectory: types.STRING, 26 | nShow: types.INT, 27 | hInstApp: types.HINSTANCE, 28 | lpIDList: types.LPVOID, 29 | lpClass: types.STRING, 30 | hkeyClass: types.HKEY, 31 | dwHotKey: types.DWORD, 32 | DUMMYUNIONNAME: DUMMYUNIONNAME, 33 | hProcess: types.HANDLE 34 | }); 35 | 36 | var shell32Mock = { 37 | ShellExecuteExA: function () { 38 | } 39 | }; 40 | shell32Mock.ShellExecuteExA.async = function (type, cb) { 41 | debug('async'); 42 | debug(type.deref().lpFile); 43 | assert.deepEqual(type.type.fields.cbSize, SHELLEXECUTEINFO.fields.cbSize); 44 | cb(null, true); 45 | }; 46 | 47 | module.exports = shell32Mock; 48 | -------------------------------------------------------------------------------- /test/registry.js: -------------------------------------------------------------------------------- 1 | /* global describe, it */ 2 | 'use strict'; 3 | require('./test_helper'); 4 | 5 | var assert = require('assert'), 6 | registry = require('../index').registry, 7 | windef = require('../index').windef; 8 | 9 | describe('Registry API open tests', () => { 10 | it('Should open a subkey provided a predefined key', () => { 11 | var key = registry.openKeyFromPredefined(windef.HKEY.HKEY_CLASSES_ROOT, '.txt', windef.KEY_ACCESS.KEY_ALL_ACCESS); 12 | console.log(key.handle); 13 | assert.equal(key.handle !== null, true); 14 | key.close(); 15 | }); 16 | it('Should open a subkey provided a previously opened key', () => { 17 | var key = registry.openKeyFromPredefined(windef.HKEY.HKEY_CLASSES_ROOT, '', windef.KEY_ACCESS.KEY_ALL_ACCESS); 18 | var key2 = registry.openKeyFromKeyObject(key, '.txt', windef.KEY_ACCESS.KEY_ALL_ACCESS); 19 | assert.equal(key2.handle !== null, true); 20 | key.close(); 21 | }); 22 | }); 23 | 24 | describe('Create Key Tests', function () { 25 | it('Should create a new key and delete it', () => { 26 | var key = registry.openKeyFromPredefined(windef.HKEY.HKEY_CLASSES_ROOT, '.txt', windef.KEY_ACCESS.KEY_ALL_ACCESS); 27 | 28 | assert(key.handle !== undefined); 29 | assert(key.handle !== null); 30 | 31 | registry.createKey(key, '\test_key_name', windef.KEY_ACCESS.KEY_ALL_ACCESS); 32 | 33 | var createdKey = registry.openKeyFromKeyObject(key, '\test_key_name', windef.KEY_ACCESS.KEY_ALL_ACCESS); 34 | 35 | assert(createdKey.handle !== undefined); 36 | assert(createdKey.handle !== null); 37 | assert(createdKey.path === '\test_key_name'); 38 | 39 | registry.deleteKey(key, '\test_key_name'); 40 | assert.throws(() => { 41 | registry.openKeyFromKeyObject(key, '\test_key_name', windef.KEY_ACCESS.KEY_ALL_ACCESS); 42 | }, (err) => { 43 | assert(err.indexOf('ERROR_FILE_NOT_FOUND') > -1); 44 | return true; 45 | }); 46 | 47 | key.close(); 48 | }); 49 | }); 50 | 51 | describe('Set / Query Value Tests', function () { 52 | it('Should set and read REG_SZ Value', () => { 53 | var key = registry.openKeyFromPredefined(windef.HKEY.HKEY_CLASSES_ROOT, '.txt', windef.KEY_ACCESS.KEY_ALL_ACCESS); 54 | 55 | assert.equal(key.handle !== null, true); 56 | 57 | registry.setValueForKeyObject(key, 'test_value_name', windef.REG_VALUE_TYPE.REG_SZ, 'test_value'); 58 | 59 | var value = registry.queryValueForKeyObject(key, 'test_value_name'); 60 | console.log('her is value:' + value); 61 | assert.equal(value, 'test_value'); 62 | console.log('lngth:' + value.length); 63 | key.close(); 64 | }); 65 | }); 66 | -------------------------------------------------------------------------------- /test/test_helper.js: -------------------------------------------------------------------------------- 1 | /* global process, after */ 2 | var mockery = require('mockery'); 3 | 4 | if (process.env.TEST_MOCKS_ON) { 5 | mockery.enable({ 6 | warnOnReplace: false, 7 | warnOnUnregistered: false 8 | }); 9 | } 10 | 11 | mockery.registerMock('ffi', require('./mock/ffi')); 12 | 13 | after(() => { 14 | mockery.disable(); 15 | }); 16 | -------------------------------------------------------------------------------- /test/utils.js: -------------------------------------------------------------------------------- 1 | /* global describe, it */ 2 | 'use strict'; 3 | if (process.env.TEST_MOCKS_ON) { 4 | require('./test_helper'); 5 | } 6 | 7 | var utils = require('../lib/utils'), 8 | assert = require('assert'); 9 | 10 | describe('File Association Test', () => { 11 | it('Should create a file association for *.zzz files', () => { 12 | utils.associateExeForFile('myTestHandler', 'A test handler for unit tests', '', 'C:\\Program Files\\nodejs\\node.exe %1', '.zzz'); 13 | assert(true); 14 | }); 15 | }); 16 | 17 | describe('UAC elevate tests', () => { 18 | it('Should get results for elevate for a given file', (done) => { 19 | utils.elevate(process.execPath, 'index.js', function (err, result) { 20 | assert.equal(err, null); 21 | assert.equal(result, true); 22 | done(); 23 | }); 24 | }); 25 | 26 | it('Empty file path, should return with error', (done) => { 27 | utils.elevate('', null, function (err, result) { 28 | assert.equal(err, 'Missing filepath'); 29 | assert.equal(result, null); 30 | done(); 31 | }); 32 | }); 33 | 34 | it('Null file path, should return with error', (done) => { 35 | utils.elevate(null, null, function (err, result) { 36 | assert.equal(err, 'Missing filepath'); 37 | assert.equal(result, null); 38 | done(); 39 | }); 40 | }); 41 | }); 42 | --------------------------------------------------------------------------------