├── .gitignore ├── .npmignore ├── .vscode └── tasks.json ├── LICENSE.md ├── README.md ├── circle.yml ├── index.ts ├── package-lock.json ├── package.json ├── src ├── Animation.ts ├── AnimationFrame.ts ├── Animations │ ├── BcaAnimation.ts │ └── WaveAnimation.ts ├── AppInfo.ts ├── AuthorInfo.ts ├── ChromaApp.ts ├── ChromaInstance.ts ├── Color.ts ├── DeviceRequestData.ts ├── Devices │ ├── Base.ts │ ├── ChromaLink.ts │ ├── Headset.ts │ ├── Keyboard.ts │ ├── Keypad.ts │ ├── Mouse.ts │ ├── Mousepad.ts │ └── index.ts ├── Effect.ts ├── Grid.ts ├── Key.ts └── request.ts ├── tsconfig.json └── tslint.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Project specific 2 | dist/ 3 | 4 | # Logs 5 | logs 6 | *.log 7 | npm-debug.log* 8 | yarn-debug.log* 9 | yarn-error.log* 10 | 11 | # Runtime data 12 | pids 13 | *.pid 14 | *.seed 15 | *.pid.lock 16 | 17 | # Directory for instrumented libs generated by jscoverage/JSCover 18 | lib-cov 19 | 20 | # Coverage directory used by tools like istanbul 21 | coverage 22 | 23 | # nyc test coverage 24 | .nyc_output 25 | 26 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 27 | .grunt 28 | 29 | # Bower dependency directory (https://bower.io/) 30 | bower_components 31 | 32 | # node-waf configuration 33 | .lock-wscript 34 | 35 | # Compiled binary addons (http://nodejs.org/api/addons.html) 36 | build/Release 37 | 38 | # Dependency directories 39 | node_modules/ 40 | jspm_packages/ 41 | 42 | # Typescript v1 declaration files 43 | typings/ 44 | 45 | # Optional npm cache directory 46 | .npm 47 | 48 | # Optional eslint cache 49 | .eslintcache 50 | 51 | # Optional REPL history 52 | .node_repl_history 53 | 54 | # Output of 'npm pack' 55 | *.tgz 56 | 57 | # Yarn Integrity file 58 | .yarn-integrity 59 | 60 | # dotenv environment variables file 61 | .env -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src/ 2 | sample/ 3 | .vscode/ 4 | index.ts 5 | tsconfig.json 6 | tslint.json 7 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "0.1.0", 5 | "command": "tsc", 6 | "isShellCommand": true, 7 | "args": ["-p", "."], 8 | "showOutput": "silent", 9 | "problemMatcher": "$tsc" 10 | } -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017 Chroma Developer Community (https://github.com/chroma-sdk). 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Chroma.js 2 | 3 | [![CircleCI](https://circleci.com/gh/chroma-sdk/chroma-js.svg?style=svg&circle-token=d066d70fae54ca26b07aad36250e78d478c62790)](https://circleci.com/gh/chroma-sdk/chroma-js) 4 | 5 | Chroma.js is a library that provides a simple interface to interact with Razer's Chroma REST API. 6 | 7 | ## Building from source 8 | 9 | After cloning this repository the Typescript Code needs to be transpiled. 10 | 11 | This is done either by using your IDE (VS-Code is configured) or by going into the "sdk" directory and running: 12 | 13 | ```node 14 | npm install 15 | npm run build 16 | ``` 17 | 18 | or 19 | 20 | ```node 21 | yarn install 22 | yarn run build 23 | ``` 24 | 25 | Now the `dist` folder contains all the needed files. 26 | 27 | Afterwards you can start the example by executing the following in the example folder: 28 | 29 | ```node 30 | npm install 31 | npm run dev 32 | ``` 33 | 34 | or 35 | 36 | ```node 37 | yarn install 38 | yarn run dev 39 | ``` 40 | 41 | This will start a Javascript development Server running on `http://localhost:8080` 42 | 43 | To run the Node.js version just do in the example directory: 44 | 45 | ```node 46 | yarn install 47 | yarn run build 48 | node dist/Server.bundle.js 49 | ``` -------------------------------------------------------------------------------- /circle.yml: -------------------------------------------------------------------------------- 1 | machine: 2 | node: 3 | version: 6.1.0 4 | 5 | dependencies: 6 | override: 7 | - npm install 8 | 9 | test: 10 | override: 11 | - npm run lint 12 | - npm run build 13 | - npm test -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | 2 | export * from "./src/ChromaApp"; 3 | export * from "./src/ChromaInstance"; 4 | export * from "./src/Color"; 5 | export * from "./src/Key"; 6 | export * from "./src/Devices/Base"; 7 | export * from "./src/Animation"; 8 | export * from "./src/Devices/Keyboard"; 9 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@chromasdk/chromajs", 3 | "version": "0.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ansi-regex": { 8 | "version": "2.1.1", 9 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 10 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 11 | "dev": true 12 | }, 13 | "ansi-styles": { 14 | "version": "2.2.1", 15 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 16 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 17 | "dev": true 18 | }, 19 | "babel-code-frame": { 20 | "version": "6.22.0", 21 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", 22 | "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", 23 | "dev": true, 24 | "requires": { 25 | "chalk": "1.1.3", 26 | "esutils": "2.0.2", 27 | "js-tokens": "3.0.1" 28 | } 29 | }, 30 | "balanced-match": { 31 | "version": "0.4.2", 32 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", 33 | "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", 34 | "dev": true 35 | }, 36 | "brace-expansion": { 37 | "version": "1.1.7", 38 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", 39 | "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", 40 | "dev": true, 41 | "requires": { 42 | "balanced-match": "0.4.2", 43 | "concat-map": "0.0.1" 44 | } 45 | }, 46 | "chalk": { 47 | "version": "1.1.3", 48 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 49 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 50 | "dev": true, 51 | "requires": { 52 | "ansi-styles": "2.2.1", 53 | "escape-string-regexp": "1.0.5", 54 | "has-ansi": "2.0.0", 55 | "strip-ansi": "3.0.1", 56 | "supports-color": "2.0.0" 57 | } 58 | }, 59 | "colors": { 60 | "version": "1.1.2", 61 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", 62 | "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", 63 | "dev": true 64 | }, 65 | "concat-map": { 66 | "version": "0.0.1", 67 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 68 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 69 | "dev": true 70 | }, 71 | "diff": { 72 | "version": "3.2.0", 73 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", 74 | "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", 75 | "dev": true 76 | }, 77 | "encoding": { 78 | "version": "0.1.12", 79 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", 80 | "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", 81 | "requires": { 82 | "iconv-lite": "0.4.16" 83 | } 84 | }, 85 | "escape-string-regexp": { 86 | "version": "1.0.5", 87 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 88 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 89 | "dev": true 90 | }, 91 | "esutils": { 92 | "version": "2.0.2", 93 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 94 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 95 | "dev": true 96 | }, 97 | "fs.realpath": { 98 | "version": "1.0.0", 99 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 100 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 101 | "dev": true 102 | }, 103 | "glob": { 104 | "version": "7.1.1", 105 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", 106 | "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", 107 | "dev": true, 108 | "requires": { 109 | "fs.realpath": "1.0.0", 110 | "inflight": "1.0.6", 111 | "inherits": "2.0.3", 112 | "minimatch": "3.0.3", 113 | "once": "1.4.0", 114 | "path-is-absolute": "1.0.1" 115 | } 116 | }, 117 | "has-ansi": { 118 | "version": "2.0.0", 119 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 120 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 121 | "dev": true, 122 | "requires": { 123 | "ansi-regex": "2.1.1" 124 | } 125 | }, 126 | "iconv-lite": { 127 | "version": "0.4.16", 128 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.16.tgz", 129 | "integrity": "sha1-Zd477rOeKWDWfwSfFjT/y83pAUs=" 130 | }, 131 | "inflight": { 132 | "version": "1.0.6", 133 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 134 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 135 | "dev": true, 136 | "requires": { 137 | "once": "1.4.0", 138 | "wrappy": "1.0.2" 139 | } 140 | }, 141 | "inherits": { 142 | "version": "2.0.3", 143 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 144 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 145 | "dev": true 146 | }, 147 | "is-stream": { 148 | "version": "1.1.0", 149 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 150 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 151 | }, 152 | "isomorphic-fetch": { 153 | "version": "2.2.1", 154 | "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", 155 | "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", 156 | "requires": { 157 | "node-fetch": "1.6.3", 158 | "whatwg-fetch": "2.0.3" 159 | } 160 | }, 161 | "js-tokens": { 162 | "version": "3.0.1", 163 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz", 164 | "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=", 165 | "dev": true 166 | }, 167 | "minimatch": { 168 | "version": "3.0.3", 169 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", 170 | "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", 171 | "dev": true, 172 | "requires": { 173 | "brace-expansion": "1.1.7" 174 | } 175 | }, 176 | "minimist": { 177 | "version": "0.0.10", 178 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", 179 | "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", 180 | "dev": true 181 | }, 182 | "node-fetch": { 183 | "version": "1.6.3", 184 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.6.3.tgz", 185 | "integrity": "sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ=", 186 | "requires": { 187 | "encoding": "0.1.12", 188 | "is-stream": "1.1.0" 189 | } 190 | }, 191 | "nyc": { 192 | "version": "10.3.2", 193 | "resolved": "https://registry.npmjs.org/nyc/-/nyc-10.3.2.tgz", 194 | "integrity": "sha1-8n9NkfKp2zbCT1dP9cbv/wIz3kY=", 195 | "dev": true, 196 | "requires": { 197 | "archy": "1.0.0", 198 | "arrify": "1.0.1", 199 | "caching-transform": "1.0.1", 200 | "convert-source-map": "1.5.0", 201 | "debug-log": "1.0.1", 202 | "default-require-extensions": "1.0.0", 203 | "find-cache-dir": "0.1.1", 204 | "find-up": "1.1.2", 205 | "foreground-child": "1.5.6", 206 | "glob": "7.1.1", 207 | "istanbul-lib-coverage": "1.1.0", 208 | "istanbul-lib-hook": "1.0.6", 209 | "istanbul-lib-instrument": "1.7.1", 210 | "istanbul-lib-report": "1.1.0", 211 | "istanbul-lib-source-maps": "1.2.0", 212 | "istanbul-reports": "1.1.0", 213 | "md5-hex": "1.3.0", 214 | "merge-source-map": "1.0.3", 215 | "micromatch": "2.3.11", 216 | "mkdirp": "0.5.1", 217 | "resolve-from": "2.0.0", 218 | "rimraf": "2.6.1", 219 | "signal-exit": "3.0.2", 220 | "spawn-wrap": "1.2.4", 221 | "test-exclude": "4.1.0", 222 | "yargs": "7.1.0", 223 | "yargs-parser": "5.0.0" 224 | }, 225 | "dependencies": { 226 | "align-text": { 227 | "version": "0.1.4", 228 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 229 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", 230 | "dev": true, 231 | "requires": { 232 | "kind-of": "3.2.0", 233 | "longest": "1.0.1", 234 | "repeat-string": "1.6.1" 235 | } 236 | }, 237 | "amdefine": { 238 | "version": "1.0.1", 239 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 240 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", 241 | "dev": true 242 | }, 243 | "ansi-regex": { 244 | "version": "2.1.1", 245 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 246 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 247 | "dev": true 248 | }, 249 | "ansi-styles": { 250 | "version": "2.2.1", 251 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 252 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 253 | "dev": true 254 | }, 255 | "append-transform": { 256 | "version": "0.4.0", 257 | "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", 258 | "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", 259 | "dev": true, 260 | "requires": { 261 | "default-require-extensions": "1.0.0" 262 | } 263 | }, 264 | "archy": { 265 | "version": "1.0.0", 266 | "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", 267 | "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", 268 | "dev": true 269 | }, 270 | "arr-diff": { 271 | "version": "2.0.0", 272 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", 273 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", 274 | "dev": true, 275 | "requires": { 276 | "arr-flatten": "1.0.3" 277 | } 278 | }, 279 | "arr-flatten": { 280 | "version": "1.0.3", 281 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.3.tgz", 282 | "integrity": "sha1-onTthawIhJtr14R8RYB0XcUa37E=", 283 | "dev": true 284 | }, 285 | "array-unique": { 286 | "version": "0.2.1", 287 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", 288 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", 289 | "dev": true 290 | }, 291 | "arrify": { 292 | "version": "1.0.1", 293 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 294 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 295 | "dev": true 296 | }, 297 | "async": { 298 | "version": "1.5.2", 299 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 300 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", 301 | "dev": true 302 | }, 303 | "babel-code-frame": { 304 | "version": "6.22.0", 305 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", 306 | "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", 307 | "dev": true, 308 | "requires": { 309 | "chalk": "1.1.3", 310 | "esutils": "2.0.2", 311 | "js-tokens": "3.0.1" 312 | } 313 | }, 314 | "babel-generator": { 315 | "version": "6.24.1", 316 | "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.24.1.tgz", 317 | "integrity": "sha1-5xX0hsWN7SVknYiJRNUqoHxdlJc=", 318 | "dev": true, 319 | "requires": { 320 | "babel-messages": "6.23.0", 321 | "babel-runtime": "6.23.0", 322 | "babel-types": "6.24.1", 323 | "detect-indent": "4.0.0", 324 | "jsesc": "1.3.0", 325 | "lodash": "4.17.4", 326 | "source-map": "0.5.6", 327 | "trim-right": "1.0.1" 328 | } 329 | }, 330 | "babel-messages": { 331 | "version": "6.23.0", 332 | "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", 333 | "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", 334 | "dev": true, 335 | "requires": { 336 | "babel-runtime": "6.23.0" 337 | } 338 | }, 339 | "babel-runtime": { 340 | "version": "6.23.0", 341 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", 342 | "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", 343 | "dev": true, 344 | "requires": { 345 | "core-js": "2.4.1", 346 | "regenerator-runtime": "0.10.5" 347 | } 348 | }, 349 | "babel-template": { 350 | "version": "6.24.1", 351 | "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.24.1.tgz", 352 | "integrity": "sha1-BK5RTx+Ts6JTfyoPYKWkX7gwgzM=", 353 | "dev": true, 354 | "requires": { 355 | "babel-runtime": "6.23.0", 356 | "babel-traverse": "6.24.1", 357 | "babel-types": "6.24.1", 358 | "babylon": "6.17.0", 359 | "lodash": "4.17.4" 360 | } 361 | }, 362 | "babel-traverse": { 363 | "version": "6.24.1", 364 | "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.24.1.tgz", 365 | "integrity": "sha1-qzZnP9NW+aCUhlnnszjV/q2zFpU=", 366 | "dev": true, 367 | "requires": { 368 | "babel-code-frame": "6.22.0", 369 | "babel-messages": "6.23.0", 370 | "babel-runtime": "6.23.0", 371 | "babel-types": "6.24.1", 372 | "babylon": "6.17.0", 373 | "debug": "2.6.6", 374 | "globals": "9.17.0", 375 | "invariant": "2.2.2", 376 | "lodash": "4.17.4" 377 | } 378 | }, 379 | "babel-types": { 380 | "version": "6.24.1", 381 | "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.24.1.tgz", 382 | "integrity": "sha1-oTaHncFbNga9oNkMH8dDBML/CXU=", 383 | "dev": true, 384 | "requires": { 385 | "babel-runtime": "6.23.0", 386 | "esutils": "2.0.2", 387 | "lodash": "4.17.4", 388 | "to-fast-properties": "1.0.3" 389 | } 390 | }, 391 | "babylon": { 392 | "version": "6.17.0", 393 | "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.0.tgz", 394 | "integrity": "sha1-N9qUiHhIi5xOPEA4iT+jMUs/yTI=", 395 | "dev": true 396 | }, 397 | "balanced-match": { 398 | "version": "0.4.2", 399 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", 400 | "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", 401 | "dev": true 402 | }, 403 | "brace-expansion": { 404 | "version": "1.1.7", 405 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", 406 | "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", 407 | "dev": true, 408 | "requires": { 409 | "balanced-match": "0.4.2", 410 | "concat-map": "0.0.1" 411 | } 412 | }, 413 | "braces": { 414 | "version": "1.8.5", 415 | "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", 416 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", 417 | "dev": true, 418 | "requires": { 419 | "expand-range": "1.8.2", 420 | "preserve": "0.2.0", 421 | "repeat-element": "1.1.2" 422 | } 423 | }, 424 | "builtin-modules": { 425 | "version": "1.1.1", 426 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 427 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 428 | "dev": true 429 | }, 430 | "caching-transform": { 431 | "version": "1.0.1", 432 | "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", 433 | "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=", 434 | "dev": true, 435 | "requires": { 436 | "md5-hex": "1.3.0", 437 | "mkdirp": "0.5.1", 438 | "write-file-atomic": "1.3.4" 439 | } 440 | }, 441 | "camelcase": { 442 | "version": "1.2.1", 443 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 444 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", 445 | "dev": true, 446 | "optional": true 447 | }, 448 | "center-align": { 449 | "version": "0.1.3", 450 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 451 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 452 | "dev": true, 453 | "optional": true, 454 | "requires": { 455 | "align-text": "0.1.4", 456 | "lazy-cache": "1.0.4" 457 | } 458 | }, 459 | "chalk": { 460 | "version": "1.1.3", 461 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 462 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 463 | "dev": true, 464 | "requires": { 465 | "ansi-styles": "2.2.1", 466 | "escape-string-regexp": "1.0.5", 467 | "has-ansi": "2.0.0", 468 | "strip-ansi": "3.0.1", 469 | "supports-color": "2.0.0" 470 | } 471 | }, 472 | "cliui": { 473 | "version": "2.1.0", 474 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 475 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 476 | "dev": true, 477 | "optional": true, 478 | "requires": { 479 | "center-align": "0.1.3", 480 | "right-align": "0.1.3", 481 | "wordwrap": "0.0.2" 482 | }, 483 | "dependencies": { 484 | "wordwrap": { 485 | "version": "0.0.2", 486 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 487 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", 488 | "dev": true, 489 | "optional": true 490 | } 491 | } 492 | }, 493 | "code-point-at": { 494 | "version": "1.1.0", 495 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 496 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", 497 | "dev": true 498 | }, 499 | "commondir": { 500 | "version": "1.0.1", 501 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 502 | "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", 503 | "dev": true 504 | }, 505 | "concat-map": { 506 | "version": "0.0.1", 507 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 508 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 509 | "dev": true 510 | }, 511 | "convert-source-map": { 512 | "version": "1.5.0", 513 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", 514 | "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", 515 | "dev": true 516 | }, 517 | "core-js": { 518 | "version": "2.4.1", 519 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", 520 | "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", 521 | "dev": true 522 | }, 523 | "cross-spawn": { 524 | "version": "4.0.2", 525 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", 526 | "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", 527 | "dev": true, 528 | "requires": { 529 | "lru-cache": "4.0.2", 530 | "which": "1.2.14" 531 | } 532 | }, 533 | "debug": { 534 | "version": "2.6.6", 535 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.6.tgz", 536 | "integrity": "sha1-qfpvvpykPPHnn3O3XAGJy7fW21o=", 537 | "dev": true, 538 | "requires": { 539 | "ms": "0.7.3" 540 | } 541 | }, 542 | "debug-log": { 543 | "version": "1.0.1", 544 | "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", 545 | "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", 546 | "dev": true 547 | }, 548 | "decamelize": { 549 | "version": "1.2.0", 550 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 551 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 552 | "dev": true 553 | }, 554 | "default-require-extensions": { 555 | "version": "1.0.0", 556 | "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", 557 | "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", 558 | "dev": true, 559 | "requires": { 560 | "strip-bom": "2.0.0" 561 | } 562 | }, 563 | "detect-indent": { 564 | "version": "4.0.0", 565 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", 566 | "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", 567 | "dev": true, 568 | "requires": { 569 | "repeating": "2.0.1" 570 | } 571 | }, 572 | "error-ex": { 573 | "version": "1.3.1", 574 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", 575 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", 576 | "dev": true, 577 | "requires": { 578 | "is-arrayish": "0.2.1" 579 | } 580 | }, 581 | "escape-string-regexp": { 582 | "version": "1.0.5", 583 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 584 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 585 | "dev": true 586 | }, 587 | "esutils": { 588 | "version": "2.0.2", 589 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 590 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 591 | "dev": true 592 | }, 593 | "expand-brackets": { 594 | "version": "0.1.5", 595 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", 596 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", 597 | "dev": true, 598 | "requires": { 599 | "is-posix-bracket": "0.1.1" 600 | } 601 | }, 602 | "expand-range": { 603 | "version": "1.8.2", 604 | "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", 605 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", 606 | "dev": true, 607 | "requires": { 608 | "fill-range": "2.2.3" 609 | } 610 | }, 611 | "extglob": { 612 | "version": "0.3.2", 613 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", 614 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", 615 | "dev": true, 616 | "requires": { 617 | "is-extglob": "1.0.0" 618 | } 619 | }, 620 | "filename-regex": { 621 | "version": "2.0.1", 622 | "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", 623 | "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", 624 | "dev": true 625 | }, 626 | "fill-range": { 627 | "version": "2.2.3", 628 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", 629 | "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", 630 | "dev": true, 631 | "requires": { 632 | "is-number": "2.1.0", 633 | "isobject": "2.1.0", 634 | "randomatic": "1.1.6", 635 | "repeat-element": "1.1.2", 636 | "repeat-string": "1.6.1" 637 | } 638 | }, 639 | "find-cache-dir": { 640 | "version": "0.1.1", 641 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", 642 | "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", 643 | "dev": true, 644 | "requires": { 645 | "commondir": "1.0.1", 646 | "mkdirp": "0.5.1", 647 | "pkg-dir": "1.0.0" 648 | } 649 | }, 650 | "find-up": { 651 | "version": "1.1.2", 652 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 653 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 654 | "dev": true, 655 | "requires": { 656 | "path-exists": "2.1.0", 657 | "pinkie-promise": "2.0.1" 658 | } 659 | }, 660 | "for-in": { 661 | "version": "1.0.2", 662 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 663 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", 664 | "dev": true 665 | }, 666 | "for-own": { 667 | "version": "0.1.5", 668 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", 669 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", 670 | "dev": true, 671 | "requires": { 672 | "for-in": "1.0.2" 673 | } 674 | }, 675 | "foreground-child": { 676 | "version": "1.5.6", 677 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", 678 | "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", 679 | "dev": true, 680 | "requires": { 681 | "cross-spawn": "4.0.2", 682 | "signal-exit": "3.0.2" 683 | } 684 | }, 685 | "fs.realpath": { 686 | "version": "1.0.0", 687 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 688 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 689 | "dev": true 690 | }, 691 | "get-caller-file": { 692 | "version": "1.0.2", 693 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", 694 | "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", 695 | "dev": true 696 | }, 697 | "glob": { 698 | "version": "7.1.1", 699 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", 700 | "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", 701 | "dev": true, 702 | "requires": { 703 | "fs.realpath": "1.0.0", 704 | "inflight": "1.0.6", 705 | "inherits": "2.0.3", 706 | "minimatch": "3.0.3", 707 | "once": "1.4.0", 708 | "path-is-absolute": "1.0.1" 709 | } 710 | }, 711 | "glob-base": { 712 | "version": "0.3.0", 713 | "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", 714 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", 715 | "dev": true, 716 | "requires": { 717 | "glob-parent": "2.0.0", 718 | "is-glob": "2.0.1" 719 | } 720 | }, 721 | "glob-parent": { 722 | "version": "2.0.0", 723 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", 724 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", 725 | "dev": true, 726 | "requires": { 727 | "is-glob": "2.0.1" 728 | } 729 | }, 730 | "globals": { 731 | "version": "9.17.0", 732 | "resolved": "https://registry.npmjs.org/globals/-/globals-9.17.0.tgz", 733 | "integrity": "sha1-DAymltm5u2lNLlRwvTd3fKrVAoY=", 734 | "dev": true 735 | }, 736 | "graceful-fs": { 737 | "version": "4.1.11", 738 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 739 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 740 | "dev": true 741 | }, 742 | "handlebars": { 743 | "version": "4.0.8", 744 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.8.tgz", 745 | "integrity": "sha1-Irh1zT8ObL6jAxTxROgrx6cv9CA=", 746 | "dev": true, 747 | "requires": { 748 | "async": "1.5.2", 749 | "optimist": "0.6.1", 750 | "source-map": "0.4.4", 751 | "uglify-js": "2.8.22" 752 | }, 753 | "dependencies": { 754 | "source-map": { 755 | "version": "0.4.4", 756 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", 757 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", 758 | "dev": true, 759 | "requires": { 760 | "amdefine": "1.0.1" 761 | } 762 | } 763 | } 764 | }, 765 | "has-ansi": { 766 | "version": "2.0.0", 767 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 768 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 769 | "dev": true, 770 | "requires": { 771 | "ansi-regex": "2.1.1" 772 | } 773 | }, 774 | "has-flag": { 775 | "version": "1.0.0", 776 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", 777 | "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", 778 | "dev": true 779 | }, 780 | "hosted-git-info": { 781 | "version": "2.4.2", 782 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.4.2.tgz", 783 | "integrity": "sha1-AHa59GonBQbduq6lZJaJdGBhKmc=", 784 | "dev": true 785 | }, 786 | "imurmurhash": { 787 | "version": "0.1.4", 788 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 789 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 790 | "dev": true 791 | }, 792 | "inflight": { 793 | "version": "1.0.6", 794 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 795 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 796 | "dev": true, 797 | "requires": { 798 | "once": "1.4.0", 799 | "wrappy": "1.0.2" 800 | } 801 | }, 802 | "inherits": { 803 | "version": "2.0.3", 804 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 805 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 806 | "dev": true 807 | }, 808 | "invariant": { 809 | "version": "2.2.2", 810 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", 811 | "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", 812 | "dev": true, 813 | "requires": { 814 | "loose-envify": "1.3.1" 815 | } 816 | }, 817 | "invert-kv": { 818 | "version": "1.0.0", 819 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 820 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", 821 | "dev": true 822 | }, 823 | "is-arrayish": { 824 | "version": "0.2.1", 825 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 826 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 827 | "dev": true 828 | }, 829 | "is-buffer": { 830 | "version": "1.1.5", 831 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", 832 | "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", 833 | "dev": true 834 | }, 835 | "is-builtin-module": { 836 | "version": "1.0.0", 837 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", 838 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", 839 | "dev": true, 840 | "requires": { 841 | "builtin-modules": "1.1.1" 842 | } 843 | }, 844 | "is-dotfile": { 845 | "version": "1.0.2", 846 | "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", 847 | "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=", 848 | "dev": true 849 | }, 850 | "is-equal-shallow": { 851 | "version": "0.1.3", 852 | "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", 853 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", 854 | "dev": true, 855 | "requires": { 856 | "is-primitive": "2.0.0" 857 | } 858 | }, 859 | "is-extendable": { 860 | "version": "0.1.1", 861 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 862 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", 863 | "dev": true 864 | }, 865 | "is-extglob": { 866 | "version": "1.0.0", 867 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", 868 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", 869 | "dev": true 870 | }, 871 | "is-finite": { 872 | "version": "1.0.2", 873 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 874 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 875 | "dev": true, 876 | "requires": { 877 | "number-is-nan": "1.0.1" 878 | } 879 | }, 880 | "is-fullwidth-code-point": { 881 | "version": "1.0.0", 882 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 883 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 884 | "dev": true, 885 | "requires": { 886 | "number-is-nan": "1.0.1" 887 | } 888 | }, 889 | "is-glob": { 890 | "version": "2.0.1", 891 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", 892 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", 893 | "dev": true, 894 | "requires": { 895 | "is-extglob": "1.0.0" 896 | } 897 | }, 898 | "is-number": { 899 | "version": "2.1.0", 900 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", 901 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", 902 | "dev": true, 903 | "requires": { 904 | "kind-of": "3.2.0" 905 | } 906 | }, 907 | "is-posix-bracket": { 908 | "version": "0.1.1", 909 | "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", 910 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", 911 | "dev": true 912 | }, 913 | "is-primitive": { 914 | "version": "2.0.0", 915 | "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", 916 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", 917 | "dev": true 918 | }, 919 | "is-utf8": { 920 | "version": "0.2.1", 921 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 922 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", 923 | "dev": true 924 | }, 925 | "isarray": { 926 | "version": "1.0.0", 927 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 928 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 929 | "dev": true 930 | }, 931 | "isexe": { 932 | "version": "2.0.0", 933 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 934 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 935 | "dev": true 936 | }, 937 | "isobject": { 938 | "version": "2.1.0", 939 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 940 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 941 | "dev": true, 942 | "requires": { 943 | "isarray": "1.0.0" 944 | } 945 | }, 946 | "istanbul-lib-coverage": { 947 | "version": "1.1.0", 948 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.0.tgz", 949 | "integrity": "sha1-ysoZ3srvNSW11jMdcB8/O3rUhSg=", 950 | "dev": true 951 | }, 952 | "istanbul-lib-hook": { 953 | "version": "1.0.6", 954 | "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.6.tgz", 955 | "integrity": "sha1-wIZtHoHPLVMZJJUQEx/Bbe5JIx8=", 956 | "dev": true, 957 | "requires": { 958 | "append-transform": "0.4.0" 959 | } 960 | }, 961 | "istanbul-lib-instrument": { 962 | "version": "1.7.1", 963 | "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.1.tgz", 964 | "integrity": "sha1-Fp4xvGLHeIUamUOd2Zw8wSGE02A=", 965 | "dev": true, 966 | "requires": { 967 | "babel-generator": "6.24.1", 968 | "babel-template": "6.24.1", 969 | "babel-traverse": "6.24.1", 970 | "babel-types": "6.24.1", 971 | "babylon": "6.17.0", 972 | "istanbul-lib-coverage": "1.1.0", 973 | "semver": "5.3.0" 974 | } 975 | }, 976 | "istanbul-lib-report": { 977 | "version": "1.1.0", 978 | "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.0.tgz", 979 | "integrity": "sha1-RExOzKmvqTz1hPVrEPGVv3aMB3A=", 980 | "dev": true, 981 | "requires": { 982 | "istanbul-lib-coverage": "1.1.0", 983 | "mkdirp": "0.5.1", 984 | "path-parse": "1.0.5", 985 | "supports-color": "3.2.3" 986 | }, 987 | "dependencies": { 988 | "supports-color": { 989 | "version": "3.2.3", 990 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", 991 | "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", 992 | "dev": true, 993 | "requires": { 994 | "has-flag": "1.0.0" 995 | } 996 | } 997 | } 998 | }, 999 | "istanbul-lib-source-maps": { 1000 | "version": "1.2.0", 1001 | "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.0.tgz", 1002 | "integrity": "sha1-jHcG1Jfib+62rz4MKP1bBmlZjQ4=", 1003 | "dev": true, 1004 | "requires": { 1005 | "debug": "2.6.6", 1006 | "istanbul-lib-coverage": "1.1.0", 1007 | "mkdirp": "0.5.1", 1008 | "rimraf": "2.6.1", 1009 | "source-map": "0.5.6" 1010 | } 1011 | }, 1012 | "istanbul-reports": { 1013 | "version": "1.1.0", 1014 | "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.0.tgz", 1015 | "integrity": "sha1-HvO3lYiSGc+1+tFjZfbOEI1fjGY=", 1016 | "dev": true, 1017 | "requires": { 1018 | "handlebars": "4.0.8" 1019 | } 1020 | }, 1021 | "js-tokens": { 1022 | "version": "3.0.1", 1023 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz", 1024 | "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=", 1025 | "dev": true 1026 | }, 1027 | "jsesc": { 1028 | "version": "1.3.0", 1029 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", 1030 | "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", 1031 | "dev": true 1032 | }, 1033 | "kind-of": { 1034 | "version": "3.2.0", 1035 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.0.tgz", 1036 | "integrity": "sha1-tYq+TVwEStM3JqjBUltIz4kb/wc=", 1037 | "dev": true, 1038 | "requires": { 1039 | "is-buffer": "1.1.5" 1040 | } 1041 | }, 1042 | "lazy-cache": { 1043 | "version": "1.0.4", 1044 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 1045 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", 1046 | "dev": true, 1047 | "optional": true 1048 | }, 1049 | "lcid": { 1050 | "version": "1.0.0", 1051 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 1052 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 1053 | "dev": true, 1054 | "requires": { 1055 | "invert-kv": "1.0.0" 1056 | } 1057 | }, 1058 | "load-json-file": { 1059 | "version": "1.1.0", 1060 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", 1061 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", 1062 | "dev": true, 1063 | "requires": { 1064 | "graceful-fs": "4.1.11", 1065 | "parse-json": "2.2.0", 1066 | "pify": "2.3.0", 1067 | "pinkie-promise": "2.0.1", 1068 | "strip-bom": "2.0.0" 1069 | } 1070 | }, 1071 | "lodash": { 1072 | "version": "4.17.4", 1073 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 1074 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", 1075 | "dev": true 1076 | }, 1077 | "longest": { 1078 | "version": "1.0.1", 1079 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 1080 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", 1081 | "dev": true 1082 | }, 1083 | "loose-envify": { 1084 | "version": "1.3.1", 1085 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", 1086 | "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", 1087 | "dev": true, 1088 | "requires": { 1089 | "js-tokens": "3.0.1" 1090 | } 1091 | }, 1092 | "lru-cache": { 1093 | "version": "4.0.2", 1094 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", 1095 | "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=", 1096 | "dev": true, 1097 | "requires": { 1098 | "pseudomap": "1.0.2", 1099 | "yallist": "2.1.2" 1100 | } 1101 | }, 1102 | "md5-hex": { 1103 | "version": "1.3.0", 1104 | "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", 1105 | "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", 1106 | "dev": true, 1107 | "requires": { 1108 | "md5-o-matic": "0.1.1" 1109 | } 1110 | }, 1111 | "md5-o-matic": { 1112 | "version": "0.1.1", 1113 | "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", 1114 | "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", 1115 | "dev": true 1116 | }, 1117 | "merge-source-map": { 1118 | "version": "1.0.3", 1119 | "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.3.tgz", 1120 | "integrity": "sha1-2hQV8nIqURnbB7FMT5c0EIY6Kr8=", 1121 | "dev": true, 1122 | "requires": { 1123 | "source-map": "0.5.6" 1124 | } 1125 | }, 1126 | "micromatch": { 1127 | "version": "2.3.11", 1128 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", 1129 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", 1130 | "dev": true, 1131 | "requires": { 1132 | "arr-diff": "2.0.0", 1133 | "array-unique": "0.2.1", 1134 | "braces": "1.8.5", 1135 | "expand-brackets": "0.1.5", 1136 | "extglob": "0.3.2", 1137 | "filename-regex": "2.0.1", 1138 | "is-extglob": "1.0.0", 1139 | "is-glob": "2.0.1", 1140 | "kind-of": "3.2.0", 1141 | "normalize-path": "2.1.1", 1142 | "object.omit": "2.0.1", 1143 | "parse-glob": "3.0.4", 1144 | "regex-cache": "0.4.3" 1145 | } 1146 | }, 1147 | "minimatch": { 1148 | "version": "3.0.3", 1149 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", 1150 | "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", 1151 | "dev": true, 1152 | "requires": { 1153 | "brace-expansion": "1.1.7" 1154 | } 1155 | }, 1156 | "minimist": { 1157 | "version": "0.0.8", 1158 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1159 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1160 | "dev": true 1161 | }, 1162 | "mkdirp": { 1163 | "version": "0.5.1", 1164 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1165 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1166 | "dev": true, 1167 | "requires": { 1168 | "minimist": "0.0.8" 1169 | } 1170 | }, 1171 | "ms": { 1172 | "version": "0.7.3", 1173 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz", 1174 | "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=", 1175 | "dev": true 1176 | }, 1177 | "normalize-package-data": { 1178 | "version": "2.3.8", 1179 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.8.tgz", 1180 | "integrity": "sha1-2Bntoqne29H/pWPqQHHZNngilbs=", 1181 | "dev": true, 1182 | "requires": { 1183 | "hosted-git-info": "2.4.2", 1184 | "is-builtin-module": "1.0.0", 1185 | "semver": "5.3.0", 1186 | "validate-npm-package-license": "3.0.1" 1187 | } 1188 | }, 1189 | "normalize-path": { 1190 | "version": "2.1.1", 1191 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 1192 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 1193 | "dev": true, 1194 | "requires": { 1195 | "remove-trailing-separator": "1.0.1" 1196 | } 1197 | }, 1198 | "number-is-nan": { 1199 | "version": "1.0.1", 1200 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1201 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 1202 | "dev": true 1203 | }, 1204 | "object-assign": { 1205 | "version": "4.1.1", 1206 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1207 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1208 | "dev": true 1209 | }, 1210 | "object.omit": { 1211 | "version": "2.0.1", 1212 | "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", 1213 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", 1214 | "dev": true, 1215 | "requires": { 1216 | "for-own": "0.1.5", 1217 | "is-extendable": "0.1.1" 1218 | } 1219 | }, 1220 | "once": { 1221 | "version": "1.4.0", 1222 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1223 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1224 | "dev": true, 1225 | "requires": { 1226 | "wrappy": "1.0.2" 1227 | } 1228 | }, 1229 | "optimist": { 1230 | "version": "0.6.1", 1231 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", 1232 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", 1233 | "dev": true, 1234 | "requires": { 1235 | "minimist": "0.0.8", 1236 | "wordwrap": "0.0.3" 1237 | } 1238 | }, 1239 | "os-homedir": { 1240 | "version": "1.0.2", 1241 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1242 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 1243 | "dev": true 1244 | }, 1245 | "os-locale": { 1246 | "version": "1.4.0", 1247 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", 1248 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", 1249 | "dev": true, 1250 | "requires": { 1251 | "lcid": "1.0.0" 1252 | } 1253 | }, 1254 | "parse-glob": { 1255 | "version": "3.0.4", 1256 | "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", 1257 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", 1258 | "dev": true, 1259 | "requires": { 1260 | "glob-base": "0.3.0", 1261 | "is-dotfile": "1.0.2", 1262 | "is-extglob": "1.0.0", 1263 | "is-glob": "2.0.1" 1264 | } 1265 | }, 1266 | "parse-json": { 1267 | "version": "2.2.0", 1268 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1269 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1270 | "dev": true, 1271 | "requires": { 1272 | "error-ex": "1.3.1" 1273 | } 1274 | }, 1275 | "path-exists": { 1276 | "version": "2.1.0", 1277 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 1278 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 1279 | "dev": true, 1280 | "requires": { 1281 | "pinkie-promise": "2.0.1" 1282 | } 1283 | }, 1284 | "path-is-absolute": { 1285 | "version": "1.0.1", 1286 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1287 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1288 | "dev": true 1289 | }, 1290 | "path-parse": { 1291 | "version": "1.0.5", 1292 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 1293 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", 1294 | "dev": true 1295 | }, 1296 | "path-type": { 1297 | "version": "1.1.0", 1298 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", 1299 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", 1300 | "dev": true, 1301 | "requires": { 1302 | "graceful-fs": "4.1.11", 1303 | "pify": "2.3.0", 1304 | "pinkie-promise": "2.0.1" 1305 | } 1306 | }, 1307 | "pify": { 1308 | "version": "2.3.0", 1309 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1310 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1311 | "dev": true 1312 | }, 1313 | "pinkie": { 1314 | "version": "2.0.4", 1315 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1316 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 1317 | "dev": true 1318 | }, 1319 | "pinkie-promise": { 1320 | "version": "2.0.1", 1321 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1322 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1323 | "dev": true, 1324 | "requires": { 1325 | "pinkie": "2.0.4" 1326 | } 1327 | }, 1328 | "pkg-dir": { 1329 | "version": "1.0.0", 1330 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", 1331 | "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", 1332 | "dev": true, 1333 | "requires": { 1334 | "find-up": "1.1.2" 1335 | } 1336 | }, 1337 | "preserve": { 1338 | "version": "0.2.0", 1339 | "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", 1340 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", 1341 | "dev": true 1342 | }, 1343 | "pseudomap": { 1344 | "version": "1.0.2", 1345 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1346 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", 1347 | "dev": true 1348 | }, 1349 | "randomatic": { 1350 | "version": "1.1.6", 1351 | "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.6.tgz", 1352 | "integrity": "sha1-EQ3Kv/OX6dz/fAeJzMCkmt8exbs=", 1353 | "dev": true, 1354 | "requires": { 1355 | "is-number": "2.1.0", 1356 | "kind-of": "3.2.0" 1357 | } 1358 | }, 1359 | "read-pkg": { 1360 | "version": "1.1.0", 1361 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", 1362 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", 1363 | "dev": true, 1364 | "requires": { 1365 | "load-json-file": "1.1.0", 1366 | "normalize-package-data": "2.3.8", 1367 | "path-type": "1.1.0" 1368 | } 1369 | }, 1370 | "read-pkg-up": { 1371 | "version": "1.0.1", 1372 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", 1373 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", 1374 | "dev": true, 1375 | "requires": { 1376 | "find-up": "1.1.2", 1377 | "read-pkg": "1.1.0" 1378 | } 1379 | }, 1380 | "regenerator-runtime": { 1381 | "version": "0.10.5", 1382 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", 1383 | "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", 1384 | "dev": true 1385 | }, 1386 | "regex-cache": { 1387 | "version": "0.4.3", 1388 | "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", 1389 | "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", 1390 | "dev": true, 1391 | "requires": { 1392 | "is-equal-shallow": "0.1.3", 1393 | "is-primitive": "2.0.0" 1394 | } 1395 | }, 1396 | "remove-trailing-separator": { 1397 | "version": "1.0.1", 1398 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz", 1399 | "integrity": "sha1-YV67lq9VlVLUv0BXyENtSGq2PMQ=", 1400 | "dev": true 1401 | }, 1402 | "repeat-element": { 1403 | "version": "1.1.2", 1404 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", 1405 | "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", 1406 | "dev": true 1407 | }, 1408 | "repeat-string": { 1409 | "version": "1.6.1", 1410 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 1411 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 1412 | "dev": true 1413 | }, 1414 | "repeating": { 1415 | "version": "2.0.1", 1416 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", 1417 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", 1418 | "dev": true, 1419 | "requires": { 1420 | "is-finite": "1.0.2" 1421 | } 1422 | }, 1423 | "require-directory": { 1424 | "version": "2.1.1", 1425 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1426 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 1427 | "dev": true 1428 | }, 1429 | "require-main-filename": { 1430 | "version": "1.0.1", 1431 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", 1432 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", 1433 | "dev": true 1434 | }, 1435 | "resolve-from": { 1436 | "version": "2.0.0", 1437 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 1438 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", 1439 | "dev": true 1440 | }, 1441 | "right-align": { 1442 | "version": "0.1.3", 1443 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 1444 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 1445 | "dev": true, 1446 | "optional": true, 1447 | "requires": { 1448 | "align-text": "0.1.4" 1449 | } 1450 | }, 1451 | "rimraf": { 1452 | "version": "2.6.1", 1453 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", 1454 | "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", 1455 | "dev": true, 1456 | "requires": { 1457 | "glob": "7.1.1" 1458 | } 1459 | }, 1460 | "semver": { 1461 | "version": "5.3.0", 1462 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", 1463 | "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", 1464 | "dev": true 1465 | }, 1466 | "set-blocking": { 1467 | "version": "2.0.0", 1468 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1469 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 1470 | "dev": true 1471 | }, 1472 | "signal-exit": { 1473 | "version": "3.0.2", 1474 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1475 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 1476 | "dev": true 1477 | }, 1478 | "slide": { 1479 | "version": "1.1.6", 1480 | "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", 1481 | "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", 1482 | "dev": true 1483 | }, 1484 | "source-map": { 1485 | "version": "0.5.6", 1486 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", 1487 | "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", 1488 | "dev": true 1489 | }, 1490 | "spawn-wrap": { 1491 | "version": "1.2.4", 1492 | "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.2.4.tgz", 1493 | "integrity": "sha1-kg6yEadpwJPuv71bDnpdLmirLkA=", 1494 | "dev": true, 1495 | "requires": { 1496 | "foreground-child": "1.5.6", 1497 | "mkdirp": "0.5.1", 1498 | "os-homedir": "1.0.2", 1499 | "rimraf": "2.6.1", 1500 | "signal-exit": "2.1.2", 1501 | "which": "1.2.14" 1502 | }, 1503 | "dependencies": { 1504 | "signal-exit": { 1505 | "version": "2.1.2", 1506 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-2.1.2.tgz", 1507 | "integrity": "sha1-N1h5sfkuvDszRIDQONxUam1VhWQ=", 1508 | "dev": true 1509 | } 1510 | } 1511 | }, 1512 | "spdx-correct": { 1513 | "version": "1.0.2", 1514 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", 1515 | "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", 1516 | "dev": true, 1517 | "requires": { 1518 | "spdx-license-ids": "1.2.2" 1519 | } 1520 | }, 1521 | "spdx-expression-parse": { 1522 | "version": "1.0.4", 1523 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", 1524 | "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", 1525 | "dev": true 1526 | }, 1527 | "spdx-license-ids": { 1528 | "version": "1.2.2", 1529 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", 1530 | "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", 1531 | "dev": true 1532 | }, 1533 | "string-width": { 1534 | "version": "1.0.2", 1535 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1536 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 1537 | "dev": true, 1538 | "requires": { 1539 | "code-point-at": "1.1.0", 1540 | "is-fullwidth-code-point": "1.0.0", 1541 | "strip-ansi": "3.0.1" 1542 | } 1543 | }, 1544 | "strip-ansi": { 1545 | "version": "3.0.1", 1546 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1547 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1548 | "dev": true, 1549 | "requires": { 1550 | "ansi-regex": "2.1.1" 1551 | } 1552 | }, 1553 | "strip-bom": { 1554 | "version": "2.0.0", 1555 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 1556 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", 1557 | "dev": true, 1558 | "requires": { 1559 | "is-utf8": "0.2.1" 1560 | } 1561 | }, 1562 | "supports-color": { 1563 | "version": "2.0.0", 1564 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1565 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1566 | "dev": true 1567 | }, 1568 | "test-exclude": { 1569 | "version": "4.1.0", 1570 | "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.0.tgz", 1571 | "integrity": "sha1-BMpwtzkN04yY1KADoXOAbKeZHJE=", 1572 | "dev": true, 1573 | "requires": { 1574 | "arrify": "1.0.1", 1575 | "micromatch": "2.3.11", 1576 | "object-assign": "4.1.1", 1577 | "read-pkg-up": "1.0.1", 1578 | "require-main-filename": "1.0.1" 1579 | } 1580 | }, 1581 | "to-fast-properties": { 1582 | "version": "1.0.3", 1583 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", 1584 | "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", 1585 | "dev": true 1586 | }, 1587 | "trim-right": { 1588 | "version": "1.0.1", 1589 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", 1590 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", 1591 | "dev": true 1592 | }, 1593 | "uglify-js": { 1594 | "version": "2.8.22", 1595 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.22.tgz", 1596 | "integrity": "sha1-1Uk0d4qNoUkD+imjJvskwKtRoaA=", 1597 | "dev": true, 1598 | "optional": true, 1599 | "requires": { 1600 | "source-map": "0.5.6", 1601 | "uglify-to-browserify": "1.0.2", 1602 | "yargs": "3.10.0" 1603 | }, 1604 | "dependencies": { 1605 | "yargs": { 1606 | "version": "3.10.0", 1607 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 1608 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", 1609 | "dev": true, 1610 | "optional": true, 1611 | "requires": { 1612 | "camelcase": "1.2.1", 1613 | "cliui": "2.1.0", 1614 | "decamelize": "1.2.0", 1615 | "window-size": "0.1.0" 1616 | } 1617 | } 1618 | } 1619 | }, 1620 | "uglify-to-browserify": { 1621 | "version": "1.0.2", 1622 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 1623 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", 1624 | "dev": true, 1625 | "optional": true 1626 | }, 1627 | "validate-npm-package-license": { 1628 | "version": "3.0.1", 1629 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", 1630 | "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", 1631 | "dev": true, 1632 | "requires": { 1633 | "spdx-correct": "1.0.2", 1634 | "spdx-expression-parse": "1.0.4" 1635 | } 1636 | }, 1637 | "which": { 1638 | "version": "1.2.14", 1639 | "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", 1640 | "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", 1641 | "dev": true, 1642 | "requires": { 1643 | "isexe": "2.0.0" 1644 | } 1645 | }, 1646 | "which-module": { 1647 | "version": "1.0.0", 1648 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", 1649 | "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", 1650 | "dev": true 1651 | }, 1652 | "window-size": { 1653 | "version": "0.1.0", 1654 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 1655 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", 1656 | "dev": true, 1657 | "optional": true 1658 | }, 1659 | "wordwrap": { 1660 | "version": "0.0.3", 1661 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 1662 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", 1663 | "dev": true 1664 | }, 1665 | "wrap-ansi": { 1666 | "version": "2.1.0", 1667 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 1668 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 1669 | "dev": true, 1670 | "requires": { 1671 | "string-width": "1.0.2", 1672 | "strip-ansi": "3.0.1" 1673 | } 1674 | }, 1675 | "wrappy": { 1676 | "version": "1.0.2", 1677 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1678 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1679 | "dev": true 1680 | }, 1681 | "write-file-atomic": { 1682 | "version": "1.3.4", 1683 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", 1684 | "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", 1685 | "dev": true, 1686 | "requires": { 1687 | "graceful-fs": "4.1.11", 1688 | "imurmurhash": "0.1.4", 1689 | "slide": "1.1.6" 1690 | } 1691 | }, 1692 | "y18n": { 1693 | "version": "3.2.1", 1694 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", 1695 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", 1696 | "dev": true 1697 | }, 1698 | "yallist": { 1699 | "version": "2.1.2", 1700 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 1701 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", 1702 | "dev": true 1703 | }, 1704 | "yargs": { 1705 | "version": "7.1.0", 1706 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", 1707 | "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", 1708 | "dev": true, 1709 | "requires": { 1710 | "camelcase": "3.0.0", 1711 | "cliui": "3.2.0", 1712 | "decamelize": "1.2.0", 1713 | "get-caller-file": "1.0.2", 1714 | "os-locale": "1.4.0", 1715 | "read-pkg-up": "1.0.1", 1716 | "require-directory": "2.1.1", 1717 | "require-main-filename": "1.0.1", 1718 | "set-blocking": "2.0.0", 1719 | "string-width": "1.0.2", 1720 | "which-module": "1.0.0", 1721 | "y18n": "3.2.1", 1722 | "yargs-parser": "5.0.0" 1723 | }, 1724 | "dependencies": { 1725 | "camelcase": { 1726 | "version": "3.0.0", 1727 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", 1728 | "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", 1729 | "dev": true 1730 | }, 1731 | "cliui": { 1732 | "version": "3.2.0", 1733 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", 1734 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", 1735 | "dev": true, 1736 | "requires": { 1737 | "string-width": "1.0.2", 1738 | "strip-ansi": "3.0.1", 1739 | "wrap-ansi": "2.1.0" 1740 | } 1741 | } 1742 | } 1743 | }, 1744 | "yargs-parser": { 1745 | "version": "5.0.0", 1746 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", 1747 | "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", 1748 | "dev": true, 1749 | "requires": { 1750 | "camelcase": "3.0.0" 1751 | }, 1752 | "dependencies": { 1753 | "camelcase": { 1754 | "version": "3.0.0", 1755 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", 1756 | "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", 1757 | "dev": true 1758 | } 1759 | } 1760 | } 1761 | } 1762 | }, 1763 | "once": { 1764 | "version": "1.4.0", 1765 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1766 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1767 | "dev": true, 1768 | "requires": { 1769 | "wrappy": "1.0.2" 1770 | } 1771 | }, 1772 | "optimist": { 1773 | "version": "0.6.1", 1774 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", 1775 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", 1776 | "dev": true, 1777 | "requires": { 1778 | "minimist": "0.0.10", 1779 | "wordwrap": "0.0.3" 1780 | } 1781 | }, 1782 | "path-is-absolute": { 1783 | "version": "1.0.1", 1784 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1785 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1786 | "dev": true 1787 | }, 1788 | "path-parse": { 1789 | "version": "1.0.5", 1790 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 1791 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", 1792 | "dev": true 1793 | }, 1794 | "resolve": { 1795 | "version": "1.3.3", 1796 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", 1797 | "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", 1798 | "dev": true, 1799 | "requires": { 1800 | "path-parse": "1.0.5" 1801 | } 1802 | }, 1803 | "rimraf": { 1804 | "version": "2.6.1", 1805 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", 1806 | "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", 1807 | "dev": true, 1808 | "requires": { 1809 | "glob": "7.1.1" 1810 | } 1811 | }, 1812 | "semver": { 1813 | "version": "5.3.0", 1814 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", 1815 | "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", 1816 | "dev": true 1817 | }, 1818 | "strip-ansi": { 1819 | "version": "3.0.1", 1820 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1821 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1822 | "dev": true, 1823 | "requires": { 1824 | "ansi-regex": "2.1.1" 1825 | } 1826 | }, 1827 | "supports-color": { 1828 | "version": "2.0.0", 1829 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1830 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1831 | "dev": true 1832 | }, 1833 | "tslib": { 1834 | "version": "1.7.1", 1835 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.7.1.tgz", 1836 | "integrity": "sha1-vIAEFkaRkjp5/oN4u+s9ogF1OOw=", 1837 | "dev": true 1838 | }, 1839 | "tslint": { 1840 | "version": "5.3.2", 1841 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.3.2.tgz", 1842 | "integrity": "sha1-5WRZ+wlacwfxA7hAUhdPXju+9u0=", 1843 | "dev": true, 1844 | "requires": { 1845 | "babel-code-frame": "6.22.0", 1846 | "colors": "1.1.2", 1847 | "diff": "3.2.0", 1848 | "glob": "7.1.1", 1849 | "optimist": "0.6.1", 1850 | "resolve": "1.3.3", 1851 | "semver": "5.3.0", 1852 | "tslib": "1.7.1", 1853 | "tsutils": "2.1.0" 1854 | } 1855 | }, 1856 | "tsutils": { 1857 | "version": "2.1.0", 1858 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.1.0.tgz", 1859 | "integrity": "sha1-W+g3bJKVKPZbMC3p4XsABOTB6yA=", 1860 | "dev": true 1861 | }, 1862 | "typescript": { 1863 | "version": "2.3.3", 1864 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.3.3.tgz", 1865 | "integrity": "sha1-ljnzw7QBSOjKl/4IpR3RiRu2viI=", 1866 | "dev": true 1867 | }, 1868 | "whatwg-fetch": { 1869 | "version": "2.0.3", 1870 | "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", 1871 | "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" 1872 | }, 1873 | "wordwrap": { 1874 | "version": "0.0.3", 1875 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 1876 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", 1877 | "dev": true 1878 | }, 1879 | "wrappy": { 1880 | "version": "1.0.2", 1881 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1882 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1883 | "dev": true 1884 | } 1885 | } 1886 | } 1887 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@chromasdk/chromajs", 3 | "version": "0.1.1", 4 | "description": "JavaScript client for the Razer Chroma REST API", 5 | "repository": { 6 | "type": "git", 7 | "url": "git+https://github.com/chroma-sdk/chroma-js.git" 8 | }, 9 | "bugs": { 10 | "url": "https://github.com/chroma-sdk/chroma-js/issues" 11 | }, 12 | "license": "MIT", 13 | "main": "./dist/index.js", 14 | "types": "./dist/main.d.ts", 15 | "dependencies": { 16 | "isomorphic-fetch": "2.2.1" 17 | }, 18 | "devDependencies": { 19 | "nyc": "10.3.2", 20 | "rimraf": "2.6.1", 21 | "tslint": "5.3.2", 22 | "typescript": "2.3.3" 23 | }, 24 | "scripts": { 25 | "build": "tsc", 26 | "dev": "tsc -w", 27 | "lint": "tslint src/**/*.ts{,x}" 28 | }, 29 | "homepage": "https://github.com/chroma-sdk/chroma-js#readme", 30 | "directories": { 31 | "test": "test" 32 | }, 33 | "keywords": [ 34 | "Razer", 35 | "Chroma", 36 | "SDK", 37 | "Rest", 38 | "API", 39 | "API" 40 | ] 41 | } 42 | -------------------------------------------------------------------------------- /src/Animation.ts: -------------------------------------------------------------------------------- 1 | import {AnimationFrame} from "./AnimationFrame"; 2 | import {ChromaInstance} from "./ChromaInstance"; 3 | import Color from "./Color"; 4 | import {DeviceRequestData} from "./DeviceRequestData"; 5 | import DeviceContainer from "./Devices"; 6 | import {IDevice, IDeviceData} from "./Devices/Base"; 7 | import ChromaLink from "./Devices/ChromaLink"; 8 | import Headset from "./Devices/Headset"; 9 | import Keyboard from "./Devices/Keyboard"; 10 | import Keypad from "./Devices/Keypad"; 11 | import Mouse from "./Devices/Mouse"; 12 | import Mousepad from "./Devices/Mousepad"; 13 | import Effect from "./Effect"; 14 | 15 | function sleep(time: number) { 16 | return new Promise((resolve) => setTimeout(resolve, time)); 17 | } 18 | 19 | export interface IPlayInstance { 20 | send(container: DeviceContainer): void; 21 | deleteEffect(effects: string[]): Promise; 22 | sendDeviceUpdate(devices: IDeviceData[], store: boolean): Promise; 23 | } 24 | 25 | export class Animation { 26 | public Frames: AnimationFrame[] = []; 27 | public isPlaying: boolean = false; 28 | public Instance: IPlayInstance = null; 29 | public currentFrame: number = 0; 30 | private isInit: boolean= false; 31 | 32 | public async play(instance: IPlayInstance) { 33 | if (!this.isInit) { 34 | this.isInit = true; 35 | await this.createFrames(); 36 | } 37 | this.Instance = instance; 38 | this.isPlaying = true; 39 | this.currentFrame = 0; 40 | await this.createEffects(instance); 41 | 42 | this.playLoop(instance); 43 | } 44 | 45 | public async playLoop(instance: IPlayInstance) { 46 | for (const i of this.Frames){ 47 | await instance.send(i); 48 | await sleep(i.delay); 49 | if (!this.isPlaying) { 50 | break; 51 | } 52 | } 53 | if (this.isPlaying) { 54 | this.playLoop(instance); 55 | } 56 | } 57 | 58 | public async stop() { 59 | this.isPlaying = false; 60 | const effectIds: string[] = []; 61 | for (const frame of this.Frames){ 62 | if (frame.Keyboard.effectId !== "") { 63 | effectIds.push(frame.Keyboard.effectId); 64 | } 65 | frame.Keyboard.effectId = ""; 66 | } 67 | 68 | await this.Instance.deleteEffect(effectIds); 69 | } 70 | 71 | public async createEffects(instance: IPlayInstance) { 72 | this.Instance = instance; 73 | const keyboardEffectData: any = []; 74 | const device = new DeviceRequestData(); 75 | device.device = "keyboard"; 76 | 77 | for (const frame of this.Frames){ 78 | keyboardEffectData.push(frame.Keyboard.effectData); 79 | } 80 | 81 | device.effectData = { 82 | effects: keyboardEffectData, 83 | }; 84 | 85 | const response = await instance.sendDeviceUpdate([device], true); 86 | const keyboardids = response[0]; 87 | 88 | for (let i = 0; i < keyboardids.length; i++) { 89 | this.Frames[i].Keyboard.effectId = keyboardids[i] !== null ? keyboardids[i].id : ""; 90 | } 91 | return; 92 | } 93 | 94 | public async createFrames() { 95 | for (let i = 0; i < 10; i++) { 96 | const frame = new AnimationFrame(); 97 | frame.Keyboard.setAll(new Color("ff0000")); 98 | this.Frames.push(frame); 99 | } 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /src/AnimationFrame.ts: -------------------------------------------------------------------------------- 1 | import DeviceContainer from "./Devices"; 2 | 3 | export class AnimationFrame extends DeviceContainer { 4 | public delay: number = 1000 / 15; 5 | } 6 | -------------------------------------------------------------------------------- /src/Animations/BcaAnimation.ts: -------------------------------------------------------------------------------- 1 | import {Animation} from "../Animation"; 2 | import {AnimationFrame} from "../AnimationFrame"; 3 | import {Color} from "../Color"; 4 | 5 | export class BcaAnimation extends Animation { 6 | private url: string = null; 7 | private blob: Blob = null; 8 | 9 | constructor(url: string | Blob) { 10 | super(); 11 | if (typeof url === "string") { 12 | this.url = url as string; 13 | } else { 14 | this.blob = url as Blob; 15 | } 16 | } 17 | 18 | public async createFrames() { 19 | if (this.blob !== null) { 20 | await this.fromBlob(this.blob); 21 | } else { 22 | await fetch(this.url).then((response) => { 23 | return response.blob(); 24 | }) 25 | .then(this.fromBlob); 26 | } 27 | } 28 | 29 | private async fromBlob(myBlob: Blob) { 30 | this.blob = myBlob; 31 | const reader = new FileReader(); 32 | const test = new Promise((resolve, reject) => { 33 | reader.addEventListener("loadend", () => { 34 | resolve(reader.result as ArrayBuffer); 35 | }); 36 | }); 37 | reader.readAsArrayBuffer(myBlob); 38 | const anim = await test; 39 | await this.parseAnimation(anim); 40 | } 41 | 42 | private async parseAnimation(buffer: ArrayBuffer) { 43 | const view = new DataView( buffer ); 44 | 45 | const fileheader = { 46 | BcaOffset: view.getUint32(0x0A, true), 47 | Size: view.getUint16(0x02, true), 48 | Type: view.getUint16(0x0), 49 | }; 50 | 51 | const bcaheader = { 52 | FPS: view.getUint16(fileheader.BcaOffset + 10, true), 53 | FrameCount: view.getUint32(fileheader.BcaOffset + 12, true), 54 | FrameOffset: view.getUint32(fileheader.BcaOffset + 6, true), 55 | Size: view.getUint32(fileheader.BcaOffset, true), 56 | Version: view.getUint16(fileheader.BcaOffset + 4, true), 57 | }; 58 | let lastframe: AnimationFrame = null; 59 | 60 | let offset = bcaheader.FrameOffset; 61 | for (let frame = 1; frame <= bcaheader.FrameCount; frame++) { 62 | const frameheader = { 63 | DataSize: view.getUint16(offset + 4, true), 64 | DeviceCount: view.getUint16(offset + 2, true), 65 | HeaderSize: view.getUint16(offset, true), 66 | }; 67 | const animframe = new AnimationFrame(); 68 | animframe.delay = 10; 69 | if (lastframe !== null) { 70 | animframe.Keyboard.grid = lastframe.Keyboard.grid.clone(); 71 | } 72 | 73 | let deviceoffset = offset + 6; 74 | for (let device = 0; device < frameheader.DeviceCount; device++) { 75 | const deviceheader = { 76 | DataSize: view.getUint16(deviceoffset + 4, true), 77 | DataType: view.getUint8(deviceoffset + 1), 78 | Device: view.getUint16(deviceoffset + 2, true), 79 | HeaderSize: view.getUint8(deviceoffset), 80 | }; 81 | let dataoffset = deviceoffset + 6; 82 | 83 | const datacount = deviceheader.DataSize / 6; 84 | // console.log("COUNT", datacount); 85 | 86 | for (let devicedatanum = 0; devicedatanum < datacount; devicedatanum++) { 87 | 88 | const devicedata = { 89 | Col: view.getUint8(dataoffset + 1), 90 | RGBa: view.getUint32(dataoffset + 2, true), 91 | Row: view.getUint8(dataoffset), 92 | }; 93 | 94 | if (deviceheader.Device === 1) { 95 | animframe.Keyboard.setPosition(devicedata.Row, devicedata.Col, new Color(devicedata.RGBa)); 96 | } else { 97 | // TODO: ADD MORE DEVICES 98 | // console.log("UNKNOWN"); 99 | } 100 | 101 | dataoffset += 6; 102 | } 103 | 104 | deviceoffset = dataoffset; 105 | } 106 | 107 | offset = deviceoffset; 108 | lastframe = animframe; 109 | this.Frames.push(animframe); 110 | } 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /src/Animations/WaveAnimation.ts: -------------------------------------------------------------------------------- 1 | import {Animation} from "../Animation"; 2 | import {AnimationFrame} from "../AnimationFrame"; 3 | import {Color} from "../Color"; 4 | import {Keyboard} from "../Devices/Keyboard"; 5 | 6 | export class WaveAnimation extends Animation { 7 | private rightToLeft: boolean; 8 | 9 | constructor(rightToLeft: boolean = true) { 10 | super(); 11 | this.rightToLeft = rightToLeft; 12 | } 13 | 14 | public async createFrames() { 15 | const frequency = 1; 16 | const rainbow: Color[] = []; 17 | 18 | for (let num = 0; num < Math.PI * 2; num += (Math.PI * 2 / 22)) { 19 | const red = Math.cos(num) * 255 / 2 + 255 / 2; 20 | const green = Math.cos(num + Math.PI) * 255 / 2 + 255 / 2; 21 | const blue = Math.sin(num) * 255 / 2 + 255 / 2; 22 | const color = new Color(red, blue, green); 23 | rainbow.push(color); 24 | } 25 | 26 | for (const rainbowStep of rainbow) 27 | { 28 | const frame = new AnimationFrame(); 29 | for (let c = 0; c < Keyboard.Columns; ++c) { 30 | frame.Keyboard.setCol(c, rainbowStep); 31 | } 32 | if (this.rightToLeft) { 33 | const first = rainbow.shift(); 34 | rainbow.push(first); 35 | } else { 36 | const first = rainbow.pop(); 37 | rainbow.unshift(first); 38 | } 39 | this.Frames.push(frame); 40 | } 41 | 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/AppInfo.ts: -------------------------------------------------------------------------------- 1 | import {AuthorInfo} from "./AuthorInfo"; 2 | import {AvailableDevices} from "./Devices"; 3 | 4 | export enum AppCategory { 5 | Application = "application" as any, 6 | Game = "game" as any, 7 | } 8 | 9 | export class AppInfo { 10 | public Title: string; 11 | public Description: string; 12 | public Author: AuthorInfo = new AuthorInfo(); 13 | public DeviceSupported: AvailableDevices[] = []; 14 | public Category: AppCategory; 15 | 16 | public toJSON() { 17 | return { 18 | author: this.Author, 19 | category: this.Category, 20 | description: this.Description, 21 | device_supported: this.DeviceSupported, 22 | title: this.Title, 23 | }; 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/AuthorInfo.ts: -------------------------------------------------------------------------------- 1 | export class AuthorInfo { 2 | public Contact: string; 3 | public Name: string; 4 | 5 | public toJSON() { 6 | return { 7 | contact: this.Contact, 8 | name: this.Name, 9 | }; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/ChromaApp.ts: -------------------------------------------------------------------------------- 1 | import {AppCategory, AppInfo} from "./AppInfo"; 2 | import {AvailableDevices} from "./Devices"; 3 | 4 | import {ChromaInstance} from "./ChromaInstance"; 5 | import fetch from "./request"; 6 | 7 | export class ChromaApp { 8 | private uninitpromise: any = null; 9 | private activeInstance: Promise = null; 10 | private data: AppInfo; 11 | 12 | constructor(title: string, 13 | description: string= "", 14 | author: string= "TempRazerDev", 15 | contact: string= "razer@test.de", 16 | devices: AvailableDevices[]= [ 17 | AvailableDevices.Keyboard, 18 | AvailableDevices.Mouse, 19 | AvailableDevices.Headset, 20 | AvailableDevices.Mousepad, 21 | AvailableDevices.Keypad, 22 | AvailableDevices.ChromaLink, 23 | ], 24 | category: AppCategory= AppCategory.Application) { 25 | this.activeInstance = null; 26 | this.data = new AppInfo(); 27 | this.data.Title = title; 28 | this.data.Description = description; 29 | this.data.Author.Name = author; 30 | this.data.Author.Contact = contact; 31 | this.data.DeviceSupported = devices; 32 | this.data.Category = category; 33 | } 34 | 35 | public async Instance(create: boolean= true): Promise { 36 | if (this.activeInstance !== null) { 37 | const instance = await this.activeInstance; 38 | 39 | if (!instance.destroyed) { 40 | return instance; 41 | } else { 42 | this.activeInstance = null; 43 | } 44 | } 45 | 46 | if (create) { 47 | const options = { 48 | body: JSON.stringify(this.data), 49 | headers: {"Content-Type": "application/json"}, 50 | method: "post", 51 | }; 52 | 53 | this.activeInstance = new Promise(async (resolve, reject) => { 54 | try { 55 | const response = await fetch("http://localhost:54235/razer/chromasdk", options); 56 | const json = await response.json(); 57 | if (json.uri !== undefined) { 58 | resolve(new ChromaInstance(json.uri)); 59 | } 60 | reject("Unable to retrieve URI " + JSON.stringify(json)); 61 | } catch (error) { 62 | reject(error); 63 | } 64 | }); 65 | 66 | return await this.activeInstance; 67 | } else { 68 | return null; 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/ChromaInstance.ts: -------------------------------------------------------------------------------- 1 | import Color from "./Color"; 2 | import fetch from "./request"; 3 | 4 | import {Animation} from "./Animation"; 5 | import {IDevice, IDeviceData} from "./Devices/Base"; 6 | 7 | import DeviceContainer from "./Devices"; 8 | 9 | import Effect from "./Effect"; 10 | 11 | export class ChromaInstance extends DeviceContainer { 12 | public destroyed: boolean = false; 13 | 14 | private url: string; 15 | private interval: number; 16 | private activeAnimation: Animation = null; 17 | 18 | constructor(url: string) { 19 | super(); 20 | this.url = url; 21 | this.heartbeat = this.heartbeat.bind(this); 22 | this.setAll = this.setAll.bind(this); 23 | this.destroy = this.destroy.bind(this); 24 | this.interval = setInterval(this.heartbeat, 10000); 25 | } 26 | 27 | public async playAnimation(animation: Animation) { 28 | await this.stopAnimation(); 29 | this.activeAnimation = animation; 30 | await animation.play(this); 31 | return animation; 32 | } 33 | 34 | public async stopAnimation() { 35 | if (this.activeAnimation !== null) { 36 | await this.activeAnimation.stop(); 37 | this.activeAnimation = null; 38 | } 39 | return; 40 | } 41 | 42 | public async destroy() { 43 | this.destroyed = true; 44 | clearInterval(this.interval); 45 | this.interval = null; 46 | const url = this.url; 47 | this.url = ""; 48 | const response = await fetch(url, { 49 | method: "delete", 50 | }); 51 | 52 | if (!response.ok) { 53 | throw Error(response.statusText); 54 | } 55 | 56 | return true; 57 | } 58 | 59 | public async heartbeat() { 60 | if (this.url === "") { 61 | return; 62 | } 63 | const response = await fetch(this.url + "/heartbeat", { 64 | method: "put", 65 | }); 66 | 67 | if (!response.ok) { 68 | throw Error(response.statusText); 69 | } 70 | 71 | return response; 72 | } 73 | 74 | public async send(container: DeviceContainer = this) { 75 | if (this.url === "") { 76 | return; 77 | } 78 | 79 | const devices: IDevice[] = []; 80 | const effectids = []; 81 | for (const device of container.Devices){ 82 | if (device.activeEffect === Effect.UNDEFINED) { 83 | continue; 84 | } 85 | 86 | if (device.effectId !== "") { 87 | effectids.push(device.effectId); 88 | } else { 89 | devices.push(device); 90 | } 91 | } 92 | this.setEffect(effectids); 93 | return await this.sendDeviceUpdate(devices, false); 94 | 95 | } 96 | 97 | public async sendDeviceUpdate(devices: IDeviceData[], store: boolean= false) { 98 | const response = []; 99 | for (const device of devices){ 100 | const name = device.device; 101 | const parsedData = device.effectData; 102 | const deviceresponse = await fetch(this.url + "/" + name, { 103 | body: JSON.stringify(parsedData), 104 | headers: { "Content-Type": "application/json" }, 105 | method: (store) ? "post" : "put", 106 | }); 107 | 108 | if (!deviceresponse.ok) { 109 | throw Error(deviceresponse.statusText); 110 | } 111 | const data = await deviceresponse.json(); 112 | 113 | response.push(data.results); 114 | } 115 | return response; 116 | } 117 | 118 | public async setEffect(effectids: string[]) { 119 | if (effectids.length === 0) { 120 | return; 121 | } 122 | for (const effectid of effectids){ 123 | 124 | const payload = JSON.stringify({ 125 | id: effectid, 126 | }); 127 | const deviceresponse = await fetch(this.url + "/effect", { 128 | body: payload, 129 | headers: { "Content-Type": "application/json", "Content-Length": payload.length }, 130 | method: "put", 131 | }); 132 | 133 | const jsonresp = await deviceresponse.json(); 134 | } 135 | } 136 | 137 | public async deleteEffect(effectids: string[]) { 138 | if (effectids.length === 0) { 139 | return; 140 | } 141 | 142 | const payload = JSON.stringify({ 143 | ids: effectids, 144 | }); 145 | const deviceresponse = await fetch(this.url + "/effect", { 146 | body: payload, 147 | headers: { "Content-Type": "application/json", "Content-Length": payload.length }, 148 | method: "delete", 149 | }); 150 | } 151 | 152 | } 153 | -------------------------------------------------------------------------------- /src/Color.ts: -------------------------------------------------------------------------------- 1 | export class Color { 2 | public static Black: Color = new Color("000000"); 3 | public static Red: Color = new Color("ff0000"); 4 | public static Green: Color = new Color("00ff00"); 5 | public static Blue: Color = new Color("0000ff"); 6 | public static HotPink: Color = new Color(255, 105, 180); 7 | public static Orange: Color = new Color("ffa500"); 8 | public static Pink: Color = new Color("ff00ff"); 9 | public static Purple: Color = new Color("800080"); 10 | public static While: Color = new Color(255, 255, 255); 11 | public static Yellow: Color = new Color(255, 255, 0); 12 | 13 | public r: number; 14 | public g: number; 15 | public b: number; 16 | public isKey: boolean = false; 17 | 18 | constructor(r: number | string, g: number= null, b: number= null) { 19 | if (g === null && b === null && r !== null) { 20 | if (typeof r === "string") { 21 | const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(r); 22 | this.r = parseInt(result[1], 16); 23 | this.g = parseInt(result[2], 16); 24 | this.b = parseInt(result[3], 16); 25 | } else { 26 | this.b = (r >> 16) & 0xff; // tslint:disable-line:no-bitwise 27 | this.g = (r >> 8) & 0xff; // tslint:disable-line:no-bitwise 28 | this.r = (r >> 0) & 0xff; // tslint:disable-line:no-bitwise 29 | } 30 | } else { 31 | this.r = Math.round(r as number); 32 | this.g = Math.round(g); 33 | this.b = Math.round(b); 34 | } 35 | if (this.r > 255) { 36 | this.r = 255; 37 | } 38 | if (this.g > 255) { 39 | this.g = 255; 40 | } 41 | if (this.b > 255) { 42 | this.b = 255; 43 | } 44 | if (this.r < 0) { 45 | this.r = 0; 46 | } 47 | if (this.g < 0) { 48 | this.g = 0; 49 | } 50 | if (this.b < 0) { 51 | this.b = 0; 52 | } 53 | } 54 | 55 | public toBGR() { 56 | let rhex = this.r.toString(16); 57 | if (rhex.length < 2) { 58 | rhex = "0" + rhex; 59 | } 60 | let ghex = this.g.toString(16); 61 | if (ghex.length < 2) { 62 | ghex = "0" + ghex; 63 | } 64 | let bhex = this.b.toString(16); 65 | if (bhex.length < 2) { 66 | bhex = "0" + bhex; 67 | } 68 | 69 | let result = bhex + ghex + rhex; 70 | if (this.isKey) { 71 | result = "ff" + result; 72 | } 73 | 74 | return parseInt(result, 16); 75 | } 76 | 77 | public toJSON() { 78 | return this.toBGR(); 79 | } 80 | 81 | public toString() { 82 | return this.r + " " + this.g + " " + this.b; 83 | } 84 | } 85 | 86 | export default Color; 87 | -------------------------------------------------------------------------------- /src/DeviceRequestData.ts: -------------------------------------------------------------------------------- 1 | import {IDeviceData} from "./Devices/Base"; 2 | import Effect from "./Effect"; 3 | 4 | export class DeviceRequestData implements IDeviceData { 5 | public activeEffect: Effect; 6 | public effectData: any; 7 | public device: string; 8 | } 9 | -------------------------------------------------------------------------------- /src/Devices/Base.ts: -------------------------------------------------------------------------------- 1 | import {ChromaInstance} from "../ChromaInstance"; 2 | import Effect from "../Effect"; 3 | import fetch from "../request"; 4 | 5 | function parseEffectData(effect: any, data: any) { 6 | let jsonObj = null; 7 | if (effect === Effect.CHROMA_NONE) { 8 | jsonObj = { effect }; 9 | } else if (effect === Effect.CHROMA_CUSTOM 10 | || effect === Effect.CHROMA_CUSTOM2 11 | || effect === Effect.CHROMA_CUSTOM_KEY) { 12 | jsonObj = { effect, param: data }; 13 | } else if (effect === Effect.CHROMA_STATIC) { 14 | const color = { color: data }; 15 | jsonObj = { effect, param: color }; 16 | } 17 | return jsonObj; 18 | } 19 | 20 | export interface IDeviceData { 21 | activeEffect: Effect; 22 | effectData: any; 23 | device: string; 24 | } 25 | 26 | export interface IDevice { 27 | activeEffect: Effect; 28 | effectData: any; 29 | device: string; 30 | effectId: string; 31 | setStatic(color: any): void; 32 | setAll(color: any): void; 33 | setNone(): void; 34 | } 35 | 36 | export default class DeviceBase implements IDevice, IDeviceData { 37 | public device: any; 38 | public supports: any; 39 | public activeEffect: Effect = Effect.UNDEFINED; 40 | public effectData: any = null; 41 | public effectId: string = ""; 42 | 43 | constructor() { 44 | this.setStatic = this.setStatic.bind(this); 45 | this.setDeviceEffect = this.setDeviceEffect.bind(this); 46 | this.setAll = this.setAll.bind(this); 47 | this.setNone = this.setNone.bind(this); 48 | this.set = this.set.bind(this); 49 | } 50 | 51 | public setStatic(color: any) { 52 | this.setDeviceEffect(Effect.CHROMA_STATIC, color); 53 | return this; 54 | } 55 | 56 | public setAll(color: any) { 57 | this.setStatic(color); 58 | return this; 59 | } 60 | 61 | public set() { 62 | // console.log("Test"); 63 | } 64 | 65 | public setNone() { 66 | this.setDeviceEffect(Effect.CHROMA_NONE); 67 | } 68 | 69 | public async setDeviceEffect(effect: Effect, data: any = null) { 70 | this.activeEffect = effect; 71 | this.effectData = parseEffectData(effect, data); 72 | } 73 | 74 | } 75 | -------------------------------------------------------------------------------- /src/Devices/ChromaLink.ts: -------------------------------------------------------------------------------- 1 | import {ChromaInstance} from "../ChromaInstance"; 2 | import DeviceBase from "./Base"; 3 | 4 | export default class ChromaLink extends DeviceBase { 5 | constructor() { 6 | super(); 7 | this.device = "chromalink"; 8 | this.supports = ["CHROMA_NONE", "CHROMA_CUSTOM", "CHROMA_STATIC"]; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/Devices/Headset.ts: -------------------------------------------------------------------------------- 1 | import {ChromaInstance} from "../ChromaInstance"; 2 | import DeviceBase from "./Base"; 3 | 4 | export default class Headset extends DeviceBase { 5 | constructor() { 6 | super(); 7 | this.device = "headset"; 8 | this.supports = ["CHROMA_NONE", "CHROMA_CUSTOM", "CHROMA_STATIC"]; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/Devices/Keyboard.ts: -------------------------------------------------------------------------------- 1 | import {ChromaInstance} from "../ChromaInstance"; 2 | import Color from "../Color"; 3 | import Effect from "../Effect"; 4 | import Grid from "../Grid"; 5 | import Key from "../Key"; 6 | import DeviceBase from "./Base"; 7 | 8 | export class Keyboard extends DeviceBase { 9 | public static Columns: number = 22; 10 | public static Rows: number = 6; 11 | 12 | public grid: Grid; 13 | public keys: Grid; 14 | 15 | constructor() { 16 | super(); 17 | this.device = "keyboard"; 18 | this.grid = new Grid(Keyboard.Rows, Keyboard.Columns, Color.Black); 19 | this.keys = new Grid(Keyboard.Rows, Keyboard.Columns, Color.Black); 20 | this.setKey = this.setKey.bind(this); 21 | } 22 | 23 | public setAll(color: Color) { 24 | this.grid.set(color); 25 | this.keys.set(Color.Black); 26 | this.set(); 27 | return this; 28 | } 29 | 30 | public setRow(r: number, color: Color) { 31 | this.grid.setRow(r, color); 32 | this.set(); 33 | return this; 34 | } 35 | 36 | public setCol(c: number, color: Color) { 37 | this.grid.setCol(c, color); 38 | this.set(); 39 | return this; 40 | } 41 | 42 | public setPosition(r: number, c: number, color: Color) { 43 | color.isKey = false; 44 | this.grid.setPosition(r, c, color); 45 | this.set(); 46 | return this; 47 | } 48 | 49 | public setKey(keyOrArrayOfKeys: Key | Key[], color: Color) { 50 | if (keyOrArrayOfKeys instanceof Array) { 51 | const keyarray = keyOrArrayOfKeys as Key[]; 52 | keyOrArrayOfKeys.forEach((element) => { 53 | this.setKey(element, color); 54 | }); 55 | return this; 56 | } else { 57 | const row = keyOrArrayOfKeys >> 8; // tslint:disable-line:no-bitwise 58 | const col = keyOrArrayOfKeys & 0xFF; // tslint:disable-line:no-bitwise 59 | color.isKey = true; 60 | 61 | this.keys.setPosition(row, col, color); 62 | return this; 63 | } 64 | } 65 | 66 | public set() { 67 | this.setDeviceEffect(Effect.CHROMA_CUSTOM_KEY, { 68 | color: this.grid, 69 | key: this.keys, 70 | }); 71 | return this; 72 | } 73 | } 74 | 75 | export default Keyboard; 76 | -------------------------------------------------------------------------------- /src/Devices/Keypad.ts: -------------------------------------------------------------------------------- 1 | import {ChromaInstance} from "../ChromaInstance"; 2 | import Color from "../Color"; 3 | import Effect from "../Effect"; 4 | import Grid from "../Grid"; 5 | import DeviceBase from "./Base"; 6 | 7 | export default class Keypad extends DeviceBase { 8 | public grid: Grid; 9 | 10 | constructor() { 11 | super(); 12 | this.device = "keypad"; 13 | this.grid = new Grid(4, 5); 14 | } 15 | 16 | public setAll(color: Color) { 17 | this.grid.set(color); 18 | this.set(); 19 | return this; 20 | } 21 | 22 | public setPosition(r: number, c: number, color: Color) { 23 | this.grid.setPosition(r, c, color); 24 | this.set(); 25 | return this; 26 | } 27 | 28 | public set() { 29 | this.setDeviceEffect(Effect.CHROMA_CUSTOM, this.grid.grid); 30 | return this; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/Devices/Mouse.ts: -------------------------------------------------------------------------------- 1 | import {ChromaInstance} from "../ChromaInstance"; 2 | import Color from "../Color"; 3 | import Effect from "../Effect"; 4 | import Grid from "../Grid"; 5 | import DeviceBase from "./Base"; 6 | 7 | export default class Mouse extends DeviceBase { 8 | public grid: Grid; 9 | 10 | constructor() { 11 | super(); 12 | this.device = "mouse"; 13 | this.grid = new Grid(9, 7); 14 | } 15 | 16 | public setAll(color: Color) { 17 | this.grid.set(color); 18 | this.set(); 19 | return this; 20 | } 21 | 22 | public setPosition(r: number, c: number, color: Color) { 23 | this.grid.setPosition(r, c, color); 24 | this.set(); 25 | return this; 26 | } 27 | 28 | public set() { 29 | this.setDeviceEffect(Effect.CHROMA_CUSTOM2, this.grid.grid); 30 | return this; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/Devices/Mousepad.ts: -------------------------------------------------------------------------------- 1 | import {ChromaInstance} from "../ChromaInstance"; 2 | import Color from "../Color"; 3 | import Effect from "../Effect"; 4 | import Grid from "../Grid"; 5 | import DeviceBase from "./Base"; 6 | 7 | export default class Mousepad extends DeviceBase { 8 | public grid: Grid; 9 | 10 | constructor() { 11 | super(); 12 | this.device = "mousepad"; 13 | this.grid = new Grid(1, 15); 14 | } 15 | 16 | public setAll(color: Color) { 17 | this.grid.set(color); 18 | this.set(); 19 | return this; 20 | } 21 | 22 | public setPosition(c: number, color: Color) { 23 | this.grid.setPosition(0, c, color); 24 | this.set(); 25 | return this; 26 | } 27 | 28 | public set() { 29 | this.setDeviceEffect(Effect.CHROMA_CUSTOM, this.grid.grid[0]); 30 | return this; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/Devices/index.ts: -------------------------------------------------------------------------------- 1 | import Color from "../Color"; 2 | import {IDevice} from "./Base"; 3 | import ChromaLink from "./ChromaLink"; 4 | import Headset from "./Headset"; 5 | import Keyboard from "./Keyboard"; 6 | import Keypad from "./Keypad"; 7 | import Mouse from "./Mouse"; 8 | import Mousepad from "./Mousepad"; 9 | 10 | export enum AvailableDevices { 11 | ChromaLink = "chromalink" as any, 12 | Headset = "headset" as any, 13 | Keyboard = "keyboard" as any, 14 | Keypad = "keypad" as any, 15 | Mouse = "mouse" as any, 16 | Mousepad = "mousepad" as any, 17 | } 18 | 19 | export default class DeviceContainer { 20 | public Keyboard: Keyboard = new Keyboard(); 21 | public Mousepad: Mousepad = new Mousepad(); 22 | public Mouse: Mouse = new Mouse(); 23 | public Keypad: Keypad = new Keypad(); 24 | public Headset: Headset = new Headset(); 25 | public ChromaLink: ChromaLink = new ChromaLink(); 26 | public AnimationId: string = ""; 27 | public Devices: IDevice[] = []; 28 | 29 | constructor() { 30 | 31 | this.Devices.push(this.Keyboard, this.Mousepad, this.Mouse, this.Keypad, this.Headset, this.ChromaLink); 32 | } 33 | 34 | public setAll(color: Color) { 35 | this.Devices.forEach((device) => { 36 | device.setAll(color); 37 | }); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/Effect.ts: -------------------------------------------------------------------------------- 1 | enum Effect { 2 | UNDEFINED, 3 | EFFECT_ID, 4 | CHROMA_NONE = "CHROMA_NONE" as any, 5 | CHROMA_CUSTOM = "CHROMA_CUSTOM" as any, 6 | CHROMA_CUSTOM2 = "CHROMA_CUSTOM2" as any, 7 | CHROMA_CUSTOM_KEY = "CHROMA_CUSTOM_KEY" as any, 8 | CHROMA_STATIC = "CHROMA_STATIC" as any, 9 | } 10 | 11 | export default Effect; 12 | -------------------------------------------------------------------------------- /src/Grid.ts: -------------------------------------------------------------------------------- 1 | import { Color } from "./Color"; 2 | 3 | export default class Grid { 4 | public grid: Color[][]; 5 | public rows: number; 6 | public cols: number; 7 | public initialValue: Color; 8 | public isExtended: boolean = false; 9 | 10 | constructor(rows: number, cols: number, initialValue: Color= Color.Black) { 11 | this.rows = rows; 12 | this.cols = cols; 13 | this.initialValue = initialValue; 14 | this.grid = []; 15 | } 16 | 17 | public clone() { 18 | const copygrid = new Grid(this.rows, this.cols, this.initialValue); 19 | for (const inner of this.grid){ 20 | const rowarray = new Array(); 21 | for (const color of inner){ 22 | rowarray.push(new Color(color.r, color.g, color.b)); 23 | } 24 | copygrid.grid.push(rowarray); 25 | } 26 | return copygrid; 27 | } 28 | 29 | public setPosition(r: number, c: number, value: Color) { 30 | if (r === undefined || this.rows <= r || r < 0) { 31 | throw Error("Index out of range [row]"); 32 | } 33 | if (c === undefined || this.cols <= c || c < 0) { 34 | throw Error("Index out of range [col]"); 35 | } 36 | if (this.grid[r] === undefined) { 37 | this.grid[r] = []; 38 | } 39 | this.grid[r][c] = value; 40 | } 41 | 42 | public setRow(r: number, value: Color) { 43 | if (r === undefined || this.rows <= r || r < 0) { 44 | throw Error("Index out of range [row] " + this.rows + " - " + r); 45 | } 46 | if (this.grid[r] === undefined) { 47 | this.grid[r] = []; 48 | } 49 | 50 | for (let c = 0; c < this.cols; c++) { 51 | this.grid[r][c] = value; 52 | } 53 | } 54 | 55 | public setCol(c: number, value: Color) { 56 | if (c === undefined || this.cols <= c || c < 0) { 57 | throw Error("Index out of range [col]"); 58 | } 59 | for (let r = 0; r < this.rows; r++) { 60 | if (this.grid[r] === undefined) { 61 | this.grid[r] = []; 62 | } 63 | this.grid[r][c] = value; 64 | } 65 | } 66 | 67 | public set(value: Color) { 68 | for (let r = 0; r < this.rows; r++) { 69 | if (this.grid[r] === undefined) { 70 | this.grid[r] = []; 71 | } 72 | for (let c = 0; c < this.cols; c++) { 73 | this.grid[r][c] = value; 74 | } 75 | } 76 | } 77 | 78 | public getPosition(r: number, c: number) { 79 | if (this.grid[r] !== undefined && this.grid[r][c] !== undefined) { 80 | return this.grid[r][c]; 81 | } 82 | return null; 83 | } 84 | 85 | public toJSON() { 86 | if (!this.isExtended) { 87 | this.isExtended = true; 88 | for (let r = 0; r < this.rows; r++) { 89 | if (this.grid[r] === undefined) { 90 | this.grid[r] = []; 91 | } 92 | 93 | for (let c = 0; c < this.cols; c++) { 94 | if (this.grid[r][c] === undefined) { 95 | this.grid[r][c] = this.initialValue; 96 | } 97 | } 98 | } 99 | } 100 | return this.grid; 101 | } 102 | 103 | } 104 | -------------------------------------------------------------------------------- /src/Key.ts: -------------------------------------------------------------------------------- 1 | export enum Key { 2 | Logo = 0x0014, 3 | Escape = 0x0001, 4 | F1 = 0x0003, 5 | F2 = 0x0004, 6 | F3 = 0x0005, 7 | F4 = 0x0006, 8 | F5 = 0x0007, 9 | F6 = 0x0008, 10 | F7 = 0x0009, 11 | F8 = 0x000A, 12 | F9 = 0x000B, 13 | F10 = 0x000C, 14 | F11 = 0x000D, 15 | F12 = 0x000E, 16 | D1 = 0x0102, 17 | D2 = 0x0103, 18 | D3 = 0x0104, 19 | D4 = 0x0105, 20 | D5 = 0x0106, 21 | D6 = 0x0107, 22 | D7 = 0x0108, 23 | D8 = 0x0109, 24 | D9 = 0x010A, 25 | D0 = 0x010B, 26 | A = 0x0302, 27 | B = 0x0407, 28 | C = 0x0405, 29 | D = 0x0304, 30 | E = 0x0204, 31 | F = 0x0305, 32 | G = 0x0306, 33 | H = 0x0307, 34 | I = 0x0209, 35 | J = 0x0308, 36 | K = 0x0309, 37 | L = 0x030A, 38 | M = 0x0409, 39 | N = 0x0408, 40 | O = 0x020A, 41 | P = 0x020B, 42 | Q = 0x0202, 43 | R = 0x0205, 44 | S = 0x0303, 45 | T = 0x0206, 46 | U = 0x0208, 47 | V = 0x0406, 48 | W = 0x0203, 49 | X = 0x0404, 50 | Y = 0x0207, 51 | Z = 0x0403, 52 | NumLock = 0x0112, 53 | Num0 = 0x0513, 54 | Num1 = 0x0412, 55 | Num2 = 0x0413, 56 | Num3 = 0x0414, 57 | Num4 = 0x0312, 58 | Num5 = 0x0313, 59 | Num6 = 0x0314, 60 | Num7 = 0x0212, 61 | Num8 = 0x0213, 62 | Num9 = 0x0214, 63 | NumDivide = 0x0113, 64 | NumMultiply = 0x0114, 65 | NumSubtract = 0x0115, 66 | NumAdd = 0x0215, 67 | NumEnter = 0x0415, 68 | NumDecimal = 0x0514, 69 | PrintScreen = 0x000F, 70 | Scroll = 0x0010, 71 | Pause = 0x0011, 72 | Insert = 0x010F, 73 | Home = 0x0110, 74 | PageUp = 0x0111, 75 | Delete = 0x020f, 76 | End = 0x0210, 77 | PageDown = 0x0211, 78 | Up = 0x0410, 79 | Left = 0x050F, 80 | Down = 0x0510, 81 | Right = 0x0511, 82 | Tab = 0x0201, 83 | CapsLock = 0x0301, 84 | Backspace = 0x010E, 85 | Enter = 0x030E, 86 | LeftControl = 0x0501, 87 | LeftWindows = 0x0502, 88 | LeftAlt = 0x0503, 89 | Space = 0x0507, 90 | RightAlt = 0x050B, 91 | Function = 0x050C, 92 | RightMenu = 0x050D, 93 | RightControl = 0x050E, 94 | LeftShift = 0x0401, 95 | RightShift = 0x040E, 96 | Macro1 = 0x0100, 97 | Macro2 = 0x0200, 98 | Macro3 = 0x0300, 99 | Macro4 = 0x0400, 100 | Macro5 = 0x0500, 101 | OemTilde = 0x0101, 102 | OemMinus = 0x010C, 103 | OemEquals = 0x010D, 104 | OemLeftBracket = 0x020C, 105 | OemRightBracket = 0x020D, 106 | OemBackslash = 0x020E, 107 | OemSemicolon = 0x030B, 108 | OemApostrophe = 0x030C, 109 | OemComma = 0x040A, 110 | OemPeriod = 0x040B, 111 | OemSlash = 0x040C, 112 | EurPound = 0x030D, 113 | EurBackslash = 0x0402, 114 | JpnYen = 0x0015, 115 | JpnSlash = 0x040D, 116 | Jpn3 = 0x0504, 117 | Jpn4 = 0x0509, 118 | Jpn5 = 0x050A, 119 | KorPipe = 0x0015, 120 | Kor2 = 0x030D, 121 | Kor3 = 0x0402, 122 | Kor4 = 0x040D, 123 | Kor5 = 0x0504, 124 | Kor6 = 0x0509, 125 | Kor7 = 0x050A, 126 | Invalid = 0xFFFF, 127 | } 128 | 129 | export default Key; 130 | -------------------------------------------------------------------------------- /src/request.ts: -------------------------------------------------------------------------------- 1 | import "isomorphic-fetch"; 2 | 3 | function request(arg1: any, arg2: any) { 4 | return fetch(arg1, arg2); 5 | } 6 | 7 | export default request; 8 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": true, 3 | "compilerOptions": { 4 | "outDir": "./dist/", 5 | "sourceMap": true, 6 | "noImplicitAny": true, 7 | "module": "commonjs", 8 | "target": "es2015", 9 | "declaration": true 10 | }, 11 | "exclude": [ 12 | "node_modules", 13 | "dist" 14 | ], 15 | "awesomeTypescriptLoaderOptions": { 16 | "forkChecker": true, 17 | "useWebpackText": true 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tslint:latest" 3 | } --------------------------------------------------------------------------------