├── .gitignore ├── .npmignore ├── .travis.yml ├── CONTRIBUTING.md ├── LICENSE.md ├── README.md ├── docs └── fritzing │ ├── i2C_128x32_Uno.fzz │ └── i2C_128x32_Uno.png ├── oled.ts ├── package-lock.json ├── package.json ├── tests ├── buffers │ ├── adafruitLogoBuf.js │ └── drawPixel.js ├── demoTime.js ├── demoTime_bt.js ├── images │ ├── cat-128x64.png │ ├── cat-microview.png │ ├── cat.png │ ├── noopkat-mono.png │ ├── noopkat.png │ └── parrot-tiny.png └── unit │ └── oledjs.spec.js └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | node_modules 3 | bitmaps 4 | font-dev.js 5 | .DS_Store 6 | npm-debug.log 7 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | tsconfig.json 2 | oled.ts 3 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "11" 4 | - "10" 5 | - "9" 6 | - "8" 7 | - "7" 8 | - "6" 9 | 10 | before_script: 11 | - npm install 12 | - npm run build 13 | 14 | script: 15 | - npm run test 16 | 17 | env: 18 | - CC=clang CXX=clang++ npm_config_clang=1 19 | 20 | addons: 21 | apt: 22 | sources: 23 | - ubuntu-toolchain-r-test 24 | packages: 25 | - gcc-4.8 26 | - g++-4.8 27 | - build-essential 28 | - libudev-dev 29 | 30 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Thank you for your interest in contributing to oled-js to make it even better! 4 | 5 | Not sure where to start? Check out the currently filed issues to see if there's anything there you'd like to work on. 6 | 7 | ## Feature requests 8 | The best thing to do here is to file an issue if there already isn't one. If it's something fairly obviously needed (in your opinion) and you are happy to code it, feel free to open a pull request without filing an issue first. 9 | 10 | ## Bugs / Issues 11 | Run a quick look through the currently open and closed issues and pull requests to make sure it hasn't already been reported or closed. If it's unique, feel free to open an issue. 12 | 13 | 14 | ## Code contribution workflow 15 | 1. Fork this repository and clone the new fork locally 16 | 2. Make your changes in a new git branch: `git checkout -b my-fix-branch master` 17 | 3. Follow the coding style of this project. 18 | 4. Create your patch/feature, including appropriate tests if a test suite is present 19 | 5. Commit your changes using a descriptive commit message 20 | 6. Rebase on master if your branch falls behind on commits 21 | 7. Push up your new branch to your forked repo 22 | 8. In GitHub, send a pull request to `oled-js:master`. Include an explanation of what you did, and reference any issues if they are related. 23 | 24 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Suz Hinton 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 | ![‘npm version’](http://img.shields.io/npm/v/oled-js.svg?style=flat) ![‘downloads over month’](http://img.shields.io/npm/dm/oled-js.svg?style=flat) 2 | 3 | oled js 4 | ======================== 5 | 6 | ![oled-cat](http://f.cl.ly/items/2G041X2C1o2A1n2D3S18/cat-oled.png) 7 | 8 | ## What is this? 9 | 10 | This repo is a library compatible with Rick Waldron's [johnny-five](https://github.com/rwaldron/johnny-five) project. It adds support for I2C/SPI compatible monochrome OLED screens. Works with 128 x 32, 128 x 64 and 96 x 16 sized screens, of the SSD1306 OLED/PLED Controller (read the [datasheet here](http://www.adafruit.com/datasheets/SSD1306.pdf)). 11 | 12 | Got a [MicroView](https://www.sparkfun.com/products/12923) from GeekAmmo/SparkFun? That'll work too. 13 | 14 | Interested in the nerdy bits going on behind the scenes? [Read my blog post about how OLED screens work](http://meow.noopkat.com/oled-js/)! 15 | 16 | OLED screens are really cool - now you can control them with JavaScript! 17 | 18 | ## Install 19 | 20 | If you haven't already, install [NodeJS](http://nodejs.org/) and the [Arduino IDE](http://arduino.cc/en/Main/Software) to your computer. 21 | 22 | 1. `npm install oled-js` 23 | 2. Upload the Standard Firmata sketch (prepackaged with the Arduino IDE) to your Arduino of choice. This can be found under ``File > Examples > Firmata > StandardFirmata`` [[ further help]](http://arduino.cc/en/Guide/HomePage) 24 | 25 | ## I2C screens 26 | Hook up I2C compatible oled to the Arduino. If using an Arduino Uno, pins are as follows: 27 | 28 | + SDL to pin A4 29 | + SCL to pin A5 30 | + RESET to pin 4 31 | 32 | [Fritzing diagram is here](https://raw.githubusercontent.com/noopkat/johnny-five-oled/master/docs/fritzing/i2C_128x32_Uno.png). Look up the correct pins if using a board other than Arduino. 33 | 34 | If you'd like to run the demo: 35 | 36 | 1. `git clone` this repo (get latest release instead of master branch) 37 | 2. `npm install` 38 | 3. Replace width, height, and other values in the options with your own in tests/demoTime.js 39 | 4. `node tests/demoTime.js` 40 | 41 | ### I2C example 42 | 43 | ```javascript 44 | const five = require('johnny-five'); 45 | const Oled = require('oled-js'); 46 | 47 | const board = new five.Board(); 48 | 49 | board.on('ready', () => { 50 | console.log('Connected to Arduino, ready.'); 51 | 52 | const opts = { 53 | width: 128, 54 | height: 64, 55 | address: 0x3D 56 | }; 57 | 58 | const oled = new Oled(board, five, opts); 59 | // do cool oled things here 60 | }); 61 | 62 | ``` 63 | 64 | ### Wait, how do I find out the I2C address of my OLED screen? 65 | Yeah this sounds like a nightmare, but it's pretty simple! Before uploading standard firmata to your Arduino, upload the [following sketch](http://playground.arduino.cc/Main/I2cScanner) from the Arduino Playground called 'I2C scanner'. Does what it says on the box. Open up your serial monitor, and you'll see your device address pop up there. Make a note of it, then re-upload standard firmata to your Arduino again. 66 | 67 | ## SPI screens 68 | 69 | **IMPORTANT NOTE: Using SPI will make your screen update and draw VERY slow. Manual hardware SPI over USB is the only way currently to do this within Johnny-Five, which is not optimized for the normal speed you can expect from SPI in general. Sorry about that. [Here is a video I took to show this](https://www.youtube.com/watch?v=wHCxlYx2bZY).** 70 | 71 | Hook up SPI compatible oled to the Arduino. If using an Arduino Uno, pins are as follows: 72 | 73 | + Data/MOSI to pin D9 74 | + CLK to pin D10 75 | + D/C to pin D11 76 | + RST to pin D13 77 | + CS/SS to pin 12 (you can change this one if you really want to) 78 | 79 | Fritzing diagram coming soon. 80 | 81 | #### SPI example 82 | 83 | ```javascript 84 | const five = require('johnny-five'); 85 | const Oled = require('oled-js'); 86 | 87 | const board = new five.Board(); 88 | 89 | board.on('ready', () => { 90 | console.log('Connected to Arduino, ready.'); 91 | 92 | const opts = { 93 | width: 128, 94 | height: 64, 95 | secondaryPin: 12 96 | }; 97 | 98 | const oled = new Oled(board, five, opts); 99 | // do cool oled things here 100 | }); 101 | 102 | ``` 103 | 104 | ## MicroView 105 | 106 | **MicroView uses SPI, so please see the note about drawing speed in the SPI section above.** 107 | 108 | This one is pretty simple - use the USB programmer that should have come with your MicroView. Insert the MicroView's header pins into the slots on the USB programmer. Plug it in to your nearest USB port, and you're done! No pin mappings, no sweat. 109 | 110 | ### Microview example 111 | 112 | ```javascript 113 | const five = require('johnny-five'); 114 | const Oled = require('oled-js'); 115 | 116 | const board = new five.Board(); 117 | 118 | board.on('ready', () => { 119 | console.log('Connected to Arduino, ready.'); 120 | 121 | const opts = { 122 | width: 64, 123 | height: 48, 124 | microview: true 125 | }; 126 | 127 | const oled = new Oled(board, five, opts); 128 | // do cool oled things here 129 | }); 130 | 131 | ``` 132 | 133 | ## Available methods 134 | 135 | ### clearDisplay 136 | Fills the buffer with 'off' pixels (0x00). Optional bool argument specifies whether screen updates immediately with result. Default is true. 137 | 138 | Usage: 139 | ```javascript 140 | oled.clearDisplay(); 141 | ``` 142 | 143 | ### dimDisplay 144 | Lowers the contrast on the display. This method takes one argument, a boolean. True for dimming, false to restore normal contrast. 145 | 146 | Usage: 147 | ```javascript 148 | oled.dimDisplay(true|false); 149 | ``` 150 | 151 | ### invertDisplay 152 | Inverts the pixels on the display. Black becomes white, white becomes black. This method takes one argument, a boolean. True for inverted state, false to restore normal pixel colors. 153 | 154 | Usage: 155 | ```javascript 156 | oled.invertDisplay(true|false); 157 | ``` 158 | 159 | ### turnOffDisplay 160 | Turns the display off. 161 | 162 | Usage: 163 | ```javascript 164 | oled.turnOffDisplay(); 165 | ``` 166 | 167 | ### turnOnDisplay 168 | Turns the display on. 169 | 170 | Usage: 171 | ```javascript 172 | oled.turnOnDisplay(); 173 | ``` 174 | 175 | 176 | ### drawPixel 177 | Draws a pixel at a specified position on the display. This method takes one argument: a multi-dimensional array containing either one or more sets of pixels. 178 | 179 | Each pixel needs an x position, a y position, and a color. Colors can be specified as either 0 for 'off' or black, and 1 or 255 for 'on' or white. 180 | 181 | Optional bool as last argument specifies whether screen updates immediately with result. Default is true. 182 | 183 | Usage: 184 | ```javascript 185 | // draws 4 white pixels total 186 | // format: [x, y, color] 187 | oled.drawPixel([ 188 | [128, 1, 1], 189 | [128, 32, 1], 190 | [128, 16, 1], 191 | [64, 16, 1] 192 | ]); 193 | ``` 194 | 195 | ### drawLine 196 | Draws a one pixel wide line. 197 | 198 | Arguments: 199 | + int **x0, y0** - start location of line 200 | + int **x1, y1** - end location of line 201 | + int **color** - can be specified as either 0 for 'off' or black, and 1 or 255 for 'on' or white. 202 | 203 | Optional bool as last argument specifies whether screen updates immediately with result. Default is true. 204 | 205 | Usage: 206 | ```javascript 207 | // args: (x0, y0, x1, y1, color) 208 | oled.drawLine(1, 1, 128, 32, 1); 209 | ``` 210 | 211 | ### fillRect 212 | Draws a filled rectangle. 213 | 214 | Arguments: 215 | + int **x0, y0** - top left corner of rectangle 216 | + int **width, height** - width and height of rectangle in pixels 217 | + int **color** - can be specified as either 0 for 'off' or black, and 1 or 255 for 'on' or white. 218 | 219 | Optional bool as last argument specifies whether screen updates immediately with result. Default is true. 220 | 221 | Usage: 222 | ```javascript 223 | // args: (x0, y0, width, height, color) 224 | oled.fillRect(1, 1, 10, 20, 1); 225 | ``` 226 | 227 | ### drawRect 228 | Draws an empty rectangle. 229 | 230 | Arguments: 231 | + int **x0, y0** - top left corner of rectangle 232 | + int **width, height** - width and height of rectangle in pixels 233 | + int **color** - can be specified as either 0 for 'off' or black, and 1 or 255 for 'on' or white. 234 | 235 | Optional bool as last argument specifies whether screen updates immediately with result. Default is true. 236 | 237 | Usage: 238 | ```javascript 239 | // args: (x0, y0, width, height, color) 240 | oled.drawRect(1, 1, 10, 20, 1); 241 | ``` 242 | 243 | ### drawCircle 244 | Draws an empty circle. 245 | 246 | Arguments: 247 | + int **x** - x of circle's center 248 | + int **y** - y of circle's center 249 | + int **r** - radius of circle 250 | + int **color** - can be specified as either 0 for 'off' or black, and 1 or 255 for 'on' or white. 251 | 252 | Optional bool as last argument specifies whether screen updates immediately with result. Default is true. 253 | 254 | Usage: 255 | ```javascript 256 | // args: (x, y, r, color) 257 | oled.drawCircle(30, 10, 5, 1); 258 | ``` 259 | 260 | 261 | ### drawBitmap 262 | Draws a bitmap using raw pixel data returned from an image parser. The image sourced must be monochrome, and indexed to only 2 colors. Resize the bitmap to your screen dimensions first. Using an image editor or ImageMagick might be required. 263 | 264 | Optional bool as last argument specifies whether screen updates immediately with result. Default is true. 265 | 266 | Tip: use a NodeJS image parser to get the pixel data, such as [pngparse](https://www.npmjs.org/package/pngparse). A demonstration of using this is below. 267 | 268 | 269 | Example usage: 270 | ``` 271 | npm install pngparse 272 | ``` 273 | 274 | ```javascript 275 | const pngparse = require('pngparse'); 276 | 277 | pngparse.parseFile('indexed_file.png', (err, image) => { 278 | oled.drawBitmap(image.data); 279 | }); 280 | ``` 281 | 282 | This method is provided as a primitive convenience. A better way to display images is to use NodeJS package [png-to-lcd](https://www.npmjs.org/package/png-to-lcd) instead. It's just as easy to use as drawBitmap, but is compatible with all image depths (lazy is good!). It will also auto-dither if you choose. You should still resize your image to your screen dimensions. This alternative method is covered below: 283 | 284 | ``` 285 | npm install png-to-lcd 286 | ``` 287 | 288 | ```javascript 289 | const pngtolcd = require('png-to-lcd'); 290 | 291 | pngtolcd('nyan-cat.png', true, (err, bitmap) => { 292 | oled.buffer = bitmap; 293 | oled.update(); 294 | }); 295 | ``` 296 | 297 | ### startScroll 298 | Scrolls the current display either left or right. 299 | Arguments: 300 | + string **direction** - direction of scrolling. 'left' or 'right' 301 | + int **start** - starting row of scrolling area 302 | + int **stop** - end row of scrolling area 303 | 304 | Usage: 305 | ```javascript 306 | // args: (direction, start, stop) 307 | oled.startScroll('left', 0, 15); // this will scroll an entire 128 x 32 screen 308 | ``` 309 | 310 | ### stopScroll 311 | Stops all current scrolling behaviour. 312 | 313 | Usage: 314 | ```javascript 315 | oled.stopScroll(); 316 | ``` 317 | 318 | ### setCursor 319 | Sets the x and y position of 'cursor', when about to write text. This effectively helps tell the display where to start typing when writeString() method is called. 320 | 321 | Call setCursor just before writeString(). 322 | 323 | Usage: 324 | ```javascript 325 | // sets cursor to x = 1, y = 1 326 | oled.setCursor(1, 1); 327 | ``` 328 | 329 | ### writeString 330 | Writes a string of text to the display. 331 | Call setCursor() just before, if you need to set starting text position. 332 | 333 | Arguments: 334 | + obj **font** - font object in JSON format (see note below on sourcing a font) 335 | + int **size** - font size, as multiplier. Eg. 2 would double size, 3 would triple etc. 336 | + string **text** - the actual text you want to show on the display. 337 | + int **color** - color of text. Can be specified as either 0 for 'off' or black, and 1 or 255 for 'on' or white. 338 | + bool **wrapping** - true applies word wrapping at the screen limit, false for no wrapping. If a long string without spaces is supplied as the text, just letter wrapping will apply instead. 339 | + int **linespacing** - amount of spacing between lines of text on the screen. Negative numbers are also ok. 340 | 341 | Optional bool as last argument specifies whether screen updates immediately with result. Default is true. 342 | 343 | Before all of this text can happen, you need to load a font buffer for use. A good font to start with is NodeJS package [oled-font-5x7](https://www.npmjs.org/package/oled-font-5x7). Want more options? Try rolling your own font module to require instead, using the [oled-js font foundry](http://noopkat.github.io/oled-js-font-foundry/)! 344 | 345 | Usage: 346 | ``` 347 | npm install oled-font-5x7 348 | ``` 349 | 350 | ```javascript 351 | const font = require('oled-font-5x7'); 352 | 353 | // sets cursor to x = 1, y = 1 354 | oled.setCursor(1, 1); 355 | oled.writeString(font, 1, 'Cats and dogs are really cool animals, you know.', 1, true, 2); 356 | ``` 357 | 358 | ### update 359 | Sends the entire buffer in its current state to the oled display, effectively syncing the two. This method generally does not need to be called, unless you're messing around with the framebuffer manually before you're ready to sync with the display. It's also needed if you're choosing not to draw on the screen immediately with the built in methods. 360 | 361 | Usage: 362 | ```javascript 363 | oled.update(); 364 | ``` 365 | 366 | ## Future 367 | + better documentation 368 | + 16-bit color oled support 369 | -------------------------------------------------------------------------------- /docs/fritzing/i2C_128x32_Uno.fzz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noopkat/oled-js/eec79a88f36589dd06fa184aa9702d35d4dd072b/docs/fritzing/i2C_128x32_Uno.fzz -------------------------------------------------------------------------------- /docs/fritzing/i2C_128x32_Uno.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noopkat/oled-js/eec79a88f36589dd06fa184aa9702d35d4dd072b/docs/fritzing/i2C_128x32_Uno.png -------------------------------------------------------------------------------- /oled.ts: -------------------------------------------------------------------------------- 1 | import { Board, Pin } from "johnny-five" 2 | 3 | enum Protocol {I2C, SPI} 4 | enum TransferType {Command, Data} 5 | type Direction = 'left' | 'left diagonal' | 'right' | 'right diagonal' 6 | type Black = 0x00 7 | type White = 0x01 | 0xff 8 | type Color = Black | White 9 | type Pixel = [number, number, Color] 10 | 11 | interface OledOptions { 12 | height?: number 13 | width?: number 14 | address?: number 15 | microview?: boolean 16 | secondaryPin?: number 17 | resetPin?: number 18 | data?: number 19 | command?: number 20 | } 21 | 22 | interface Font { 23 | monospace: boolean 24 | width: number 25 | height: number 26 | fontData: number[] 27 | lookup: string[] 28 | } 29 | 30 | interface ScreenConfig { 31 | multiplex: number 32 | compins: number 33 | coloffset: number 34 | } 35 | 36 | interface SPIConfig { 37 | dcPin: number 38 | ssPin: number 39 | rstPin: number 40 | clkPin: number 41 | mosiPin: number 42 | } 43 | 44 | export = class Oled { 45 | // Configuration 46 | private readonly HEIGHT: number 47 | private readonly WIDTH: number 48 | private readonly ADDRESS: number 49 | private readonly PROTOCOL: Protocol 50 | private readonly MICROVIEW: boolean 51 | private readonly SECONDARYPIN: number 52 | private readonly RESETPIN: number 53 | private readonly DATA: number 54 | private readonly COMMAND: number 55 | 56 | private readonly board: Board 57 | private readonly five: any 58 | 59 | private readonly screenConfig: ScreenConfig 60 | private readonly SPIconfig: SPIConfig 61 | 62 | private dcPin: Pin 63 | private ssPin: Pin 64 | private clkPin: Pin 65 | private mosiPin: Pin 66 | private rstPin: Pin 67 | 68 | // Commands 69 | private static readonly DISPLAY_OFF: number = 0xAE 70 | private static readonly DISPLAY_ON: number = 0xAF 71 | private static readonly SET_DISPLAY_CLOCK_DIV: number = 0xD5 72 | private static readonly SET_MULTIPLEX: number = 0xA8 73 | private static readonly SET_DISPLAY_OFFSET: number = 0xD3 74 | private static readonly SET_START_LINE: number = 0x00 75 | private static readonly CHARGE_PUMP: number = 0x8D 76 | private static readonly EXTERNAL_VCC: boolean = false 77 | private static readonly MEMORY_MODE: number = 0x20 78 | private static readonly SEG_REMAP: number = 0xA1 // using 0xA0 will flip screen 79 | private static readonly COM_SCAN_DEC: number = 0xC8 80 | private static readonly COM_SCAN_INC: number = 0xC0 81 | private static readonly SET_COM_PINS: number = 0xDA 82 | private static readonly SET_CONTRAST: number = 0x81 83 | private static readonly SET_PRECHARGE: number = 0xd9 84 | private static readonly SET_VCOM_DETECT: number = 0xDB 85 | private static readonly DISPLAY_ALL_ON_RESUME: number = 0xA4 86 | private static readonly NORMAL_DISPLAY: number = 0xA6 87 | private static readonly COLUMN_ADDR: number = 0x21 88 | private static readonly PAGE_ADDR: number = 0x22 89 | private static readonly INVERT_DISPLAY: number = 0xA7 90 | private static readonly ACTIVATE_SCROLL: number = 0x2F 91 | private static readonly DEACTIVATE_SCROLL: number = 0x2E 92 | private static readonly SET_VERTICAL_SCROLL_AREA: number = 0xA3 93 | private static readonly RIGHT_HORIZONTAL_SCROLL: number = 0x26 94 | private static readonly LEFT_HORIZONTAL_SCROLL: number = 0x27 95 | private static readonly VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL: number = 0x29 96 | private static readonly VERTICAL_AND_LEFT_HORIZONTAL_SCROLL: number = 0x2A 97 | 98 | // State 99 | private buffer: Buffer 100 | private cursor_x: number 101 | private cursor_y: number 102 | private dirtyBytes: number[] 103 | 104 | public constructor (board: Board, five: any, opts: OledOptions) { 105 | this.HEIGHT = opts.height || 32 106 | this.WIDTH = opts.width || 128 107 | this.ADDRESS = opts.address || 0x3C 108 | this.PROTOCOL = (opts.address) ? Protocol.I2C : Protocol.SPI 109 | this.MICROVIEW = opts.microview || false 110 | this.SECONDARYPIN = opts.secondaryPin || 12 111 | this.RESETPIN = opts.resetPin || 4 112 | this.DATA = opts.data || 0x40 113 | this.COMMAND = opts.command || 0x00 114 | 115 | this.cursor_x = 0 116 | this.cursor_y = 0 117 | 118 | // new blank buffer 119 | this.buffer = Buffer.alloc((this.WIDTH * this.HEIGHT) / 8) 120 | this.buffer.fill(0x00) 121 | 122 | this.dirtyBytes = [] 123 | 124 | // this is necessary as we're not natively sitting within johnny-five lib 125 | this.board = board 126 | this.five = five 127 | 128 | const config: { [screenSize: string]: ScreenConfig; } = { 129 | '128x32': { 130 | 'multiplex': 0x1F, 131 | 'compins': 0x02, 132 | 'coloffset': 0 133 | }, 134 | '128x64': { 135 | 'multiplex': 0x3F, 136 | 'compins': 0x12, 137 | 'coloffset': 0 138 | }, 139 | '96x16': { 140 | 'multiplex': 0x0F, 141 | 'compins': 0x2, 142 | 'coloffset': 0 143 | }, 144 | // this is blended microview / normal 64 x 48, currently wip 145 | '64x48': { 146 | 'multiplex': 0x2F, 147 | 'compins': 0x12, 148 | 'coloffset': (this.MICROVIEW) ? 32 : 0 149 | } 150 | } 151 | 152 | // microview is wip 153 | if (this.MICROVIEW) { 154 | // microview spi pins 155 | this.SPIconfig = { 156 | 'dcPin': 8, 157 | 'ssPin': 10, 158 | 'rstPin': 7, 159 | 'clkPin': 13, 160 | 'mosiPin': 11 161 | } 162 | } else if (this.PROTOCOL === Protocol.SPI) { 163 | // generic spi pins 164 | this.SPIconfig = { 165 | 'dcPin': 11, 166 | 'ssPin': this.SECONDARYPIN, 167 | 'rstPin': 13, 168 | 'clkPin': 10, 169 | 'mosiPin': 9 170 | } 171 | } 172 | 173 | const screenSize = `${this.WIDTH}x${this.HEIGHT}` 174 | this.screenConfig = config[screenSize] 175 | 176 | if (this.PROTOCOL === Protocol.I2C) { 177 | this._setUpI2C(opts) 178 | } else { 179 | this._setUpSPI() 180 | } 181 | 182 | this._initialise() 183 | } 184 | 185 | private _initialise (): void { 186 | // sequence of bytes to initialise with 187 | const initSeq = [ 188 | Oled.DISPLAY_OFF, 189 | Oled.SET_DISPLAY_CLOCK_DIV, 0x80, 190 | Oled.SET_MULTIPLEX, this.screenConfig.multiplex, // set the last value dynamically based on screen size requirement 191 | Oled.SET_DISPLAY_OFFSET, 0x00, // sets offset pro to 0 192 | Oled.SET_START_LINE, 193 | Oled.CHARGE_PUMP, 0x14, // charge pump val 194 | Oled.MEMORY_MODE, 0x00, // 0x0 act like ks0108 195 | Oled.SEG_REMAP, // screen orientation 196 | Oled.COM_SCAN_DEC, // screen orientation change to INC to flip 197 | Oled.SET_COM_PINS, this.screenConfig.compins, // com pins val sets dynamically to match each screen size requirement 198 | Oled.SET_CONTRAST, 0x8F, // contrast val 199 | Oled.SET_PRECHARGE, 0xF1, // precharge val 200 | Oled.SET_VCOM_DETECT, 0x40, // vcom detect 201 | Oled.DISPLAY_ALL_ON_RESUME, 202 | Oled.NORMAL_DISPLAY, 203 | Oled.DISPLAY_ON 204 | ] 205 | 206 | // write init seq commands 207 | for (let i = 0; i < initSeq.length; i++) { 208 | this._transfer(TransferType.Command, initSeq[i]) 209 | } 210 | } 211 | 212 | private _setUpSPI (): void { 213 | // set up spi pins 214 | this.dcPin = new this.five.Pin(this.SPIconfig.dcPin) 215 | this.ssPin = new this.five.Pin(this.SPIconfig.ssPin) 216 | this.clkPin = new this.five.Pin(this.SPIconfig.clkPin) 217 | this.mosiPin = new this.five.Pin(this.SPIconfig.mosiPin) 218 | // reset won't be used as it causes a bunch of default initialisations 219 | this.rstPin = new this.five.Pin(this.SPIconfig.rstPin) 220 | 221 | // get the screen out of default mode 222 | this.rstPin.low() 223 | this.rstPin.high() 224 | // Set SS to high so a connected chip will be "deselected" by default 225 | this.ssPin.high() 226 | } 227 | 228 | private _setUpI2C (opts: OledOptions): void { 229 | // enable i2C in firmata 230 | this.board.io.i2cConfig(opts) 231 | // set up reset pin and hold high 232 | this.rstPin = new this.five.Pin(this.RESETPIN) 233 | this.rstPin.low() 234 | this.rstPin.high() 235 | } 236 | 237 | // writes both commands and data buffers to this device 238 | private _transfer (type: TransferType, val: number): void { 239 | let control: number 240 | 241 | if (type === TransferType.Data) { 242 | control = this.DATA 243 | } else if (type === TransferType.Command) { 244 | control = this.COMMAND 245 | } else { 246 | return 247 | } 248 | 249 | if (this.PROTOCOL === Protocol.I2C) { 250 | // send control and actual val 251 | this.board.io.i2cWrite(this.ADDRESS, [control, val]) 252 | } else { 253 | // send val via SPI, no control byte 254 | this._writeSPI(val, type) 255 | } 256 | } 257 | 258 | private _writeSPI (byte: number, mode: TransferType): void { 259 | // set dc to low if command byte, high if data byte 260 | if (mode === TransferType.Command) { 261 | this.dcPin.low() 262 | } else { 263 | this.dcPin.high() 264 | } 265 | 266 | // select the device as secondary 267 | this.ssPin.low() 268 | 269 | for (let bit = 7; bit >= 0; bit--) { 270 | // pull clock low 271 | this.clkPin.low() 272 | 273 | // shift out a bit for mosi 274 | if (byte & (1 << bit)) { 275 | this.mosiPin.high() 276 | } else { 277 | this.mosiPin.low() 278 | } 279 | 280 | // pull clock high to collect bit 281 | this.clkPin.high() 282 | } 283 | 284 | // turn off ss so other devices can use SPI 285 | // don't be an SPI hogging jerk basically 286 | this.ssPin.high() 287 | } 288 | 289 | // read a byte from the oled 290 | private _readI2C (fn: (data: number) => void): void { 291 | this.board.io.i2cReadOnce(this.ADDRESS, 1, (data: number) => { 292 | fn(data) 293 | }) 294 | } 295 | 296 | // sometimes the oled gets a bit busy with lots of bytes. 297 | // Read the response byte to see if this is the case 298 | private _waitUntilReady (callback: () => void): void { 299 | const oled = this 300 | 301 | const tick = (callback: () => void) => { 302 | oled._readI2C((byte: number) => { 303 | // read the busy byte in the response 304 | const busy = byte >> 7 & 1 305 | if (!busy) { 306 | // if not busy, it's ready for callback 307 | callback() 308 | } else { 309 | console.log('I\'m busy!') 310 | setTimeout(tick, 0) 311 | } 312 | }) 313 | } 314 | 315 | if (this.PROTOCOL === Protocol.I2C) { 316 | setTimeout(() => { tick(callback) }, 0) 317 | } else { 318 | callback() 319 | } 320 | } 321 | 322 | // set starting position of a text string on the oled 323 | public setCursor (x: number, y: number): void { 324 | this.cursor_x = x 325 | this.cursor_y = y 326 | } 327 | 328 | private _invertColor(color: Color): Color { 329 | return (color === 0) ? 1 : 0 330 | } 331 | 332 | // write text to the oled 333 | public writeString (font: Font, size: number, string: string, color: Color, wrap: boolean, linespacing: number | null, sync?: boolean): void { 334 | const immed = (typeof sync === 'undefined') ? true : sync 335 | const wordArr = string.split(' ') 336 | 337 | const len = wordArr.length 338 | 339 | // start x offset at cursor pos 340 | let offset = this.cursor_x 341 | let padding = 0 342 | 343 | const letspace = 1 344 | const leading = linespacing || 2 345 | 346 | // loop through words 347 | for (let i = 0; i < len; i += 1) { 348 | // put the word space back in 349 | if (i < len -1 ) wordArr[i] += ' '; 350 | 351 | const stringArr = wordArr[i].split('') 352 | const slen = stringArr.length 353 | const compare = (font.width * size * slen) + (size * (len - 1)) 354 | 355 | // wrap words if necessary 356 | if (wrap && len > 1 && (offset >= (this.WIDTH - compare))) { 357 | offset = 1 358 | this.cursor_y += (font.height * size) + size + leading 359 | this.setCursor(offset, this.cursor_y) 360 | } 361 | 362 | // loop through the array of each char to draw 363 | for (let i = 0; i < slen; i += 1) { 364 | // look up the position of the char, pull out the buffer slice 365 | const charBuf = this._findCharBuf(font, stringArr[i]) 366 | // read the bits in the bytes that make up the char 367 | const charBytes = this._readCharBytes(charBuf) 368 | // draw the entire charactei 369 | this._drawChar(font, charBytes, size, color, false) 370 | 371 | // fills in background behind the text pixels so that it's easier to read the text 372 | this.fillRect(offset - padding, this.cursor_y, padding, (font.height * size), this._invertColor(color), false) 373 | 374 | // calc new x position for the next char, add a touch of padding too if it's a non space char 375 | padding = (stringArr[i] === ' ') ? 0 : size + letspace 376 | offset += (font.width * size) + padding 377 | 378 | 379 | // wrap letters if necessary 380 | if (wrap && (offset >= (this.WIDTH - font.width - letspace))) { 381 | offset = 1 382 | this.cursor_y += (font.height * size) + size + leading 383 | } 384 | // set the 'cursor' for the next char to be drawn, then loop again for next char 385 | this.setCursor(offset, this.cursor_y) 386 | } 387 | } 388 | if (immed) { 389 | this._updateDirtyBytes(this.dirtyBytes) 390 | } 391 | } 392 | 393 | // draw an individual character to the screen 394 | private _drawChar (font: Font, byteArray: number[][], size: number, color: Color, sync?: boolean): void { 395 | // take your positions... 396 | const x = this.cursor_x 397 | const y = this.cursor_y 398 | 399 | let c = 0 400 | let pagePos = 0 401 | // loop through the byte array containing the hexes for the char 402 | for (let i = 0; i < byteArray.length; i += 1) { 403 | pagePos = Math.floor(i / font.width) * 8 404 | for (let j = 0; j < 8; j += 1) { 405 | // pull color out (invert the color if user chose black) 406 | const pixelState = (byteArray[i][j] === 1) ? color : this._invertColor(color); 407 | let xpos 408 | let ypos 409 | // standard font size 410 | if (size === 1) { 411 | xpos = x + c 412 | ypos = y + j + pagePos 413 | this.drawPixel([xpos, ypos, pixelState], false) 414 | } else { 415 | // MATH! Calculating pixel size multiplier to primitively scale the font 416 | xpos = x + (i * size) 417 | ypos = y + (j * size) 418 | this.fillRect(xpos, ypos, size, size, pixelState, false) 419 | } 420 | } 421 | c = (c < font.width - 1) ? c += 1 : 0 422 | } 423 | } 424 | 425 | // get character bytes from the supplied font object in order to send to framebuffer 426 | private _readCharBytes (byteArray: number[]): number[][] { 427 | let bitArr = [] 428 | const bitCharArr = [] 429 | // loop through each byte supplied for a char 430 | for (let i = 0; i < byteArray.length; i += 1) { 431 | // set current byte 432 | const byte = byteArray[i] 433 | // read each byte 434 | for (let j = 0; j < 8; j += 1) { 435 | // shift bits right until all are read 436 | const bit = byte >> j & 1 437 | bitArr.push(bit) 438 | } 439 | // push to array containing flattened bit sequence 440 | bitCharArr.push(bitArr) 441 | // clear bits for next byte 442 | bitArr = [] 443 | } 444 | 445 | return bitCharArr 446 | } 447 | 448 | // find where the character exists within the font object 449 | private _findCharBuf (font: Font, c: string): number[] { 450 | const charLength = Math.ceil((font.width * font.height) / 8) 451 | // use the lookup array as a ref to find where the current char bytes start 452 | const cBufPos = font.lookup.indexOf(c) * charLength 453 | // slice just the current char's bytes out of the fontData array and return 454 | return font.fontData.slice(cBufPos, cBufPos + charLength) 455 | } 456 | 457 | // send the entire framebuffer to the oled 458 | public update (): void { 459 | // wait for oled to be ready 460 | this._waitUntilReady(() => { 461 | // set the start and endbyte locations for oled display update 462 | const displaySeq = [ 463 | Oled.COLUMN_ADDR, 464 | this.screenConfig.coloffset, 465 | this.screenConfig.coloffset + this.WIDTH - 1, // column start and end address 466 | Oled.PAGE_ADDR, 0, (this.HEIGHT / 8) - 1 // page start and end address 467 | ] 468 | 469 | const displaySeqLen = displaySeq.length 470 | const bufferLen = this.buffer.length 471 | 472 | // send intro seq 473 | for (let i = 0; i < displaySeqLen; i += 1) { 474 | this._transfer(TransferType.Command, displaySeq[i]) 475 | } 476 | 477 | // write buffer data 478 | for (let i = 0; i < bufferLen; i += 1) { 479 | this._transfer(TransferType.Data, this.buffer[i]) 480 | } 481 | }) 482 | 483 | // now that all bytes are synced, reset dirty state 484 | this.dirtyBytes = [] 485 | } 486 | 487 | // send dim display command to oled 488 | public dimDisplay (bool: boolean): void { 489 | let contrast: number 490 | 491 | if (bool) { 492 | contrast = 0 // Dimmed display 493 | } else { 494 | contrast = 0xCF // Bright display 495 | } 496 | 497 | this._transfer(TransferType.Command, Oled.SET_CONTRAST) 498 | this._transfer(TransferType.Command, contrast) 499 | } 500 | 501 | // turn oled off 502 | public turnOffDisplay (): void { 503 | this._transfer(TransferType.Command, Oled.DISPLAY_OFF) 504 | } 505 | 506 | // turn oled on 507 | public turnOnDisplay (): void { 508 | this._transfer(TransferType.Command, Oled.DISPLAY_ON) 509 | } 510 | 511 | // clear all pixels currently on the display 512 | public clearDisplay (sync?: boolean): void { 513 | const immed = (typeof sync === 'undefined') ? true : sync 514 | // write off pixels 515 | for (let i = 0; i < this.buffer.length; i += 1) { 516 | if (this.buffer[i] !== 0x00) { 517 | this.buffer[i] = 0x00 518 | if (this.dirtyBytes.indexOf(i) === -1) { 519 | this.dirtyBytes.push(i) 520 | } 521 | } 522 | } 523 | 524 | if (immed) { 525 | this._updateDirtyBytes(this.dirtyBytes) 526 | } 527 | } 528 | 529 | // invert pixels on oled 530 | public invertDisplay (bool: boolean): void { 531 | if (bool) { 532 | this._transfer(TransferType.Command, Oled.INVERT_DISPLAY) // inverted 533 | } else { 534 | this._transfer(TransferType.Command, Oled.NORMAL_DISPLAY) // non inverted 535 | } 536 | } 537 | 538 | // draw an image pixel array on the screen 539 | public drawBitmap (pixels: Color[], sync?: boolean): void { 540 | const immed = (typeof sync === 'undefined') ? true : sync 541 | 542 | for (let i = 0; i < pixels.length; i++) { 543 | const x = Math.floor(i % this.WIDTH) 544 | const y = Math.floor(i / this.WIDTH) 545 | 546 | this.drawPixel([x, y, pixels[i]], false) 547 | } 548 | 549 | if (immed) { 550 | this._updateDirtyBytes(this.dirtyBytes) 551 | } 552 | } 553 | 554 | private _isSinglePixel(pixels: Pixel | Pixel[]): pixels is Pixel { 555 | return typeof pixels[0] !== 'object' 556 | } 557 | 558 | // draw one or many pixels on oled 559 | public drawPixel (pixels: Pixel | Pixel[], sync?: boolean): void { 560 | const immed = (typeof sync === 'undefined') ? true : sync 561 | 562 | // handle lazy single pixel case 563 | if (this._isSinglePixel(pixels)) pixels = [pixels] 564 | 565 | pixels.forEach((el: Pixel) => { 566 | // return if the pixel is out of range 567 | const [ x, y, color ] = el 568 | 569 | if (x > this.WIDTH || y > this.HEIGHT) return 570 | 571 | // thanks, Martin Richards. 572 | // I wanna can this, this tool is for devs who get 0 indexes 573 | // x -= 1; y -=1; 574 | let byte = 0 575 | 576 | const page = Math.floor(y / 8) 577 | const pageShift = 0x01 << (y - 8 * page); 578 | 579 | // is the pixel on the first row of the page? 580 | (page === 0) ? byte = x : byte = x + (this.WIDTH * page) 581 | 582 | // colors! Well, monochrome. 583 | if (color === 0) { 584 | // BLACK pixel 585 | this.buffer[byte] &= ~pageShift 586 | } else { 587 | // WHITE pixel 588 | this.buffer[byte] |= pageShift 589 | } 590 | 591 | // push byte to dirty if not already there 592 | if (this.dirtyBytes.indexOf(byte) === -1) { 593 | this.dirtyBytes.push(byte) 594 | } 595 | }, this) 596 | 597 | if (immed) { 598 | this._updateDirtyBytes(this.dirtyBytes) 599 | } 600 | } 601 | 602 | // looks at dirty bytes, and sends the updated bytes to the display 603 | private _updateDirtyBytes (byteArray: number[]): void { 604 | const blen = byteArray.length 605 | 606 | this._waitUntilReady(() => { 607 | let pageStart = Infinity 608 | let pageEnd = 0 609 | let colStart = Infinity 610 | let colEnd = 0 611 | let any = false 612 | 613 | // iterate through dirty bytes 614 | for (let i = 0; i < blen; i += 1) { 615 | const b = byteArray[i] 616 | if ((b >= 0) && (b < this.buffer.length)) { 617 | const page = b / this.WIDTH | 0 618 | if (page < pageStart) pageStart = page 619 | if (page > pageEnd) pageEnd = page 620 | const col = b % this.WIDTH 621 | if (col < colStart) colStart = col 622 | if (col > colEnd) colEnd = col 623 | any = true 624 | } 625 | } 626 | 627 | if (!any) return 628 | 629 | const displaySeq = [ 630 | Oled.COLUMN_ADDR, colStart, colEnd, // column start and end address 631 | Oled.PAGE_ADDR, pageStart, pageEnd // page start and end address 632 | ] 633 | 634 | const displaySeqLen = displaySeq.length 635 | 636 | // send intro seq 637 | for (let i = 0; i < displaySeqLen; i += 1) { 638 | this._transfer(TransferType.Command, displaySeq[i]) 639 | } 640 | 641 | // send byte, then move on to next byte 642 | for (let i = pageStart; i <= pageEnd; i += 1) { 643 | for (let j = colStart; j <= colEnd; j += 1) { 644 | this._transfer(TransferType.Data, this.buffer[this.WIDTH * i + j]) 645 | } 646 | } 647 | }) 648 | 649 | // now that all bytes are synced, reset dirty state 650 | this.dirtyBytes = [] 651 | } 652 | 653 | // using Bresenham's line algorithm 654 | public drawLine (x0: number, y0: number, x1: number, y1: number, color: Color, sync?: boolean): void { 655 | const immed = (typeof sync === 'undefined') ? true : sync 656 | 657 | const dx = Math.abs(x1 - x0) 658 | const sx = x0 < x1 ? 1 : -1 659 | const dy = Math.abs(y1 - y0) 660 | const sy = y0 < y1 ? 1 : -1 661 | 662 | let err = (dx > dy ? dx : -dy) / 2 663 | 664 | while (true) { 665 | this.drawPixel([x0, y0, color], false) 666 | 667 | if (x0 === x1 && y0 === y1) break 668 | 669 | const e2 = err 670 | 671 | if (e2 > -dx) { err -= dy; x0 += sx } 672 | if (e2 < dy) { err += dx; y0 += sy } 673 | } 674 | 675 | if (immed) { 676 | this._updateDirtyBytes(this.dirtyBytes) 677 | } 678 | } 679 | 680 | // Draw an outlined rectangle 681 | public drawRect (x: number, y: number, w: number, h: number, color: Color, sync?: boolean): void { 682 | const immed = (typeof sync === 'undefined') ? true : sync 683 | // top 684 | this.drawLine(x, y, x + w, y, color, false) 685 | 686 | // left 687 | this.drawLine(x, y + 1, x, y + h - 1, color, false) 688 | 689 | // right 690 | this.drawLine(x + w, y + 1, x + w, y + h - 1, color, false) 691 | 692 | // bottom 693 | this.drawLine(x, y + h - 1, x + w, y + h - 1, color, false) 694 | 695 | if (immed) { 696 | this._updateDirtyBytes(this.dirtyBytes) 697 | } 698 | }; 699 | 700 | // draw a filled rectangle on the oled 701 | public fillRect (x: number, y: number, w: number, h: number, color: Color, sync?: boolean): void { 702 | const immed = (typeof sync === 'undefined') ? true : sync 703 | // one iteration for each column of the rectangle 704 | for (let i = x; i < x + w; i += 1) { 705 | // draws a vert line 706 | this.drawLine(i, y, i, y + h - 1, color, false) 707 | } 708 | if (immed) { 709 | this._updateDirtyBytes(this.dirtyBytes) 710 | } 711 | } 712 | 713 | /** 714 | * Draw a circle outline 715 | * 716 | * This method is ad verbatim translation from the corresponding 717 | * method on the Adafruit GFX library 718 | * https://github.com/adafruit/Adafruit-GFX-Library 719 | */ 720 | public drawCircle (x0: number, y0: number, r: number, color: Color, sync?: boolean): void { 721 | const immed = (typeof sync === 'undefined') ? true : sync 722 | 723 | let f = 1 - r 724 | let ddF_x = 1 725 | let ddF_y = -2 * r 726 | let x = 0 727 | let y = r 728 | 729 | this.drawPixel( 730 | [[x0, y0 + r, color], 731 | [x0, y0 - r, color], 732 | [x0 + r, y0, color], 733 | [x0 - r, y0, color]], 734 | false 735 | ) 736 | 737 | while (x < y) { 738 | if (f >= 0) { 739 | y-- 740 | ddF_y += 2 741 | f += ddF_y 742 | } 743 | x++ 744 | ddF_x += 2 745 | f += ddF_x 746 | 747 | this.drawPixel( 748 | [[x0 + x, y0 + y, color], 749 | [x0 - x, y0 + y, color], 750 | [x0 + x, y0 - y, color], 751 | [x0 - x, y0 - y, color], 752 | [x0 + y, y0 + x, color], 753 | [x0 - y, y0 + x, color], 754 | [x0 + y, y0 - x, color], 755 | [x0 - y, y0 - x, color]], 756 | false 757 | ) 758 | } 759 | 760 | if (immed) { 761 | this._updateDirtyBytes(this.dirtyBytes) 762 | } 763 | }; 764 | 765 | // activate scrolling for rows start through stop 766 | public startScroll (dir: Direction, start: number, stop: number): void { 767 | const cmdSeq: number[] = [] 768 | 769 | switch (dir) { 770 | case 'right': 771 | cmdSeq.push(Oled.RIGHT_HORIZONTAL_SCROLL); break 772 | case 'left': 773 | cmdSeq.push(Oled.LEFT_HORIZONTAL_SCROLL); break 774 | case 'left diagonal': 775 | cmdSeq.push( 776 | Oled.SET_VERTICAL_SCROLL_AREA, 777 | 0x00, 778 | this.HEIGHT, 779 | Oled.VERTICAL_AND_LEFT_HORIZONTAL_SCROLL, 780 | 0x00, 781 | start, 782 | 0x00, 783 | stop, 784 | 0x01, 785 | Oled.ACTIVATE_SCROLL 786 | ) 787 | break 788 | case 'right diagonal': 789 | cmdSeq.push( 790 | Oled.SET_VERTICAL_SCROLL_AREA, 791 | 0x00, 792 | this.HEIGHT, 793 | Oled.VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL, 794 | 0x00, 795 | start, 796 | 0x00, 797 | stop, 798 | 0x01, 799 | Oled.ACTIVATE_SCROLL 800 | ) 801 | break 802 | } 803 | 804 | this._waitUntilReady(() => { 805 | if (dir === 'right' || dir === 'left') { 806 | cmdSeq.push( 807 | 0x00, start, 808 | 0x00, stop, 809 | 0x00, 0xFF, 810 | Oled.ACTIVATE_SCROLL 811 | ) 812 | } 813 | 814 | for (let i = 0; i < cmdSeq.length; i += 1) { 815 | this._transfer(TransferType.Command, cmdSeq[i]) 816 | } 817 | }) 818 | } 819 | 820 | // stop scrolling display contents 821 | public stopScroll () { 822 | this._transfer(TransferType.Command, Oled.DEACTIVATE_SCROLL) // stahp 823 | } 824 | } 825 | 826 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "oled-js", 3 | "version": "5.1.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@serialport/binding-abstract": { 8 | "version": "8.0.6", 9 | "resolved": "https://registry.npmjs.org/@serialport/binding-abstract/-/binding-abstract-8.0.6.tgz", 10 | "integrity": "sha512-1swwUVoRyQ9ubxrkJ8JPppykohUpTAP4jkGr36e9NjbVocSPfqeX6tFZFwl/IdUlwJwxGdbKDqq7FvXniCQUMw==", 11 | "requires": { 12 | "debug": "^4.1.1" 13 | } 14 | }, 15 | "@serialport/binding-mock": { 16 | "version": "8.0.6", 17 | "resolved": "https://registry.npmjs.org/@serialport/binding-mock/-/binding-mock-8.0.6.tgz", 18 | "integrity": "sha512-BIbY5/PsDDo0QWDNCCxDgpowAdks+aZR8BOsEtK2GoASTTcJCy1fBwPIfH870o7rnbH901wY3C+yuTfdOvSO9A==", 19 | "requires": { 20 | "@serialport/binding-abstract": "^8.0.6", 21 | "debug": "^4.1.1" 22 | } 23 | }, 24 | "@serialport/bindings": { 25 | "version": "8.0.7", 26 | "resolved": "https://registry.npmjs.org/@serialport/bindings/-/bindings-8.0.7.tgz", 27 | "integrity": "sha512-IqudDL8ne2Y2S0W5fKA6wdgHCIA2e2OIaPVYhGy6duE6legNHFY+05CLicHAyAeTocXmHU7rVNxzVQrOG5tM4g==", 28 | "requires": { 29 | "@serialport/binding-abstract": "^8.0.6", 30 | "@serialport/parser-readline": "^8.0.6", 31 | "bindings": "^1.5.0", 32 | "debug": "^4.1.1", 33 | "nan": "^2.14.0", 34 | "prebuild-install": "^5.3.0" 35 | } 36 | }, 37 | "@serialport/parser-byte-length": { 38 | "version": "8.0.6", 39 | "resolved": "https://registry.npmjs.org/@serialport/parser-byte-length/-/parser-byte-length-8.0.6.tgz", 40 | "integrity": "sha512-92mrFxFEvq3gRvSM7ANK/jfbmHslz91a5oYJy/nbSn4H/MCRXjxR2YOkQgVXuN+zLt+iyDoW3pcOP4Sc1nWdqQ==" 41 | }, 42 | "@serialport/parser-cctalk": { 43 | "version": "8.0.6", 44 | "resolved": "https://registry.npmjs.org/@serialport/parser-cctalk/-/parser-cctalk-8.0.6.tgz", 45 | "integrity": "sha512-pqtCYQPgxnxHygiXUPCfgX7sEx+fdR/ObjpscidynEULUq2fFrC5kBkrxRbTfHRtTaU2ii9DyjFq0JVRCbhI0Q==" 46 | }, 47 | "@serialport/parser-delimiter": { 48 | "version": "8.0.6", 49 | "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-8.0.6.tgz", 50 | "integrity": "sha512-ogKOcPisPMlVtirkuDu3SFTF0+xT0ijxoH7XjpZiYL41EVi367MwuCnEmXG+dEKKnF0j9EPqOyD2LGSJxaFmhQ==" 51 | }, 52 | "@serialport/parser-readline": { 53 | "version": "8.0.6", 54 | "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-8.0.6.tgz", 55 | "integrity": "sha512-OYBT2mpczh9QUI3MTw8j0A0tIlPVjpVipvuVnjRkYwxrxPeq04RaLFhaDpuRzua5rTKMt89c1y3btYeoDXMjAA==", 56 | "requires": { 57 | "@serialport/parser-delimiter": "^8.0.6" 58 | } 59 | }, 60 | "@serialport/parser-ready": { 61 | "version": "8.0.6", 62 | "resolved": "https://registry.npmjs.org/@serialport/parser-ready/-/parser-ready-8.0.6.tgz", 63 | "integrity": "sha512-xcEqv4rc119WR5JzAuu8UeJOlAwET2PTdNb6aIrrLlmTxhvuBbuRFcsnF3BpH9jUL30Kh7a6QiNXIwVG+WR/1Q==" 64 | }, 65 | "@serialport/parser-regex": { 66 | "version": "8.0.6", 67 | "resolved": "https://registry.npmjs.org/@serialport/parser-regex/-/parser-regex-8.0.6.tgz", 68 | "integrity": "sha512-J8KY75Azz5ZyExmyM5YfUxbXOWBkZCytKgCCmZ966ttwZS0bUZOuoCaZj2Zp4VILJAiLuxHoqc0foi67Fri5+g==" 69 | }, 70 | "@serialport/stream": { 71 | "version": "8.0.6", 72 | "resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-8.0.6.tgz", 73 | "integrity": "sha512-ym1PwM0rwLrj90vRBB66I1hwMXbuMw9wGTxqns75U3N/tuNFOH85mxXaYVF2TpI66aM849NoI1jMm50fl9equg==", 74 | "requires": { 75 | "debug": "^4.1.1" 76 | } 77 | }, 78 | "@types/johnny-five": { 79 | "version": "1.3.0", 80 | "resolved": "https://registry.npmjs.org/@types/johnny-five/-/johnny-five-1.3.0.tgz", 81 | "integrity": "sha512-V2GNfEJDXBjM3bUmUx8295wBgu+2OrnCw2t9W0giwKg6roZpwfVMHSuiUR/1fITEoSwbnzZByWvonIjSHeMUng==", 82 | "requires": { 83 | "@types/node": "*" 84 | } 85 | }, 86 | "@types/node": { 87 | "version": "13.7.4", 88 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.4.tgz", 89 | "integrity": "sha512-oVeL12C6gQS/GAExndigSaLxTrKpQPxewx9bOcwfvJiJge4rr7wNaph4J+ns5hrmIV2as5qxqN8YKthn9qh0jw==" 90 | }, 91 | "acorn": { 92 | "version": "6.4.0", 93 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", 94 | "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", 95 | "dev": true 96 | }, 97 | "acorn-jsx": { 98 | "version": "5.1.0", 99 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", 100 | "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", 101 | "dev": true 102 | }, 103 | "ajv": { 104 | "version": "6.12.0", 105 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", 106 | "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", 107 | "dev": true, 108 | "requires": { 109 | "fast-deep-equal": "^3.1.1", 110 | "fast-json-stable-stringify": "^2.0.0", 111 | "json-schema-traverse": "^0.4.1", 112 | "uri-js": "^4.2.2" 113 | } 114 | }, 115 | "ajv-keywords": { 116 | "version": "3.4.1", 117 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", 118 | "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", 119 | "dev": true 120 | }, 121 | "ansi-escapes": { 122 | "version": "3.2.0", 123 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 124 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", 125 | "dev": true 126 | }, 127 | "ansi-regex": { 128 | "version": "2.1.1", 129 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 130 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 131 | }, 132 | "ansi-styles": { 133 | "version": "3.2.1", 134 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 135 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 136 | "dev": true, 137 | "requires": { 138 | "color-convert": "^1.9.0" 139 | }, 140 | "dependencies": { 141 | "color-convert": { 142 | "version": "1.9.3", 143 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 144 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 145 | "dev": true, 146 | "requires": { 147 | "color-name": "1.1.3" 148 | } 149 | } 150 | } 151 | }, 152 | "aproba": { 153 | "version": "1.2.0", 154 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 155 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" 156 | }, 157 | "are-we-there-yet": { 158 | "version": "1.1.5", 159 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", 160 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", 161 | "requires": { 162 | "delegates": "^1.0.0", 163 | "readable-stream": "^2.0.6" 164 | } 165 | }, 166 | "argparse": { 167 | "version": "1.0.10", 168 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 169 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 170 | "dev": true, 171 | "requires": { 172 | "sprintf-js": "~1.0.2" 173 | } 174 | }, 175 | "array-includes": { 176 | "version": "3.1.1", 177 | "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", 178 | "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", 179 | "dev": true, 180 | "requires": { 181 | "define-properties": "^1.1.3", 182 | "es-abstract": "^1.17.0", 183 | "is-string": "^1.0.5" 184 | } 185 | }, 186 | "babel-code-frame": { 187 | "version": "6.26.0", 188 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 189 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 190 | "dev": true, 191 | "requires": { 192 | "chalk": "^1.1.3", 193 | "esutils": "^2.0.2", 194 | "js-tokens": "^3.0.2" 195 | }, 196 | "dependencies": { 197 | "ansi-styles": { 198 | "version": "2.2.1", 199 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 200 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 201 | "dev": true 202 | }, 203 | "chalk": { 204 | "version": "1.1.3", 205 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 206 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 207 | "dev": true, 208 | "requires": { 209 | "ansi-styles": "^2.2.1", 210 | "escape-string-regexp": "^1.0.2", 211 | "has-ansi": "^2.0.0", 212 | "strip-ansi": "^3.0.0", 213 | "supports-color": "^2.0.0" 214 | } 215 | }, 216 | "supports-color": { 217 | "version": "2.0.0", 218 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 219 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 220 | "dev": true 221 | } 222 | } 223 | }, 224 | "balanced-match": { 225 | "version": "1.0.0", 226 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 227 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 228 | "dev": true 229 | }, 230 | "bindings": { 231 | "version": "1.5.0", 232 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 233 | "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 234 | "requires": { 235 | "file-uri-to-path": "1.0.0" 236 | } 237 | }, 238 | "bl": { 239 | "version": "3.0.0", 240 | "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.0.tgz", 241 | "integrity": "sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==", 242 | "requires": { 243 | "readable-stream": "^3.0.1" 244 | }, 245 | "dependencies": { 246 | "readable-stream": { 247 | "version": "3.6.0", 248 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 249 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 250 | "requires": { 251 | "inherits": "^2.0.3", 252 | "string_decoder": "^1.1.1", 253 | "util-deprecate": "^1.0.1" 254 | } 255 | } 256 | } 257 | }, 258 | "brace-expansion": { 259 | "version": "1.1.11", 260 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 261 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 262 | "dev": true, 263 | "requires": { 264 | "balanced-match": "^1.0.0", 265 | "concat-map": "0.0.1" 266 | } 267 | }, 268 | "browser-serialport": { 269 | "version": "2.1.0", 270 | "resolved": "https://registry.npmjs.org/browser-serialport/-/browser-serialport-2.1.0.tgz", 271 | "integrity": "sha1-+4QHfoS5u7uEk1quH8rJzmEF3H8=", 272 | "dev": true, 273 | "optional": true 274 | }, 275 | "caller-path": { 276 | "version": "0.1.0", 277 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", 278 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", 279 | "dev": true, 280 | "requires": { 281 | "callsites": "^0.2.0" 282 | } 283 | }, 284 | "callsites": { 285 | "version": "0.2.0", 286 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", 287 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", 288 | "dev": true 289 | }, 290 | "chalk": { 291 | "version": "2.1.0", 292 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", 293 | "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", 294 | "dev": true, 295 | "requires": { 296 | "ansi-styles": "^3.1.0", 297 | "escape-string-regexp": "^1.0.5", 298 | "supports-color": "^4.0.0" 299 | } 300 | }, 301 | "chardet": { 302 | "version": "0.4.2", 303 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", 304 | "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", 305 | "dev": true 306 | }, 307 | "chownr": { 308 | "version": "1.1.4", 309 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 310 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" 311 | }, 312 | "circular-json": { 313 | "version": "0.3.3", 314 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", 315 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", 316 | "dev": true 317 | }, 318 | "cli-cursor": { 319 | "version": "2.1.0", 320 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 321 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 322 | "dev": true, 323 | "requires": { 324 | "restore-cursor": "^2.0.0" 325 | } 326 | }, 327 | "cli-width": { 328 | "version": "2.2.0", 329 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 330 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 331 | "dev": true 332 | }, 333 | "code-point-at": { 334 | "version": "1.1.0", 335 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 336 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 337 | }, 338 | "color-convert": { 339 | "version": "1.2.2", 340 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.2.2.tgz", 341 | "integrity": "sha1-776VaX3TfX7s+uH9LPvrhMwlBk4=", 342 | "dev": true 343 | }, 344 | "color-name": { 345 | "version": "1.1.3", 346 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 347 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 348 | "dev": true 349 | }, 350 | "concat-map": { 351 | "version": "0.0.1", 352 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 353 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 354 | "dev": true 355 | }, 356 | "console-control-strings": { 357 | "version": "1.1.0", 358 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 359 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" 360 | }, 361 | "contains-path": { 362 | "version": "0.1.0", 363 | "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", 364 | "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", 365 | "dev": true 366 | }, 367 | "core-util-is": { 368 | "version": "1.0.2", 369 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 370 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 371 | }, 372 | "cross-spawn": { 373 | "version": "6.0.5", 374 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 375 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 376 | "dev": true, 377 | "requires": { 378 | "nice-try": "^1.0.4", 379 | "path-key": "^2.0.1", 380 | "semver": "^5.5.0", 381 | "shebang-command": "^1.2.0", 382 | "which": "^1.2.9" 383 | } 384 | }, 385 | "debug": { 386 | "version": "4.1.1", 387 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 388 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 389 | "requires": { 390 | "ms": "^2.1.1" 391 | } 392 | }, 393 | "debug-log": { 394 | "version": "1.0.1", 395 | "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", 396 | "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", 397 | "dev": true 398 | }, 399 | "decompress-response": { 400 | "version": "4.2.1", 401 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", 402 | "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", 403 | "requires": { 404 | "mimic-response": "^2.0.0" 405 | } 406 | }, 407 | "deep-equal": { 408 | "version": "1.1.1", 409 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", 410 | "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", 411 | "dev": true, 412 | "requires": { 413 | "is-arguments": "^1.0.4", 414 | "is-date-object": "^1.0.1", 415 | "is-regex": "^1.0.4", 416 | "object-is": "^1.0.1", 417 | "object-keys": "^1.1.1", 418 | "regexp.prototype.flags": "^1.2.0" 419 | } 420 | }, 421 | "deep-extend": { 422 | "version": "0.6.0", 423 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 424 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 425 | }, 426 | "deep-is": { 427 | "version": "0.1.3", 428 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 429 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 430 | "dev": true 431 | }, 432 | "define-properties": { 433 | "version": "1.1.3", 434 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 435 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 436 | "dev": true, 437 | "requires": { 438 | "object-keys": "^1.0.12" 439 | } 440 | }, 441 | "defined": { 442 | "version": "1.0.0", 443 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 444 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 445 | "dev": true 446 | }, 447 | "deglob": { 448 | "version": "2.1.1", 449 | "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz", 450 | "integrity": "sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==", 451 | "dev": true, 452 | "requires": { 453 | "find-root": "^1.0.0", 454 | "glob": "^7.0.5", 455 | "ignore": "^3.0.9", 456 | "pkg-config": "^1.1.0", 457 | "run-parallel": "^1.1.2", 458 | "uniq": "^1.0.1" 459 | }, 460 | "dependencies": { 461 | "ignore": { 462 | "version": "3.3.10", 463 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", 464 | "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", 465 | "dev": true 466 | } 467 | } 468 | }, 469 | "delegates": { 470 | "version": "1.0.0", 471 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 472 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 473 | }, 474 | "detect-libc": { 475 | "version": "1.0.3", 476 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 477 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" 478 | }, 479 | "doctrine": { 480 | "version": "2.1.0", 481 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 482 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 483 | "dev": true, 484 | "requires": { 485 | "esutils": "^2.0.2" 486 | } 487 | }, 488 | "dotignore": { 489 | "version": "0.1.2", 490 | "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", 491 | "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", 492 | "dev": true, 493 | "requires": { 494 | "minimatch": "^3.0.4" 495 | } 496 | }, 497 | "duplexer": { 498 | "version": "0.1.1", 499 | "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", 500 | "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", 501 | "dev": true 502 | }, 503 | "end-of-stream": { 504 | "version": "1.4.4", 505 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 506 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 507 | "requires": { 508 | "once": "^1.4.0" 509 | } 510 | }, 511 | "error-ex": { 512 | "version": "1.3.2", 513 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 514 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 515 | "dev": true, 516 | "requires": { 517 | "is-arrayish": "^0.2.1" 518 | } 519 | }, 520 | "es-abstract": { 521 | "version": "1.17.4", 522 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", 523 | "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", 524 | "dev": true, 525 | "requires": { 526 | "es-to-primitive": "^1.2.1", 527 | "function-bind": "^1.1.1", 528 | "has": "^1.0.3", 529 | "has-symbols": "^1.0.1", 530 | "is-callable": "^1.1.5", 531 | "is-regex": "^1.0.5", 532 | "object-inspect": "^1.7.0", 533 | "object-keys": "^1.1.1", 534 | "object.assign": "^4.1.0", 535 | "string.prototype.trimleft": "^2.1.1", 536 | "string.prototype.trimright": "^2.1.1" 537 | } 538 | }, 539 | "es-to-primitive": { 540 | "version": "1.2.1", 541 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 542 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 543 | "dev": true, 544 | "requires": { 545 | "is-callable": "^1.1.4", 546 | "is-date-object": "^1.0.1", 547 | "is-symbol": "^1.0.2" 548 | } 549 | }, 550 | "es6-shim": { 551 | "version": "0.35.5", 552 | "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.5.tgz", 553 | "integrity": "sha512-E9kK/bjtCQRpN1K28Xh4BlmP8egvZBGJJ+9GtnzOwt7mdqtrjHFuVGr7QJfdjBIKqrlU5duPf3pCBoDrkjVYFg==", 554 | "dev": true 555 | }, 556 | "escape-string-regexp": { 557 | "version": "1.0.5", 558 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 559 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 560 | "dev": true 561 | }, 562 | "eslint": { 563 | "version": "5.4.0", 564 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.4.0.tgz", 565 | "integrity": "sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg==", 566 | "dev": true, 567 | "requires": { 568 | "ajv": "^6.5.0", 569 | "babel-code-frame": "^6.26.0", 570 | "chalk": "^2.1.0", 571 | "cross-spawn": "^6.0.5", 572 | "debug": "^3.1.0", 573 | "doctrine": "^2.1.0", 574 | "eslint-scope": "^4.0.0", 575 | "eslint-utils": "^1.3.1", 576 | "eslint-visitor-keys": "^1.0.0", 577 | "espree": "^4.0.0", 578 | "esquery": "^1.0.1", 579 | "esutils": "^2.0.2", 580 | "file-entry-cache": "^2.0.0", 581 | "functional-red-black-tree": "^1.0.1", 582 | "glob": "^7.1.2", 583 | "globals": "^11.7.0", 584 | "ignore": "^4.0.2", 585 | "imurmurhash": "^0.1.4", 586 | "inquirer": "^5.2.0", 587 | "is-resolvable": "^1.1.0", 588 | "js-yaml": "^3.11.0", 589 | "json-stable-stringify-without-jsonify": "^1.0.1", 590 | "levn": "^0.3.0", 591 | "lodash": "^4.17.5", 592 | "minimatch": "^3.0.4", 593 | "mkdirp": "^0.5.1", 594 | "natural-compare": "^1.4.0", 595 | "optionator": "^0.8.2", 596 | "path-is-inside": "^1.0.2", 597 | "pluralize": "^7.0.0", 598 | "progress": "^2.0.0", 599 | "regexpp": "^2.0.0", 600 | "require-uncached": "^1.0.3", 601 | "semver": "^5.5.0", 602 | "strip-ansi": "^4.0.0", 603 | "strip-json-comments": "^2.0.1", 604 | "table": "^4.0.3", 605 | "text-table": "^0.2.0" 606 | }, 607 | "dependencies": { 608 | "ansi-regex": { 609 | "version": "3.0.0", 610 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 611 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 612 | "dev": true 613 | }, 614 | "debug": { 615 | "version": "3.2.6", 616 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 617 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 618 | "dev": true, 619 | "requires": { 620 | "ms": "^2.1.1" 621 | } 622 | }, 623 | "strip-ansi": { 624 | "version": "4.0.0", 625 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 626 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 627 | "dev": true, 628 | "requires": { 629 | "ansi-regex": "^3.0.0" 630 | } 631 | } 632 | } 633 | }, 634 | "eslint-config-standard": { 635 | "version": "12.0.0", 636 | "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", 637 | "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", 638 | "dev": true 639 | }, 640 | "eslint-config-standard-jsx": { 641 | "version": "6.0.2", 642 | "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-6.0.2.tgz", 643 | "integrity": "sha512-D+YWAoXw+2GIdbMBRAzWwr1ZtvnSf4n4yL0gKGg7ShUOGXkSOLerI17K4F6LdQMJPNMoWYqepzQD/fKY+tXNSg==", 644 | "dev": true 645 | }, 646 | "eslint-import-resolver-node": { 647 | "version": "0.3.3", 648 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", 649 | "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", 650 | "dev": true, 651 | "requires": { 652 | "debug": "^2.6.9", 653 | "resolve": "^1.13.1" 654 | }, 655 | "dependencies": { 656 | "debug": { 657 | "version": "2.6.9", 658 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 659 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 660 | "dev": true, 661 | "requires": { 662 | "ms": "2.0.0" 663 | } 664 | }, 665 | "ms": { 666 | "version": "2.0.0", 667 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 668 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 669 | "dev": true 670 | } 671 | } 672 | }, 673 | "eslint-module-utils": { 674 | "version": "2.5.2", 675 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz", 676 | "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==", 677 | "dev": true, 678 | "requires": { 679 | "debug": "^2.6.9", 680 | "pkg-dir": "^2.0.0" 681 | }, 682 | "dependencies": { 683 | "debug": { 684 | "version": "2.6.9", 685 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 686 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 687 | "dev": true, 688 | "requires": { 689 | "ms": "2.0.0" 690 | } 691 | }, 692 | "ms": { 693 | "version": "2.0.0", 694 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 695 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 696 | "dev": true 697 | } 698 | } 699 | }, 700 | "eslint-plugin-es": { 701 | "version": "1.4.1", 702 | "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz", 703 | "integrity": "sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==", 704 | "dev": true, 705 | "requires": { 706 | "eslint-utils": "^1.4.2", 707 | "regexpp": "^2.0.1" 708 | } 709 | }, 710 | "eslint-plugin-import": { 711 | "version": "2.14.0", 712 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", 713 | "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", 714 | "dev": true, 715 | "requires": { 716 | "contains-path": "^0.1.0", 717 | "debug": "^2.6.8", 718 | "doctrine": "1.5.0", 719 | "eslint-import-resolver-node": "^0.3.1", 720 | "eslint-module-utils": "^2.2.0", 721 | "has": "^1.0.1", 722 | "lodash": "^4.17.4", 723 | "minimatch": "^3.0.3", 724 | "read-pkg-up": "^2.0.0", 725 | "resolve": "^1.6.0" 726 | }, 727 | "dependencies": { 728 | "debug": { 729 | "version": "2.6.9", 730 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 731 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 732 | "dev": true, 733 | "requires": { 734 | "ms": "2.0.0" 735 | } 736 | }, 737 | "doctrine": { 738 | "version": "1.5.0", 739 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", 740 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", 741 | "dev": true, 742 | "requires": { 743 | "esutils": "^2.0.2", 744 | "isarray": "^1.0.0" 745 | } 746 | }, 747 | "ms": { 748 | "version": "2.0.0", 749 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 750 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 751 | "dev": true 752 | } 753 | } 754 | }, 755 | "eslint-plugin-node": { 756 | "version": "7.0.1", 757 | "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz", 758 | "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==", 759 | "dev": true, 760 | "requires": { 761 | "eslint-plugin-es": "^1.3.1", 762 | "eslint-utils": "^1.3.1", 763 | "ignore": "^4.0.2", 764 | "minimatch": "^3.0.4", 765 | "resolve": "^1.8.1", 766 | "semver": "^5.5.0" 767 | } 768 | }, 769 | "eslint-plugin-promise": { 770 | "version": "4.0.1", 771 | "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", 772 | "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", 773 | "dev": true 774 | }, 775 | "eslint-plugin-react": { 776 | "version": "7.11.1", 777 | "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", 778 | "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", 779 | "dev": true, 780 | "requires": { 781 | "array-includes": "^3.0.3", 782 | "doctrine": "^2.1.0", 783 | "has": "^1.0.3", 784 | "jsx-ast-utils": "^2.0.1", 785 | "prop-types": "^15.6.2" 786 | } 787 | }, 788 | "eslint-plugin-standard": { 789 | "version": "4.0.1", 790 | "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz", 791 | "integrity": "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==", 792 | "dev": true 793 | }, 794 | "eslint-scope": { 795 | "version": "4.0.3", 796 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", 797 | "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", 798 | "dev": true, 799 | "requires": { 800 | "esrecurse": "^4.1.0", 801 | "estraverse": "^4.1.1" 802 | } 803 | }, 804 | "eslint-utils": { 805 | "version": "1.4.3", 806 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 807 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 808 | "dev": true, 809 | "requires": { 810 | "eslint-visitor-keys": "^1.1.0" 811 | } 812 | }, 813 | "eslint-visitor-keys": { 814 | "version": "1.1.0", 815 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", 816 | "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", 817 | "dev": true 818 | }, 819 | "espree": { 820 | "version": "4.1.0", 821 | "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", 822 | "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", 823 | "dev": true, 824 | "requires": { 825 | "acorn": "^6.0.2", 826 | "acorn-jsx": "^5.0.0", 827 | "eslint-visitor-keys": "^1.0.0" 828 | } 829 | }, 830 | "esprima": { 831 | "version": "4.0.1", 832 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 833 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 834 | "dev": true 835 | }, 836 | "esquery": { 837 | "version": "1.1.0", 838 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", 839 | "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", 840 | "dev": true, 841 | "requires": { 842 | "estraverse": "^4.0.0" 843 | } 844 | }, 845 | "esrecurse": { 846 | "version": "4.2.1", 847 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 848 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 849 | "dev": true, 850 | "requires": { 851 | "estraverse": "^4.1.0" 852 | } 853 | }, 854 | "estraverse": { 855 | "version": "4.3.0", 856 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 857 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 858 | "dev": true 859 | }, 860 | "esutils": { 861 | "version": "2.0.3", 862 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 863 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 864 | "dev": true 865 | }, 866 | "expand-template": { 867 | "version": "2.0.3", 868 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 869 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" 870 | }, 871 | "external-editor": { 872 | "version": "2.2.0", 873 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", 874 | "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", 875 | "dev": true, 876 | "requires": { 877 | "chardet": "^0.4.0", 878 | "iconv-lite": "^0.4.17", 879 | "tmp": "^0.0.33" 880 | } 881 | }, 882 | "fast-deep-equal": { 883 | "version": "3.1.1", 884 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", 885 | "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", 886 | "dev": true 887 | }, 888 | "fast-json-stable-stringify": { 889 | "version": "2.1.0", 890 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 891 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 892 | "dev": true 893 | }, 894 | "fast-levenshtein": { 895 | "version": "2.0.6", 896 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 897 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 898 | "dev": true 899 | }, 900 | "figures": { 901 | "version": "2.0.0", 902 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 903 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 904 | "dev": true, 905 | "requires": { 906 | "escape-string-regexp": "^1.0.5" 907 | } 908 | }, 909 | "file-entry-cache": { 910 | "version": "2.0.0", 911 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", 912 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 913 | "dev": true, 914 | "requires": { 915 | "flat-cache": "^1.2.1", 916 | "object-assign": "^4.0.1" 917 | } 918 | }, 919 | "file-uri-to-path": { 920 | "version": "1.0.0", 921 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 922 | "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" 923 | }, 924 | "find-root": { 925 | "version": "1.1.0", 926 | "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", 927 | "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", 928 | "dev": true 929 | }, 930 | "find-up": { 931 | "version": "2.1.0", 932 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 933 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 934 | "dev": true, 935 | "requires": { 936 | "locate-path": "^2.0.0" 937 | } 938 | }, 939 | "firmata": { 940 | "version": "2.2.0", 941 | "resolved": "https://registry.npmjs.org/firmata/-/firmata-2.2.0.tgz", 942 | "integrity": "sha512-/Q8oSwAQVPfnAtiJj9VQb5HBDYvonN/a843MQq+7VjS74Pi2KWYTW2XZajUHH3u47lo0kahaycZpgOp4aidqlA==", 943 | "dev": true, 944 | "optional": true, 945 | "requires": { 946 | "firmata-io": "^2.2.0", 947 | "serialport": "^8.0.5" 948 | } 949 | }, 950 | "firmata-io": { 951 | "version": "2.2.0", 952 | "resolved": "https://registry.npmjs.org/firmata-io/-/firmata-io-2.2.0.tgz", 953 | "integrity": "sha512-K4WTkHWhptQ6OM/SGLz/+jyO4wBcIigEj15gxdJBJ+NErSHaG4Mg8lra0kDNB049NYXMfZYgy27C3mU8+0bybQ==", 954 | "dev": true, 955 | "optional": true 956 | }, 957 | "flat-cache": { 958 | "version": "1.3.4", 959 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", 960 | "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", 961 | "dev": true, 962 | "requires": { 963 | "circular-json": "^0.3.1", 964 | "graceful-fs": "^4.1.2", 965 | "rimraf": "~2.6.2", 966 | "write": "^0.2.1" 967 | } 968 | }, 969 | "floyd-steinberg": { 970 | "version": "1.0.6", 971 | "resolved": "https://registry.npmjs.org/floyd-steinberg/-/floyd-steinberg-1.0.6.tgz", 972 | "integrity": "sha512-gzlre+taSQzEY+nCusbHJFQ3zHXBkRAX4fe3szssPY/N/t1ClBX9hnHZM4o8ZvpdqLLUPEavuZ/Noj71ZaA8+A==", 973 | "dev": true 974 | }, 975 | "for-each": { 976 | "version": "0.3.3", 977 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 978 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 979 | "dev": true, 980 | "requires": { 981 | "is-callable": "^1.1.3" 982 | } 983 | }, 984 | "fs-constants": { 985 | "version": "1.0.0", 986 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 987 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 988 | }, 989 | "fs.realpath": { 990 | "version": "1.0.0", 991 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 992 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 993 | "dev": true 994 | }, 995 | "function-bind": { 996 | "version": "1.1.1", 997 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 998 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 999 | "dev": true 1000 | }, 1001 | "functional-red-black-tree": { 1002 | "version": "1.0.1", 1003 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 1004 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 1005 | "dev": true 1006 | }, 1007 | "gauge": { 1008 | "version": "2.7.4", 1009 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 1010 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 1011 | "requires": { 1012 | "aproba": "^1.0.3", 1013 | "console-control-strings": "^1.0.0", 1014 | "has-unicode": "^2.0.0", 1015 | "object-assign": "^4.1.0", 1016 | "signal-exit": "^3.0.0", 1017 | "string-width": "^1.0.1", 1018 | "strip-ansi": "^3.0.1", 1019 | "wide-align": "^1.1.0" 1020 | } 1021 | }, 1022 | "get-stdin": { 1023 | "version": "6.0.0", 1024 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", 1025 | "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", 1026 | "dev": true 1027 | }, 1028 | "github-from-package": { 1029 | "version": "0.0.0", 1030 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 1031 | "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" 1032 | }, 1033 | "glob": { 1034 | "version": "7.1.6", 1035 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 1036 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 1037 | "dev": true, 1038 | "requires": { 1039 | "fs.realpath": "^1.0.0", 1040 | "inflight": "^1.0.4", 1041 | "inherits": "2", 1042 | "minimatch": "^3.0.4", 1043 | "once": "^1.3.0", 1044 | "path-is-absolute": "^1.0.0" 1045 | } 1046 | }, 1047 | "globals": { 1048 | "version": "11.12.0", 1049 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1050 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1051 | "dev": true 1052 | }, 1053 | "graceful-fs": { 1054 | "version": "4.2.3", 1055 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", 1056 | "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", 1057 | "dev": true 1058 | }, 1059 | "has": { 1060 | "version": "1.0.3", 1061 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1062 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1063 | "dev": true, 1064 | "requires": { 1065 | "function-bind": "^1.1.1" 1066 | } 1067 | }, 1068 | "has-ansi": { 1069 | "version": "2.0.0", 1070 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1071 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1072 | "dev": true, 1073 | "requires": { 1074 | "ansi-regex": "^2.0.0" 1075 | } 1076 | }, 1077 | "has-flag": { 1078 | "version": "2.0.0", 1079 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 1080 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 1081 | "dev": true 1082 | }, 1083 | "has-symbols": { 1084 | "version": "1.0.1", 1085 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 1086 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 1087 | "dev": true 1088 | }, 1089 | "has-unicode": { 1090 | "version": "2.0.1", 1091 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 1092 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" 1093 | }, 1094 | "hosted-git-info": { 1095 | "version": "2.8.5", 1096 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", 1097 | "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", 1098 | "dev": true 1099 | }, 1100 | "iconv-lite": { 1101 | "version": "0.4.24", 1102 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1103 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1104 | "dev": true, 1105 | "requires": { 1106 | "safer-buffer": ">= 2.1.2 < 3" 1107 | } 1108 | }, 1109 | "ignore": { 1110 | "version": "4.0.6", 1111 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 1112 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 1113 | "dev": true 1114 | }, 1115 | "imurmurhash": { 1116 | "version": "0.1.4", 1117 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1118 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1119 | "dev": true 1120 | }, 1121 | "inflight": { 1122 | "version": "1.0.6", 1123 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1124 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1125 | "dev": true, 1126 | "requires": { 1127 | "once": "^1.3.0", 1128 | "wrappy": "1" 1129 | } 1130 | }, 1131 | "inherits": { 1132 | "version": "2.0.4", 1133 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1134 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1135 | }, 1136 | "ini": { 1137 | "version": "1.3.5", 1138 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 1139 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" 1140 | }, 1141 | "inquirer": { 1142 | "version": "5.2.0", 1143 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", 1144 | "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", 1145 | "dev": true, 1146 | "requires": { 1147 | "ansi-escapes": "^3.0.0", 1148 | "chalk": "^2.0.0", 1149 | "cli-cursor": "^2.1.0", 1150 | "cli-width": "^2.0.0", 1151 | "external-editor": "^2.1.0", 1152 | "figures": "^2.0.0", 1153 | "lodash": "^4.3.0", 1154 | "mute-stream": "0.0.7", 1155 | "run-async": "^2.2.0", 1156 | "rxjs": "^5.5.2", 1157 | "string-width": "^2.1.0", 1158 | "strip-ansi": "^4.0.0", 1159 | "through": "^2.3.6" 1160 | }, 1161 | "dependencies": { 1162 | "ansi-regex": { 1163 | "version": "3.0.0", 1164 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1165 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 1166 | "dev": true 1167 | }, 1168 | "is-fullwidth-code-point": { 1169 | "version": "2.0.0", 1170 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1171 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1172 | "dev": true 1173 | }, 1174 | "string-width": { 1175 | "version": "2.1.1", 1176 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1177 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1178 | "dev": true, 1179 | "requires": { 1180 | "is-fullwidth-code-point": "^2.0.0", 1181 | "strip-ansi": "^4.0.0" 1182 | } 1183 | }, 1184 | "strip-ansi": { 1185 | "version": "4.0.0", 1186 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1187 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1188 | "dev": true, 1189 | "requires": { 1190 | "ansi-regex": "^3.0.0" 1191 | } 1192 | } 1193 | } 1194 | }, 1195 | "is-arguments": { 1196 | "version": "1.0.4", 1197 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", 1198 | "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", 1199 | "dev": true 1200 | }, 1201 | "is-arrayish": { 1202 | "version": "0.2.1", 1203 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1204 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 1205 | "dev": true 1206 | }, 1207 | "is-callable": { 1208 | "version": "1.1.5", 1209 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 1210 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", 1211 | "dev": true 1212 | }, 1213 | "is-date-object": { 1214 | "version": "1.0.2", 1215 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 1216 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", 1217 | "dev": true 1218 | }, 1219 | "is-finite": { 1220 | "version": "1.1.0", 1221 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", 1222 | "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", 1223 | "dev": true 1224 | }, 1225 | "is-fullwidth-code-point": { 1226 | "version": "1.0.0", 1227 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1228 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1229 | "requires": { 1230 | "number-is-nan": "^1.0.0" 1231 | } 1232 | }, 1233 | "is-plain-obj": { 1234 | "version": "1.1.0", 1235 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", 1236 | "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", 1237 | "dev": true 1238 | }, 1239 | "is-promise": { 1240 | "version": "2.1.0", 1241 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 1242 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 1243 | "dev": true 1244 | }, 1245 | "is-regex": { 1246 | "version": "1.0.5", 1247 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 1248 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 1249 | "dev": true, 1250 | "requires": { 1251 | "has": "^1.0.3" 1252 | } 1253 | }, 1254 | "is-regexp": { 1255 | "version": "1.0.0", 1256 | "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", 1257 | "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", 1258 | "dev": true 1259 | }, 1260 | "is-resolvable": { 1261 | "version": "1.1.0", 1262 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", 1263 | "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", 1264 | "dev": true 1265 | }, 1266 | "is-string": { 1267 | "version": "1.0.5", 1268 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", 1269 | "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", 1270 | "dev": true 1271 | }, 1272 | "is-symbol": { 1273 | "version": "1.0.3", 1274 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 1275 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 1276 | "dev": true, 1277 | "requires": { 1278 | "has-symbols": "^1.0.1" 1279 | } 1280 | }, 1281 | "isarray": { 1282 | "version": "1.0.0", 1283 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1284 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1285 | }, 1286 | "isexe": { 1287 | "version": "2.0.0", 1288 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1289 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1290 | "dev": true 1291 | }, 1292 | "johnny-five": { 1293 | "version": "1.4.0", 1294 | "resolved": "https://registry.npmjs.org/johnny-five/-/johnny-five-1.4.0.tgz", 1295 | "integrity": "sha512-Zqk/HnVueqg9QUcfMtl3cN56E8Mh9FxS8vkvsP+FXLrP1wH6q6pdp1ejht7JTgMJ9J9UI1Z/lI4x1AudCrrYiw==", 1296 | "dev": true, 1297 | "requires": { 1298 | "browser-serialport": "^2.1.0", 1299 | "chalk": "2.1.0", 1300 | "color-convert": "~1.2.2", 1301 | "firmata": "^2.2.0", 1302 | "lodash.clonedeep": "^4.3.0", 1303 | "lodash.debounce": "^4.0.3", 1304 | "nanotimer": "0.3.10", 1305 | "serialport": "^8.0.5", 1306 | "temporal": "^0.7.1" 1307 | }, 1308 | "dependencies": { 1309 | "temporal": { 1310 | "version": "0.7.1", 1311 | "resolved": "https://registry.npmjs.org/temporal/-/temporal-0.7.1.tgz", 1312 | "integrity": "sha512-6Xd3c2llgkjGP7kn2LXuiHZ8/cRiIX5EsPcvn8slkAcayWEzf7xuXxd7BcgUm2djmI1DPFUSMFeFwQcLVMLsOw==", 1313 | "dev": true 1314 | } 1315 | } 1316 | }, 1317 | "js-tokens": { 1318 | "version": "3.0.2", 1319 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 1320 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 1321 | "dev": true 1322 | }, 1323 | "js-yaml": { 1324 | "version": "3.13.1", 1325 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 1326 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 1327 | "dev": true, 1328 | "requires": { 1329 | "argparse": "^1.0.7", 1330 | "esprima": "^4.0.0" 1331 | } 1332 | }, 1333 | "json-parse-better-errors": { 1334 | "version": "1.0.2", 1335 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 1336 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", 1337 | "dev": true 1338 | }, 1339 | "json-schema-traverse": { 1340 | "version": "0.4.1", 1341 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1342 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1343 | "dev": true 1344 | }, 1345 | "json-stable-stringify-without-jsonify": { 1346 | "version": "1.0.1", 1347 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1348 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1349 | "dev": true 1350 | }, 1351 | "jsx-ast-utils": { 1352 | "version": "2.2.3", 1353 | "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", 1354 | "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", 1355 | "dev": true, 1356 | "requires": { 1357 | "array-includes": "^3.0.3", 1358 | "object.assign": "^4.1.0" 1359 | } 1360 | }, 1361 | "levn": { 1362 | "version": "0.3.0", 1363 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1364 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1365 | "dev": true, 1366 | "requires": { 1367 | "prelude-ls": "~1.1.2", 1368 | "type-check": "~0.3.2" 1369 | } 1370 | }, 1371 | "load-json-file": { 1372 | "version": "2.0.0", 1373 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", 1374 | "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", 1375 | "dev": true, 1376 | "requires": { 1377 | "graceful-fs": "^4.1.2", 1378 | "parse-json": "^2.2.0", 1379 | "pify": "^2.0.0", 1380 | "strip-bom": "^3.0.0" 1381 | } 1382 | }, 1383 | "locate-path": { 1384 | "version": "2.0.0", 1385 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 1386 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 1387 | "dev": true, 1388 | "requires": { 1389 | "p-locate": "^2.0.0", 1390 | "path-exists": "^3.0.0" 1391 | } 1392 | }, 1393 | "lodash": { 1394 | "version": "4.17.15", 1395 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 1396 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 1397 | "dev": true 1398 | }, 1399 | "lodash.clonedeep": { 1400 | "version": "4.5.0", 1401 | "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", 1402 | "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", 1403 | "dev": true 1404 | }, 1405 | "lodash.debounce": { 1406 | "version": "4.0.8", 1407 | "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", 1408 | "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", 1409 | "dev": true 1410 | }, 1411 | "loose-envify": { 1412 | "version": "1.4.0", 1413 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1414 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1415 | "dev": true, 1416 | "requires": { 1417 | "js-tokens": "^3.0.0 || ^4.0.0" 1418 | } 1419 | }, 1420 | "mimic-fn": { 1421 | "version": "1.2.0", 1422 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 1423 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 1424 | "dev": true 1425 | }, 1426 | "mimic-response": { 1427 | "version": "2.1.0", 1428 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", 1429 | "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" 1430 | }, 1431 | "minimatch": { 1432 | "version": "3.0.4", 1433 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1434 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1435 | "dev": true, 1436 | "requires": { 1437 | "brace-expansion": "^1.1.7" 1438 | } 1439 | }, 1440 | "minimist": { 1441 | "version": "1.2.0", 1442 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1443 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 1444 | }, 1445 | "mkdirp": { 1446 | "version": "0.5.1", 1447 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1448 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1449 | "requires": { 1450 | "minimist": "0.0.8" 1451 | }, 1452 | "dependencies": { 1453 | "minimist": { 1454 | "version": "0.0.8", 1455 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1456 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 1457 | } 1458 | } 1459 | }, 1460 | "ms": { 1461 | "version": "2.1.2", 1462 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1463 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1464 | }, 1465 | "mute-stream": { 1466 | "version": "0.0.7", 1467 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 1468 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 1469 | "dev": true 1470 | }, 1471 | "nan": { 1472 | "version": "2.14.0", 1473 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", 1474 | "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" 1475 | }, 1476 | "nanotimer": { 1477 | "version": "0.3.10", 1478 | "resolved": "https://registry.npmjs.org/nanotimer/-/nanotimer-0.3.10.tgz", 1479 | "integrity": "sha1-6C7g0AWCsj5wa9wA/znIfaqt24M=", 1480 | "dev": true 1481 | }, 1482 | "napi-build-utils": { 1483 | "version": "1.0.1", 1484 | "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.1.tgz", 1485 | "integrity": "sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==" 1486 | }, 1487 | "natural-compare": { 1488 | "version": "1.4.0", 1489 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1490 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1491 | "dev": true 1492 | }, 1493 | "nice-try": { 1494 | "version": "1.0.5", 1495 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1496 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1497 | "dev": true 1498 | }, 1499 | "node-abi": { 1500 | "version": "2.15.0", 1501 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.15.0.tgz", 1502 | "integrity": "sha512-FeLpTS0F39U7hHZU1srAK4Vx+5AHNVOTP+hxBNQknR/54laTHSFIJkDWDqiquY1LeLUgTfPN7sLPhMubx0PLAg==", 1503 | "requires": { 1504 | "semver": "^5.4.1" 1505 | } 1506 | }, 1507 | "noop-logger": { 1508 | "version": "0.1.1", 1509 | "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", 1510 | "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" 1511 | }, 1512 | "normalize-package-data": { 1513 | "version": "2.5.0", 1514 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 1515 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 1516 | "dev": true, 1517 | "requires": { 1518 | "hosted-git-info": "^2.1.4", 1519 | "resolve": "^1.10.0", 1520 | "semver": "2 || 3 || 4 || 5", 1521 | "validate-npm-package-license": "^3.0.1" 1522 | } 1523 | }, 1524 | "npmlog": { 1525 | "version": "4.1.2", 1526 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 1527 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 1528 | "requires": { 1529 | "are-we-there-yet": "~1.1.2", 1530 | "console-control-strings": "~1.1.0", 1531 | "gauge": "~2.7.3", 1532 | "set-blocking": "~2.0.0" 1533 | } 1534 | }, 1535 | "number-is-nan": { 1536 | "version": "1.0.1", 1537 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1538 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 1539 | }, 1540 | "object-assign": { 1541 | "version": "4.1.1", 1542 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1543 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1544 | }, 1545 | "object-inspect": { 1546 | "version": "1.7.0", 1547 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", 1548 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", 1549 | "dev": true 1550 | }, 1551 | "object-is": { 1552 | "version": "1.0.2", 1553 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", 1554 | "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", 1555 | "dev": true 1556 | }, 1557 | "object-keys": { 1558 | "version": "1.1.1", 1559 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1560 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1561 | "dev": true 1562 | }, 1563 | "object.assign": { 1564 | "version": "4.1.0", 1565 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 1566 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 1567 | "dev": true, 1568 | "requires": { 1569 | "define-properties": "^1.1.2", 1570 | "function-bind": "^1.1.1", 1571 | "has-symbols": "^1.0.0", 1572 | "object-keys": "^1.0.11" 1573 | } 1574 | }, 1575 | "oled-font-5x7": { 1576 | "version": "1.0.3", 1577 | "resolved": "https://registry.npmjs.org/oled-font-5x7/-/oled-font-5x7-1.0.3.tgz", 1578 | "integrity": "sha512-l25WvKft8CgXYxtaqKdYrAS1P91rnUUUIiOXojAOvjNCsfFzIl1aEsE2JuaRgMh1Euo7slm5lX0w+1qNkL8PpQ==", 1579 | "dev": true 1580 | }, 1581 | "once": { 1582 | "version": "1.4.0", 1583 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1584 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1585 | "requires": { 1586 | "wrappy": "1" 1587 | } 1588 | }, 1589 | "onetime": { 1590 | "version": "2.0.1", 1591 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 1592 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 1593 | "dev": true, 1594 | "requires": { 1595 | "mimic-fn": "^1.0.0" 1596 | } 1597 | }, 1598 | "optionator": { 1599 | "version": "0.8.3", 1600 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 1601 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 1602 | "dev": true, 1603 | "requires": { 1604 | "deep-is": "~0.1.3", 1605 | "fast-levenshtein": "~2.0.6", 1606 | "levn": "~0.3.0", 1607 | "prelude-ls": "~1.1.2", 1608 | "type-check": "~0.3.2", 1609 | "word-wrap": "~1.2.3" 1610 | } 1611 | }, 1612 | "os-tmpdir": { 1613 | "version": "1.0.2", 1614 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1615 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1616 | "dev": true 1617 | }, 1618 | "p-limit": { 1619 | "version": "1.3.0", 1620 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 1621 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 1622 | "dev": true, 1623 | "requires": { 1624 | "p-try": "^1.0.0" 1625 | } 1626 | }, 1627 | "p-locate": { 1628 | "version": "2.0.0", 1629 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1630 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1631 | "dev": true, 1632 | "requires": { 1633 | "p-limit": "^1.1.0" 1634 | } 1635 | }, 1636 | "p-try": { 1637 | "version": "1.0.0", 1638 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 1639 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", 1640 | "dev": true 1641 | }, 1642 | "parse-json": { 1643 | "version": "2.2.0", 1644 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1645 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1646 | "dev": true, 1647 | "requires": { 1648 | "error-ex": "^1.2.0" 1649 | } 1650 | }, 1651 | "parse-ms": { 1652 | "version": "1.0.1", 1653 | "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", 1654 | "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", 1655 | "dev": true 1656 | }, 1657 | "path-exists": { 1658 | "version": "3.0.0", 1659 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1660 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1661 | "dev": true 1662 | }, 1663 | "path-is-absolute": { 1664 | "version": "1.0.1", 1665 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1666 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1667 | "dev": true 1668 | }, 1669 | "path-is-inside": { 1670 | "version": "1.0.2", 1671 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1672 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1673 | "dev": true 1674 | }, 1675 | "path-key": { 1676 | "version": "2.0.1", 1677 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1678 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1679 | "dev": true 1680 | }, 1681 | "path-parse": { 1682 | "version": "1.0.6", 1683 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1684 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 1685 | "dev": true 1686 | }, 1687 | "path-type": { 1688 | "version": "2.0.0", 1689 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", 1690 | "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", 1691 | "dev": true, 1692 | "requires": { 1693 | "pify": "^2.0.0" 1694 | } 1695 | }, 1696 | "pify": { 1697 | "version": "2.3.0", 1698 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1699 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1700 | "dev": true 1701 | }, 1702 | "pkg-conf": { 1703 | "version": "2.1.0", 1704 | "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", 1705 | "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", 1706 | "dev": true, 1707 | "requires": { 1708 | "find-up": "^2.0.0", 1709 | "load-json-file": "^4.0.0" 1710 | }, 1711 | "dependencies": { 1712 | "load-json-file": { 1713 | "version": "4.0.0", 1714 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", 1715 | "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", 1716 | "dev": true, 1717 | "requires": { 1718 | "graceful-fs": "^4.1.2", 1719 | "parse-json": "^4.0.0", 1720 | "pify": "^3.0.0", 1721 | "strip-bom": "^3.0.0" 1722 | } 1723 | }, 1724 | "parse-json": { 1725 | "version": "4.0.0", 1726 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 1727 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 1728 | "dev": true, 1729 | "requires": { 1730 | "error-ex": "^1.3.1", 1731 | "json-parse-better-errors": "^1.0.1" 1732 | } 1733 | }, 1734 | "pify": { 1735 | "version": "3.0.0", 1736 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 1737 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 1738 | "dev": true 1739 | } 1740 | } 1741 | }, 1742 | "pkg-config": { 1743 | "version": "1.1.1", 1744 | "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", 1745 | "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", 1746 | "dev": true, 1747 | "requires": { 1748 | "debug-log": "^1.0.0", 1749 | "find-root": "^1.0.0", 1750 | "xtend": "^4.0.1" 1751 | } 1752 | }, 1753 | "pkg-dir": { 1754 | "version": "2.0.0", 1755 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", 1756 | "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", 1757 | "dev": true, 1758 | "requires": { 1759 | "find-up": "^2.1.0" 1760 | } 1761 | }, 1762 | "plur": { 1763 | "version": "1.0.0", 1764 | "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", 1765 | "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", 1766 | "dev": true 1767 | }, 1768 | "pluralize": { 1769 | "version": "7.0.0", 1770 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", 1771 | "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", 1772 | "dev": true 1773 | }, 1774 | "png-to-lcd": { 1775 | "version": "1.0.3", 1776 | "resolved": "https://registry.npmjs.org/png-to-lcd/-/png-to-lcd-1.0.3.tgz", 1777 | "integrity": "sha1-QzH6YZlLJ2/Otnxbv2HZiDPBTBY=", 1778 | "dev": true, 1779 | "requires": { 1780 | "floyd-steinberg": "~1.0.4", 1781 | "pngparse": "~2.0.1" 1782 | } 1783 | }, 1784 | "pngparse": { 1785 | "version": "2.0.1", 1786 | "resolved": "https://registry.npmjs.org/pngparse/-/pngparse-2.0.1.tgz", 1787 | "integrity": "sha1-hoUt5N40n077HoUudSVlXlrF37g=", 1788 | "dev": true 1789 | }, 1790 | "prebuild-install": { 1791 | "version": "5.3.3", 1792 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.3.tgz", 1793 | "integrity": "sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==", 1794 | "requires": { 1795 | "detect-libc": "^1.0.3", 1796 | "expand-template": "^2.0.3", 1797 | "github-from-package": "0.0.0", 1798 | "minimist": "^1.2.0", 1799 | "mkdirp": "^0.5.1", 1800 | "napi-build-utils": "^1.0.1", 1801 | "node-abi": "^2.7.0", 1802 | "noop-logger": "^0.1.1", 1803 | "npmlog": "^4.0.1", 1804 | "pump": "^3.0.0", 1805 | "rc": "^1.2.7", 1806 | "simple-get": "^3.0.3", 1807 | "tar-fs": "^2.0.0", 1808 | "tunnel-agent": "^0.6.0", 1809 | "which-pm-runs": "^1.0.0" 1810 | } 1811 | }, 1812 | "prelude-ls": { 1813 | "version": "1.1.2", 1814 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1815 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1816 | "dev": true 1817 | }, 1818 | "pretty-ms": { 1819 | "version": "2.1.0", 1820 | "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", 1821 | "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", 1822 | "dev": true, 1823 | "requires": { 1824 | "is-finite": "^1.0.1", 1825 | "parse-ms": "^1.0.0", 1826 | "plur": "^1.0.0" 1827 | } 1828 | }, 1829 | "process-nextick-args": { 1830 | "version": "2.0.1", 1831 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1832 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1833 | }, 1834 | "progress": { 1835 | "version": "2.0.3", 1836 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1837 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1838 | "dev": true 1839 | }, 1840 | "prop-types": { 1841 | "version": "15.7.2", 1842 | "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", 1843 | "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", 1844 | "dev": true, 1845 | "requires": { 1846 | "loose-envify": "^1.4.0", 1847 | "object-assign": "^4.1.1", 1848 | "react-is": "^16.8.1" 1849 | } 1850 | }, 1851 | "pump": { 1852 | "version": "3.0.0", 1853 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1854 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1855 | "requires": { 1856 | "end-of-stream": "^1.1.0", 1857 | "once": "^1.3.1" 1858 | } 1859 | }, 1860 | "punycode": { 1861 | "version": "2.1.1", 1862 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1863 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1864 | "dev": true 1865 | }, 1866 | "quibble": { 1867 | "version": "0.5.7", 1868 | "resolved": "https://registry.npmjs.org/quibble/-/quibble-0.5.7.tgz", 1869 | "integrity": "sha512-QnHxlD12qhGGjvoEW4PIp8tA80tKjh5CxTg5wLTPp/aqvHElBA+Ag3JN0dWlHY96CUaJqSGmLxTLi+7wbysyZw==", 1870 | "dev": true, 1871 | "requires": { 1872 | "lodash": "^4.17.14", 1873 | "resolve": "^1.11.1" 1874 | } 1875 | }, 1876 | "rc": { 1877 | "version": "1.2.8", 1878 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 1879 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 1880 | "requires": { 1881 | "deep-extend": "^0.6.0", 1882 | "ini": "~1.3.0", 1883 | "minimist": "^1.2.0", 1884 | "strip-json-comments": "~2.0.1" 1885 | } 1886 | }, 1887 | "re-emitter": { 1888 | "version": "1.1.4", 1889 | "resolved": "https://registry.npmjs.org/re-emitter/-/re-emitter-1.1.4.tgz", 1890 | "integrity": "sha512-C0SIXdXDSus2yqqvV7qifnb4NoWP7mEBXJq3axci301mXHCZb8Djwm4hrEZo4UeXRaEnfjH98uQ8EBppk2oNWA==", 1891 | "dev": true 1892 | }, 1893 | "react-is": { 1894 | "version": "16.12.0", 1895 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", 1896 | "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==", 1897 | "dev": true 1898 | }, 1899 | "read-pkg": { 1900 | "version": "2.0.0", 1901 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", 1902 | "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", 1903 | "dev": true, 1904 | "requires": { 1905 | "load-json-file": "^2.0.0", 1906 | "normalize-package-data": "^2.3.2", 1907 | "path-type": "^2.0.0" 1908 | } 1909 | }, 1910 | "read-pkg-up": { 1911 | "version": "2.0.0", 1912 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", 1913 | "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", 1914 | "dev": true, 1915 | "requires": { 1916 | "find-up": "^2.0.0", 1917 | "read-pkg": "^2.0.0" 1918 | } 1919 | }, 1920 | "readable-stream": { 1921 | "version": "2.3.7", 1922 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1923 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1924 | "requires": { 1925 | "core-util-is": "~1.0.0", 1926 | "inherits": "~2.0.3", 1927 | "isarray": "~1.0.0", 1928 | "process-nextick-args": "~2.0.0", 1929 | "safe-buffer": "~5.1.1", 1930 | "string_decoder": "~1.1.1", 1931 | "util-deprecate": "~1.0.1" 1932 | } 1933 | }, 1934 | "regexp.prototype.flags": { 1935 | "version": "1.3.0", 1936 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", 1937 | "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", 1938 | "dev": true, 1939 | "requires": { 1940 | "define-properties": "^1.1.3", 1941 | "es-abstract": "^1.17.0-next.1" 1942 | } 1943 | }, 1944 | "regexpp": { 1945 | "version": "2.0.1", 1946 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 1947 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 1948 | "dev": true 1949 | }, 1950 | "repeat-string": { 1951 | "version": "1.6.1", 1952 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 1953 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 1954 | "dev": true 1955 | }, 1956 | "require-uncached": { 1957 | "version": "1.0.3", 1958 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", 1959 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", 1960 | "dev": true, 1961 | "requires": { 1962 | "caller-path": "^0.1.0", 1963 | "resolve-from": "^1.0.0" 1964 | } 1965 | }, 1966 | "resolve": { 1967 | "version": "1.15.1", 1968 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", 1969 | "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", 1970 | "dev": true, 1971 | "requires": { 1972 | "path-parse": "^1.0.6" 1973 | } 1974 | }, 1975 | "resolve-from": { 1976 | "version": "1.0.1", 1977 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 1978 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", 1979 | "dev": true 1980 | }, 1981 | "restore-cursor": { 1982 | "version": "2.0.0", 1983 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 1984 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 1985 | "dev": true, 1986 | "requires": { 1987 | "onetime": "^2.0.0", 1988 | "signal-exit": "^3.0.2" 1989 | } 1990 | }, 1991 | "resumer": { 1992 | "version": "0.0.0", 1993 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 1994 | "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", 1995 | "dev": true, 1996 | "requires": { 1997 | "through": "~2.3.4" 1998 | } 1999 | }, 2000 | "rimraf": { 2001 | "version": "2.6.3", 2002 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 2003 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 2004 | "dev": true, 2005 | "requires": { 2006 | "glob": "^7.1.3" 2007 | } 2008 | }, 2009 | "run-async": { 2010 | "version": "2.3.0", 2011 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 2012 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 2013 | "dev": true, 2014 | "requires": { 2015 | "is-promise": "^2.1.0" 2016 | } 2017 | }, 2018 | "run-parallel": { 2019 | "version": "1.1.9", 2020 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", 2021 | "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", 2022 | "dev": true 2023 | }, 2024 | "rxjs": { 2025 | "version": "5.5.12", 2026 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", 2027 | "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", 2028 | "dev": true, 2029 | "requires": { 2030 | "symbol-observable": "1.0.1" 2031 | } 2032 | }, 2033 | "safe-buffer": { 2034 | "version": "5.1.2", 2035 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2036 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2037 | }, 2038 | "safer-buffer": { 2039 | "version": "2.1.2", 2040 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2041 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2042 | "dev": true 2043 | }, 2044 | "semver": { 2045 | "version": "5.7.1", 2046 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 2047 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 2048 | }, 2049 | "serialport": { 2050 | "version": "8.0.7", 2051 | "resolved": "https://registry.npmjs.org/serialport/-/serialport-8.0.7.tgz", 2052 | "integrity": "sha512-R9bfNebs2dblYf5sD/Aaa7j8+siP4X7TGT02lqHM9DF5fyjlrPGXmsLw9+LKOz1AvjGjkxf2NzBVnDpqRX7clQ==", 2053 | "requires": { 2054 | "@serialport/binding-mock": "^8.0.6", 2055 | "@serialport/bindings": "^8.0.7", 2056 | "@serialport/parser-byte-length": "^8.0.6", 2057 | "@serialport/parser-cctalk": "^8.0.6", 2058 | "@serialport/parser-delimiter": "^8.0.6", 2059 | "@serialport/parser-readline": "^8.0.6", 2060 | "@serialport/parser-ready": "^8.0.6", 2061 | "@serialport/parser-regex": "^8.0.6", 2062 | "@serialport/stream": "^8.0.6", 2063 | "debug": "^4.1.1" 2064 | } 2065 | }, 2066 | "set-blocking": { 2067 | "version": "2.0.0", 2068 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 2069 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 2070 | }, 2071 | "shebang-command": { 2072 | "version": "1.2.0", 2073 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 2074 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 2075 | "dev": true, 2076 | "requires": { 2077 | "shebang-regex": "^1.0.0" 2078 | } 2079 | }, 2080 | "shebang-regex": { 2081 | "version": "1.0.0", 2082 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 2083 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 2084 | "dev": true 2085 | }, 2086 | "signal-exit": { 2087 | "version": "3.0.2", 2088 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 2089 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 2090 | }, 2091 | "simple-concat": { 2092 | "version": "1.0.0", 2093 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", 2094 | "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" 2095 | }, 2096 | "simple-get": { 2097 | "version": "3.1.0", 2098 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", 2099 | "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", 2100 | "requires": { 2101 | "decompress-response": "^4.2.0", 2102 | "once": "^1.3.1", 2103 | "simple-concat": "^1.0.0" 2104 | } 2105 | }, 2106 | "slice-ansi": { 2107 | "version": "1.0.0", 2108 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", 2109 | "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", 2110 | "dev": true, 2111 | "requires": { 2112 | "is-fullwidth-code-point": "^2.0.0" 2113 | }, 2114 | "dependencies": { 2115 | "is-fullwidth-code-point": { 2116 | "version": "2.0.0", 2117 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 2118 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 2119 | "dev": true 2120 | } 2121 | } 2122 | }, 2123 | "spdx-correct": { 2124 | "version": "3.1.0", 2125 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", 2126 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", 2127 | "dev": true, 2128 | "requires": { 2129 | "spdx-expression-parse": "^3.0.0", 2130 | "spdx-license-ids": "^3.0.0" 2131 | } 2132 | }, 2133 | "spdx-exceptions": { 2134 | "version": "2.2.0", 2135 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", 2136 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", 2137 | "dev": true 2138 | }, 2139 | "spdx-expression-parse": { 2140 | "version": "3.0.0", 2141 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 2142 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 2143 | "dev": true, 2144 | "requires": { 2145 | "spdx-exceptions": "^2.1.0", 2146 | "spdx-license-ids": "^3.0.0" 2147 | } 2148 | }, 2149 | "spdx-license-ids": { 2150 | "version": "3.0.5", 2151 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", 2152 | "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", 2153 | "dev": true 2154 | }, 2155 | "split": { 2156 | "version": "1.0.1", 2157 | "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", 2158 | "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", 2159 | "dev": true, 2160 | "requires": { 2161 | "through": "2" 2162 | } 2163 | }, 2164 | "sprintf-js": { 2165 | "version": "1.0.3", 2166 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2167 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2168 | "dev": true 2169 | }, 2170 | "standard": { 2171 | "version": "12.0.1", 2172 | "resolved": "https://registry.npmjs.org/standard/-/standard-12.0.1.tgz", 2173 | "integrity": "sha512-UqdHjh87OG2gUrNCSM4QRLF5n9h3TFPwrCNyVlkqu31Hej0L/rc8hzKqVvkb2W3x0WMq7PzZdkLfEcBhVOR6lg==", 2174 | "dev": true, 2175 | "requires": { 2176 | "eslint": "~5.4.0", 2177 | "eslint-config-standard": "12.0.0", 2178 | "eslint-config-standard-jsx": "6.0.2", 2179 | "eslint-plugin-import": "~2.14.0", 2180 | "eslint-plugin-node": "~7.0.1", 2181 | "eslint-plugin-promise": "~4.0.0", 2182 | "eslint-plugin-react": "~7.11.1", 2183 | "eslint-plugin-standard": "~4.0.0", 2184 | "standard-engine": "~9.0.0" 2185 | } 2186 | }, 2187 | "standard-engine": { 2188 | "version": "9.0.0", 2189 | "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-9.0.0.tgz", 2190 | "integrity": "sha512-ZfNfCWZ2Xq67VNvKMPiVMKHnMdvxYzvZkf1AH8/cw2NLDBm5LRsxMqvEJpsjLI/dUosZ3Z1d6JlHDp5rAvvk2w==", 2191 | "dev": true, 2192 | "requires": { 2193 | "deglob": "^2.1.0", 2194 | "get-stdin": "^6.0.0", 2195 | "minimist": "^1.1.0", 2196 | "pkg-conf": "^2.0.0" 2197 | } 2198 | }, 2199 | "string-width": { 2200 | "version": "1.0.2", 2201 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 2202 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 2203 | "requires": { 2204 | "code-point-at": "^1.0.0", 2205 | "is-fullwidth-code-point": "^1.0.0", 2206 | "strip-ansi": "^3.0.0" 2207 | } 2208 | }, 2209 | "string.prototype.trim": { 2210 | "version": "1.2.1", 2211 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz", 2212 | "integrity": "sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==", 2213 | "dev": true, 2214 | "requires": { 2215 | "define-properties": "^1.1.3", 2216 | "es-abstract": "^1.17.0-next.1", 2217 | "function-bind": "^1.1.1" 2218 | } 2219 | }, 2220 | "string.prototype.trimleft": { 2221 | "version": "2.1.1", 2222 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", 2223 | "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", 2224 | "dev": true, 2225 | "requires": { 2226 | "define-properties": "^1.1.3", 2227 | "function-bind": "^1.1.1" 2228 | } 2229 | }, 2230 | "string.prototype.trimright": { 2231 | "version": "2.1.1", 2232 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", 2233 | "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", 2234 | "dev": true, 2235 | "requires": { 2236 | "define-properties": "^1.1.3", 2237 | "function-bind": "^1.1.1" 2238 | } 2239 | }, 2240 | "string_decoder": { 2241 | "version": "1.1.1", 2242 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2243 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2244 | "requires": { 2245 | "safe-buffer": "~5.1.0" 2246 | } 2247 | }, 2248 | "stringify-object-es5": { 2249 | "version": "2.5.0", 2250 | "resolved": "https://registry.npmjs.org/stringify-object-es5/-/stringify-object-es5-2.5.0.tgz", 2251 | "integrity": "sha1-BXw8mpChJzObudFwSikLt70KHsU=", 2252 | "dev": true, 2253 | "requires": { 2254 | "is-plain-obj": "^1.0.0", 2255 | "is-regexp": "^1.0.0" 2256 | } 2257 | }, 2258 | "strip-ansi": { 2259 | "version": "3.0.1", 2260 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2261 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2262 | "requires": { 2263 | "ansi-regex": "^2.0.0" 2264 | } 2265 | }, 2266 | "strip-bom": { 2267 | "version": "3.0.0", 2268 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 2269 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 2270 | "dev": true 2271 | }, 2272 | "strip-json-comments": { 2273 | "version": "2.0.1", 2274 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2275 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 2276 | }, 2277 | "supports-color": { 2278 | "version": "4.5.0", 2279 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", 2280 | "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", 2281 | "dev": true, 2282 | "requires": { 2283 | "has-flag": "^2.0.0" 2284 | } 2285 | }, 2286 | "symbol-observable": { 2287 | "version": "1.0.1", 2288 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", 2289 | "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", 2290 | "dev": true 2291 | }, 2292 | "table": { 2293 | "version": "4.0.3", 2294 | "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", 2295 | "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", 2296 | "dev": true, 2297 | "requires": { 2298 | "ajv": "^6.0.1", 2299 | "ajv-keywords": "^3.0.0", 2300 | "chalk": "^2.1.0", 2301 | "lodash": "^4.17.4", 2302 | "slice-ansi": "1.0.0", 2303 | "string-width": "^2.1.1" 2304 | }, 2305 | "dependencies": { 2306 | "ansi-regex": { 2307 | "version": "3.0.0", 2308 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 2309 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 2310 | "dev": true 2311 | }, 2312 | "is-fullwidth-code-point": { 2313 | "version": "2.0.0", 2314 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 2315 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 2316 | "dev": true 2317 | }, 2318 | "string-width": { 2319 | "version": "2.1.1", 2320 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 2321 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 2322 | "dev": true, 2323 | "requires": { 2324 | "is-fullwidth-code-point": "^2.0.0", 2325 | "strip-ansi": "^4.0.0" 2326 | } 2327 | }, 2328 | "strip-ansi": { 2329 | "version": "4.0.0", 2330 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 2331 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 2332 | "dev": true, 2333 | "requires": { 2334 | "ansi-regex": "^3.0.0" 2335 | } 2336 | } 2337 | } 2338 | }, 2339 | "tap-out": { 2340 | "version": "1.4.2", 2341 | "resolved": "https://registry.npmjs.org/tap-out/-/tap-out-1.4.2.tgz", 2342 | "integrity": "sha1-yQfsG/lAURHQiCY+kvVgi4jLs3o=", 2343 | "dev": true, 2344 | "requires": { 2345 | "re-emitter": "^1.0.0", 2346 | "readable-stream": "^2.0.0", 2347 | "split": "^1.0.0", 2348 | "trim": "0.0.1" 2349 | } 2350 | }, 2351 | "tap-spec": { 2352 | "version": "4.1.2", 2353 | "resolved": "https://registry.npmjs.org/tap-spec/-/tap-spec-4.1.2.tgz", 2354 | "integrity": "sha512-CmZP7vp9Jk7fND0nvdjIzjGMZnBDx1jVG7T9x6i2GZb/ejIODGz7OSsWFfwwuEcY9yHWtpD/mdLverla0M8EWA==", 2355 | "dev": true, 2356 | "requires": { 2357 | "chalk": "^1.0.0", 2358 | "duplexer": "^0.1.1", 2359 | "figures": "^1.4.0", 2360 | "lodash": "^3.6.0", 2361 | "pretty-ms": "^2.1.0", 2362 | "repeat-string": "^1.5.2", 2363 | "tap-out": "^1.4.1", 2364 | "through2": "^2.0.0" 2365 | }, 2366 | "dependencies": { 2367 | "ansi-styles": { 2368 | "version": "2.2.1", 2369 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 2370 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 2371 | "dev": true 2372 | }, 2373 | "chalk": { 2374 | "version": "1.1.3", 2375 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 2376 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 2377 | "dev": true, 2378 | "requires": { 2379 | "ansi-styles": "^2.2.1", 2380 | "escape-string-regexp": "^1.0.2", 2381 | "has-ansi": "^2.0.0", 2382 | "strip-ansi": "^3.0.0", 2383 | "supports-color": "^2.0.0" 2384 | } 2385 | }, 2386 | "figures": { 2387 | "version": "1.7.0", 2388 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 2389 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", 2390 | "dev": true, 2391 | "requires": { 2392 | "escape-string-regexp": "^1.0.5", 2393 | "object-assign": "^4.1.0" 2394 | } 2395 | }, 2396 | "lodash": { 2397 | "version": "3.10.1", 2398 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", 2399 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", 2400 | "dev": true 2401 | }, 2402 | "supports-color": { 2403 | "version": "2.0.0", 2404 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 2405 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 2406 | "dev": true 2407 | } 2408 | } 2409 | }, 2410 | "tape": { 2411 | "version": "4.13.0", 2412 | "resolved": "https://registry.npmjs.org/tape/-/tape-4.13.0.tgz", 2413 | "integrity": "sha512-J/hvA+GJnuWJ0Sj8Z0dmu3JgMNU+MmusvkCT7+SN4/2TklW18FNCp/UuHIEhPZwHfy4sXfKYgC7kypKg4umbOw==", 2414 | "dev": true, 2415 | "requires": { 2416 | "deep-equal": "~1.1.1", 2417 | "defined": "~1.0.0", 2418 | "dotignore": "~0.1.2", 2419 | "for-each": "~0.3.3", 2420 | "function-bind": "~1.1.1", 2421 | "glob": "~7.1.6", 2422 | "has": "~1.0.3", 2423 | "inherits": "~2.0.4", 2424 | "is-regex": "~1.0.5", 2425 | "minimist": "~1.2.0", 2426 | "object-inspect": "~1.7.0", 2427 | "resolve": "~1.14.2", 2428 | "resumer": "~0.0.0", 2429 | "string.prototype.trim": "~1.2.1", 2430 | "through": "~2.3.8" 2431 | }, 2432 | "dependencies": { 2433 | "resolve": { 2434 | "version": "1.14.2", 2435 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.2.tgz", 2436 | "integrity": "sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ==", 2437 | "dev": true, 2438 | "requires": { 2439 | "path-parse": "^1.0.6" 2440 | } 2441 | } 2442 | } 2443 | }, 2444 | "tar-fs": { 2445 | "version": "2.0.0", 2446 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", 2447 | "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", 2448 | "requires": { 2449 | "chownr": "^1.1.1", 2450 | "mkdirp": "^0.5.1", 2451 | "pump": "^3.0.0", 2452 | "tar-stream": "^2.0.0" 2453 | } 2454 | }, 2455 | "tar-stream": { 2456 | "version": "2.1.0", 2457 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz", 2458 | "integrity": "sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==", 2459 | "requires": { 2460 | "bl": "^3.0.0", 2461 | "end-of-stream": "^1.4.1", 2462 | "fs-constants": "^1.0.0", 2463 | "inherits": "^2.0.3", 2464 | "readable-stream": "^3.1.1" 2465 | }, 2466 | "dependencies": { 2467 | "readable-stream": { 2468 | "version": "3.6.0", 2469 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 2470 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 2471 | "requires": { 2472 | "inherits": "^2.0.3", 2473 | "string_decoder": "^1.1.1", 2474 | "util-deprecate": "^1.0.1" 2475 | } 2476 | } 2477 | } 2478 | }, 2479 | "temporal": { 2480 | "version": "0.5.0", 2481 | "resolved": "https://registry.npmjs.org/temporal/-/temporal-0.5.0.tgz", 2482 | "integrity": "sha1-W4GJVMjavNL4siYQeCNCMouCQUw=", 2483 | "dev": true, 2484 | "requires": { 2485 | "es6-shim": "^0.35.5" 2486 | } 2487 | }, 2488 | "testdouble": { 2489 | "version": "3.12.5", 2490 | "resolved": "https://registry.npmjs.org/testdouble/-/testdouble-3.12.5.tgz", 2491 | "integrity": "sha512-HxATrZ9Olip3bl/oW56uINeMAGDKjy2Q5CdoaCVTxcixN+BIOuPbiLDZ3OaE3d8vKsb4IZZr5Km5fTLZ5ha26g==", 2492 | "dev": true, 2493 | "requires": { 2494 | "lodash": "^4.17.15", 2495 | "quibble": "^0.5.6", 2496 | "stringify-object-es5": "^2.5.0", 2497 | "theredoc": "^1.0.0" 2498 | } 2499 | }, 2500 | "text-table": { 2501 | "version": "0.2.0", 2502 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2503 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 2504 | "dev": true 2505 | }, 2506 | "theredoc": { 2507 | "version": "1.0.0", 2508 | "resolved": "https://registry.npmjs.org/theredoc/-/theredoc-1.0.0.tgz", 2509 | "integrity": "sha512-KU3SA3TjRRM932jpNfD3u4Ec3bSvedyo5ITPI7zgWYnKep7BwQQaxlhI9qbO+lKJoRnoAbEVfMcAHRuKVYikDA==", 2510 | "dev": true 2511 | }, 2512 | "through": { 2513 | "version": "2.3.8", 2514 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2515 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 2516 | "dev": true 2517 | }, 2518 | "through2": { 2519 | "version": "2.0.5", 2520 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 2521 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 2522 | "dev": true, 2523 | "requires": { 2524 | "readable-stream": "~2.3.6", 2525 | "xtend": "~4.0.1" 2526 | } 2527 | }, 2528 | "tmp": { 2529 | "version": "0.0.33", 2530 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 2531 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 2532 | "dev": true, 2533 | "requires": { 2534 | "os-tmpdir": "~1.0.2" 2535 | } 2536 | }, 2537 | "trim": { 2538 | "version": "0.0.1", 2539 | "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", 2540 | "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", 2541 | "dev": true 2542 | }, 2543 | "tunnel-agent": { 2544 | "version": "0.6.0", 2545 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2546 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 2547 | "requires": { 2548 | "safe-buffer": "^5.0.1" 2549 | } 2550 | }, 2551 | "type-check": { 2552 | "version": "0.3.2", 2553 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 2554 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 2555 | "dev": true, 2556 | "requires": { 2557 | "prelude-ls": "~1.1.2" 2558 | } 2559 | }, 2560 | "typescript": { 2561 | "version": "3.8.2", 2562 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.2.tgz", 2563 | "integrity": "sha512-EgOVgL/4xfVrCMbhYKUQTdF37SQn4Iw73H5BgCrF1Abdun7Kwy/QZsE/ssAy0y4LxBbvua3PIbFsbRczWWnDdQ==", 2564 | "dev": true 2565 | }, 2566 | "uniq": { 2567 | "version": "1.0.1", 2568 | "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", 2569 | "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", 2570 | "dev": true 2571 | }, 2572 | "uri-js": { 2573 | "version": "4.2.2", 2574 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 2575 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 2576 | "dev": true, 2577 | "requires": { 2578 | "punycode": "^2.1.0" 2579 | } 2580 | }, 2581 | "util-deprecate": { 2582 | "version": "1.0.2", 2583 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2584 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 2585 | }, 2586 | "validate-npm-package-license": { 2587 | "version": "3.0.4", 2588 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 2589 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 2590 | "dev": true, 2591 | "requires": { 2592 | "spdx-correct": "^3.0.0", 2593 | "spdx-expression-parse": "^3.0.0" 2594 | } 2595 | }, 2596 | "which": { 2597 | "version": "1.3.1", 2598 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2599 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2600 | "dev": true, 2601 | "requires": { 2602 | "isexe": "^2.0.0" 2603 | } 2604 | }, 2605 | "which-pm-runs": { 2606 | "version": "1.0.0", 2607 | "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", 2608 | "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" 2609 | }, 2610 | "wide-align": { 2611 | "version": "1.1.3", 2612 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 2613 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 2614 | "requires": { 2615 | "string-width": "^1.0.2 || 2" 2616 | } 2617 | }, 2618 | "word-wrap": { 2619 | "version": "1.2.3", 2620 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 2621 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 2622 | "dev": true 2623 | }, 2624 | "wrappy": { 2625 | "version": "1.0.2", 2626 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2627 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 2628 | }, 2629 | "write": { 2630 | "version": "0.2.1", 2631 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", 2632 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 2633 | "dev": true, 2634 | "requires": { 2635 | "mkdirp": "^0.5.1" 2636 | } 2637 | }, 2638 | "xtend": { 2639 | "version": "4.0.2", 2640 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 2641 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 2642 | "dev": true 2643 | } 2644 | } 2645 | } 2646 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "oled-js", 3 | "version": "5.1.2", 4 | "description": "johnny-five compatible lib for oled devices", 5 | "main": "build/oled.js", 6 | "types": "build/oled.d.ts", 7 | "files": [ 8 | "build/oled.js", 9 | "build/oled.d.ts" 10 | ], 11 | "devDependencies": { 12 | "@types/node": "^13.5.0", 13 | "johnny-five": "^1.4.0", 14 | "oled-font-5x7": "~1.0.0", 15 | "png-to-lcd": "~1.0.3", 16 | "pngparse": "~2.0.1", 17 | "standard": "^12.0.1", 18 | "tap-spec": "^4.1.1", 19 | "tape": "^4.6.3", 20 | "temporal": "^0.5.0", 21 | "testdouble": "^3.1.0", 22 | "typescript": "^3.7.5" 23 | }, 24 | "dependencies": { 25 | "@types/johnny-five": "*", 26 | "serialport": "8" 27 | }, 28 | "scripts": { 29 | "build": "tsc -b", 30 | "test": "node tests/unit/oledjs.spec.js | tap-spec" 31 | }, 32 | "repository": { 33 | "type": "git", 34 | "url": "git://github.com/noopkat/oled-js.git" 35 | }, 36 | "keywords": [ 37 | "johnny-five", 38 | "oled", 39 | "firmata" 40 | ], 41 | "author": "Suz Hinton", 42 | "license": "MIT", 43 | "bugs": { 44 | "url": "https://github.com/noopkat/oled-js/issues" 45 | }, 46 | "homepage": "https://github.com/noopkat/oled-js" 47 | } 48 | -------------------------------------------------------------------------------- /tests/buffers/adafruitLogoBuf.js: -------------------------------------------------------------------------------- 1 | // example picture using just pixels, in the framebuffer size allowed (512) 2 | var adafruitLogo = [ 3 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 4 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 5 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 6 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 7 | 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 8 | 0x00, 0x80, 0x80, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 9 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 10 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 11 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 12 | 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xF8, 0xE0, 0x00, 0x00, 0x00, 0x00, 13 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 14 | 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0xFF, 15 | 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 16 | 0x80, 0xFF, 0xFF, 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 17 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x8C, 0x8E, 0x84, 0x00, 0x00, 0x80, 0xF8, 18 | 0xF8, 0xF8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 19 | 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xE0, 0xE0, 0xC0, 0x80, 20 | 0x00, 0xE0, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 21 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xC7, 0x01, 0x01, 22 | 0x01, 0x01, 0x83, 0xFF, 0xFF, 0x00, 0x00, 0x7C, 0xFE, 0xC7, 0x01, 0x01, 0x01, 0x01, 0x83, 0xFF, 23 | 0xFF, 0xFF, 0x00, 0x38, 0xFE, 0xC7, 0x83, 0x01, 0x01, 0x01, 0x83, 0xC7, 0xFF, 0xFF, 0x00, 0x00, 24 | 0x01, 0xFF, 0xFF, 0x01, 0x01, 0x00, 0xFF, 0xFF, 0x07, 0x01, 0x01, 0x01, 0x00, 0x00, 0x7F, 0xFF, 25 | 0x80, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0xFF, 26 | 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 27 | 0x03, 0x0F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xC7, 0xC7, 0x8F, 28 | 0x8F, 0x9F, 0xBF, 0xFF, 0xFF, 0xC3, 0xC0, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, 0xFC, 29 | 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF8, 0xF0, 0xF0, 0xE0, 0xC0, 0x00, 0x01, 0x03, 0x03, 0x03, 30 | 0x03, 0x03, 0x01, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 31 | 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x03, 0x03, 0x00, 0x00, 32 | 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 33 | 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x03, 34 | 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 35 | ]; 36 | 37 | module.exports = adafruitLogo; -------------------------------------------------------------------------------- /tests/buffers/drawPixel.js: -------------------------------------------------------------------------------- 1 | module.exports = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; 2 | -------------------------------------------------------------------------------- /tests/demoTime.js: -------------------------------------------------------------------------------- 1 | var five = require('johnny-five'), 2 | pngtolcd = require('png-to-lcd'), 3 | board = new five.Board(), 4 | Oled = require('../build/oled'), 5 | font = require('oled-font-5x7'), 6 | temporal = require('temporal'); 7 | 8 | // testing features 9 | board.on('ready', function() { 10 | console.log('Connected to Arduino, ready.'); 11 | 12 | // I2C va USB 13 | // var opts = { 14 | // width: 128, 15 | // height: 64, 16 | // address: 0x3D 17 | // }; 18 | 19 | // SPI via USB 20 | // var opts = { 21 | // width: 128, 22 | // height: 64, 23 | // secondaryPin: 12 24 | // }; 25 | 26 | // SPI Microview via USB 27 | var opts = { 28 | width: 64, 29 | height: 48, 30 | microview: true 31 | }; 32 | 33 | var oled = new Oled(board, five, opts); 34 | 35 | test(oled); 36 | }); 37 | 38 | // sequence of test displays 39 | function test(oled) { 40 | 41 | // if it was already scrolling, stop 42 | oled.stopScroll(); 43 | 44 | // clear first just in case 45 | oled.update(); 46 | 47 | // make it prettier 48 | oled.dimDisplay(true); 49 | 50 | 51 | temporal.queue([ 52 | { 53 | delay: 100, 54 | task: function() { 55 | // draw some test pixels 56 | oled.drawPixel([ 57 | [127, 0, 1], 58 | [127, 31, 1], 59 | [127, 16, 1], 60 | [64, 16, 1] 61 | ]); 62 | } 63 | }, 64 | { 65 | delay: 10000, 66 | task: function() { 67 | oled.clearDisplay(); 68 | // display a bitmap 69 | pngtolcd(__dirname + '/images/cat-128x64.png', true, function(err, bitmapbuf) { 70 | oled.buffer = bitmapbuf; 71 | oled.update(); 72 | }); 73 | 74 | } 75 | }, 76 | { 77 | delay: 10000, 78 | task: function() { 79 | oled.clearDisplay(); 80 | // display text 81 | oled.setCursor(0, 0); 82 | oled.writeString(font, 1, 'Cats and dogs are really cool animals, you know.', 1, true, 2); 83 | } 84 | }, 85 | { 86 | delay: 10000, 87 | task: function() { 88 | oled.clearDisplay(); 89 | // draw some lines 90 | oled.drawLine(0, 0, 127, 31, 1); 91 | oled.drawLine(64, 16, 127, 16, 1); 92 | oled.drawLine(0, 10, 40, 10, 1); 93 | } 94 | }, 95 | { 96 | delay: 10000, 97 | task: function() { 98 | oled.clearDisplay(); 99 | // draw a rectangle 100 | oled.fillRect(0, 0, 10, 20, 1); 101 | } 102 | }, 103 | { 104 | delay: 10000, 105 | task: function() { 106 | // create concenctric rectangle outlines 107 | oled.clearDisplay(); 108 | 109 | //calc how many squares we can fit on the screen 110 | var padding = 2; 111 | var square_count = ((oled.WIDTH / 2 ) / (padding * 2) ) - 1; 112 | 113 | for(var i = 0; i < square_count; i ++){ 114 | var x = ((i + 1) * padding); 115 | var y = ((i + 1) * padding); 116 | var w = oled.WIDTH - (x * padding); 117 | var h = oled.HEIGHT - (y * padding); 118 | oled.drawRect(x, y, w, h, 1, false); 119 | } 120 | oled.update(); 121 | } 122 | }, 123 | { 124 | delay: 10000, 125 | task: function() { 126 | // create concenctric circle outlines 127 | oled.clearDisplay(); 128 | 129 | var x = oled.WIDTH / 2; 130 | var y = oled.HEIGHT / 2; 131 | var radius = oled.HEIGHT - 1 132 | 133 | //calc how many circles we can fit on the screen 134 | var circle_count = radius / 3; 135 | 136 | for(var i = 0; i < circle_count; i++){ 137 | var r = radius - (i * 3); 138 | oled.drawCircle(x, y, r, 1, false); 139 | } 140 | oled.update(); 141 | } 142 | }, 143 | { 144 | delay: 10000, 145 | task: function() { 146 | oled.clearDisplay(); 147 | // display text 148 | oled.setCursor(0, 7); 149 | oled.writeString(font, 2, 'SCROLL!', 1, true, 1); 150 | oled.startScroll('left', 0, 6); 151 | } 152 | }, 153 | { 154 | delay: 10000, 155 | task: function() { 156 | oled.stopScroll(); 157 | oled.clearDisplay(); 158 | oled.update(); 159 | oled.setCursor(0, 7); 160 | oled.writeString(font, 2, 'DIAGONAL SCROLL', 1, true, 1); 161 | oled.startScroll('left diagonal', 0, 15); 162 | } 163 | } 164 | ]); 165 | } 166 | -------------------------------------------------------------------------------- /tests/demoTime_bt.js: -------------------------------------------------------------------------------- 1 | var five = require('johnny-five'), 2 | pngtolcd = require('png-to-lcd'), 3 | blendMicroIO = require('blend-micro-io'), 4 | Oled = require('../build/oled'), 5 | font = require('oled-font-5x7'), 6 | temporal = require('temporal'); 7 | 8 | var board = new five.Board({ 9 | io: new blendMicroIO() 10 | }); 11 | 12 | // testing features 13 | board.on('ready', function() { 14 | console.log('Connected to Arduino, ready.'); 15 | 16 | var opts = { 17 | width: 128, 18 | height: 64, 19 | address: 0x3D 20 | }; 21 | 22 | var oled = new Oled(board, five, opts); 23 | 24 | test(oled); 25 | }); 26 | 27 | // sequence of test displays 28 | function test(oled) { 29 | 30 | // if it was already scrolling, stop 31 | oled.stopScroll(); 32 | 33 | // clear first just in case 34 | oled.update(); 35 | 36 | // make it prettier 37 | oled.dimDisplay(true); 38 | 39 | 40 | temporal.queue([ 41 | { 42 | delay: 100, 43 | task: function() { 44 | // draw some test pixels 45 | oled.drawPixel([ 46 | [127, 0, 1], 47 | [127, 31, 1], 48 | [127, 16, 1], 49 | [64, 16, 1] 50 | ]); 51 | } 52 | }, 53 | { 54 | delay: 10000, 55 | task: function() { 56 | oled.clearDisplay(); 57 | // display a bitmap 58 | pngtolcd(__dirname + '/images/cat-128x64.png', true, function(err, bitmapbuf) { 59 | oled.buffer = bitmapbuf; 60 | oled.update(); 61 | }); 62 | 63 | } 64 | }, 65 | { 66 | delay: 10000, 67 | task: function() { 68 | oled.clearDisplay(); 69 | // display text 70 | oled.setCursor(0, 0); 71 | oled.writeString(font, 1, 'Cats and dogs are really cool animals, you know.', 1, true); 72 | } 73 | }, 74 | { 75 | delay: 10000, 76 | task: function() { 77 | oled.clearDisplay(); 78 | // draw some lines 79 | oled.drawLine(0, 0, 127, 31, 1); 80 | oled.drawLine(64, 16, 127, 16, 1); 81 | oled.drawLine(0, 10, 40, 10, 1); 82 | } 83 | }, 84 | { 85 | delay: 10000, 86 | task: function() { 87 | oled.clearDisplay(); 88 | // draw a rectangle 89 | oled.fillRect(0, 0, 10, 20, 1); 90 | } 91 | }, 92 | { 93 | delay: 10000, 94 | task: function() { 95 | oled.clearDisplay(); 96 | // display text 97 | oled.setCursor(0, 7); 98 | oled.writeString(font, 2, 'SCROLL!', 1, true); 99 | oled.startScroll('left', 0, 6); 100 | } 101 | } 102 | ]); 103 | } -------------------------------------------------------------------------------- /tests/images/cat-128x64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noopkat/oled-js/eec79a88f36589dd06fa184aa9702d35d4dd072b/tests/images/cat-128x64.png -------------------------------------------------------------------------------- /tests/images/cat-microview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noopkat/oled-js/eec79a88f36589dd06fa184aa9702d35d4dd072b/tests/images/cat-microview.png -------------------------------------------------------------------------------- /tests/images/cat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noopkat/oled-js/eec79a88f36589dd06fa184aa9702d35d4dd072b/tests/images/cat.png -------------------------------------------------------------------------------- /tests/images/noopkat-mono.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noopkat/oled-js/eec79a88f36589dd06fa184aa9702d35d4dd072b/tests/images/noopkat-mono.png -------------------------------------------------------------------------------- /tests/images/noopkat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noopkat/oled-js/eec79a88f36589dd06fa184aa9702d35d4dd072b/tests/images/noopkat.png -------------------------------------------------------------------------------- /tests/images/parrot-tiny.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noopkat/oled-js/eec79a88f36589dd06fa184aa9702d35d4dd072b/tests/images/parrot-tiny.png -------------------------------------------------------------------------------- /tests/unit/oledjs.spec.js: -------------------------------------------------------------------------------- 1 | // test deps 2 | var test = require('tape'); 3 | var td = require('testdouble'); 4 | 5 | // require and stub oled.js 6 | var oledjs = require('../../build/oled.js'); 7 | oledjs.prototype._setUpI2C = td.function(); 8 | oledjs.prototype._transfer = td.function(); 9 | 10 | // require and stub johnny-five 11 | var five = td.function(); 12 | var board = new td.constructor(); 13 | 14 | // import framebuffer snapshots 15 | var drawPixelBuffer = require('../buffers/drawPixel'); 16 | 17 | test('drawPixel outputs correct buffer', function (t) { 18 | t.plan(1); 19 | 20 | var options = { 21 | width: 128, 22 | height: 64, 23 | address: 0x3D 24 | }; 25 | 26 | var oled = new oledjs(board, five, options); 27 | 28 | oled.drawPixel([ 29 | [127, 0, 1], 30 | [127, 31, 1], 31 | [127, 16, 1], 32 | [64, 16, 1] 33 | ], false); 34 | 35 | t.ok(oled.buffer.equals(Buffer.from(drawPixelBuffer))); 36 | }); 37 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es5", 5 | "declaration": true, 6 | "removeComments": true, 7 | "noImplicitAny": true, 8 | "noImplicitReturns": true, 9 | "noImplicitThis": true, 10 | "outDir": "./build" 11 | }, 12 | "include": [ 13 | "oled.ts" 14 | ] 15 | } 16 | --------------------------------------------------------------------------------