├── .gitignore ├── .jshintrc ├── LICENSE.md ├── README.md ├── arduino-1.6.0 └── attiny85 │ └── Blink.cpp.hex ├── examples └── attiny85.js ├── index.js ├── lib └── statics.js ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "camelcase": true, 3 | "curly": true, 4 | "eqeqeq": true, 5 | // "freeze": true, 6 | "indent": 2, 7 | "newcap": false, 8 | "quotmark": "single", 9 | "maxdepth": 3, 10 | "maxstatements": 50, 11 | "maxlen": 80, 12 | "eqnull": true, 13 | "funcscope": true, 14 | "strict": true, 15 | "undef": true, 16 | "unused": true, 17 | "node": true, 18 | // "mocha": true, 19 | "trailing": true 20 | } -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Jacob Rosenthal 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ##usbtinyisp 2 | fully javascript usbtinyisp like [adafruit usbtinyisp](https://www.adafruit.com/product/46), [mit fabisp](http://fab.cba.mit.edu/content/projects/fabisp/) or [sparkfun tinyavr](https://www.sparkfun.com/products/11801). Allows you to program bootloaders or regular code onto attiny's (and probably more) straight from node (and soon the browser). No more avrdude system calls or using the arduino IDE. -------------------------------------------------------------------------------- /arduino-1.6.0/attiny85/Blink.cpp.hex: -------------------------------------------------------------------------------- 1 | :1000000023C032C031C030C02FC042C02DC02CC070 2 | :100010002BC02AC029C028C027C026C025C0010285 3 | :100020000000040000000000010204081020200469 4 | :100030001008020202020202020202020000000094 5 | :10004000380000000000370011241FBECFE5D2E0C9 6 | :10005000DEBFCDBF20E0A0E6B0E001C01D92A93612 7 | :10006000B207E1F748D152C1CBCF61E080E0D5C003 8 | :1000700061E080E00BD168EE73E080E090E076D044 9 | :1000800060E080E003D168EE73E080E090E06EC055 10 | :100090001F920F920FB60F9211242F933F938F93BD 11 | :1000A0009F93AF93BF938091610090916200A09164 12 | :1000B0006300B09164003091600020E3230F2D377E 13 | :1000C00020F44096A11DB11D05C023EB230F4196DE 14 | :1000D000A11DB11D20936000809361009093620088 15 | :1000E000A0936300B09364008091650090916600D6 16 | :1000F000A0916700B09168000196A11DB11D809389 17 | :10010000650090936600A0936700B0936800BF916C 18 | :10011000AF919F918F913F912F910F900FBE0F90B4 19 | :100120001F9018953FB7F8948091650090916600F4 20 | :10013000A0916700B091680022B708B601FE05C023 21 | :100140002F3F19F00196A11DB11D3FBF6627782FE3 22 | :10015000892F9A2F620F711D811D911D46E0660F38 23 | :10016000771F881F991F4A95D1F70895CF92DF9284 24 | :10017000EF92FF92CF93DF936B017C01D3DFEB0112 25 | :10018000C114D104E104F10479F0BFD0CBDF6C1BC2 26 | :100190007D0B683E7340A0F381E0C81AD108E108E6 27 | :1001A000F108C851DC4FECCFDF91CF91FF90EF9079 28 | :1001B000DF90CF90089578948AB582608ABD8AB521 29 | :1001C00081608ABD83B7826083BF83B7816083BF4C 30 | :1001D00089B7826089BF80B7826080BF329A319AC6 31 | :1001E000309A379A0895823081F018F4813051F0B6 32 | :1001F0000895833019F0843009F008958CB58F7D0F 33 | :100200008CBD08958AB58F7702C08AB58F7D8ABD6F 34 | :1002100008958CB580648CBD0895CF93DF9390E0F2 35 | :10022000FC01E85DFF4F2491FC01EE5CFF4F8491DF 36 | :10023000882349F190E0880F991FFC01EE5BFF4F86 37 | :10024000A591B491845C9F4FFC01C591D4919FB757 38 | :10025000611108C0F8948C91209582238C93888139 39 | :1002600082230AC0623051F4F8948C91322F309579 40 | :1002700083238C938881822B888304C0F8948C918B 41 | :10028000822B8C939FBFDF91CF9108950F931F9383 42 | :10029000CF93DF931F92CDB7DEB7282F30E0F9015F 43 | :1002A000E25EFF4F8491F901E85DFF4F1491F9017F 44 | :1002B000EE5CFF4F04910023C1F0882319F069839D 45 | :1002C00092DF6981E02FF0E0EE0FFF1FE45CFF4F4B 46 | :1002D000A591B4919FB7F8948C91611103C01095CA 47 | :1002E000812301C0812B8C939FBF0F90DF91CF9111 48 | :1002F0001F910F9108955FDF8CDFB7DEC0E0D0E083 49 | :10030000B7DE2097E9F37CDEFBCF0895F894FFCFAA 50 | :00000001FF 51 | -------------------------------------------------------------------------------- /examples/attiny85.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var usbtinyisp = require('../'); 4 | var when = require('when'); 5 | var nodefn = require('when/node'); 6 | var ihex = require('intel-hex'); 7 | var fs = require('fs'); 8 | 9 | var data = fs.readFileSync('arduino-1.6.0/attiny85/blink.cpp.hex', { encoding: 'utf8' }); 10 | 11 | var options = { 12 | board: { 13 | name: 'Attiny85', 14 | signature: new Buffer([0x1e, 0x93, 0x0b]), 15 | pageSize: 64, 16 | }, 17 | memory: { 18 | data: ihex.parse(data).data 19 | }, 20 | pid: 3231, 21 | vid: 6017 22 | }; 23 | 24 | 25 | // var efuse = 0xff; //how does ff become 50 80? 26 | // var hfuse = 0xdf; 27 | // var lfuse = 0x62; 28 | // writeFuse.bind(null, tinyAVR, new Buffer([0x50, 0x08, 0x00, 0x00])), 29 | // writeFuse.bind(null, tinyAVR, new Buffer([0x58, 0x08, 0x00, 0x00])), 30 | // writeFuse.bind(null, tinyAVR, new Buffer([0x50, 0x00, 0x00, 0x00])) 31 | 32 | 33 | var bootload = function(cb){ 34 | return nodefn.bindCallback(when.promise(function(resolve, reject) { 35 | 36 | var tinyAVR; 37 | 38 | function open(){ 39 | return when.promise(function(resolve, reject) { 40 | tinyAVR = new usbtinyisp(options); 41 | tinyAVR.open(function(err){ 42 | if(err){ return reject(err); } 43 | return resolve(); 44 | }); 45 | }); 46 | } 47 | 48 | function close(){ 49 | return when.promise(function(resolve) { 50 | tinyAVR.close(); 51 | return resolve(); 52 | }); 53 | } 54 | 55 | function setSCK(){ 56 | return when.promise(function(resolve, reject) { 57 | tinyAVR.setSCK(function(err){ 58 | if(err){ return reject(err); } 59 | return resolve(); 60 | }); 61 | }); 62 | } 63 | 64 | function sendSync(){ 65 | return when.promise(function(resolve, reject) { 66 | tinyAVR.spi(new Buffer([0xac, 0x53, 0x00, 0x00]), function(err){ 67 | if(err){ return reject(err); } 68 | return resolve(); 69 | }); 70 | }); 71 | } 72 | 73 | function sync(){ 74 | 75 | return setSCK() 76 | .delay(50) 77 | .then(sendSync); 78 | } 79 | 80 | function getSignature1(){ 81 | return when.promise(function(resolve, reject) { 82 | tinyAVR.spi(new Buffer([0x30, 0x00, 0x00, 0x00]), function(err, sig){ 83 | if(err){ return reject(err); } 84 | return resolve(sig); 85 | }); 86 | }); 87 | } 88 | 89 | function getSignature2(){ 90 | return when.promise(function(resolve, reject) { 91 | tinyAVR.spi(new Buffer([0x30, 0x00, 0x01, 0x00]), function(err, sig){ 92 | if(err){ return reject(err); } 93 | return resolve(sig); 94 | }); 95 | }); 96 | } 97 | 98 | function getSignature3(){ 99 | return when.promise(function(resolve, reject) { 100 | tinyAVR.spi(new Buffer([0x30, 0x00, 0x02, 0x00]), function(err, sig){ 101 | if(err){ return reject(err); } 102 | return resolve(sig); 103 | }); 104 | }); 105 | } 106 | 107 | function verifySignature(){ 108 | 109 | return getSignature1() 110 | .then(function(sig){ 111 | if(options.board.signature[0] !== sig[3]){ 112 | throw new Error('Signature does not match'); 113 | } 114 | }) 115 | .then(getSignature2) 116 | .then(function(sig){ 117 | if(options.board.signature[1] !== sig[3]){ 118 | throw new Error('Signature does not match'); 119 | } 120 | }) 121 | .then(getSignature3) 122 | .then(function(sig){ 123 | if(options.board.signature[2] !== sig[3]){ 124 | throw new Error('Signature does not match'); 125 | } 126 | }); 127 | } 128 | 129 | function erase(){ 130 | return when.promise(function(resolve, reject) { 131 | tinyAVR.spi(new Buffer([0xac, 0x80, 0x00, 0x00]), function(err){ 132 | if(err){ return reject(err); } 133 | return resolve(); 134 | }); 135 | }); 136 | } 137 | 138 | function powerDown(){ 139 | return when.promise(function(resolve, reject) { 140 | tinyAVR.powerDown(function(err){ 141 | if(err){ return reject(err); } 142 | return resolve(); 143 | }); 144 | }); 145 | } 146 | 147 | function upload(){ 148 | 149 | var writeBytes = new Buffer(0); 150 | var useaddr; 151 | var pageaddr; 152 | 153 | function loadPage() { 154 | return when.promise(function(resolve, reject) { 155 | tinyAVR.writeFlash(0, pageaddr, writeBytes, function(err, result){ 156 | if(err){ return reject(err); } 157 | return resolve(); 158 | }); 159 | }); 160 | } 161 | 162 | function loadAddress() { 163 | return when.promise(function(resolve, reject) { 164 | var low = useaddr & 0xff; 165 | var high = (useaddr >> 8) & 0xff; 166 | 167 | var cmd = new Buffer([0x4c, high, low, 0x00]); 168 | 169 | tinyAVR.spi(cmd, function(err, result){ 170 | if(err){ return reject(err); } 171 | return resolve(); 172 | }); 173 | 174 | }); 175 | } 176 | 177 | function unspool(index) { 178 | return [index, index + options.board.pageSize]; 179 | } 180 | 181 | function predicate(index) { 182 | return index > options.memory.data.length; 183 | } 184 | 185 | function handler(index) { 186 | 187 | pageaddr = index; 188 | useaddr = index >> 1; 189 | writeBytes = options.memory.data.slice(pageaddr, (options.memory.data.length > options.board.pageSize ? (pageaddr + options.board.pageSize) : options.memory.data.length - 1)); 190 | 191 | return loadPage() 192 | .then(loadAddress) 193 | .delay(4); 194 | } 195 | 196 | return when.unfold(unspool, predicate, handler, 0); 197 | } 198 | 199 | open() 200 | .then(sync) 201 | .then(verifySignature) 202 | .then(erase) 203 | .then(sync) 204 | .then(upload) 205 | .then(powerDown) 206 | .finally(close) 207 | .then(function(){ 208 | return resolve(); 209 | }, 210 | function(error){ 211 | return reject(error); 212 | }); 213 | 214 | }), cb); 215 | }; 216 | 217 | bootload(function(error){ 218 | if(error) { console.log(error); } 219 | console.log('Success'); 220 | }); 221 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var util = require('util'); 4 | var EE = require('events').EventEmitter; 5 | var usb = require('usb'); 6 | var statics = require('./lib/statics'); 7 | 8 | var usbtiny = function(options) { 9 | if (!(this instanceof usbtiny)) 10 | { return new usbtiny(); } 11 | 12 | EE.call(this); 13 | 14 | this.device = {}; 15 | this.log = options.log || function(){}; 16 | this.options = options; 17 | }; 18 | 19 | function fixOSX() { 20 | (function(self, __open) { 21 | self.device.__open = function() { 22 | __open.call(this); 23 | // injecting this line here to alleviate a bad error later 24 | this.__claimInterface(0); 25 | }; 26 | })(this, this.device.__open); 27 | }; 28 | 29 | util.inherits(usbtiny, EE); 30 | 31 | usbtiny.prototype.open = function(cb){ 32 | var self = this; 33 | 34 | var device = usb.findByIds(this.options.vid, this.options.pid); 35 | if (!device) { 36 | return cb(new Error('could not find requested device.')); 37 | } 38 | self.device = device; 39 | 40 | if (process.platform.toLowerCase() === 'darwin') { 41 | fixOSX.call(this); 42 | } 43 | 44 | self.device.open(); 45 | 46 | if (cb) { 47 | cb(); 48 | } 49 | }; 50 | 51 | usbtiny.prototype.close = function(cb){ 52 | this.device.close(); 53 | 54 | if (cb) { 55 | cb(); 56 | } 57 | }; 58 | 59 | usbtiny.prototype.setSCK = function(val, cb){ 60 | if (!cb) { 61 | var cb = val; 62 | var val = statics.SCK_DEFAULT; 63 | } 64 | 65 | var requesttype = 0xC0; 66 | var requestid = statics.USBTINY_POWERUP; 67 | var index = statics.RESET_LOW; 68 | var length = 0; 69 | 70 | this.log('requesttype: ', requesttype.toString(16), ' requestid:', requestid.toString(16), ' val: ', val.toString(16), ' index: ', index.toString(16), ' buflen: ', length.toString(16)); 71 | 72 | this.device.controlTransfer( 73 | requesttype, requestid, val, index, length, cb); 74 | }; 75 | 76 | usbtiny.prototype.spi = function(buffer, cb){ 77 | 78 | var requesttype = 0xC0; 79 | var requestid = statics.USBTINY_SPI; 80 | var val = (buffer[1] << 8) | buffer[0]; 81 | var index = (buffer[3] << 8) | buffer[2]; 82 | var length = 4; 83 | 84 | this.log('requesttype: ', requesttype.toString(16), ' requestid:', requestid.toString(16), ' val: ', val.toString(16), ' index: ', index.toString(16), ' buflen: ', length.toString(16)); 85 | 86 | this.device.controlTransfer( 87 | requesttype, requestid, val, index, length, cb); 88 | }; 89 | 90 | usbtiny.prototype.readFlash = function(delay, address, length, cb){ 91 | 92 | var requesttype = 0xC0; 93 | var requestid = statics.USBTINY_FLASH_READ; 94 | 95 | this.log('requesttype: ', requesttype.toString(16), ' requestid:', requestid.toString(16), ' val: ', delay.toString(16), ' index: ', address.toString(16), ' buflen: ', length.toString(16)); 96 | 97 | this.device.controlTransfer( 98 | requesttype, requestid, delay, address, length, cb); 99 | }; 100 | 101 | //only supporting paged for now 102 | usbtiny.prototype.writeFlash = function(delay, address, buffer, cb){ 103 | 104 | var requesttype = 0x40; 105 | var requestid = statics.USBTINY_FLASH_WRITE; 106 | 107 | this.log('requesttype: ', requesttype.toString(16), ' requestid:', requestid.toString(16), ' val: ', delay.toString(16), ' index: ', address.toString(16), ' buflen: ', buffer.length.toString(16)); 108 | // console.log(buffer.toString('hex')); 109 | 110 | this.device.controlTransfer( 111 | requesttype, requestid, delay, address, buffer, cb); 112 | }; 113 | 114 | usbtiny.prototype.powerDown = function(cb){ 115 | 116 | var requesttype = 0xC0; 117 | var requestid = statics.USBTINY_POWERDOWN; 118 | var val = 0; 119 | var index = 0; 120 | var length = 0; 121 | 122 | this.log('requesttype: ', requesttype.toString(16), ' requestid:', requestid.toString(16), ' val: ', val.toString(16), ' index: ', index.toString(16), ' buflen: ', length.toString(16)); 123 | 124 | this.device.controlTransfer( 125 | requesttype, requestid, val, index, length, cb); 126 | }; 127 | 128 | //only supporting paged for now and eeprom isnt paged on tiny85 129 | usbtiny.prototype.readEeprom = function(delay, address, length, cb){ 130 | 131 | var requesttype = 0xC0; 132 | var requestid = statics.USBTINY_EEPROM_READ; 133 | 134 | this.log('requesttype: ', requesttype.toString(16), ' requestid:', requestid.toString(16), ' val: ', delay.toString(16), ' index: ', address.toString(16), ' buflen: ', length.toString(16)); 135 | 136 | this.device.controlTransfer( 137 | requesttype, requestid, delay, address, length, cb); 138 | }; 139 | 140 | usbtiny.prototype.writeEeprom = function(delay, address, buffer, cb){ 141 | 142 | var requesttype = 0x40; 143 | var requestid = statics.USBTINY_EEPROM_WRITE; 144 | 145 | this.log('requesttype: ', requesttype.toString(16), ' requestid:', requestid.toString(16), ' val: ', delay.toString(16), ' index: ', address.toString(16), ' buflen: ', buffer.toString('hex')); 146 | 147 | this.device.controlTransfer( 148 | requesttype, requestid, delay, address, buffer, cb); 149 | }; 150 | 151 | module.exports = usbtiny; 152 | 153 | -------------------------------------------------------------------------------- /lib/statics.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 3 | // Generic requests 4 | USBTINY_ECHO: 0, // 0x00: echo test 5 | USBTINY_READ: 1, // 0x01: read byte (wIndex:address) 6 | USBTINY_WRITE: 2, // 0x02: write byte (wIndex:address, wValue:value) 7 | USBTINY_CLR: 3, // 0x03: clear bit (wIndex:address, wValue:bitno) 8 | USBTINY_SET: 4, // 0x04: set bit (wIndex:address, wValue:bitno) 9 | 10 | //Programming requests 11 | USBTINY_POWERUP: 5, // 0x05: apply power (wValue:SCK-period, wIndex:RESET) 12 | USBTINY_POWERDOWN: 6, // 0x06: remove power from chip 13 | USBTINY_SPI: 7, // 0x07: issue SPI command (wValue:c1c0, wIndex:c3c2) 14 | USBTINY_POLL_BYTES: 8, // 0x08: set poll bytes for write (wValue:p1p2) 15 | USBTINY_FLASH_READ: 9, // 0x09: read flash (wIndex:address) 16 | USBTINY_FLASH_WRITE: 10, // 0x0A: write flash (wIndex:address, wValue:timeout) 17 | USBTINY_EEPROM_READ: 11, // 0x0B: read eeprom (wIndex:address) 18 | USBTINY_EEPROM_WRITE: 12, // 0x0C: write eeprom (wIndex:address, wValue:timeout) 19 | 20 | RESET_LOW: 0, 21 | RESET_HIGH: 1, 22 | SCK_MIN: 1, 23 | SCK_MAX: 250, 24 | SCK_DEFAULT: 10, 25 | CHUNK_SIZE: 128, 26 | USB_TIMEOUT: 500, 27 | 28 | }; 29 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "usbtinyisp", 3 | "version": "0.0.4", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abbrev": { 8 | "version": "1.1.1", 9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 10 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 11 | }, 12 | "ansi-regex": { 13 | "version": "2.1.1", 14 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 15 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 16 | }, 17 | "aproba": { 18 | "version": "1.2.0", 19 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 20 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" 21 | }, 22 | "are-we-there-yet": { 23 | "version": "1.1.5", 24 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", 25 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", 26 | "requires": { 27 | "delegates": "^1.0.0", 28 | "readable-stream": "^2.0.6" 29 | } 30 | }, 31 | "async": { 32 | "version": "2.6.1", 33 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", 34 | "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", 35 | "requires": { 36 | "lodash": "^4.17.10" 37 | } 38 | }, 39 | "balanced-match": { 40 | "version": "1.0.0", 41 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 42 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 43 | }, 44 | "brace-expansion": { 45 | "version": "1.1.11", 46 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 47 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 48 | "requires": { 49 | "balanced-match": "^1.0.0", 50 | "concat-map": "0.0.1" 51 | } 52 | }, 53 | "chownr": { 54 | "version": "1.1.1", 55 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", 56 | "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" 57 | }, 58 | "code-point-at": { 59 | "version": "1.1.0", 60 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 61 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 62 | }, 63 | "concat-map": { 64 | "version": "0.0.1", 65 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 66 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 67 | }, 68 | "console-control-strings": { 69 | "version": "1.1.0", 70 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 71 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" 72 | }, 73 | "core-util-is": { 74 | "version": "1.0.2", 75 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 76 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 77 | }, 78 | "debug": { 79 | "version": "2.6.9", 80 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 81 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 82 | "requires": { 83 | "ms": "2.0.0" 84 | } 85 | }, 86 | "deep-extend": { 87 | "version": "0.6.0", 88 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 89 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 90 | }, 91 | "delegates": { 92 | "version": "1.0.0", 93 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 94 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 95 | }, 96 | "detect-libc": { 97 | "version": "1.0.3", 98 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 99 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" 100 | }, 101 | "fs-minipass": { 102 | "version": "1.2.5", 103 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", 104 | "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", 105 | "requires": { 106 | "minipass": "^2.2.1" 107 | } 108 | }, 109 | "fs.realpath": { 110 | "version": "1.0.0", 111 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 112 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 113 | }, 114 | "gauge": { 115 | "version": "2.7.4", 116 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 117 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 118 | "requires": { 119 | "aproba": "^1.0.3", 120 | "console-control-strings": "^1.0.0", 121 | "has-unicode": "^2.0.0", 122 | "object-assign": "^4.1.0", 123 | "signal-exit": "^3.0.0", 124 | "string-width": "^1.0.1", 125 | "strip-ansi": "^3.0.1", 126 | "wide-align": "^1.1.0" 127 | } 128 | }, 129 | "glob": { 130 | "version": "7.1.3", 131 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 132 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 133 | "requires": { 134 | "fs.realpath": "^1.0.0", 135 | "inflight": "^1.0.4", 136 | "inherits": "2", 137 | "minimatch": "^3.0.4", 138 | "once": "^1.3.0", 139 | "path-is-absolute": "^1.0.0" 140 | } 141 | }, 142 | "has-unicode": { 143 | "version": "2.0.1", 144 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 145 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" 146 | }, 147 | "iconv-lite": { 148 | "version": "0.4.24", 149 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 150 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 151 | "requires": { 152 | "safer-buffer": ">= 2.1.2 < 3" 153 | } 154 | }, 155 | "ignore-walk": { 156 | "version": "3.0.1", 157 | "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", 158 | "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", 159 | "requires": { 160 | "minimatch": "^3.0.4" 161 | } 162 | }, 163 | "inflight": { 164 | "version": "1.0.6", 165 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 166 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 167 | "requires": { 168 | "once": "^1.3.0", 169 | "wrappy": "1" 170 | } 171 | }, 172 | "inherits": { 173 | "version": "2.0.3", 174 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 175 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 176 | }, 177 | "ini": { 178 | "version": "1.3.5", 179 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 180 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" 181 | }, 182 | "intel-hex": { 183 | "version": "0.1.1", 184 | "resolved": "https://registry.npmjs.org/intel-hex/-/intel-hex-0.1.1.tgz", 185 | "integrity": "sha1-glRF26vauNeYjG39tHDfu7Gf1JQ=", 186 | "dev": true 187 | }, 188 | "is-fullwidth-code-point": { 189 | "version": "1.0.0", 190 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 191 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 192 | "requires": { 193 | "number-is-nan": "^1.0.0" 194 | } 195 | }, 196 | "isarray": { 197 | "version": "1.0.0", 198 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 199 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 200 | }, 201 | "lodash": { 202 | "version": "4.17.11", 203 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 204 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" 205 | }, 206 | "minimatch": { 207 | "version": "3.0.4", 208 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 209 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 210 | "requires": { 211 | "brace-expansion": "^1.1.7" 212 | } 213 | }, 214 | "minimist": { 215 | "version": "0.0.8", 216 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 217 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 218 | }, 219 | "minipass": { 220 | "version": "2.3.5", 221 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", 222 | "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", 223 | "requires": { 224 | "safe-buffer": "^5.1.2", 225 | "yallist": "^3.0.0" 226 | } 227 | }, 228 | "minizlib": { 229 | "version": "1.2.1", 230 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", 231 | "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", 232 | "requires": { 233 | "minipass": "^2.2.1" 234 | } 235 | }, 236 | "mkdirp": { 237 | "version": "0.5.1", 238 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 239 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 240 | "requires": { 241 | "minimist": "0.0.8" 242 | } 243 | }, 244 | "ms": { 245 | "version": "2.0.0", 246 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 247 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 248 | }, 249 | "nan": { 250 | "version": "2.12.1", 251 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", 252 | "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==" 253 | }, 254 | "needle": { 255 | "version": "2.2.4", 256 | "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz", 257 | "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", 258 | "requires": { 259 | "debug": "^2.1.2", 260 | "iconv-lite": "^0.4.4", 261 | "sax": "^1.2.4" 262 | } 263 | }, 264 | "node-pre-gyp": { 265 | "version": "0.11.0", 266 | "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", 267 | "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", 268 | "requires": { 269 | "detect-libc": "^1.0.2", 270 | "mkdirp": "^0.5.1", 271 | "needle": "^2.2.1", 272 | "nopt": "^4.0.1", 273 | "npm-packlist": "^1.1.6", 274 | "npmlog": "^4.0.2", 275 | "rc": "^1.2.7", 276 | "rimraf": "^2.6.1", 277 | "semver": "^5.3.0", 278 | "tar": "^4" 279 | } 280 | }, 281 | "nopt": { 282 | "version": "4.0.1", 283 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", 284 | "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", 285 | "requires": { 286 | "abbrev": "1", 287 | "osenv": "^0.1.4" 288 | } 289 | }, 290 | "npm-bundled": { 291 | "version": "1.0.5", 292 | "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.5.tgz", 293 | "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==" 294 | }, 295 | "npm-packlist": { 296 | "version": "1.2.0", 297 | "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.2.0.tgz", 298 | "integrity": "sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ==", 299 | "requires": { 300 | "ignore-walk": "^3.0.1", 301 | "npm-bundled": "^1.0.1" 302 | } 303 | }, 304 | "npmlog": { 305 | "version": "4.1.2", 306 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 307 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 308 | "requires": { 309 | "are-we-there-yet": "~1.1.2", 310 | "console-control-strings": "~1.1.0", 311 | "gauge": "~2.7.3", 312 | "set-blocking": "~2.0.0" 313 | } 314 | }, 315 | "number-is-nan": { 316 | "version": "1.0.1", 317 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 318 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 319 | }, 320 | "object-assign": { 321 | "version": "4.1.1", 322 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 323 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 324 | }, 325 | "once": { 326 | "version": "1.4.0", 327 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 328 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 329 | "requires": { 330 | "wrappy": "1" 331 | } 332 | }, 333 | "os-homedir": { 334 | "version": "1.0.2", 335 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 336 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" 337 | }, 338 | "os-tmpdir": { 339 | "version": "1.0.2", 340 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 341 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 342 | }, 343 | "osenv": { 344 | "version": "0.1.5", 345 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", 346 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", 347 | "requires": { 348 | "os-homedir": "^1.0.0", 349 | "os-tmpdir": "^1.0.0" 350 | } 351 | }, 352 | "path-is-absolute": { 353 | "version": "1.0.1", 354 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 355 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 356 | }, 357 | "process-nextick-args": { 358 | "version": "2.0.0", 359 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 360 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 361 | }, 362 | "rc": { 363 | "version": "1.2.8", 364 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 365 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 366 | "requires": { 367 | "deep-extend": "^0.6.0", 368 | "ini": "~1.3.0", 369 | "minimist": "^1.2.0", 370 | "strip-json-comments": "~2.0.1" 371 | }, 372 | "dependencies": { 373 | "minimist": { 374 | "version": "1.2.0", 375 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 376 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 377 | } 378 | } 379 | }, 380 | "readable-stream": { 381 | "version": "2.3.6", 382 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 383 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 384 | "requires": { 385 | "core-util-is": "~1.0.0", 386 | "inherits": "~2.0.3", 387 | "isarray": "~1.0.0", 388 | "process-nextick-args": "~2.0.0", 389 | "safe-buffer": "~5.1.1", 390 | "string_decoder": "~1.1.1", 391 | "util-deprecate": "~1.0.1" 392 | } 393 | }, 394 | "rimraf": { 395 | "version": "2.6.3", 396 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 397 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 398 | "requires": { 399 | "glob": "^7.1.3" 400 | } 401 | }, 402 | "safe-buffer": { 403 | "version": "5.1.2", 404 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 405 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 406 | }, 407 | "safer-buffer": { 408 | "version": "2.1.2", 409 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 410 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 411 | }, 412 | "sax": { 413 | "version": "1.2.4", 414 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 415 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 416 | }, 417 | "semver": { 418 | "version": "5.6.0", 419 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 420 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" 421 | }, 422 | "set-blocking": { 423 | "version": "2.0.0", 424 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 425 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 426 | }, 427 | "signal-exit": { 428 | "version": "3.0.2", 429 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 430 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 431 | }, 432 | "string-width": { 433 | "version": "1.0.2", 434 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 435 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 436 | "requires": { 437 | "code-point-at": "^1.0.0", 438 | "is-fullwidth-code-point": "^1.0.0", 439 | "strip-ansi": "^3.0.0" 440 | } 441 | }, 442 | "string_decoder": { 443 | "version": "1.1.1", 444 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 445 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 446 | "requires": { 447 | "safe-buffer": "~5.1.0" 448 | } 449 | }, 450 | "strip-ansi": { 451 | "version": "3.0.1", 452 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 453 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 454 | "requires": { 455 | "ansi-regex": "^2.0.0" 456 | } 457 | }, 458 | "strip-json-comments": { 459 | "version": "2.0.1", 460 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 461 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 462 | }, 463 | "tar": { 464 | "version": "4.4.8", 465 | "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", 466 | "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", 467 | "requires": { 468 | "chownr": "^1.1.1", 469 | "fs-minipass": "^1.2.5", 470 | "minipass": "^2.3.4", 471 | "minizlib": "^1.1.1", 472 | "mkdirp": "^0.5.0", 473 | "safe-buffer": "^5.1.2", 474 | "yallist": "^3.0.2" 475 | } 476 | }, 477 | "usb": { 478 | "version": "1.5.0", 479 | "resolved": "https://registry.npmjs.org/usb/-/usb-1.5.0.tgz", 480 | "integrity": "sha512-/0stiQEmweuO2BKv2avzQQ8ypDUjo4Osz5sSEi+d0F4Rc+ddX1xED3uf4Tkelc1eADlfn0JQZYHP0bI7CNDA0Q==", 481 | "requires": { 482 | "nan": "^2.8.0", 483 | "node-pre-gyp": "^0.11.0" 484 | } 485 | }, 486 | "util-deprecate": { 487 | "version": "1.0.2", 488 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 489 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 490 | }, 491 | "when": { 492 | "version": "3.7.7", 493 | "resolved": "https://registry.npmjs.org/when/-/when-3.7.7.tgz", 494 | "integrity": "sha1-q6A/w7tzbWyIsJHQE9io5ZDYRxg=", 495 | "dev": true 496 | }, 497 | "wide-align": { 498 | "version": "1.1.3", 499 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 500 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 501 | "requires": { 502 | "string-width": "^1.0.2 || 2" 503 | } 504 | }, 505 | "wrappy": { 506 | "version": "1.0.2", 507 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 508 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 509 | }, 510 | "yallist": { 511 | "version": "3.0.3", 512 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", 513 | "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" 514 | } 515 | } 516 | } 517 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "usbtinyisp", 3 | "version": "0.0.4", 4 | "description": "fully javascript usbtinyisp like adafruit usbtinyisp, mit fabisp or sparkfun tinyavr", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/jacobrosenthal/usbtinyisp" 12 | }, 13 | "author": "Jacob Rosenthal @jacobrosenthal", 14 | "license": "MIT", 15 | "bugs": { 16 | "url": "https://github.com/jacobrosenthal/usbtinyisp/issues" 17 | }, 18 | "homepage": "https://github.com/jacobrosenthal/usbtinyisp", 19 | "dependencies": { 20 | "async": "^2.6.1", 21 | "usb": "^1.5.0" 22 | }, 23 | "devDependencies": { 24 | "when": "^3.7.2", 25 | "intel-hex": "^0.1.1" 26 | } 27 | } 28 | --------------------------------------------------------------------------------