├── .compilerc ├── .eslintrc ├── .gitignore ├── .travis.yml ├── LICENSE.md ├── README.md ├── appveyor.yml ├── forge.config.js ├── npm-shrinkwrap.json ├── package.json ├── src ├── css │ ├── main.scss │ ├── normalize.css │ └── skeleton.css ├── html │ ├── component │ │ ├── main.vue │ │ └── setting │ │ │ ├── network.vue │ │ │ ├── serial.vue │ │ │ └── usb.vue │ └── index.html ├── img │ ├── animation │ │ └── loading.gif │ └── icons │ │ ├── mac │ │ └── icon.icns │ │ ├── png │ │ ├── 1024x1024.png │ │ ├── 128x128.png │ │ ├── 16x16.png │ │ ├── 24x24.png │ │ ├── 256x256.png │ │ ├── 32x32.png │ │ ├── 48x48.png │ │ ├── 512x512.png │ │ └── 64x64.png │ │ └── win │ │ └── icon.ico └── js │ ├── adapter │ ├── network.js │ ├── serial.js │ └── usb.js │ ├── base │ └── adapter.js │ ├── constant.js │ ├── index.js │ ├── printer.js │ └── service.js ├── test └── test.js └── yarn.lock /.compilerc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "development": { 4 | "application/javascript": { 5 | "presets": [ 6 | [ 7 | "env", 8 | { 9 | "targets": { 10 | "electron": "1.6" 11 | } 12 | } 13 | ], 14 | "react" 15 | ], 16 | "plugins": [ 17 | "transform-async-to-generator" 18 | ], 19 | "sourceMaps": "inline" 20 | } 21 | }, 22 | "production": { 23 | "application/javascript": { 24 | "presets": [ 25 | [ 26 | "env", 27 | { 28 | "targets": { 29 | "electron": "1.6" 30 | } 31 | } 32 | ], 33 | "react" 34 | ], 35 | "plugins": [ 36 | "transform-async-to-generator" 37 | ], 38 | "sourceMaps": "none" 39 | } 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "standard", 4 | "plugin:vue/recommended", 5 | "plugin:import/errors", 6 | "plugin:import/warnings" 7 | ], 8 | "env": { 9 | "node": true, 10 | "mocha": true 11 | }, 12 | "plugins": ["import", "html"], 13 | "parserOptions": { 14 | "ecmaVersion": 8 15 | }, 16 | "settings": { 17 | "html/indent": "+4", 18 | "html/html-extensions": [".html"] 19 | }, 20 | "rules": { 21 | "curly": ["error", "multi-or-nest"], 22 | "comma-dangle": ["error", "always-multiline"], 23 | "prefer-const": "error", 24 | "import/extensions": "off", 25 | "import/order": ["error", { "newlines-between": "never" }], 26 | "import/no-extraneous-dependencies": "off", 27 | "import/no-unresolved": ["error", { "ignore": ["electron"] }], 28 | "linebreak-style": ["error", "unix"], 29 | "key-spacing": ["error", { 30 | "align": { 31 | "beforeColon": false, 32 | "afterColon": true, 33 | "on": "colon" 34 | }, 35 | }], 36 | "quote-props": ["error", "as-needed"], 37 | "object-curly-spacing": ["error", "always"], 38 | "no-var": "error" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 18 | .grunt 19 | 20 | # node-waf configuration 21 | .lock-wscript 22 | 23 | # Compiled binary addons (http://nodejs.org/api/addons.html) 24 | build/Release 25 | 26 | # Dependency directory 27 | # https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git 28 | node_modules 29 | out 30 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | os: 2 | - linux 3 | dist: trusty 4 | sudo: false 5 | language: node_js 6 | node_js: 7 | - lts/* 8 | matrix: 9 | include: 10 | - env: BUILD_ARCH=x64 11 | addons: 12 | apt: 13 | packages: 14 | - rpm 15 | - dpkg 16 | - fakeroot 17 | - libudev-dev 18 | - libxss1 19 | - libgtk2.0-0 20 | - libgconf-2-4 21 | - libnss3 22 | - libxtst6 23 | - libasound2 24 | - libusb-0.1-4 25 | - libusb-1.0-0 26 | - env: BUILD_ARCH=ia32 27 | addons: 28 | apt: 29 | packages: 30 | - rpm 31 | - dpkg 32 | - fakeroot 33 | - multiarch-support 34 | - libudev-dev:i386 35 | - libxss1:i386 36 | - libgtk2.0-0:i386 37 | - libgconf-2-4:i386 38 | - libnss3:i386 39 | - libxtst6:i386 40 | - libasound2:i386 41 | - libusb-0.1-4:i386 42 | - libusb-1.0-0:i386 43 | - gcc-multilib 44 | - g++-multilib 45 | allow_failures: 46 | - env: BUILD_ARCH=ia32 47 | fast_finish: true 48 | cache: 49 | directories: 50 | - $HOME/.npm 51 | - $(npm config get prefix)/lib/node_modules 52 | - $(npm config get prefix)/bin/electron-forge 53 | - node_modules 54 | install: 55 | - electron-forge --version || npm install -g electron-forge 56 | - npm install --ignore-scripts 57 | - node node_modules/electron-chromedriver/download-chromedriver.js 58 | before_script: 59 | - "export DISPLAY=:99.0" 60 | - "sh -e /etc/init.d/xvfb start" 61 | - sleep 3 62 | script: 63 | - npm run lint 64 | - electron-forge make -a $BUILD_ARCH 65 | - npm run test 66 | after_failure: 67 | - cat $HOME/recta-error.log 68 | notifications: 69 | slack: recta-project:4FFGkXeZXIJdPYi3Xkp6i9YK 70 | deploy: 71 | provider: releases 72 | api_key: 73 | secure: UXy9Qxc/tBB/3lhMASY34snXtmO/urwoF+zYAUcauFQtxLeJ5x0uqW+BfOffaJd1ZlknrvRzaBg55Sy+SUaq96QaPyBQHTx5zm/AFsv6/uub9fBOBOUHyKJOzh3f3FEfb+/YeqzCAlH3BvnK4RUOCyasg//XxgNqFg6lyRF/+LfKj803+xeoZNptompNa4GPiJhCXyNn5/DEQ/1xJdSq3r12hZh+YPE5scGCyXfxx0gAKfCnhpnHXSmQkmk8xlRkwkg3qVezvCrYgEl9VRt0lkTLGeqQea5/cOsyonSL/diemNsOuPHjJl6Y4oR7MgHh/hnm9AIn6I3ihazhCDNIX7G/FQnsukQoYcDVjJ83pd7/frk30LfLzpNAbJzHJZC1HvcS5pX4L8dcoEBknTv+miOIsLzIq5kIw7GA2wcQGX3FR9Ny/FOu58EX7CmZ8jpSNzJjF/CKkXT7vHsajnpANvfnvXOcyPZ0LbAtwAaDo/+VoUV4ShY2Tq4ue4omwm/io98A/Uh4EAO3teREtwuLL7Z2olxiRffHepmCRr2bqGsN+qWWAHwItpKAGiKo98XiyvfEOYOne/kOloe7aoj3VzrNzSQ4rGCmt5d/7ggUWIX2nLZPMrZtTHkWoF8jHMP3MphlPmcfKuSlEolifs96C574dR8UYB56jTu3JKPDKt8= 74 | file_glob: true 75 | file: out/make/* 76 | draft: true 77 | tag_name: $TRAVIS_TAG 78 | skip_cleanup: true 79 | on: 80 | tags: true 81 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright 2017 Ade Novid 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Recta Host 2 | 3 | > Direct printing from Browser 4 | 5 | [![Build Status](https://travis-ci.org/adenvt/recta-host.svg?branch=master)](https://travis-ci.org/adenvt/recta-host) 6 | [![Build status](https://ci.appveyor.com/api/projects/status/fpyk12ifj4j4re57/branch/master?svg=true)](https://ci.appveyor.com/project/adenvt/recta-host/branch/master) 7 | [![GitHub version](https://badge.fury.io/gh/adenvt%2Frecta-host.svg)](https://badge.fury.io/gh/adenvt%2Frecta-host) 8 | 9 | ## Installation 10 | 11 | ### A) Installer 12 | 13 | | Platform | 32-bit | 64-bit | 14 | |------------------------|-----------------------------------------------|---------------------------------------------| 15 | | Windows (.exe) | [exe][win32-ia32-exe] - [zip][win32-ia32-zip] | [exe][win32-x64-exe] - [zip][win32-x64-zip] | 16 | | Debian / Ubuntu (.deb) | [deb][linux-ia32-deb] - [zip][linux-ia32-zip] | [deb][linux-x64-deb] - [zip][linux-x64-zip] | 17 | | Redhat / Centos (.rpm) | [rpm][linux-ia32-rpm] - [zip][linux-ia32-zip] | [rpm][linux-x64-rpm] - [zip][linux-x64-zip] | 18 | 19 | #### Windows 20 | Use [Zadig][zadig] to install the WinUSB driver for your USB device. Otherwise you will get `LIBUSB_ERROR_NOT_SUPPORTED` when attempting to open devices. 21 | 22 | ### B) Compile from Source 23 | 24 | #### 1. Install Build Tools 25 | 26 | ##### On Windows 27 | 28 | * **Fast Ways**: Microsoft's [windows-build-tools][win-build-tool], run `npm install --global --production windows-build-tools` on PowerShell or CMD.exe *(run as Administrator)* 29 | 30 | * **Manual**: see [here][node-gyp#2] 31 | 32 | ##### On Linux 33 | 34 | * **Python** v2.7 35 | * **Build essential**: on Debian / Ubuntu, `sudo apt install build-essential` 36 | * **Libudev**: on Debian / Ubuntu, `sudo apt install libudev-dev` 37 | 38 | #### 2. Install Electron Forge 39 | 40 | ```bash 41 | npm install -g electron-forge 42 | ``` 43 | 44 | #### 3. Install Dependencies 45 | 46 | ```bash 47 | npm install 48 | ``` 49 | 50 | #### 4. Compiling 51 | 52 | ```bash 53 | npm run make 54 | ``` 55 | You can find your installer on folder `out/make` 56 | 57 | ## License 58 | 59 | This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details 60 | 61 | [win32-ia32-exe]: https://github.com/adenvt/recta-host/releases/download/1.0.0/recta-host-win32-ia32-1.0.0-setup.exe 62 | [win32-ia32-zip]: https://github.com/adenvt/recta-host/releases/download/1.0.0/recta-host-win32-ia32-1.0.0.zip 63 | [win32-x64-exe]: https://github.com/adenvt/recta-host/releases/download/1.0.0/recta-host-win32-x64-1.0.0-setup.exe 64 | [win32-x64-zip]: https://github.com/adenvt/recta-host/releases/download/1.0.0/recta-host-win32-x64-1.0.0.zip 65 | [linux-ia32-deb]: https://github.com/adenvt/recta-host/releases/download/1.0.0/recta-host-linux-ia32-1.0.0.deb 66 | [linux-ia32-rpm]: https://github.com/adenvt/recta-host/releases/download/1.0.0/recta-host-linux-ia32-1.0.0.rpm 67 | [linux-ia32-zip]: https://github.com/adenvt/recta-host/releases/download/1.0.0/recta-host-linux-ia32-1.0.0.zip 68 | [linux-x64-deb]: https://github.com/adenvt/recta-host/releases/download/1.0.0/recta-host-linux-x64-1.0.0.deb 69 | [linux-x64-rpm]: https://github.com/adenvt/recta-host/releases/download/1.0.0/recta-host-linux-x64-1.0.0.rpm 70 | [linux-x64-zip]: https://github.com/adenvt/recta-host/releases/download/1.0.0/recta-host-linux-x64-1.0.0.zip 71 | [zadig]: http://zadig.akeo.ie/ 72 | [win-build-tool]: https://github.com/felixrieseberg/windows-build-tools 73 | [node-gyp#2]: https://github.com/nodejs/node-gyp#option-2 74 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | os: unstable 2 | version: 1.0.0+{build} 3 | skip_commits: 4 | message: /.*\[skip appveyor\].*/ 5 | pull_requests: 6 | do_not_increment_build_number: true 7 | image: 8 | - Visual Studio 2015 9 | environment: 10 | nodejs_version: "6" 11 | platform: 12 | - x86 13 | - x64 14 | artifacts: 15 | - path: 'out\make\**\*' 16 | name: AllBinary 17 | cache: 18 | - '%AppData%\npm-cache' 19 | - '%AppData%\npm\node_modules' 20 | - '%AppData%\npm\electron-forge' 21 | - '%AppData%\npm\electron-forge.cmd' 22 | - node_modules 23 | install: 24 | - ps: Install-Product node $env:nodejs_version $env:platform 25 | - electron-forge --version || npm install -g electron-forge 26 | - npm install --ignore-scripts 27 | - node node_modules/electron-chromedriver/download-chromedriver.js 28 | build_script: 29 | - npm run lint 30 | - npm run make 31 | on_failure: 32 | - ps: Get-Content %userprofile%\recta-error.log 33 | test_script: 34 | - npm run test 35 | deploy: 36 | description: 'Recta v$(APPVEYOR_REPO_TAG_NAME)' 37 | provider: GitHub 38 | auth_token: 39 | secure: Pbm0ftBxOpWGbiavZdiOj6tEliYkE1pTwwOMjOZE6oEPSzkg9Pp3VXSHFUPO3S6h 40 | artifact: AllBinary 41 | draft: true 42 | on: 43 | appveyor_repo_tag: true 44 | notifications: 45 | - provider: Slack 46 | incoming_webhook: 47 | secure: OFFtfKKDuAjky0+Ora5gl19SjGcb912ETMXSyo8B1EA8A6VjXlMO6e6TNHs/cYscRhawijQV/cLSbLGlOaJTEALax8KTRr4RCNqaSq03/II= 48 | channel: '#recta-host' 49 | -------------------------------------------------------------------------------- /forge.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const { version } = require('./package.json') 3 | const { platform, arch } = process 4 | 5 | module.exports = { 6 | make_targets: { 7 | win32: [ 8 | 'squirrel', 9 | 'zip', 10 | ], 11 | darwin: [ 12 | 'zip', 13 | ], 14 | linux: [ 15 | 'deb', 16 | 'rpm', 17 | 'zip', 18 | ], 19 | }, 20 | electronPackagerConfig: { 21 | asar : true, 22 | ignore: [ 23 | '^/\\.', 24 | '^/[\\w\\.]+\\.log$', 25 | '^/yarn', 26 | '^/node_modules/uws', 27 | '^/node_modules/\\.cache', 28 | '^/test', 29 | '^/appveyor\\.yml', 30 | ], 31 | appCopyright : 'Copyright (C) 2017 Ade Novid.', 32 | icon : 'src/img/icons/win/icon.ico', 33 | win32metadata: { 34 | CompanyName : 'Recta', 35 | FileDescription : 'Recta Host', 36 | InternalName : 'Recta Host', 37 | ProductName : 'Recta Host', 38 | OriginalFilename: 'recta-host.exe', 39 | }, 40 | download: { 41 | cache: 'node_modules/.cache/electron', 42 | }, 43 | }, 44 | electronWinstallerConfig: { 45 | name : `recta-host-${platform}-${arch}`, 46 | iconUrl : 'https://raw.githubusercontent.com/adenvt/recta-host/develop/src/img/icons/win/icon.ico', 47 | setupIcon : 'src/img/icons/win/icon.ico', 48 | setupExe : `recta-host-${platform}-${arch}-${version}-setup.exe`, 49 | loadingGif: 'src/img/animation/loading.gif', 50 | }, 51 | electronInstallerDebian: { 52 | icon: { 53 | '48x48' : 'src/img/icons/png/48x48.png', 54 | '64x64' : 'src/img/icons/png/64x64.png', 55 | '128x128': 'src/img/icons/png/128x128.png', 56 | '256x256': 'src/img/icons/png/256x256.png', 57 | }, 58 | rename (dest, src) { 59 | return path.join(dest, `recta-host-${platform}-${arch}-${version}.deb`) 60 | }, 61 | }, 62 | electronInstallerRedhat: { 63 | icon: { 64 | '48x48' : 'src/img/icons/png/48x48.png', 65 | '64x64' : 'src/img/icons/png/64x64.png', 66 | '128x128': 'src/img/icons/png/128x128.png', 67 | '256x256': 'src/img/icons/png/256x256.png', 68 | }, 69 | rename (dest, src) { 70 | return path.join(dest, `recta-host-${platform}-${arch}-${version}.rpm`) 71 | }, 72 | }, 73 | github_repository: { 74 | owner: 'adenvt', 75 | name : 'recta-host', 76 | }, 77 | windowsStoreConfig: { 78 | packageName: '', 79 | name : 'rectahost', 80 | }, 81 | } 82 | -------------------------------------------------------------------------------- /npm-shrinkwrap.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "recta-host", 3 | "version": "1.0.0", 4 | "dependencies": { 5 | "@paulcbetts/mime-db": { 6 | "version": "1.22.4", 7 | "from": "@paulcbetts/mime-db@>=1.22.0 <1.23.0", 8 | "resolved": "https://registry.npmjs.org/@paulcbetts/mime-db/-/mime-db-1.22.4.tgz" 9 | }, 10 | "@paulcbetts/mime-types": { 11 | "version": "2.1.10", 12 | "from": "@paulcbetts/mime-types@>=2.1.10 <3.0.0", 13 | "resolved": "https://registry.npmjs.org/@paulcbetts/mime-types/-/mime-types-2.1.10.tgz" 14 | }, 15 | "@types/node": { 16 | "version": "7.0.42", 17 | "from": "@types/node@>=7.0.12 <8.0.0", 18 | "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.42.tgz" 19 | }, 20 | "7zip": { 21 | "version": "0.0.6", 22 | "from": "7zip@0.0.6", 23 | "resolved": "https://registry.npmjs.org/7zip/-/7zip-0.0.6.tgz" 24 | }, 25 | "abbrev": { 26 | "version": "1.1.0", 27 | "from": "abbrev@>=1.0.0 <2.0.0", 28 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz" 29 | }, 30 | "accepts": { 31 | "version": "1.3.3", 32 | "from": "accepts@1.3.3", 33 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz" 34 | }, 35 | "after": { 36 | "version": "0.8.2", 37 | "from": "after@0.8.2", 38 | "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz" 39 | }, 40 | "ajv": { 41 | "version": "4.11.8", 42 | "from": "ajv@>=4.9.1 <5.0.0", 43 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz" 44 | }, 45 | "alphanum-sort": { 46 | "version": "1.0.2", 47 | "from": "alphanum-sort@>=1.0.1 <2.0.0", 48 | "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz" 49 | }, 50 | "ansi-regex": { 51 | "version": "2.1.1", 52 | "from": "ansi-regex@>=2.0.0 <3.0.0", 53 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" 54 | }, 55 | "ansi-styles": { 56 | "version": "2.2.1", 57 | "from": "ansi-styles@>=2.2.1 <3.0.0", 58 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" 59 | }, 60 | "applescript": { 61 | "version": "1.0.0", 62 | "from": "applescript@>=1.0.0 <2.0.0", 63 | "resolved": "https://registry.npmjs.org/applescript/-/applescript-1.0.0.tgz" 64 | }, 65 | "aproba": { 66 | "version": "1.1.2", 67 | "from": "aproba@>=1.0.3 <2.0.0", 68 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.2.tgz" 69 | }, 70 | "are-we-there-yet": { 71 | "version": "1.1.4", 72 | "from": "are-we-there-yet@>=1.1.2 <1.2.0", 73 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz" 74 | }, 75 | "argparse": { 76 | "version": "1.0.9", 77 | "from": "argparse@>=1.0.7 <2.0.0", 78 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz" 79 | }, 80 | "arraybuffer.slice": { 81 | "version": "0.0.6", 82 | "from": "arraybuffer.slice@0.0.6", 83 | "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz" 84 | }, 85 | "asn1": { 86 | "version": "0.2.3", 87 | "from": "asn1@>=0.2.3 <0.3.0", 88 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" 89 | }, 90 | "assert-plus": { 91 | "version": "0.2.0", 92 | "from": "assert-plus@>=0.2.0 <0.3.0", 93 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz" 94 | }, 95 | "asynckit": { 96 | "version": "0.4.0", 97 | "from": "asynckit@>=0.4.0 <0.5.0", 98 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" 99 | }, 100 | "auto-launch": { 101 | "version": "5.0.1", 102 | "from": "auto-launch@>=5.0.1 <6.0.0", 103 | "resolved": "https://registry.npmjs.org/auto-launch/-/auto-launch-5.0.1.tgz" 104 | }, 105 | "autoprefixer": { 106 | "version": "6.7.7", 107 | "from": "autoprefixer@>=6.3.1 <7.0.0", 108 | "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz" 109 | }, 110 | "aws-sign2": { 111 | "version": "0.6.0", 112 | "from": "aws-sign2@>=0.6.0 <0.7.0", 113 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz" 114 | }, 115 | "aws4": { 116 | "version": "1.6.0", 117 | "from": "aws4@>=1.2.1 <2.0.0", 118 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz" 119 | }, 120 | "backo2": { 121 | "version": "1.0.2", 122 | "from": "backo2@1.0.2", 123 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz" 124 | }, 125 | "balanced-match": { 126 | "version": "1.0.0", 127 | "from": "balanced-match@>=1.0.0 <2.0.0", 128 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" 129 | }, 130 | "base64-arraybuffer": { 131 | "version": "0.1.5", 132 | "from": "base64-arraybuffer@0.1.5", 133 | "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz" 134 | }, 135 | "base64id": { 136 | "version": "1.0.0", 137 | "from": "base64id@1.0.0", 138 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz" 139 | }, 140 | "bcrypt-pbkdf": { 141 | "version": "1.0.1", 142 | "from": "bcrypt-pbkdf@>=1.0.0 <2.0.0", 143 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 144 | "optional": true 145 | }, 146 | "better-assert": { 147 | "version": "1.0.2", 148 | "from": "better-assert@>=1.0.0 <1.1.0", 149 | "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz" 150 | }, 151 | "bindings": { 152 | "version": "1.3.0", 153 | "from": "bindings@1.3.0", 154 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz" 155 | }, 156 | "blob": { 157 | "version": "0.0.4", 158 | "from": "blob@0.0.4", 159 | "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz" 160 | }, 161 | "block-stream": { 162 | "version": "0.0.9", 163 | "from": "block-stream@*", 164 | "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz" 165 | }, 166 | "boom": { 167 | "version": "2.10.1", 168 | "from": "boom@>=2.0.0 <3.0.0", 169 | "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" 170 | }, 171 | "brace-expansion": { 172 | "version": "1.1.8", 173 | "from": "brace-expansion@>=1.1.7 <2.0.0", 174 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz" 175 | }, 176 | "browserslist": { 177 | "version": "1.7.7", 178 | "from": "browserslist@>=1.7.6 <2.0.0", 179 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz" 180 | }, 181 | "btoa": { 182 | "version": "1.1.2", 183 | "from": "btoa@>=1.1.2 <2.0.0", 184 | "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.1.2.tgz" 185 | }, 186 | "builtin-modules": { 187 | "version": "1.1.1", 188 | "from": "builtin-modules@>=1.0.0 <2.0.0", 189 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" 190 | }, 191 | "callsite": { 192 | "version": "1.0.0", 193 | "from": "callsite@1.0.0", 194 | "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz" 195 | }, 196 | "camelcase": { 197 | "version": "3.0.0", 198 | "from": "camelcase@>=3.0.0 <4.0.0", 199 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz" 200 | }, 201 | "caniuse-api": { 202 | "version": "1.6.1", 203 | "from": "caniuse-api@>=1.5.2 <2.0.0", 204 | "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz" 205 | }, 206 | "caniuse-db": { 207 | "version": "1.0.30000716", 208 | "from": "caniuse-db@>=1.0.30000634 <2.0.0", 209 | "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000716.tgz" 210 | }, 211 | "caseless": { 212 | "version": "0.12.0", 213 | "from": "caseless@>=0.12.0 <0.13.0", 214 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" 215 | }, 216 | "chalk": { 217 | "version": "1.1.3", 218 | "from": "chalk@>=1.1.1 <2.0.0", 219 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" 220 | }, 221 | "clap": { 222 | "version": "1.2.0", 223 | "from": "clap@>=1.0.9 <2.0.0", 224 | "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.0.tgz" 225 | }, 226 | "cliui": { 227 | "version": "3.2.0", 228 | "from": "cliui@>=3.2.0 <4.0.0", 229 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz" 230 | }, 231 | "clone": { 232 | "version": "1.0.2", 233 | "from": "clone@>=1.0.2 <2.0.0", 234 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz" 235 | }, 236 | "co": { 237 | "version": "4.6.0", 238 | "from": "co@>=4.6.0 <5.0.0", 239 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz" 240 | }, 241 | "coa": { 242 | "version": "1.0.4", 243 | "from": "coa@>=1.0.1 <1.1.0", 244 | "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz" 245 | }, 246 | "code-point-at": { 247 | "version": "1.1.0", 248 | "from": "code-point-at@>=1.0.0 <2.0.0", 249 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" 250 | }, 251 | "color": { 252 | "version": "0.11.4", 253 | "from": "color@>=0.11.0 <0.12.0", 254 | "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz" 255 | }, 256 | "color-convert": { 257 | "version": "1.9.0", 258 | "from": "color-convert@>=1.3.0 <2.0.0", 259 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz" 260 | }, 261 | "color-name": { 262 | "version": "1.1.3", 263 | "from": "color-name@>=1.1.1 <2.0.0", 264 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" 265 | }, 266 | "color-string": { 267 | "version": "0.3.0", 268 | "from": "color-string@>=0.3.0 <0.4.0", 269 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz" 270 | }, 271 | "colormin": { 272 | "version": "1.1.2", 273 | "from": "colormin@>=1.0.5 <2.0.0", 274 | "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz" 275 | }, 276 | "colors": { 277 | "version": "1.1.2", 278 | "from": "colors@>=1.1.2 <1.2.0", 279 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz" 280 | }, 281 | "combined-stream": { 282 | "version": "1.0.5", 283 | "from": "combined-stream@>=1.0.5 <1.1.0", 284 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz" 285 | }, 286 | "commander": { 287 | "version": "2.11.0", 288 | "from": "commander@>=2.11.0 <3.0.0", 289 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz" 290 | }, 291 | "component-bind": { 292 | "version": "1.0.0", 293 | "from": "component-bind@1.0.0", 294 | "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz" 295 | }, 296 | "component-emitter": { 297 | "version": "1.2.1", 298 | "from": "component-emitter@1.2.1", 299 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz" 300 | }, 301 | "component-inherit": { 302 | "version": "0.0.3", 303 | "from": "component-inherit@0.0.3", 304 | "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz" 305 | }, 306 | "concat-map": { 307 | "version": "0.0.1", 308 | "from": "concat-map@0.0.1", 309 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" 310 | }, 311 | "conf": { 312 | "version": "1.1.2", 313 | "from": "conf@>=1.0.0 <2.0.0", 314 | "resolved": "https://registry.npmjs.org/conf/-/conf-1.1.2.tgz" 315 | }, 316 | "console-control-strings": { 317 | "version": "1.1.0", 318 | "from": "console-control-strings@>=1.1.0 <1.2.0", 319 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" 320 | }, 321 | "convert-source-map": { 322 | "version": "1.5.0", 323 | "from": "convert-source-map@>=1.2.0 <2.0.0", 324 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz" 325 | }, 326 | "cookie": { 327 | "version": "0.3.1", 328 | "from": "cookie@0.3.1", 329 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz" 330 | }, 331 | "core-util-is": { 332 | "version": "1.0.2", 333 | "from": "core-util-is@>=1.0.0 <1.1.0", 334 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" 335 | }, 336 | "cross-unzip": { 337 | "version": "0.0.2", 338 | "from": "cross-unzip@0.0.2", 339 | "resolved": "https://registry.npmjs.org/cross-unzip/-/cross-unzip-0.0.2.tgz" 340 | }, 341 | "cryptiles": { 342 | "version": "2.0.5", 343 | "from": "cryptiles@>=2.0.0 <3.0.0", 344 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" 345 | }, 346 | "css-color-names": { 347 | "version": "0.0.4", 348 | "from": "css-color-names@0.0.4", 349 | "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz" 350 | }, 351 | "cssnano": { 352 | "version": "3.10.0", 353 | "from": "cssnano@>=3.3.2 <4.0.0", 354 | "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz" 355 | }, 356 | "csso": { 357 | "version": "2.3.2", 358 | "from": "csso@>=2.3.1 <2.4.0", 359 | "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz" 360 | }, 361 | "dashdash": { 362 | "version": "1.14.1", 363 | "from": "dashdash@>=1.12.0 <2.0.0", 364 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 365 | "dependencies": { 366 | "assert-plus": { 367 | "version": "1.0.0", 368 | "from": "assert-plus@>=1.0.0 <2.0.0", 369 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" 370 | } 371 | } 372 | }, 373 | "de-indent": { 374 | "version": "1.0.2", 375 | "from": "de-indent@>=1.0.2 <2.0.0", 376 | "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz" 377 | }, 378 | "debug": { 379 | "version": "2.6.8", 380 | "from": "debug@>=2.5.1 <3.0.0", 381 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz" 382 | }, 383 | "decamelize": { 384 | "version": "1.2.0", 385 | "from": "decamelize@>=1.1.1 <2.0.0", 386 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" 387 | }, 388 | "deep-extend": { 389 | "version": "0.4.2", 390 | "from": "deep-extend@>=0.4.0 <0.5.0", 391 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz" 392 | }, 393 | "defined": { 394 | "version": "1.0.0", 395 | "from": "defined@>=1.0.0 <2.0.0", 396 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" 397 | }, 398 | "delayed-stream": { 399 | "version": "1.0.0", 400 | "from": "delayed-stream@>=1.0.0 <1.1.0", 401 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" 402 | }, 403 | "delegates": { 404 | "version": "1.0.0", 405 | "from": "delegates@>=1.0.0 <2.0.0", 406 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" 407 | }, 408 | "dot-prop": { 409 | "version": "4.2.0", 410 | "from": "dot-prop@>=4.1.0 <5.0.0", 411 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz" 412 | }, 413 | "ecc-jsbn": { 414 | "version": "0.1.1", 415 | "from": "ecc-jsbn@>=0.1.1 <0.2.0", 416 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 417 | "optional": true 418 | }, 419 | "electron-compile": { 420 | "version": "6.4.1", 421 | "from": "electron-compile@>=6.4.1 <7.0.0", 422 | "resolved": "https://registry.npmjs.org/electron-compile/-/electron-compile-6.4.1.tgz" 423 | }, 424 | "electron-config": { 425 | "version": "1.0.0", 426 | "from": "electron-config@>=1.0.0 <2.0.0", 427 | "resolved": "https://registry.npmjs.org/electron-config/-/electron-config-1.0.0.tgz" 428 | }, 429 | "electron-devtools-installer": { 430 | "version": "2.2.0", 431 | "from": "electron-devtools-installer@>=2.0.1 <3.0.0", 432 | "resolved": "https://registry.npmjs.org/electron-devtools-installer/-/electron-devtools-installer-2.2.0.tgz" 433 | }, 434 | "electron-positioner": { 435 | "version": "3.0.0", 436 | "from": "electron-positioner@latest", 437 | "resolved": "https://registry.npmjs.org/electron-positioner/-/electron-positioner-3.0.0.tgz" 438 | }, 439 | "electron-squirrel-startup": { 440 | "version": "1.0.0", 441 | "from": "electron-squirrel-startup@>=1.0.0 <2.0.0", 442 | "resolved": "https://registry.npmjs.org/electron-squirrel-startup/-/electron-squirrel-startup-1.0.0.tgz" 443 | }, 444 | "electron-to-chromium": { 445 | "version": "1.3.18", 446 | "from": "electron-to-chromium@>=1.2.7 <2.0.0", 447 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.18.tgz" 448 | }, 449 | "engine.io": { 450 | "version": "3.1.0", 451 | "from": "engine.io@>=3.1.0 <3.2.0", 452 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.0.tgz" 453 | }, 454 | "engine.io-client": { 455 | "version": "3.1.1", 456 | "from": "engine.io-client@>=3.1.0 <3.2.0", 457 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.1.tgz" 458 | }, 459 | "engine.io-parser": { 460 | "version": "2.1.1", 461 | "from": "engine.io-parser@>=2.1.0 <2.2.0", 462 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.1.tgz" 463 | }, 464 | "env-paths": { 465 | "version": "1.0.0", 466 | "from": "env-paths@>=1.0.0 <2.0.0", 467 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz" 468 | }, 469 | "error-ex": { 470 | "version": "1.3.1", 471 | "from": "error-ex@>=1.2.0 <2.0.0", 472 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz" 473 | }, 474 | "escape-string-regexp": { 475 | "version": "1.0.5", 476 | "from": "escape-string-regexp@>=1.0.2 <2.0.0", 477 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" 478 | }, 479 | "esprima": { 480 | "version": "2.7.3", 481 | "from": "esprima@>=2.6.0 <3.0.0", 482 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" 483 | }, 484 | "extend": { 485 | "version": "3.0.1", 486 | "from": "extend@>=3.0.0 <3.1.0", 487 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz" 488 | }, 489 | "extsprintf": { 490 | "version": "1.3.0", 491 | "from": "extsprintf@1.3.0", 492 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" 493 | }, 494 | "find-up": { 495 | "version": "1.1.2", 496 | "from": "find-up@>=1.0.0 <2.0.0", 497 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" 498 | }, 499 | "flatten": { 500 | "version": "1.0.2", 501 | "from": "flatten@>=1.0.2 <2.0.0", 502 | "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz" 503 | }, 504 | "forever-agent": { 505 | "version": "0.6.1", 506 | "from": "forever-agent@>=0.6.1 <0.7.0", 507 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" 508 | }, 509 | "form-data": { 510 | "version": "2.1.4", 511 | "from": "form-data@>=2.1.1 <2.2.0", 512 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz" 513 | }, 514 | "fs.realpath": { 515 | "version": "1.0.0", 516 | "from": "fs.realpath@>=1.0.0 <2.0.0", 517 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" 518 | }, 519 | "fstream": { 520 | "version": "1.0.11", 521 | "from": "fstream@>=1.0.2 <2.0.0", 522 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz" 523 | }, 524 | "fstream-ignore": { 525 | "version": "1.0.5", 526 | "from": "fstream-ignore@>=1.0.5 <2.0.0", 527 | "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz" 528 | }, 529 | "function-bind": { 530 | "version": "1.1.0", 531 | "from": "function-bind@>=1.0.2 <2.0.0", 532 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz" 533 | }, 534 | "gauge": { 535 | "version": "2.7.4", 536 | "from": "gauge@>=2.7.3 <2.8.0", 537 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz" 538 | }, 539 | "get-caller-file": { 540 | "version": "1.0.2", 541 | "from": "get-caller-file@>=1.0.1 <2.0.0", 542 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz" 543 | }, 544 | "getpass": { 545 | "version": "0.1.7", 546 | "from": "getpass@>=0.1.1 <0.2.0", 547 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 548 | "dependencies": { 549 | "assert-plus": { 550 | "version": "1.0.0", 551 | "from": "assert-plus@>=1.0.0 <2.0.0", 552 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" 553 | } 554 | } 555 | }, 556 | "glob": { 557 | "version": "7.1.2", 558 | "from": "glob@>=7.0.5 <8.0.0", 559 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz" 560 | }, 561 | "graceful-fs": { 562 | "version": "4.1.11", 563 | "from": "graceful-fs@>=4.1.2 <5.0.0", 564 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" 565 | }, 566 | "har-schema": { 567 | "version": "1.0.5", 568 | "from": "har-schema@>=1.0.5 <2.0.0", 569 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz" 570 | }, 571 | "har-validator": { 572 | "version": "4.2.1", 573 | "from": "har-validator@>=4.2.1 <4.3.0", 574 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz" 575 | }, 576 | "has": { 577 | "version": "1.0.1", 578 | "from": "has@>=1.0.1 <2.0.0", 579 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" 580 | }, 581 | "has-ansi": { 582 | "version": "2.0.0", 583 | "from": "has-ansi@>=2.0.0 <3.0.0", 584 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" 585 | }, 586 | "has-binary2": { 587 | "version": "1.0.2", 588 | "from": "has-binary2@>=1.0.2 <1.1.0", 589 | "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz" 590 | }, 591 | "has-cors": { 592 | "version": "1.1.0", 593 | "from": "has-cors@1.1.0", 594 | "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz" 595 | }, 596 | "has-flag": { 597 | "version": "1.0.0", 598 | "from": "has-flag@>=1.0.0 <2.0.0", 599 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" 600 | }, 601 | "has-unicode": { 602 | "version": "2.0.1", 603 | "from": "has-unicode@>=2.0.0 <3.0.0", 604 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" 605 | }, 606 | "hash-sum": { 607 | "version": "1.0.2", 608 | "from": "hash-sum@>=1.0.2 <2.0.0", 609 | "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz" 610 | }, 611 | "hawk": { 612 | "version": "3.1.3", 613 | "from": "hawk@>=3.1.3 <3.2.0", 614 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz" 615 | }, 616 | "he": { 617 | "version": "1.1.1", 618 | "from": "he@>=1.1.0 <2.0.0", 619 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz" 620 | }, 621 | "hoek": { 622 | "version": "2.16.3", 623 | "from": "hoek@>=2.0.0 <3.0.0", 624 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" 625 | }, 626 | "hosted-git-info": { 627 | "version": "2.5.0", 628 | "from": "hosted-git-info@>=2.1.4 <3.0.0", 629 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz" 630 | }, 631 | "html-comment-regex": { 632 | "version": "1.1.1", 633 | "from": "html-comment-regex@>=1.1.0 <2.0.0", 634 | "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz" 635 | }, 636 | "http-signature": { 637 | "version": "1.1.1", 638 | "from": "http-signature@>=1.1.0 <1.2.0", 639 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz" 640 | }, 641 | "indexes-of": { 642 | "version": "1.0.1", 643 | "from": "indexes-of@>=1.0.1 <2.0.0", 644 | "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz" 645 | }, 646 | "indexof": { 647 | "version": "0.0.1", 648 | "from": "indexof@0.0.1", 649 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz" 650 | }, 651 | "inflight": { 652 | "version": "1.0.6", 653 | "from": "inflight@>=1.0.4 <2.0.0", 654 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" 655 | }, 656 | "inherits": { 657 | "version": "2.0.3", 658 | "from": "inherits@>=2.0.0 <3.0.0", 659 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" 660 | }, 661 | "ini": { 662 | "version": "1.3.4", 663 | "from": "ini@>=1.3.0 <1.4.0", 664 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" 665 | }, 666 | "invert-kv": { 667 | "version": "1.0.0", 668 | "from": "invert-kv@>=1.0.0 <2.0.0", 669 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" 670 | }, 671 | "is-absolute-url": { 672 | "version": "2.1.0", 673 | "from": "is-absolute-url@>=2.0.0 <3.0.0", 674 | "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz" 675 | }, 676 | "is-arrayish": { 677 | "version": "0.2.1", 678 | "from": "is-arrayish@>=0.2.1 <0.3.0", 679 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" 680 | }, 681 | "is-builtin-module": { 682 | "version": "1.0.0", 683 | "from": "is-builtin-module@>=1.0.0 <2.0.0", 684 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz" 685 | }, 686 | "is-fullwidth-code-point": { 687 | "version": "1.0.0", 688 | "from": "is-fullwidth-code-point@>=1.0.0 <2.0.0", 689 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" 690 | }, 691 | "is-obj": { 692 | "version": "1.0.1", 693 | "from": "is-obj@>=1.0.0 <2.0.0", 694 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" 695 | }, 696 | "is-plain-obj": { 697 | "version": "1.1.0", 698 | "from": "is-plain-obj@>=1.0.0 <2.0.0", 699 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" 700 | }, 701 | "is-svg": { 702 | "version": "2.1.0", 703 | "from": "is-svg@>=2.0.0 <3.0.0", 704 | "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz" 705 | }, 706 | "is-typedarray": { 707 | "version": "1.0.0", 708 | "from": "is-typedarray@>=1.0.0 <1.1.0", 709 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" 710 | }, 711 | "is-utf8": { 712 | "version": "0.2.1", 713 | "from": "is-utf8@>=0.2.0 <0.3.0", 714 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" 715 | }, 716 | "isarray": { 717 | "version": "2.0.1", 718 | "from": "isarray@2.0.1", 719 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz" 720 | }, 721 | "isstream": { 722 | "version": "0.1.2", 723 | "from": "isstream@>=0.1.2 <0.2.0", 724 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" 725 | }, 726 | "js-base64": { 727 | "version": "2.1.9", 728 | "from": "js-base64@>=2.1.9 <3.0.0", 729 | "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz" 730 | }, 731 | "js-yaml": { 732 | "version": "3.7.0", 733 | "from": "js-yaml@>=3.7.0 <3.8.0", 734 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz" 735 | }, 736 | "jsbn": { 737 | "version": "0.1.1", 738 | "from": "jsbn@>=0.1.0 <0.2.0", 739 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 740 | "optional": true 741 | }, 742 | "json-schema": { 743 | "version": "0.2.3", 744 | "from": "json-schema@0.2.3", 745 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz" 746 | }, 747 | "json-stable-stringify": { 748 | "version": "1.0.1", 749 | "from": "json-stable-stringify@>=1.0.1 <2.0.0", 750 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" 751 | }, 752 | "json-stringify-safe": { 753 | "version": "5.0.1", 754 | "from": "json-stringify-safe@>=5.0.1 <5.1.0", 755 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" 756 | }, 757 | "json5": { 758 | "version": "0.5.1", 759 | "from": "json5@>=0.5.1 <0.6.0", 760 | "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz" 761 | }, 762 | "jsonify": { 763 | "version": "0.0.0", 764 | "from": "jsonify@>=0.0.0 <0.1.0", 765 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" 766 | }, 767 | "jsprim": { 768 | "version": "1.4.1", 769 | "from": "jsprim@>=1.2.2 <2.0.0", 770 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 771 | "dependencies": { 772 | "assert-plus": { 773 | "version": "1.0.0", 774 | "from": "assert-plus@1.0.0", 775 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" 776 | } 777 | } 778 | }, 779 | "lcid": { 780 | "version": "1.0.0", 781 | "from": "lcid@>=1.0.0 <2.0.0", 782 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz" 783 | }, 784 | "load-json-file": { 785 | "version": "1.1.0", 786 | "from": "load-json-file@>=1.0.0 <2.0.0", 787 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz" 788 | }, 789 | "locate-path": { 790 | "version": "2.0.0", 791 | "from": "locate-path@>=2.0.0 <3.0.0", 792 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 793 | "dependencies": { 794 | "path-exists": { 795 | "version": "3.0.0", 796 | "from": "path-exists@>=3.0.0 <4.0.0", 797 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" 798 | } 799 | } 800 | }, 801 | "lodash": { 802 | "version": "4.17.4", 803 | "from": "lodash@>=4.17.4 <5.0.0", 804 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" 805 | }, 806 | "lodash.assign": { 807 | "version": "4.2.0", 808 | "from": "lodash.assign@>=4.2.0 <5.0.0", 809 | "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz" 810 | }, 811 | "lodash.memoize": { 812 | "version": "4.1.2", 813 | "from": "lodash.memoize@>=4.1.2 <5.0.0", 814 | "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" 815 | }, 816 | "lodash.uniq": { 817 | "version": "4.5.0", 818 | "from": "lodash.uniq@>=4.5.0 <5.0.0", 819 | "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" 820 | }, 821 | "lru-cache": { 822 | "version": "4.1.1", 823 | "from": "lru-cache@>=4.0.1 <5.0.0", 824 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz" 825 | }, 826 | "macaddress": { 827 | "version": "0.2.8", 828 | "from": "macaddress@>=0.2.8 <0.3.0", 829 | "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz" 830 | }, 831 | "make-dir": { 832 | "version": "1.0.0", 833 | "from": "make-dir@>=1.0.0 <2.0.0", 834 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz" 835 | }, 836 | "math-expression-evaluator": { 837 | "version": "1.2.17", 838 | "from": "math-expression-evaluator@>=1.2.14 <2.0.0", 839 | "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz" 840 | }, 841 | "mime-db": { 842 | "version": "1.29.0", 843 | "from": "mime-db@>=1.29.0 <1.30.0", 844 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz" 845 | }, 846 | "mime-types": { 847 | "version": "2.1.16", 848 | "from": "mime-types@>=2.1.11 <2.2.0", 849 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz" 850 | }, 851 | "minimatch": { 852 | "version": "3.0.4", 853 | "from": "minimatch@>=3.0.4 <4.0.0", 854 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" 855 | }, 856 | "minimist": { 857 | "version": "1.2.0", 858 | "from": "minimist@latest", 859 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" 860 | }, 861 | "mkdirp": { 862 | "version": "0.5.1", 863 | "from": "mkdirp@>=0.5.1 <0.6.0", 864 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 865 | "dependencies": { 866 | "minimist": { 867 | "version": "0.0.8", 868 | "from": "minimist@0.0.8", 869 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" 870 | } 871 | } 872 | }, 873 | "ms": { 874 | "version": "2.0.0", 875 | "from": "ms@2.0.0", 876 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" 877 | }, 878 | "nan": { 879 | "version": "2.6.2", 880 | "from": "nan@>=2.6.2 <3.0.0", 881 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz" 882 | }, 883 | "negotiator": { 884 | "version": "0.6.1", 885 | "from": "negotiator@0.6.1", 886 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz" 887 | }, 888 | "node-pre-gyp": { 889 | "version": "0.6.36", 890 | "from": "node-pre-gyp@>=0.6.30 <0.7.0", 891 | "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz" 892 | }, 893 | "nopt": { 894 | "version": "4.0.1", 895 | "from": "nopt@>=4.0.1 <5.0.0", 896 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz" 897 | }, 898 | "normalize-package-data": { 899 | "version": "2.4.0", 900 | "from": "normalize-package-data@>=2.3.2 <3.0.0", 901 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz" 902 | }, 903 | "normalize-range": { 904 | "version": "0.1.2", 905 | "from": "normalize-range@>=0.1.2 <0.2.0", 906 | "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" 907 | }, 908 | "normalize-url": { 909 | "version": "1.9.1", 910 | "from": "normalize-url@>=1.4.0 <2.0.0", 911 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz" 912 | }, 913 | "npmlog": { 914 | "version": "4.1.2", 915 | "from": "npmlog@>=4.0.2 <5.0.0", 916 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz" 917 | }, 918 | "num2fraction": { 919 | "version": "1.2.2", 920 | "from": "num2fraction@>=1.2.2 <2.0.0", 921 | "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz" 922 | }, 923 | "number-is-nan": { 924 | "version": "1.0.1", 925 | "from": "number-is-nan@>=1.0.0 <2.0.0", 926 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" 927 | }, 928 | "oauth-sign": { 929 | "version": "0.8.2", 930 | "from": "oauth-sign@>=0.8.1 <0.9.0", 931 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz" 932 | }, 933 | "object-assign": { 934 | "version": "4.1.1", 935 | "from": "object-assign@>=4.1.1 <4.2.0", 936 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" 937 | }, 938 | "object-component": { 939 | "version": "0.0.3", 940 | "from": "object-component@0.0.3", 941 | "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz" 942 | }, 943 | "once": { 944 | "version": "1.4.0", 945 | "from": "once@>=1.3.0 <2.0.0", 946 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" 947 | }, 948 | "os-homedir": { 949 | "version": "1.0.2", 950 | "from": "os-homedir@>=1.0.0 <2.0.0", 951 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" 952 | }, 953 | "os-locale": { 954 | "version": "1.4.0", 955 | "from": "os-locale@>=1.4.0 <2.0.0", 956 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz" 957 | }, 958 | "os-tmpdir": { 959 | "version": "1.0.2", 960 | "from": "os-tmpdir@>=1.0.0 <2.0.0", 961 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" 962 | }, 963 | "osenv": { 964 | "version": "0.1.4", 965 | "from": "osenv@>=0.1.4 <0.2.0", 966 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz" 967 | }, 968 | "p-limit": { 969 | "version": "1.1.0", 970 | "from": "p-limit@>=1.1.0 <2.0.0", 971 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz" 972 | }, 973 | "p-locate": { 974 | "version": "2.0.0", 975 | "from": "p-locate@>=2.0.0 <3.0.0", 976 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" 977 | }, 978 | "parse-json": { 979 | "version": "2.2.0", 980 | "from": "parse-json@>=2.2.0 <3.0.0", 981 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz" 982 | }, 983 | "parsejson": { 984 | "version": "0.0.3", 985 | "from": "parsejson@0.0.3", 986 | "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz" 987 | }, 988 | "parseqs": { 989 | "version": "0.0.5", 990 | "from": "parseqs@0.0.5", 991 | "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz" 992 | }, 993 | "parseuri": { 994 | "version": "0.0.5", 995 | "from": "parseuri@0.0.5", 996 | "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz" 997 | }, 998 | "path-exists": { 999 | "version": "2.1.0", 1000 | "from": "path-exists@>=2.0.0 <3.0.0", 1001 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz" 1002 | }, 1003 | "path-is-absolute": { 1004 | "version": "1.0.1", 1005 | "from": "path-is-absolute@>=1.0.0 <2.0.0", 1006 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" 1007 | }, 1008 | "path-type": { 1009 | "version": "1.1.0", 1010 | "from": "path-type@>=1.0.0 <2.0.0", 1011 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" 1012 | }, 1013 | "performance-now": { 1014 | "version": "0.2.0", 1015 | "from": "performance-now@>=0.2.0 <0.3.0", 1016 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz" 1017 | }, 1018 | "pify": { 1019 | "version": "2.3.0", 1020 | "from": "pify@>=2.3.0 <3.0.0", 1021 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" 1022 | }, 1023 | "pinkie": { 1024 | "version": "2.0.4", 1025 | "from": "pinkie@>=2.0.0 <3.0.0", 1026 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" 1027 | }, 1028 | "pinkie-promise": { 1029 | "version": "2.0.1", 1030 | "from": "pinkie-promise@>=2.0.0 <3.0.0", 1031 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" 1032 | }, 1033 | "pkg-up": { 1034 | "version": "2.0.0", 1035 | "from": "pkg-up@>=2.0.0 <3.0.0", 1036 | "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", 1037 | "dependencies": { 1038 | "find-up": { 1039 | "version": "2.1.0", 1040 | "from": "find-up@>=2.1.0 <3.0.0", 1041 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" 1042 | } 1043 | } 1044 | }, 1045 | "postcss": { 1046 | "version": "5.2.17", 1047 | "from": "postcss@>=5.0.10 <6.0.0", 1048 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", 1049 | "dependencies": { 1050 | "supports-color": { 1051 | "version": "3.2.3", 1052 | "from": "supports-color@>=3.2.3 <4.0.0", 1053 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" 1054 | } 1055 | } 1056 | }, 1057 | "postcss-calc": { 1058 | "version": "5.3.1", 1059 | "from": "postcss-calc@>=5.2.0 <6.0.0", 1060 | "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz" 1061 | }, 1062 | "postcss-colormin": { 1063 | "version": "2.2.2", 1064 | "from": "postcss-colormin@>=2.1.8 <3.0.0", 1065 | "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz" 1066 | }, 1067 | "postcss-convert-values": { 1068 | "version": "2.6.1", 1069 | "from": "postcss-convert-values@>=2.3.4 <3.0.0", 1070 | "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz" 1071 | }, 1072 | "postcss-discard-comments": { 1073 | "version": "2.0.4", 1074 | "from": "postcss-discard-comments@>=2.0.4 <3.0.0", 1075 | "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz" 1076 | }, 1077 | "postcss-discard-duplicates": { 1078 | "version": "2.1.0", 1079 | "from": "postcss-discard-duplicates@>=2.0.1 <3.0.0", 1080 | "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz" 1081 | }, 1082 | "postcss-discard-empty": { 1083 | "version": "2.1.0", 1084 | "from": "postcss-discard-empty@>=2.0.1 <3.0.0", 1085 | "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz" 1086 | }, 1087 | "postcss-discard-overridden": { 1088 | "version": "0.1.1", 1089 | "from": "postcss-discard-overridden@>=0.1.1 <0.2.0", 1090 | "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz" 1091 | }, 1092 | "postcss-discard-unused": { 1093 | "version": "2.2.3", 1094 | "from": "postcss-discard-unused@>=2.2.1 <3.0.0", 1095 | "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz" 1096 | }, 1097 | "postcss-filter-plugins": { 1098 | "version": "2.0.2", 1099 | "from": "postcss-filter-plugins@>=2.0.0 <3.0.0", 1100 | "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz" 1101 | }, 1102 | "postcss-merge-idents": { 1103 | "version": "2.1.7", 1104 | "from": "postcss-merge-idents@>=2.1.5 <3.0.0", 1105 | "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz" 1106 | }, 1107 | "postcss-merge-longhand": { 1108 | "version": "2.0.2", 1109 | "from": "postcss-merge-longhand@>=2.0.1 <3.0.0", 1110 | "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz" 1111 | }, 1112 | "postcss-merge-rules": { 1113 | "version": "2.1.2", 1114 | "from": "postcss-merge-rules@>=2.0.3 <3.0.0", 1115 | "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz" 1116 | }, 1117 | "postcss-message-helpers": { 1118 | "version": "2.0.0", 1119 | "from": "postcss-message-helpers@>=2.0.0 <3.0.0", 1120 | "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz" 1121 | }, 1122 | "postcss-minify-font-values": { 1123 | "version": "1.0.5", 1124 | "from": "postcss-minify-font-values@>=1.0.2 <2.0.0", 1125 | "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz" 1126 | }, 1127 | "postcss-minify-gradients": { 1128 | "version": "1.0.5", 1129 | "from": "postcss-minify-gradients@>=1.0.1 <2.0.0", 1130 | "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz" 1131 | }, 1132 | "postcss-minify-params": { 1133 | "version": "1.2.2", 1134 | "from": "postcss-minify-params@>=1.0.4 <2.0.0", 1135 | "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz" 1136 | }, 1137 | "postcss-minify-selectors": { 1138 | "version": "2.1.1", 1139 | "from": "postcss-minify-selectors@>=2.0.4 <3.0.0", 1140 | "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz" 1141 | }, 1142 | "postcss-normalize-charset": { 1143 | "version": "1.1.1", 1144 | "from": "postcss-normalize-charset@>=1.1.0 <2.0.0", 1145 | "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz" 1146 | }, 1147 | "postcss-normalize-url": { 1148 | "version": "3.0.8", 1149 | "from": "postcss-normalize-url@>=3.0.7 <4.0.0", 1150 | "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz" 1151 | }, 1152 | "postcss-ordered-values": { 1153 | "version": "2.2.3", 1154 | "from": "postcss-ordered-values@>=2.1.0 <3.0.0", 1155 | "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz" 1156 | }, 1157 | "postcss-reduce-idents": { 1158 | "version": "2.4.0", 1159 | "from": "postcss-reduce-idents@>=2.2.2 <3.0.0", 1160 | "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz" 1161 | }, 1162 | "postcss-reduce-initial": { 1163 | "version": "1.0.1", 1164 | "from": "postcss-reduce-initial@>=1.0.0 <2.0.0", 1165 | "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz" 1166 | }, 1167 | "postcss-reduce-transforms": { 1168 | "version": "1.0.4", 1169 | "from": "postcss-reduce-transforms@>=1.0.3 <2.0.0", 1170 | "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz" 1171 | }, 1172 | "postcss-selector-parser": { 1173 | "version": "2.2.3", 1174 | "from": "postcss-selector-parser@>=2.0.0 <3.0.0", 1175 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz" 1176 | }, 1177 | "postcss-svgo": { 1178 | "version": "2.1.6", 1179 | "from": "postcss-svgo@>=2.1.1 <3.0.0", 1180 | "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz" 1181 | }, 1182 | "postcss-unique-selectors": { 1183 | "version": "2.0.2", 1184 | "from": "postcss-unique-selectors@>=2.0.2 <3.0.0", 1185 | "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz" 1186 | }, 1187 | "postcss-value-parser": { 1188 | "version": "3.3.0", 1189 | "from": "postcss-value-parser@>=3.2.3 <4.0.0", 1190 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" 1191 | }, 1192 | "postcss-zindex": { 1193 | "version": "2.2.0", 1194 | "from": "postcss-zindex@>=2.0.1 <3.0.0", 1195 | "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz" 1196 | }, 1197 | "prepend-http": { 1198 | "version": "1.0.4", 1199 | "from": "prepend-http@>=1.0.0 <2.0.0", 1200 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz" 1201 | }, 1202 | "process-nextick-args": { 1203 | "version": "1.0.7", 1204 | "from": "process-nextick-args@>=1.0.6 <1.1.0", 1205 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" 1206 | }, 1207 | "promirepl": { 1208 | "version": "1.0.1", 1209 | "from": "promirepl@>=1.0.1 <2.0.0", 1210 | "resolved": "https://registry.npmjs.org/promirepl/-/promirepl-1.0.1.tgz" 1211 | }, 1212 | "pseudomap": { 1213 | "version": "1.0.2", 1214 | "from": "pseudomap@>=1.0.2 <2.0.0", 1215 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" 1216 | }, 1217 | "punycode": { 1218 | "version": "1.4.1", 1219 | "from": "punycode@>=1.4.1 <2.0.0", 1220 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" 1221 | }, 1222 | "q": { 1223 | "version": "1.5.0", 1224 | "from": "q@>=1.1.2 <2.0.0", 1225 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz" 1226 | }, 1227 | "qs": { 1228 | "version": "6.4.0", 1229 | "from": "qs@>=6.4.0 <6.5.0", 1230 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz" 1231 | }, 1232 | "query-string": { 1233 | "version": "4.3.4", 1234 | "from": "query-string@>=4.1.0 <5.0.0", 1235 | "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz" 1236 | }, 1237 | "rc": { 1238 | "version": "1.2.1", 1239 | "from": "rc@>=1.1.7 <2.0.0", 1240 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", 1241 | "dependencies": { 1242 | "minimist": { 1243 | "version": "1.2.0", 1244 | "from": "minimist@>=1.2.0 <2.0.0", 1245 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" 1246 | } 1247 | } 1248 | }, 1249 | "read-pkg": { 1250 | "version": "1.1.0", 1251 | "from": "read-pkg@>=1.0.0 <2.0.0", 1252 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" 1253 | }, 1254 | "read-pkg-up": { 1255 | "version": "1.0.1", 1256 | "from": "read-pkg-up@>=1.0.1 <2.0.0", 1257 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz" 1258 | }, 1259 | "readable-stream": { 1260 | "version": "2.3.3", 1261 | "from": "readable-stream@>=2.0.6 <3.0.0", 1262 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 1263 | "dependencies": { 1264 | "isarray": { 1265 | "version": "1.0.0", 1266 | "from": "isarray@>=1.0.0 <1.1.0", 1267 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" 1268 | }, 1269 | "safe-buffer": { 1270 | "version": "5.1.1", 1271 | "from": "safe-buffer@>=5.1.1 <5.2.0", 1272 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" 1273 | } 1274 | } 1275 | }, 1276 | "reduce-css-calc": { 1277 | "version": "1.3.0", 1278 | "from": "reduce-css-calc@>=1.2.6 <2.0.0", 1279 | "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", 1280 | "dependencies": { 1281 | "balanced-match": { 1282 | "version": "0.4.2", 1283 | "from": "balanced-match@>=0.4.2 <0.5.0", 1284 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" 1285 | } 1286 | } 1287 | }, 1288 | "reduce-function-call": { 1289 | "version": "1.0.2", 1290 | "from": "reduce-function-call@>=1.0.1 <2.0.0", 1291 | "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", 1292 | "dependencies": { 1293 | "balanced-match": { 1294 | "version": "0.4.2", 1295 | "from": "balanced-match@>=0.4.2 <0.5.0", 1296 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" 1297 | } 1298 | } 1299 | }, 1300 | "request": { 1301 | "version": "2.81.0", 1302 | "from": "request@>=2.81.0 <3.0.0", 1303 | "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz" 1304 | }, 1305 | "require-directory": { 1306 | "version": "2.1.1", 1307 | "from": "require-directory@>=2.1.1 <3.0.0", 1308 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" 1309 | }, 1310 | "require-main-filename": { 1311 | "version": "1.0.1", 1312 | "from": "require-main-filename@>=1.0.1 <2.0.0", 1313 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz" 1314 | }, 1315 | "rimraf": { 1316 | "version": "2.6.1", 1317 | "from": "rimraf@>=2.5.4 <3.0.0", 1318 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz" 1319 | }, 1320 | "rxjs": { 1321 | "version": "5.4.3", 1322 | "from": "rxjs@>=5.1.1 <6.0.0", 1323 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.4.3.tgz" 1324 | }, 1325 | "safe-buffer": { 1326 | "version": "5.0.1", 1327 | "from": "safe-buffer@>=5.0.1 <5.1.0", 1328 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz" 1329 | }, 1330 | "sax": { 1331 | "version": "1.2.4", 1332 | "from": "sax@>=1.2.1 <1.3.0", 1333 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" 1334 | }, 1335 | "semver": { 1336 | "version": "5.4.1", 1337 | "from": "semver@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0||>=4.0.0 <5.0.0||>=5.0.0 <6.0.0", 1338 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" 1339 | }, 1340 | "serialport": { 1341 | "version": "5.0.0", 1342 | "from": "serialport@>=5.0.0-beta8 <6.0.0", 1343 | "resolved": "https://registry.npmjs.org/serialport/-/serialport-5.0.0.tgz", 1344 | "dependencies": { 1345 | "abbrev": { 1346 | "version": "1.1.0", 1347 | "from": "abbrev@1", 1348 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz" 1349 | }, 1350 | "ajv": { 1351 | "version": "4.11.8", 1352 | "from": "ajv@^4.9.1", 1353 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz" 1354 | }, 1355 | "ansi-regex": { 1356 | "version": "2.1.1", 1357 | "from": "ansi-regex@^2.0.0", 1358 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" 1359 | }, 1360 | "aproba": { 1361 | "version": "1.1.2", 1362 | "from": "aproba@^1.0.3", 1363 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.2.tgz" 1364 | }, 1365 | "are-we-there-yet": { 1366 | "version": "1.1.4", 1367 | "from": "are-we-there-yet@~1.1.2", 1368 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz" 1369 | }, 1370 | "asn1": { 1371 | "version": "0.2.3", 1372 | "from": "asn1@~0.2.3", 1373 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" 1374 | }, 1375 | "assert-plus": { 1376 | "version": "0.2.0", 1377 | "from": "assert-plus@^0.2.0", 1378 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz" 1379 | }, 1380 | "asynckit": { 1381 | "version": "0.4.0", 1382 | "from": "asynckit@^0.4.0", 1383 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" 1384 | }, 1385 | "aws-sign2": { 1386 | "version": "0.6.0", 1387 | "from": "aws-sign2@~0.6.0", 1388 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz" 1389 | }, 1390 | "aws4": { 1391 | "version": "1.6.0", 1392 | "from": "aws4@^1.2.1", 1393 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz" 1394 | }, 1395 | "balanced-match": { 1396 | "version": "1.0.0", 1397 | "from": "balanced-match@^1.0.0", 1398 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" 1399 | }, 1400 | "bcrypt-pbkdf": { 1401 | "version": "1.0.1", 1402 | "from": "bcrypt-pbkdf@^1.0.0", 1403 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 1404 | "optional": true 1405 | }, 1406 | "block-stream": { 1407 | "version": "0.0.9", 1408 | "from": "block-stream@*", 1409 | "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz" 1410 | }, 1411 | "boom": { 1412 | "version": "2.10.1", 1413 | "from": "boom@2.x.x", 1414 | "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" 1415 | }, 1416 | "brace-expansion": { 1417 | "version": "1.1.8", 1418 | "from": "brace-expansion@^1.1.7", 1419 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz" 1420 | }, 1421 | "caseless": { 1422 | "version": "0.12.0", 1423 | "from": "caseless@~0.12.0", 1424 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" 1425 | }, 1426 | "co": { 1427 | "version": "4.6.0", 1428 | "from": "co@^4.6.0", 1429 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz" 1430 | }, 1431 | "code-point-at": { 1432 | "version": "1.1.0", 1433 | "from": "code-point-at@^1.0.0", 1434 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" 1435 | }, 1436 | "combined-stream": { 1437 | "version": "1.0.5", 1438 | "from": "combined-stream@~1.0.5", 1439 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz" 1440 | }, 1441 | "concat-map": { 1442 | "version": "0.0.1", 1443 | "from": "concat-map@0.0.1", 1444 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" 1445 | }, 1446 | "console-control-strings": { 1447 | "version": "1.1.0", 1448 | "from": "console-control-strings@~1.1.0", 1449 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" 1450 | }, 1451 | "core-util-is": { 1452 | "version": "1.0.2", 1453 | "from": "core-util-is@~1.0.0", 1454 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" 1455 | }, 1456 | "cryptiles": { 1457 | "version": "2.0.5", 1458 | "from": "cryptiles@2.x.x", 1459 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" 1460 | }, 1461 | "dashdash": { 1462 | "version": "1.14.1", 1463 | "from": "dashdash@^1.12.0", 1464 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 1465 | "dependencies": { 1466 | "assert-plus": { 1467 | "version": "1.0.0", 1468 | "from": "assert-plus@^1.0.0", 1469 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" 1470 | } 1471 | } 1472 | }, 1473 | "debug": { 1474 | "version": "2.6.8", 1475 | "from": "debug@^2.6.6", 1476 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz" 1477 | }, 1478 | "deep-extend": { 1479 | "version": "0.4.2", 1480 | "from": "deep-extend@~0.4.0", 1481 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz" 1482 | }, 1483 | "delayed-stream": { 1484 | "version": "1.0.0", 1485 | "from": "delayed-stream@~1.0.0", 1486 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" 1487 | }, 1488 | "delegates": { 1489 | "version": "1.0.0", 1490 | "from": "delegates@^1.0.0", 1491 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" 1492 | }, 1493 | "ecc-jsbn": { 1494 | "version": "0.1.1", 1495 | "from": "ecc-jsbn@~0.1.1", 1496 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 1497 | "optional": true 1498 | }, 1499 | "extend": { 1500 | "version": "3.0.1", 1501 | "from": "extend@~3.0.0", 1502 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz" 1503 | }, 1504 | "extsprintf": { 1505 | "version": "1.0.2", 1506 | "from": "extsprintf@1.0.2", 1507 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz" 1508 | }, 1509 | "forever-agent": { 1510 | "version": "0.6.1", 1511 | "from": "forever-agent@~0.6.1", 1512 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" 1513 | }, 1514 | "form-data": { 1515 | "version": "2.1.4", 1516 | "from": "form-data@~2.1.1", 1517 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz" 1518 | }, 1519 | "fs.realpath": { 1520 | "version": "1.0.0", 1521 | "from": "fs.realpath@^1.0.0", 1522 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" 1523 | }, 1524 | "fstream": { 1525 | "version": "1.0.11", 1526 | "from": "fstream@^1.0.2", 1527 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz" 1528 | }, 1529 | "fstream-ignore": { 1530 | "version": "1.0.5", 1531 | "from": "fstream-ignore@^1.0.5", 1532 | "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz" 1533 | }, 1534 | "gauge": { 1535 | "version": "2.7.4", 1536 | "from": "gauge@~2.7.3", 1537 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz" 1538 | }, 1539 | "getpass": { 1540 | "version": "0.1.7", 1541 | "from": "getpass@^0.1.1", 1542 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 1543 | "dependencies": { 1544 | "assert-plus": { 1545 | "version": "1.0.0", 1546 | "from": "assert-plus@^1.0.0", 1547 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" 1548 | } 1549 | } 1550 | }, 1551 | "glob": { 1552 | "version": "7.1.2", 1553 | "from": "glob@^7.0.5", 1554 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz" 1555 | }, 1556 | "graceful-fs": { 1557 | "version": "4.1.11", 1558 | "from": "graceful-fs@^4.1.2", 1559 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" 1560 | }, 1561 | "har-schema": { 1562 | "version": "1.0.5", 1563 | "from": "har-schema@^1.0.5", 1564 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz" 1565 | }, 1566 | "har-validator": { 1567 | "version": "4.2.1", 1568 | "from": "har-validator@~4.2.1", 1569 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz" 1570 | }, 1571 | "has-unicode": { 1572 | "version": "2.0.1", 1573 | "from": "has-unicode@^2.0.0", 1574 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" 1575 | }, 1576 | "hawk": { 1577 | "version": "3.1.3", 1578 | "from": "hawk@~3.1.3", 1579 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz" 1580 | }, 1581 | "hoek": { 1582 | "version": "2.16.3", 1583 | "from": "hoek@2.x.x", 1584 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" 1585 | }, 1586 | "http-signature": { 1587 | "version": "1.1.1", 1588 | "from": "http-signature@~1.1.0", 1589 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz" 1590 | }, 1591 | "inflight": { 1592 | "version": "1.0.6", 1593 | "from": "inflight@^1.0.4", 1594 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" 1595 | }, 1596 | "inherits": { 1597 | "version": "2.0.3", 1598 | "from": "inherits@~2.0.3", 1599 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" 1600 | }, 1601 | "ini": { 1602 | "version": "1.3.4", 1603 | "from": "ini@~1.3.0", 1604 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz" 1605 | }, 1606 | "is-fullwidth-code-point": { 1607 | "version": "1.0.0", 1608 | "from": "is-fullwidth-code-point@^1.0.0", 1609 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" 1610 | }, 1611 | "is-typedarray": { 1612 | "version": "1.0.0", 1613 | "from": "is-typedarray@~1.0.0", 1614 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" 1615 | }, 1616 | "isarray": { 1617 | "version": "1.0.0", 1618 | "from": "isarray@~1.0.0", 1619 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" 1620 | }, 1621 | "isstream": { 1622 | "version": "0.1.2", 1623 | "from": "isstream@~0.1.2", 1624 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" 1625 | }, 1626 | "jsbn": { 1627 | "version": "0.1.1", 1628 | "from": "jsbn@~0.1.0", 1629 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1630 | "optional": true 1631 | }, 1632 | "json-schema": { 1633 | "version": "0.2.3", 1634 | "from": "json-schema@0.2.3", 1635 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz" 1636 | }, 1637 | "json-stable-stringify": { 1638 | "version": "1.0.1", 1639 | "from": "json-stable-stringify@^1.0.1", 1640 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" 1641 | }, 1642 | "json-stringify-safe": { 1643 | "version": "5.0.1", 1644 | "from": "json-stringify-safe@~5.0.1", 1645 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" 1646 | }, 1647 | "jsonify": { 1648 | "version": "0.0.0", 1649 | "from": "jsonify@~0.0.0", 1650 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" 1651 | }, 1652 | "jsprim": { 1653 | "version": "1.4.0", 1654 | "from": "jsprim@^1.2.2", 1655 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", 1656 | "dependencies": { 1657 | "assert-plus": { 1658 | "version": "1.0.0", 1659 | "from": "assert-plus@1.0.0", 1660 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" 1661 | } 1662 | } 1663 | }, 1664 | "mime-db": { 1665 | "version": "1.29.0", 1666 | "from": "mime-db@~1.29.0", 1667 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz" 1668 | }, 1669 | "mime-types": { 1670 | "version": "2.1.16", 1671 | "from": "mime-types@~2.1.7", 1672 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz" 1673 | }, 1674 | "minimatch": { 1675 | "version": "3.0.4", 1676 | "from": "minimatch@^3.0.4", 1677 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" 1678 | }, 1679 | "minimist": { 1680 | "version": "0.0.8", 1681 | "from": "minimist@0.0.8", 1682 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" 1683 | }, 1684 | "mkdirp": { 1685 | "version": "0.5.1", 1686 | "from": "mkdirp@^0.5.1", 1687 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" 1688 | }, 1689 | "ms": { 1690 | "version": "2.0.0", 1691 | "from": "ms@2.0.0", 1692 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" 1693 | }, 1694 | "node-pre-gyp": { 1695 | "version": "0.6.36", 1696 | "from": "node-pre-gyp@^0.6.36", 1697 | "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz" 1698 | }, 1699 | "nopt": { 1700 | "version": "4.0.1", 1701 | "from": "nopt@^4.0.1", 1702 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz" 1703 | }, 1704 | "npmlog": { 1705 | "version": "4.1.2", 1706 | "from": "npmlog@^4.0.2", 1707 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz" 1708 | }, 1709 | "number-is-nan": { 1710 | "version": "1.0.1", 1711 | "from": "number-is-nan@^1.0.0", 1712 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" 1713 | }, 1714 | "oauth-sign": { 1715 | "version": "0.8.2", 1716 | "from": "oauth-sign@~0.8.1", 1717 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz" 1718 | }, 1719 | "object-assign": { 1720 | "version": "4.1.1", 1721 | "from": "object-assign@^4.1.0", 1722 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" 1723 | }, 1724 | "once": { 1725 | "version": "1.4.0", 1726 | "from": "once@^1.3.0", 1727 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" 1728 | }, 1729 | "os-homedir": { 1730 | "version": "1.0.2", 1731 | "from": "os-homedir@^1.0.0", 1732 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" 1733 | }, 1734 | "os-tmpdir": { 1735 | "version": "1.0.2", 1736 | "from": "os-tmpdir@^1.0.0", 1737 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" 1738 | }, 1739 | "osenv": { 1740 | "version": "0.1.4", 1741 | "from": "osenv@^0.1.4", 1742 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz" 1743 | }, 1744 | "path-is-absolute": { 1745 | "version": "1.0.1", 1746 | "from": "path-is-absolute@^1.0.0", 1747 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" 1748 | }, 1749 | "performance-now": { 1750 | "version": "0.2.0", 1751 | "from": "performance-now@^0.2.0", 1752 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz" 1753 | }, 1754 | "process-nextick-args": { 1755 | "version": "1.0.7", 1756 | "from": "process-nextick-args@~1.0.6", 1757 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" 1758 | }, 1759 | "punycode": { 1760 | "version": "1.4.1", 1761 | "from": "punycode@^1.4.1", 1762 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" 1763 | }, 1764 | "qs": { 1765 | "version": "6.4.0", 1766 | "from": "qs@~6.4.0", 1767 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz" 1768 | }, 1769 | "rc": { 1770 | "version": "1.2.1", 1771 | "from": "rc@^1.1.7", 1772 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", 1773 | "dependencies": { 1774 | "minimist": { 1775 | "version": "1.2.0", 1776 | "from": "minimist@^1.2.0", 1777 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" 1778 | } 1779 | } 1780 | }, 1781 | "readable-stream": { 1782 | "version": "2.3.3", 1783 | "from": "readable-stream@^2.0.6", 1784 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" 1785 | }, 1786 | "request": { 1787 | "version": "2.81.0", 1788 | "from": "request@^2.81.0", 1789 | "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz" 1790 | }, 1791 | "rimraf": { 1792 | "version": "2.6.1", 1793 | "from": "rimraf@^2.6.1", 1794 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz" 1795 | }, 1796 | "safe-buffer": { 1797 | "version": "5.1.1", 1798 | "from": "safe-buffer@^5.0.1", 1799 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" 1800 | }, 1801 | "semver": { 1802 | "version": "5.4.1", 1803 | "from": "semver@^5.3.0", 1804 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" 1805 | }, 1806 | "set-blocking": { 1807 | "version": "2.0.0", 1808 | "from": "set-blocking@~2.0.0", 1809 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" 1810 | }, 1811 | "signal-exit": { 1812 | "version": "3.0.2", 1813 | "from": "signal-exit@^3.0.0", 1814 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz" 1815 | }, 1816 | "sntp": { 1817 | "version": "1.0.9", 1818 | "from": "sntp@1.x.x", 1819 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" 1820 | }, 1821 | "sshpk": { 1822 | "version": "1.13.1", 1823 | "from": "sshpk@^1.7.0", 1824 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", 1825 | "dependencies": { 1826 | "assert-plus": { 1827 | "version": "1.0.0", 1828 | "from": "assert-plus@^1.0.0", 1829 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" 1830 | } 1831 | } 1832 | }, 1833 | "string_decoder": { 1834 | "version": "1.0.3", 1835 | "from": "string_decoder@~1.0.3", 1836 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz" 1837 | }, 1838 | "string-width": { 1839 | "version": "1.0.2", 1840 | "from": "string-width@^1.0.1", 1841 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" 1842 | }, 1843 | "stringstream": { 1844 | "version": "0.0.5", 1845 | "from": "stringstream@~0.0.4", 1846 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" 1847 | }, 1848 | "strip-ansi": { 1849 | "version": "3.0.1", 1850 | "from": "strip-ansi@^3.0.1", 1851 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" 1852 | }, 1853 | "strip-json-comments": { 1854 | "version": "2.0.1", 1855 | "from": "strip-json-comments@~2.0.1", 1856 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" 1857 | }, 1858 | "tar": { 1859 | "version": "2.2.1", 1860 | "from": "tar@^2.2.1", 1861 | "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz" 1862 | }, 1863 | "tar-pack": { 1864 | "version": "3.4.0", 1865 | "from": "tar-pack@^3.4.0", 1866 | "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz" 1867 | }, 1868 | "tough-cookie": { 1869 | "version": "2.3.2", 1870 | "from": "tough-cookie@~2.3.0", 1871 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz" 1872 | }, 1873 | "tunnel-agent": { 1874 | "version": "0.6.0", 1875 | "from": "tunnel-agent@^0.6.0", 1876 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" 1877 | }, 1878 | "tweetnacl": { 1879 | "version": "0.14.5", 1880 | "from": "tweetnacl@~0.14.0", 1881 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1882 | "optional": true 1883 | }, 1884 | "uid-number": { 1885 | "version": "0.0.6", 1886 | "from": "uid-number@^0.0.6", 1887 | "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz" 1888 | }, 1889 | "util-deprecate": { 1890 | "version": "1.0.2", 1891 | "from": "util-deprecate@~1.0.1", 1892 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" 1893 | }, 1894 | "uuid": { 1895 | "version": "3.1.0", 1896 | "from": "uuid@^3.0.0", 1897 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz" 1898 | }, 1899 | "verror": { 1900 | "version": "1.3.6", 1901 | "from": "verror@1.3.6", 1902 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz" 1903 | }, 1904 | "wide-align": { 1905 | "version": "1.1.2", 1906 | "from": "wide-align@^1.1.0", 1907 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz" 1908 | }, 1909 | "wrappy": { 1910 | "version": "1.0.2", 1911 | "from": "wrappy@1", 1912 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" 1913 | } 1914 | } 1915 | }, 1916 | "set-blocking": { 1917 | "version": "2.0.0", 1918 | "from": "set-blocking@>=2.0.0 <3.0.0", 1919 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" 1920 | }, 1921 | "signal-exit": { 1922 | "version": "3.0.2", 1923 | "from": "signal-exit@>=3.0.0 <4.0.0", 1924 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz" 1925 | }, 1926 | "sntp": { 1927 | "version": "1.0.9", 1928 | "from": "sntp@>=1.0.0 <2.0.0", 1929 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" 1930 | }, 1931 | "socket.io": { 1932 | "version": "2.0.3", 1933 | "from": "socket.io@>=2.0.3 <3.0.0", 1934 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.3.tgz" 1935 | }, 1936 | "socket.io-adapter": { 1937 | "version": "1.1.1", 1938 | "from": "socket.io-adapter@>=1.1.0 <1.2.0", 1939 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz" 1940 | }, 1941 | "socket.io-client": { 1942 | "version": "2.0.3", 1943 | "from": "socket.io-client@>=2.0.2 <2.1.0", 1944 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.3.tgz" 1945 | }, 1946 | "socket.io-parser": { 1947 | "version": "3.1.2", 1948 | "from": "socket.io-parser@>=3.1.1 <3.2.0", 1949 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.2.tgz" 1950 | }, 1951 | "sort-keys": { 1952 | "version": "1.1.2", 1953 | "from": "sort-keys@>=1.0.0 <2.0.0", 1954 | "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz" 1955 | }, 1956 | "source-map": { 1957 | "version": "0.5.6", 1958 | "from": "source-map@>=0.5.6 <0.6.0", 1959 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" 1960 | }, 1961 | "spawn-rx": { 1962 | "version": "2.0.11", 1963 | "from": "spawn-rx@>=2.0.3 <3.0.0", 1964 | "resolved": "https://registry.npmjs.org/spawn-rx/-/spawn-rx-2.0.11.tgz" 1965 | }, 1966 | "spdx-correct": { 1967 | "version": "1.0.2", 1968 | "from": "spdx-correct@>=1.0.0 <1.1.0", 1969 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz" 1970 | }, 1971 | "spdx-expression-parse": { 1972 | "version": "1.0.4", 1973 | "from": "spdx-expression-parse@>=1.0.0 <1.1.0", 1974 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz" 1975 | }, 1976 | "spdx-license-ids": { 1977 | "version": "1.2.2", 1978 | "from": "spdx-license-ids@>=1.0.2 <2.0.0", 1979 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz" 1980 | }, 1981 | "sprintf-js": { 1982 | "version": "1.0.3", 1983 | "from": "sprintf-js@>=1.0.2 <1.1.0", 1984 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" 1985 | }, 1986 | "sshpk": { 1987 | "version": "1.13.1", 1988 | "from": "sshpk@>=1.7.0 <2.0.0", 1989 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", 1990 | "dependencies": { 1991 | "assert-plus": { 1992 | "version": "1.0.0", 1993 | "from": "assert-plus@>=1.0.0 <2.0.0", 1994 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" 1995 | } 1996 | } 1997 | }, 1998 | "strict-uri-encode": { 1999 | "version": "1.1.0", 2000 | "from": "strict-uri-encode@>=1.0.0 <2.0.0", 2001 | "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz" 2002 | }, 2003 | "string_decoder": { 2004 | "version": "1.0.3", 2005 | "from": "string_decoder@>=1.0.3 <1.1.0", 2006 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 2007 | "dependencies": { 2008 | "safe-buffer": { 2009 | "version": "5.1.1", 2010 | "from": "safe-buffer@>=5.1.0 <5.2.0", 2011 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" 2012 | } 2013 | } 2014 | }, 2015 | "string-width": { 2016 | "version": "1.0.2", 2017 | "from": "string-width@>=1.0.1 <2.0.0", 2018 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" 2019 | }, 2020 | "stringstream": { 2021 | "version": "0.0.5", 2022 | "from": "stringstream@>=0.0.4 <0.1.0", 2023 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" 2024 | }, 2025 | "strip-ansi": { 2026 | "version": "3.0.1", 2027 | "from": "strip-ansi@>=3.0.1 <4.0.0", 2028 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" 2029 | }, 2030 | "strip-bom": { 2031 | "version": "2.0.0", 2032 | "from": "strip-bom@>=2.0.0 <3.0.0", 2033 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" 2034 | }, 2035 | "strip-json-comments": { 2036 | "version": "2.0.1", 2037 | "from": "strip-json-comments@>=2.0.1 <2.1.0", 2038 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" 2039 | }, 2040 | "supports-color": { 2041 | "version": "2.0.0", 2042 | "from": "supports-color@>=2.0.0 <3.0.0", 2043 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" 2044 | }, 2045 | "svgo": { 2046 | "version": "0.7.2", 2047 | "from": "svgo@>=0.7.0 <0.8.0", 2048 | "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz" 2049 | }, 2050 | "symbol-observable": { 2051 | "version": "1.0.4", 2052 | "from": "symbol-observable@>=1.0.1 <2.0.0", 2053 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz" 2054 | }, 2055 | "tar": { 2056 | "version": "2.2.1", 2057 | "from": "tar@>=2.2.1 <3.0.0", 2058 | "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz" 2059 | }, 2060 | "tar-pack": { 2061 | "version": "3.4.0", 2062 | "from": "tar-pack@>=3.4.0 <4.0.0", 2063 | "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz" 2064 | }, 2065 | "through": { 2066 | "version": "2.3.8", 2067 | "from": "through@>=2.3.6 <3.0.0", 2068 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" 2069 | }, 2070 | "to-array": { 2071 | "version": "0.1.4", 2072 | "from": "to-array@0.1.4", 2073 | "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz" 2074 | }, 2075 | "tough-cookie": { 2076 | "version": "2.3.2", 2077 | "from": "tough-cookie@>=2.3.0 <2.4.0", 2078 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz" 2079 | }, 2080 | "tunnel-agent": { 2081 | "version": "0.6.0", 2082 | "from": "tunnel-agent@>=0.6.0 <0.7.0", 2083 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" 2084 | }, 2085 | "tweetnacl": { 2086 | "version": "0.14.5", 2087 | "from": "tweetnacl@>=0.14.0 <0.15.0", 2088 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 2089 | "optional": true 2090 | }, 2091 | "uid-number": { 2092 | "version": "0.0.6", 2093 | "from": "uid-number@>=0.0.6 <0.0.7", 2094 | "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz" 2095 | }, 2096 | "ultron": { 2097 | "version": "1.1.0", 2098 | "from": "ultron@>=1.1.0 <1.2.0", 2099 | "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.0.tgz" 2100 | }, 2101 | "uniq": { 2102 | "version": "1.0.1", 2103 | "from": "uniq@>=1.0.1 <2.0.0", 2104 | "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz" 2105 | }, 2106 | "uniqid": { 2107 | "version": "4.1.1", 2108 | "from": "uniqid@>=4.0.0 <5.0.0", 2109 | "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz" 2110 | }, 2111 | "uniqs": { 2112 | "version": "2.0.0", 2113 | "from": "uniqs@>=2.0.0 <3.0.0", 2114 | "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" 2115 | }, 2116 | "untildify": { 2117 | "version": "3.0.2", 2118 | "from": "untildify@>=3.0.2 <4.0.0", 2119 | "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.2.tgz" 2120 | }, 2121 | "usb": { 2122 | "version": "1.3.0", 2123 | "from": "git+https://github.com/tessel/node-usb.git#1.3.0", 2124 | "resolved": "git+https://github.com/tessel/node-usb.git#38cc9cc75759e74f3d3ee8c79ca852395c3529b0" 2125 | }, 2126 | "util-deprecate": { 2127 | "version": "1.0.2", 2128 | "from": "util-deprecate@>=1.0.1 <1.1.0", 2129 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" 2130 | }, 2131 | "uuid": { 2132 | "version": "3.1.0", 2133 | "from": "uuid@>=3.0.0 <4.0.0", 2134 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz" 2135 | }, 2136 | "uws": { 2137 | "version": "0.14.5", 2138 | "from": "uws@>=0.14.4 <0.15.0", 2139 | "resolved": "https://registry.npmjs.org/uws/-/uws-0.14.5.tgz", 2140 | "optional": true 2141 | }, 2142 | "validate-npm-package-license": { 2143 | "version": "3.0.1", 2144 | "from": "validate-npm-package-license@>=3.0.1 <4.0.0", 2145 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz" 2146 | }, 2147 | "vendors": { 2148 | "version": "1.0.1", 2149 | "from": "vendors@>=1.0.0 <2.0.0", 2150 | "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz" 2151 | }, 2152 | "verror": { 2153 | "version": "1.10.0", 2154 | "from": "verror@1.10.0", 2155 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 2156 | "dependencies": { 2157 | "assert-plus": { 2158 | "version": "1.0.0", 2159 | "from": "assert-plus@>=1.0.0 <2.0.0", 2160 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" 2161 | } 2162 | } 2163 | }, 2164 | "vue": { 2165 | "version": "2.4.2", 2166 | "from": "vue@>=2.1.7 <3.0.0", 2167 | "resolved": "https://registry.npmjs.org/vue/-/vue-2.4.2.tgz" 2168 | }, 2169 | "vue-hot-reload-api": { 2170 | "version": "2.1.0", 2171 | "from": "vue-hot-reload-api@>=2.0.1 <3.0.0", 2172 | "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.1.0.tgz" 2173 | }, 2174 | "vue-template-compiler": { 2175 | "version": "2.4.2", 2176 | "from": "vue-template-compiler@>=2.0.0-alpha.8 <3.0.0", 2177 | "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.4.2.tgz" 2178 | }, 2179 | "vue-template-es2015-compiler": { 2180 | "version": "1.5.3", 2181 | "from": "vue-template-es2015-compiler@>=1.2.2 <2.0.0", 2182 | "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.5.3.tgz" 2183 | }, 2184 | "vueify": { 2185 | "version": "9.4.1", 2186 | "from": "vueify@>=9.4.1 <10.0.0", 2187 | "resolved": "https://registry.npmjs.org/vueify/-/vueify-9.4.1.tgz" 2188 | }, 2189 | "whet.extend": { 2190 | "version": "0.9.9", 2191 | "from": "whet.extend@>=0.9.9 <0.10.0", 2192 | "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz" 2193 | }, 2194 | "which-module": { 2195 | "version": "1.0.0", 2196 | "from": "which-module@>=1.0.0 <2.0.0", 2197 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz" 2198 | }, 2199 | "wide-align": { 2200 | "version": "1.1.2", 2201 | "from": "wide-align@>=1.1.0 <2.0.0", 2202 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz" 2203 | }, 2204 | "window-size": { 2205 | "version": "0.2.0", 2206 | "from": "window-size@>=0.2.0 <0.3.0", 2207 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz" 2208 | }, 2209 | "winreg": { 2210 | "version": "1.2.2", 2211 | "from": "winreg@1.2.2", 2212 | "resolved": "https://registry.npmjs.org/winreg/-/winreg-1.2.2.tgz" 2213 | }, 2214 | "wrap-ansi": { 2215 | "version": "2.1.0", 2216 | "from": "wrap-ansi@>=2.0.0 <3.0.0", 2217 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz" 2218 | }, 2219 | "wrappy": { 2220 | "version": "1.0.2", 2221 | "from": "wrappy@>=1.0.0 <2.0.0", 2222 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" 2223 | }, 2224 | "ws": { 2225 | "version": "2.3.1", 2226 | "from": "ws@>=2.3.1 <2.4.0", 2227 | "resolved": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz" 2228 | }, 2229 | "xmlhttprequest-ssl": { 2230 | "version": "1.5.3", 2231 | "from": "xmlhttprequest-ssl@1.5.3", 2232 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz" 2233 | }, 2234 | "y18n": { 2235 | "version": "3.2.1", 2236 | "from": "y18n@>=3.2.1 <4.0.0", 2237 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz" 2238 | }, 2239 | "yallist": { 2240 | "version": "2.1.2", 2241 | "from": "yallist@>=2.1.2 <3.0.0", 2242 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" 2243 | }, 2244 | "yargs": { 2245 | "version": "4.8.1", 2246 | "from": "yargs@>=4.8.1 <5.0.0", 2247 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz" 2248 | }, 2249 | "yargs-parser": { 2250 | "version": "2.4.1", 2251 | "from": "yargs-parser@>=2.4.1 <3.0.0", 2252 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz" 2253 | }, 2254 | "yeast": { 2255 | "version": "0.1.2", 2256 | "from": "yeast@0.1.2", 2257 | "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz" 2258 | } 2259 | } 2260 | } 2261 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "recta-host", 3 | "productName": "recta-host", 4 | "version": "1.0.0", 5 | "description": "Direct printing from Browser", 6 | "main": "src/js/index.js", 7 | "scripts": { 8 | "start": "electron-forge start", 9 | "test": "mocha", 10 | "package": "electron-forge package", 11 | "make": "electron-forge make", 12 | "lint": "eslint --ext .js,.vue,.html src/ test/ ./*.js", 13 | "fix": "eslint --fix --ext .js,.vue,.html src/ test/ ./*.js" 14 | }, 15 | "keywords": [ 16 | "printer" 17 | ], 18 | "author": { 19 | "name": "Ade Novid", 20 | "email": "adenvt@gmail.com", 21 | "url": "http://adenovid.net" 22 | }, 23 | "license": "MIT", 24 | "config": { 25 | "forge": "./forge.config.js" 26 | }, 27 | "dependencies": { 28 | "auto-launch": "^5.0.1", 29 | "electron-compile": "^6.4.1", 30 | "electron-config": "^1.0.0", 31 | "electron-devtools-installer": "^2.0.1", 32 | "electron-positioner": "^3.0.0", 33 | "electron-squirrel-startup": "^1.0.0", 34 | "lodash": "^4.17.4", 35 | "minimist": "^1.2.0", 36 | "serialport": "^5.0.0-beta8", 37 | "socket.io": "^2.0.3", 38 | "usb": "git+https://github.com/tessel/node-usb.git#1.3.0", 39 | "vue": "^2.1.7", 40 | "vueify": "^9.4.1" 41 | }, 42 | "devDependencies": { 43 | "babel-plugin-transform-async-to-generator": "^6.24.1", 44 | "babel-preset-env": "^1.6.0", 45 | "babel-preset-react": "^6.24.1", 46 | "electron-prebuilt-compile": "1.6.11", 47 | "eslint": "^4.3.0", 48 | "eslint-config-standard": "^10.2.1", 49 | "eslint-plugin-html": "^3.1.1", 50 | "eslint-plugin-import": "^2.7.0", 51 | "eslint-plugin-node": "^5.1.1", 52 | "eslint-plugin-promise": "^3.5.0", 53 | "eslint-plugin-standard": "^3.0.1", 54 | "eslint-plugin-vue": "beta", 55 | "mocha": "^3.5.0", 56 | "mocha-logger": "^1.0.5", 57 | "spectron": "^3.7.2" 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/css/main.scss: -------------------------------------------------------------------------------- 1 | [v-cloak] { 2 | display: none; 3 | } 4 | 5 | h1 { 6 | text-align: center; 7 | margin-top: 1rem; 8 | } 9 | -------------------------------------------------------------------------------- /src/css/normalize.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v3.0.2 | MIT License | git.io/normalize */ 2 | 3 | /** 4 | * 1. Set default font family to sans-serif. 5 | * 2. Prevent iOS text size adjust after orientation change, without disabling 6 | * user zoom. 7 | */ 8 | 9 | html { 10 | font-family: sans-serif; /* 1 */ 11 | -ms-text-size-adjust: 100%; /* 2 */ 12 | -webkit-text-size-adjust: 100%; /* 2 */ 13 | } 14 | 15 | /** 16 | * Remove default margin. 17 | */ 18 | 19 | body { 20 | margin: 0; 21 | } 22 | 23 | /* HTML5 display definitions 24 | ========================================================================== */ 25 | 26 | /** 27 | * Correct `block` display not defined for any HTML5 element in IE 8/9. 28 | * Correct `block` display not defined for `details` or `summary` in IE 10/11 29 | * and Firefox. 30 | * Correct `block` display not defined for `main` in IE 11. 31 | */ 32 | 33 | article, 34 | aside, 35 | details, 36 | figcaption, 37 | figure, 38 | footer, 39 | header, 40 | hgroup, 41 | main, 42 | menu, 43 | nav, 44 | section, 45 | summary { 46 | display: block; 47 | } 48 | 49 | /** 50 | * 1. Correct `inline-block` display not defined in IE 8/9. 51 | * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. 52 | */ 53 | 54 | audio, 55 | canvas, 56 | progress, 57 | video { 58 | display: inline-block; /* 1 */ 59 | vertical-align: baseline; /* 2 */ 60 | } 61 | 62 | /** 63 | * Prevent modern browsers from displaying `audio` without controls. 64 | * Remove excess height in iOS 5 devices. 65 | */ 66 | 67 | audio:not([controls]) { 68 | display: none; 69 | height: 0; 70 | } 71 | 72 | /** 73 | * Address `[hidden]` styling not present in IE 8/9/10. 74 | * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. 75 | */ 76 | 77 | [hidden], 78 | template { 79 | display: none; 80 | } 81 | 82 | /* Links 83 | ========================================================================== */ 84 | 85 | /** 86 | * Remove the gray background color from active links in IE 10. 87 | */ 88 | 89 | a { 90 | background-color: transparent; 91 | } 92 | 93 | /** 94 | * Improve readability when focused and also mouse hovered in all browsers. 95 | */ 96 | 97 | a:active, 98 | a:hover { 99 | outline: 0; 100 | } 101 | 102 | /* Text-level semantics 103 | ========================================================================== */ 104 | 105 | /** 106 | * Address styling not present in IE 8/9/10/11, Safari, and Chrome. 107 | */ 108 | 109 | abbr[title] { 110 | border-bottom: 1px dotted; 111 | } 112 | 113 | /** 114 | * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. 115 | */ 116 | 117 | b, 118 | strong { 119 | font-weight: bold; 120 | } 121 | 122 | /** 123 | * Address styling not present in Safari and Chrome. 124 | */ 125 | 126 | dfn { 127 | font-style: italic; 128 | } 129 | 130 | /** 131 | * Address variable `h1` font-size and margin within `section` and `article` 132 | * contexts in Firefox 4+, Safari, and Chrome. 133 | */ 134 | 135 | h1 { 136 | font-size: 2em; 137 | margin: 0.67em 0; 138 | } 139 | 140 | /** 141 | * Address styling not present in IE 8/9. 142 | */ 143 | 144 | mark { 145 | background: #ff0; 146 | color: #000; 147 | } 148 | 149 | /** 150 | * Address inconsistent and variable font size in all browsers. 151 | */ 152 | 153 | small { 154 | font-size: 80%; 155 | } 156 | 157 | /** 158 | * Prevent `sub` and `sup` affecting `line-height` in all browsers. 159 | */ 160 | 161 | sub, 162 | sup { 163 | font-size: 75%; 164 | line-height: 0; 165 | position: relative; 166 | vertical-align: baseline; 167 | } 168 | 169 | sup { 170 | top: -0.5em; 171 | } 172 | 173 | sub { 174 | bottom: -0.25em; 175 | } 176 | 177 | /* Embedded content 178 | ========================================================================== */ 179 | 180 | /** 181 | * Remove border when inside `a` element in IE 8/9/10. 182 | */ 183 | 184 | img { 185 | border: 0; 186 | } 187 | 188 | /** 189 | * Correct overflow not hidden in IE 9/10/11. 190 | */ 191 | 192 | svg:not(:root) { 193 | overflow: hidden; 194 | } 195 | 196 | /* Grouping content 197 | ========================================================================== */ 198 | 199 | /** 200 | * Address margin not present in IE 8/9 and Safari. 201 | */ 202 | 203 | figure { 204 | margin: 1em 40px; 205 | } 206 | 207 | /** 208 | * Address differences between Firefox and other browsers. 209 | */ 210 | 211 | hr { 212 | -moz-box-sizing: content-box; 213 | box-sizing: content-box; 214 | height: 0; 215 | } 216 | 217 | /** 218 | * Contain overflow in all browsers. 219 | */ 220 | 221 | pre { 222 | overflow: auto; 223 | } 224 | 225 | /** 226 | * Address odd `em`-unit font size rendering in all browsers. 227 | */ 228 | 229 | code, 230 | kbd, 231 | pre, 232 | samp { 233 | font-family: monospace, monospace; 234 | font-size: 1em; 235 | } 236 | 237 | /* Forms 238 | ========================================================================== */ 239 | 240 | /** 241 | * Known limitation: by default, Chrome and Safari on OS X allow very limited 242 | * styling of `select`, unless a `border` property is set. 243 | */ 244 | 245 | /** 246 | * 1. Correct color not being inherited. 247 | * Known issue: affects color of disabled elements. 248 | * 2. Correct font properties not being inherited. 249 | * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. 250 | */ 251 | 252 | button, 253 | input, 254 | optgroup, 255 | select, 256 | textarea { 257 | color: inherit; /* 1 */ 258 | font: inherit; /* 2 */ 259 | margin: 0; /* 3 */ 260 | } 261 | 262 | /** 263 | * Address `overflow` set to `hidden` in IE 8/9/10/11. 264 | */ 265 | 266 | button { 267 | overflow: visible; 268 | } 269 | 270 | /** 271 | * Address inconsistent `text-transform` inheritance for `button` and `select`. 272 | * All other form control elements do not inherit `text-transform` values. 273 | * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. 274 | * Correct `select` style inheritance in Firefox. 275 | */ 276 | 277 | button, 278 | select { 279 | text-transform: none; 280 | } 281 | 282 | /** 283 | * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` 284 | * and `video` controls. 285 | * 2. Correct inability to style clickable `input` types in iOS. 286 | * 3. Improve usability and consistency of cursor style between image-type 287 | * `input` and others. 288 | */ 289 | 290 | button, 291 | html input[type="button"], /* 1 */ 292 | input[type="reset"], 293 | input[type="submit"] { 294 | -webkit-appearance: button; /* 2 */ 295 | cursor: pointer; /* 3 */ 296 | } 297 | 298 | /** 299 | * Re-set default cursor for disabled elements. 300 | */ 301 | 302 | button[disabled], 303 | html input[disabled] { 304 | cursor: default; 305 | } 306 | 307 | /** 308 | * Remove inner padding and border in Firefox 4+. 309 | */ 310 | 311 | button::-moz-focus-inner, 312 | input::-moz-focus-inner { 313 | border: 0; 314 | padding: 0; 315 | } 316 | 317 | /** 318 | * Address Firefox 4+ setting `line-height` on `input` using `!important` in 319 | * the UA stylesheet. 320 | */ 321 | 322 | input { 323 | line-height: normal; 324 | } 325 | 326 | /** 327 | * It's recommended that you don't attempt to style these elements. 328 | * Firefox's implementation doesn't respect box-sizing, padding, or width. 329 | * 330 | * 1. Address box sizing set to `content-box` in IE 8/9/10. 331 | * 2. Remove excess padding in IE 8/9/10. 332 | */ 333 | 334 | input[type="checkbox"], 335 | input[type="radio"] { 336 | box-sizing: border-box; /* 1 */ 337 | padding: 0; /* 2 */ 338 | } 339 | 340 | /** 341 | * Fix the cursor style for Chrome's increment/decrement buttons. For certain 342 | * `font-size` values of the `input`, it causes the cursor style of the 343 | * decrement button to change from `default` to `text`. 344 | */ 345 | 346 | input[type="number"]::-webkit-inner-spin-button, 347 | input[type="number"]::-webkit-outer-spin-button { 348 | height: auto; 349 | } 350 | 351 | /** 352 | * 1. Address `appearance` set to `searchfield` in Safari and Chrome. 353 | * 2. Address `box-sizing` set to `border-box` in Safari and Chrome 354 | * (include `-moz` to future-proof). 355 | */ 356 | 357 | input[type="search"] { 358 | -webkit-appearance: textfield; /* 1 */ 359 | -moz-box-sizing: content-box; 360 | -webkit-box-sizing: content-box; /* 2 */ 361 | box-sizing: content-box; 362 | } 363 | 364 | /** 365 | * Remove inner padding and search cancel button in Safari and Chrome on OS X. 366 | * Safari (but not Chrome) clips the cancel button when the search input has 367 | * padding (and `textfield` appearance). 368 | */ 369 | 370 | input[type="search"]::-webkit-search-cancel-button, 371 | input[type="search"]::-webkit-search-decoration { 372 | -webkit-appearance: none; 373 | } 374 | 375 | /** 376 | * Define consistent border, margin, and padding. 377 | */ 378 | 379 | fieldset { 380 | border: 1px solid #c0c0c0; 381 | margin: 0 2px; 382 | padding: 0.35em 0.625em 0.75em; 383 | } 384 | 385 | /** 386 | * 1. Correct `color` not being inherited in IE 8/9/10/11. 387 | * 2. Remove padding so people aren't caught out if they zero out fieldsets. 388 | */ 389 | 390 | legend { 391 | border: 0; /* 1 */ 392 | padding: 0; /* 2 */ 393 | } 394 | 395 | /** 396 | * Remove default vertical scrollbar in IE 8/9/10/11. 397 | */ 398 | 399 | textarea { 400 | overflow: auto; 401 | } 402 | 403 | /** 404 | * Don't inherit the `font-weight` (applied by a rule above). 405 | * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. 406 | */ 407 | 408 | optgroup { 409 | font-weight: bold; 410 | } 411 | 412 | /* Tables 413 | ========================================================================== */ 414 | 415 | /** 416 | * Remove most spacing between table cells. 417 | */ 418 | 419 | table { 420 | border-collapse: collapse; 421 | border-spacing: 0; 422 | } 423 | 424 | td, 425 | th { 426 | padding: 0; 427 | } -------------------------------------------------------------------------------- /src/css/skeleton.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Skeleton V2.0.4 3 | * Copyright 2014, Dave Gamache 4 | * www.getskeleton.com 5 | * Free to use under the MIT license. 6 | * http://www.opensource.org/licenses/mit-license.php 7 | * 12/29/2014 8 | */ 9 | 10 | 11 | /* Table of contents 12 | –––––––––––––––––––––––––––––––––––––––––––––––––– 13 | - Grid 14 | - Base Styles 15 | - Typography 16 | - Links 17 | - Buttons 18 | - Forms 19 | - Lists 20 | - Code 21 | - Tables 22 | - Spacing 23 | - Utilities 24 | - Clearing 25 | - Media Queries 26 | */ 27 | 28 | 29 | /* Grid 30 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 31 | .container { 32 | position: relative; 33 | width: 100%; 34 | max-width: 960px; 35 | margin: 0 auto; 36 | padding: 0 20px; 37 | box-sizing: border-box; } 38 | .column, 39 | .columns { 40 | width: 100%; 41 | float: left; 42 | box-sizing: border-box; } 43 | 44 | /* For devices larger than 400px */ 45 | @media (min-width: 400px) { 46 | .container { 47 | width: 85%; 48 | padding: 0; } 49 | } 50 | 51 | /* For devices larger than 550px */ 52 | @media (min-width: 550px) { 53 | .container { 54 | width: 80%; } 55 | .column, 56 | .columns { 57 | margin-left: 4%; } 58 | .column:first-child, 59 | .columns:first-child { 60 | margin-left: 0; } 61 | 62 | .one.column, 63 | .one.columns { width: 4.66666666667%; } 64 | .two.columns { width: 13.3333333333%; } 65 | .three.columns { width: 22%; } 66 | .four.columns { width: 30.6666666667%; } 67 | .five.columns { width: 39.3333333333%; } 68 | .six.columns { width: 48%; } 69 | .seven.columns { width: 56.6666666667%; } 70 | .eight.columns { width: 65.3333333333%; } 71 | .nine.columns { width: 74.0%; } 72 | .ten.columns { width: 82.6666666667%; } 73 | .eleven.columns { width: 91.3333333333%; } 74 | .twelve.columns { width: 100%; margin-left: 0; } 75 | 76 | .one-third.column { width: 30.6666666667%; } 77 | .two-thirds.column { width: 65.3333333333%; } 78 | 79 | .one-half.column { width: 48%; } 80 | 81 | /* Offsets */ 82 | .offset-by-one.column, 83 | .offset-by-one.columns { margin-left: 8.66666666667%; } 84 | .offset-by-two.column, 85 | .offset-by-two.columns { margin-left: 17.3333333333%; } 86 | .offset-by-three.column, 87 | .offset-by-three.columns { margin-left: 26%; } 88 | .offset-by-four.column, 89 | .offset-by-four.columns { margin-left: 34.6666666667%; } 90 | .offset-by-five.column, 91 | .offset-by-five.columns { margin-left: 43.3333333333%; } 92 | .offset-by-six.column, 93 | .offset-by-six.columns { margin-left: 52%; } 94 | .offset-by-seven.column, 95 | .offset-by-seven.columns { margin-left: 60.6666666667%; } 96 | .offset-by-eight.column, 97 | .offset-by-eight.columns { margin-left: 69.3333333333%; } 98 | .offset-by-nine.column, 99 | .offset-by-nine.columns { margin-left: 78.0%; } 100 | .offset-by-ten.column, 101 | .offset-by-ten.columns { margin-left: 86.6666666667%; } 102 | .offset-by-eleven.column, 103 | .offset-by-eleven.columns { margin-left: 95.3333333333%; } 104 | 105 | .offset-by-one-third.column, 106 | .offset-by-one-third.columns { margin-left: 34.6666666667%; } 107 | .offset-by-two-thirds.column, 108 | .offset-by-two-thirds.columns { margin-left: 69.3333333333%; } 109 | 110 | .offset-by-one-half.column, 111 | .offset-by-one-half.columns { margin-left: 52%; } 112 | 113 | } 114 | 115 | 116 | /* Base Styles 117 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 118 | /* NOTE 119 | html is set to 62.5% so that all the REM measurements throughout Skeleton 120 | are based on 10px sizing. So basically 1.5rem = 15px :) */ 121 | html { 122 | font-size: 62.5%; } 123 | body { 124 | font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */ 125 | line-height: 1.6; 126 | font-weight: 400; 127 | font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; 128 | color: #222; } 129 | 130 | 131 | /* Typography 132 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 133 | h1, h2, h3, h4, h5, h6 { 134 | margin-top: 0; 135 | margin-bottom: 2rem; 136 | font-weight: 300; } 137 | h1 { font-size: 4.0rem; line-height: 1.2; letter-spacing: -.1rem;} 138 | h2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; } 139 | h3 { font-size: 3.0rem; line-height: 1.3; letter-spacing: -.1rem; } 140 | h4 { font-size: 2.4rem; line-height: 1.35; letter-spacing: -.08rem; } 141 | h5 { font-size: 1.8rem; line-height: 1.5; letter-spacing: -.05rem; } 142 | h6 { font-size: 1.5rem; line-height: 1.6; letter-spacing: 0; } 143 | 144 | /* Larger than phablet */ 145 | @media (min-width: 550px) { 146 | h1 { font-size: 5.0rem; } 147 | h2 { font-size: 4.2rem; } 148 | h3 { font-size: 3.6rem; } 149 | h4 { font-size: 3.0rem; } 150 | h5 { font-size: 2.4rem; } 151 | h6 { font-size: 1.5rem; } 152 | } 153 | 154 | p { 155 | margin-top: 0; } 156 | 157 | 158 | /* Links 159 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 160 | a { 161 | color: #1EAEDB; } 162 | a:hover { 163 | color: #0FA0CE; } 164 | 165 | 166 | /* Buttons 167 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 168 | .button, 169 | button, 170 | input[type="submit"], 171 | input[type="reset"], 172 | input[type="button"] { 173 | display: inline-block; 174 | height: 38px; 175 | padding: 0 30px; 176 | color: #555; 177 | text-align: center; 178 | font-size: 11px; 179 | font-weight: 600; 180 | line-height: 38px; 181 | letter-spacing: .1rem; 182 | text-transform: uppercase; 183 | text-decoration: none; 184 | white-space: nowrap; 185 | background-color: transparent; 186 | border-radius: 4px; 187 | border: 1px solid #bbb; 188 | cursor: pointer; 189 | box-sizing: border-box; } 190 | .button:hover, 191 | button:hover, 192 | input[type="submit"]:hover, 193 | input[type="reset"]:hover, 194 | input[type="button"]:hover, 195 | .button:focus, 196 | button:focus, 197 | input[type="submit"]:focus, 198 | input[type="reset"]:focus, 199 | input[type="button"]:focus { 200 | color: #333; 201 | border-color: #888; 202 | outline: 0; } 203 | .button.button-primary, 204 | button.button-primary, 205 | input[type="submit"].button-primary, 206 | input[type="reset"].button-primary, 207 | input[type="button"].button-primary { 208 | color: #FFF; 209 | background-color: #33C3F0; 210 | border-color: #33C3F0; } 211 | .button.button-primary:hover, 212 | button.button-primary:hover, 213 | input[type="submit"].button-primary:hover, 214 | input[type="reset"].button-primary:hover, 215 | input[type="button"].button-primary:hover, 216 | .button.button-primary:focus, 217 | button.button-primary:focus, 218 | input[type="submit"].button-primary:focus, 219 | input[type="reset"].button-primary:focus, 220 | input[type="button"].button-primary:focus { 221 | color: #FFF; 222 | background-color: #1EAEDB; 223 | border-color: #1EAEDB; } 224 | 225 | 226 | /* Forms 227 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 228 | input[type="email"], 229 | input[type="number"], 230 | input[type="search"], 231 | input[type="text"], 232 | input[type="tel"], 233 | input[type="url"], 234 | input[type="password"], 235 | textarea, 236 | select { 237 | height: 38px; 238 | padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */ 239 | background-color: #fff; 240 | border: 1px solid #D1D1D1; 241 | border-radius: 4px; 242 | box-shadow: none; 243 | box-sizing: border-box; } 244 | /* Removes awkward default styles on some inputs for iOS */ 245 | input[type="email"], 246 | input[type="number"], 247 | input[type="search"], 248 | input[type="text"], 249 | input[type="tel"], 250 | input[type="url"], 251 | input[type="password"], 252 | textarea { 253 | -webkit-appearance: none; 254 | -moz-appearance: none; 255 | appearance: none; } 256 | textarea { 257 | min-height: 65px; 258 | padding-top: 6px; 259 | padding-bottom: 6px; } 260 | input[type="email"]:focus, 261 | input[type="number"]:focus, 262 | input[type="search"]:focus, 263 | input[type="text"]:focus, 264 | input[type="tel"]:focus, 265 | input[type="url"]:focus, 266 | input[type="password"]:focus, 267 | textarea:focus, 268 | select:focus { 269 | border: 1px solid #33C3F0; 270 | outline: 0; } 271 | label, 272 | legend { 273 | display: block; 274 | margin-bottom: .5rem; 275 | font-weight: 600; } 276 | fieldset { 277 | padding: 0; 278 | border-width: 0; } 279 | input[type="checkbox"], 280 | input[type="radio"] { 281 | display: inline; } 282 | label > .label-body { 283 | display: inline-block; 284 | margin-left: .5rem; 285 | font-weight: normal; } 286 | 287 | 288 | /* Lists 289 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 290 | ul { 291 | list-style: circle inside; } 292 | ol { 293 | list-style: decimal inside; } 294 | ol, ul { 295 | padding-left: 0; 296 | margin-top: 0; } 297 | ul ul, 298 | ul ol, 299 | ol ol, 300 | ol ul { 301 | margin: 1.5rem 0 1.5rem 3rem; 302 | font-size: 90%; } 303 | li { 304 | margin-bottom: 1rem; } 305 | 306 | 307 | /* Code 308 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 309 | code { 310 | padding: .2rem .5rem; 311 | margin: 0 .2rem; 312 | font-size: 90%; 313 | white-space: nowrap; 314 | background: #F1F1F1; 315 | border: 1px solid #E1E1E1; 316 | border-radius: 4px; } 317 | pre > code { 318 | display: block; 319 | padding: 1rem 1.5rem; 320 | white-space: pre; } 321 | 322 | 323 | /* Tables 324 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 325 | th, 326 | td { 327 | padding: 12px 15px; 328 | text-align: left; 329 | border-bottom: 1px solid #E1E1E1; } 330 | th:first-child, 331 | td:first-child { 332 | padding-left: 0; } 333 | th:last-child, 334 | td:last-child { 335 | padding-right: 0; } 336 | 337 | 338 | /* Spacing 339 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 340 | button, 341 | .button { 342 | margin-bottom: 1rem; } 343 | input, 344 | textarea, 345 | select, 346 | fieldset { 347 | margin-bottom: 1.5rem; } 348 | pre, 349 | blockquote, 350 | dl, 351 | figure, 352 | table, 353 | p, 354 | ul, 355 | ol, 356 | form { 357 | margin-bottom: 2.5rem; } 358 | 359 | 360 | /* Utilities 361 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 362 | .u-full-width { 363 | width: 100%; 364 | box-sizing: border-box; } 365 | .u-max-full-width { 366 | max-width: 100%; 367 | box-sizing: border-box; } 368 | .u-pull-right { 369 | float: right; } 370 | .u-pull-left { 371 | float: left; } 372 | 373 | 374 | /* Misc 375 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 376 | hr { 377 | margin-top: 3rem; 378 | margin-bottom: 3.5rem; 379 | border-width: 0; 380 | border-top: 1px solid #E1E1E1; } 381 | 382 | 383 | /* Clearing 384 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 385 | 386 | /* Self Clearing Goodness */ 387 | .container:after, 388 | .row:after, 389 | .u-cf { 390 | content: ""; 391 | display: table; 392 | clear: both; } 393 | 394 | 395 | /* Media Queries 396 | –––––––––––––––––––––––––––––––––––––––––––––––––– */ 397 | /* 398 | Note: The best way to structure the use of media queries is to create the queries 399 | near the relevant code. For example, if you wanted to change the styles for buttons 400 | on small devices, paste the mobile query code up in the buttons section and style it 401 | there. 402 | */ 403 | 404 | 405 | /* Larger than mobile */ 406 | @media (min-width: 400px) {} 407 | 408 | /* Larger than phablet (also point when grid becomes active) */ 409 | @media (min-width: 550px) {} 410 | 411 | /* Larger than tablet */ 412 | @media (min-width: 750px) {} 413 | 414 | /* Larger than desktop */ 415 | @media (min-width: 1000px) {} 416 | 417 | /* Larger than Desktop HD */ 418 | @media (min-width: 1200px) {} 419 | -------------------------------------------------------------------------------- /src/html/component/main.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 67 | 68 | 196 | -------------------------------------------------------------------------------- /src/html/component/setting/network.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 43 | -------------------------------------------------------------------------------- /src/html/component/setting/serial.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 74 | -------------------------------------------------------------------------------- /src/html/component/setting/usb.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 35 | -------------------------------------------------------------------------------- /src/html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Recta Print - Host 6 | 7 | 8 | 9 | 10 | 11 |
12 |
13 |
14 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/img/animation/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adenvt/recta-host/d430a9cbf8fbdcd70402f99bea47df73070059e0/src/img/animation/loading.gif -------------------------------------------------------------------------------- /src/img/icons/mac/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adenvt/recta-host/d430a9cbf8fbdcd70402f99bea47df73070059e0/src/img/icons/mac/icon.icns -------------------------------------------------------------------------------- /src/img/icons/png/1024x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adenvt/recta-host/d430a9cbf8fbdcd70402f99bea47df73070059e0/src/img/icons/png/1024x1024.png -------------------------------------------------------------------------------- /src/img/icons/png/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adenvt/recta-host/d430a9cbf8fbdcd70402f99bea47df73070059e0/src/img/icons/png/128x128.png -------------------------------------------------------------------------------- /src/img/icons/png/16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adenvt/recta-host/d430a9cbf8fbdcd70402f99bea47df73070059e0/src/img/icons/png/16x16.png -------------------------------------------------------------------------------- /src/img/icons/png/24x24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adenvt/recta-host/d430a9cbf8fbdcd70402f99bea47df73070059e0/src/img/icons/png/24x24.png -------------------------------------------------------------------------------- /src/img/icons/png/256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adenvt/recta-host/d430a9cbf8fbdcd70402f99bea47df73070059e0/src/img/icons/png/256x256.png -------------------------------------------------------------------------------- /src/img/icons/png/32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adenvt/recta-host/d430a9cbf8fbdcd70402f99bea47df73070059e0/src/img/icons/png/32x32.png -------------------------------------------------------------------------------- /src/img/icons/png/48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adenvt/recta-host/d430a9cbf8fbdcd70402f99bea47df73070059e0/src/img/icons/png/48x48.png -------------------------------------------------------------------------------- /src/img/icons/png/512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adenvt/recta-host/d430a9cbf8fbdcd70402f99bea47df73070059e0/src/img/icons/png/512x512.png -------------------------------------------------------------------------------- /src/img/icons/png/64x64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adenvt/recta-host/d430a9cbf8fbdcd70402f99bea47df73070059e0/src/img/icons/png/64x64.png -------------------------------------------------------------------------------- /src/img/icons/win/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adenvt/recta-host/d430a9cbf8fbdcd70402f99bea47df73070059e0/src/img/icons/win/icon.ico -------------------------------------------------------------------------------- /src/js/adapter/network.js: -------------------------------------------------------------------------------- 1 | import { Socket } from 'net' 2 | import Adapter from '../base/adapter.js' 3 | 4 | export default class Network extends Adapter { 5 | constructor (option = {}) { 6 | super() 7 | 8 | this.option = option 9 | this.device = new Socket() 10 | this.device.on('connect', () => { 11 | this.isOpen = true 12 | 13 | this.emit('open') 14 | }) 15 | this.device.on('close', () => { 16 | this.isOpen = false 17 | 18 | this.emit('close') 19 | }) 20 | this.device.on('error', (e) => { 21 | if (this.isOpen) 22 | this.emit('error', e) 23 | }) 24 | } 25 | 26 | open () { 27 | return new Promise((resolve, reject) => { 28 | if (this.isOpen) 29 | return resolve() 30 | 31 | this.device.once('error', (e) => { 32 | return reject(e) 33 | }).connect(this.option.port, this.option.address, () => { 34 | return resolve() 35 | }) 36 | }) 37 | } 38 | 39 | close () { 40 | return new Promise((resolve) => { 41 | if (!this.isOpen) 42 | return resolve() 43 | 44 | this.device.once('close', () => { 45 | return resolve() 46 | }).destroy() 47 | }) 48 | } 49 | 50 | write (buffer) { 51 | try { 52 | this.device.write(buffer) 53 | } catch (e) { 54 | this.emit('error', e) 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/js/adapter/serial.js: -------------------------------------------------------------------------------- 1 | import SerialPort from 'serialport' 2 | import Adapter from '../base/adapter.js' 3 | 4 | export default class Serial extends Adapter { 5 | constructor (option = {}) { 6 | super() 7 | 8 | this.device = new SerialPort(option.comport, { 9 | baudRate: option.baudrate, 10 | autoOpen: false, 11 | }) 12 | this.device.on('open', () => { 13 | this.isOpen = true 14 | 15 | this.emit('open') 16 | }) 17 | this.device.on('close', () => { 18 | this.isOpen = false 19 | 20 | this.emit('close') 21 | }) 22 | this.device.on('error', (e) => { 23 | this.emit('error', e) 24 | }) 25 | } 26 | 27 | open () { 28 | return new Promise((resolve, reject) => { 29 | if (this.isOpen) 30 | return resolve() 31 | 32 | this.device.open((error) => { 33 | if (error) 34 | return reject(error) 35 | 36 | return resolve() 37 | }) 38 | }) 39 | } 40 | 41 | close () { 42 | return new Promise((resolve, reject) => { 43 | if (!this.isOpen) 44 | return resolve() 45 | 46 | this.device.close((error) => { 47 | if (error) 48 | return reject(error) 49 | 50 | return resolve() 51 | }) 52 | }) 53 | } 54 | 55 | write (buffer) { 56 | try { 57 | this.device.write(buffer) 58 | } catch (e) { 59 | this.emit('error', e) 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/js/adapter/usb.js: -------------------------------------------------------------------------------- 1 | import OS from 'os' 2 | import LibUSB from 'usb' 3 | import Adapter from '../base/adapter.js' 4 | 5 | const IFACE_CLASS = { 6 | AUDIO : 0x01, 7 | HID : 0x03, 8 | PRINTER: 0x07, 9 | HUB : 0x09, 10 | } 11 | 12 | export default class USB extends Adapter { 13 | constructor (option = {}) { 14 | super() 15 | this.endpoint = null 16 | this.option = option 17 | 18 | if (option.vid && option.pid) 19 | this.device = LibUSB.findByIds(option.vid, option.pid) 20 | else { 21 | const devices = USB.findPrinter() 22 | 23 | if (devices && devices.length) 24 | this.device = devices[0] 25 | } 26 | 27 | if (!this.device) 28 | throw new Error('Cannot find printer') 29 | 30 | LibUSB.on('attach', (device) => { 31 | if (this.device) 32 | return 33 | 34 | const isPrinter = device.configDescriptor.interfaces.filter((iface) => { 35 | return iface.filter((conf) => { 36 | return conf.bInterfaceClass === IFACE_CLASS.PRINTER 37 | }).length 38 | }).length > 0 39 | 40 | if (isPrinter) { 41 | this.device = device 42 | if (this.option.autoOpen) 43 | this.open() 44 | } 45 | }) 46 | 47 | LibUSB.on('detach', (device) => { 48 | if (device === this.device) { 49 | this.isOpen = false 50 | this.device = null 51 | this.endpoint = null 52 | 53 | this.emit('close') 54 | } 55 | }) 56 | } 57 | 58 | static findPrinter () { 59 | return LibUSB.getDeviceList().filter((device) => { 60 | try { 61 | return device.configDescriptor.interfaces.filter((iface) => { 62 | return iface.filter((conf) => { 63 | return conf.bInterfaceClass === IFACE_CLASS.PRINTER 64 | }).length 65 | }).length 66 | } catch (e) { 67 | return false 68 | } 69 | }) 70 | } 71 | 72 | open () { 73 | return new Promise((resolve, reject) => { 74 | if (this.isOpen) 75 | return resolve() 76 | 77 | this.device.open() 78 | 79 | for (const iface of this.device.interfaces) { 80 | // http://libusb.sourceforge.net/api-1.0/group__dev.html#gab14d11ed6eac7519bb94795659d2c971 81 | // libusb_kernel_driver_active / libusb_attach_kernel_driver / libusb_detach_kernel_driver : "This functionality is not available on Windows 82 | if (OS.platform() !== 'win32') { 83 | if (iface.isKernelDriverActive()) { 84 | try { 85 | iface.detachKernelDriver() 86 | } catch (e) { 87 | return reject(new Error(`Could not detach kernel driver: '${e.message}'`)) 88 | } 89 | } 90 | } 91 | 92 | iface.claim() // must be called before using any endpoints of this interface. 93 | 94 | for (const endpoint of iface.endpoints) { 95 | if (endpoint.direction === 'out') { 96 | this.endpoint = endpoint 97 | 98 | break 99 | } 100 | } 101 | 102 | if (this.endpoint) 103 | break 104 | } 105 | 106 | if (!this.endpoint) 107 | return reject(new Error('Can not find endpoint from printer')) 108 | 109 | this.isOpen = true 110 | this.emit('open') 111 | 112 | return resolve() 113 | }) 114 | } 115 | 116 | close () { 117 | return new Promise((resolve) => { 118 | if (!this.isOpen) 119 | return resolve() 120 | 121 | this.device.close() 122 | this.isOpen = false 123 | this.endpoint = null 124 | this.emit('close') 125 | 126 | return resolve() 127 | }) 128 | } 129 | 130 | write (buffer) { 131 | try { 132 | if (!this.isOpen || !this.endpoint) 133 | throw new Error('Adapter not opened') 134 | 135 | this.endpoint.transfer(buffer) 136 | } catch (e) { 137 | this.emit('error', e) 138 | } 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /src/js/base/adapter.js: -------------------------------------------------------------------------------- 1 | import EventEmitter from 'events' 2 | 3 | export default class Adapter extends EventEmitter { 4 | constructor () { 5 | super() 6 | 7 | this.isOpen = false 8 | this.device = null 9 | } 10 | 11 | open () { 12 | return new Promise((resolve) => { 13 | if (this.isOpen) 14 | return resolve() 15 | 16 | // TODO: implement this method 17 | // console.error('Not Implemented') 18 | 19 | this.isOpen = true 20 | this.emit('open') 21 | return resolve() 22 | }) 23 | } 24 | 25 | close () { 26 | return new Promise((resolve) => { 27 | if (!this.isOpen) 28 | return resolve() 29 | 30 | // TODO: implement this method 31 | // console.error('Not Implemented') 32 | 33 | this.isOpen = false 34 | this.emit('close') 35 | 36 | return resolve() 37 | }) 38 | } 39 | 40 | write () { 41 | // TODO: implement this method 42 | // console.error('Not Implemented') 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/js/constant.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash' 2 | import AutoLaunch from 'auto-launch' 3 | import Config from 'electron-config' 4 | import { version } from '../../package.json' 5 | 6 | export const CFG = new Config({ 7 | name : 'recta', 8 | defaults: { 9 | printer: { 10 | adapter: 'usb', 11 | option : {}, 12 | }, 13 | app: { 14 | port: 1811, 15 | key : _.random(1000000000, 9999999999).toString(), 16 | }, 17 | }, 18 | }) 19 | 20 | export const AUTOLUNCHER = new AutoLaunch({ 21 | name : 'Recta', 22 | isHidden: true, 23 | }) 24 | 25 | export const ICON = (() => { 26 | const icons = { 27 | linux: '../img/icons/png/64x64.png', 28 | win32: '../img/icons/win/icon.ico', 29 | } 30 | 31 | return icons[process.platform] 32 | })() 33 | 34 | export const PRINT_TEST = 35 | `\x1b\x40\x1b\x61\x01 36 | *** PRINTER TEST *** 37 | *** RECTA PRINT *** 38 | *** v ${version} *** 39 | *** --------------- *** 40 | \x1b\x61\x00LEFT ALIGN 41 | \x1b\x61\x01CENTER ALIGN 42 | \x1b\x61\x02RIGHT ALIGN 43 | \x1b\x61\x00\x1b\x2d\x01UNDERLINE 44 | \x1b\x2d\x02UNDERLINE DOUBLE 45 | \x1b\x2d\x00\x1b\x45\x01EMPHASIZED 46 | \x1b\x45\x00\x1b\x47\x01DOUBLE STRIKE 47 | \x1b\x47\x00\x1b\x61\x01 48 | \x1d\x6b\x41\x0c123456789012\n\n` 49 | -------------------------------------------------------------------------------- /src/js/index.js: -------------------------------------------------------------------------------- 1 | import fs from 'fs' 2 | import path from 'path' 3 | import url from 'url' 4 | import { BrowserWindow, Menu, MenuItem, Tray, app, ipcMain } from 'electron' 5 | import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer' 6 | import { enableLiveReload } from 'electron-compile' 7 | import ELECTRON_SQUIRREL_STARTUP from 'electron-squirrel-startup' 8 | import Positioner from 'electron-positioner' 9 | import minimist from 'minimist' 10 | import { ICON } from './constant.js' 11 | 12 | // Keep a global reference of the window object, if you don't, the window will 13 | // be closed automatically when the JavaScript object is garbage collected. 14 | let mainWindow 15 | let tray 16 | 17 | const flags = minimist(process.argv, { 18 | boolean: true, 19 | default: { 20 | dev : !!process.execPath.match(/[\\/]electron/), 21 | testing: false, 22 | hidden : false, 23 | debug : false, 24 | log : app.getPath('home'), 25 | }, 26 | }) 27 | 28 | if (flags.debug) { 29 | process.on('uncaughtException', (err) => { 30 | fs.appendFileSync(path.join(flags.log, 'recta-error.log'), err) 31 | }) 32 | } 33 | 34 | if (flags.dev) enableLiveReload() 35 | 36 | const isSecondInstance = app.makeSingleInstance((commandLine, workingDirectory) => { 37 | // Someone tried to run a second instance, we should focus our window. 38 | if (mainWindow) { 39 | if (mainWindow.isMinimized()) 40 | mainWindow.restore() 41 | 42 | mainWindow.focus() 43 | } 44 | }) 45 | 46 | if (isSecondInstance) { 47 | app.isQuiting = true 48 | app.quit() 49 | } 50 | 51 | if (ELECTRON_SQUIRREL_STARTUP) { 52 | app.isQuiting = true 53 | app.quit() 54 | } 55 | 56 | const createWindow = async () => { 57 | // Create the browser window. 58 | mainWindow = new BrowserWindow({ 59 | width : 400, 60 | height: 600, 61 | show : !flags.hidden, 62 | icon : path.join(__dirname, '../img/icons/png/32x32.png'), 63 | }) 64 | 65 | const positioner = new Positioner(mainWindow) 66 | 67 | positioner.move('topRight') 68 | 69 | const mainMenu = Menu.buildFromTemplate([ 70 | { 71 | label : 'File', 72 | submenu: [ 73 | { 74 | label: 'Minimize to Tray', 75 | click () { 76 | mainWindow.hide() 77 | }, 78 | }, 79 | { type: 'separator' }, 80 | { 81 | label: 'Quit', 82 | click () { 83 | app.isQuiting = true 84 | app.quit() 85 | }, 86 | }, 87 | ], 88 | }, 89 | ]) 90 | 91 | if (flags.dev) { 92 | mainMenu.items[0].submenu.insert(1, new MenuItem({ type: 'separator' })) 93 | mainMenu.items[0].submenu.insert(2, new MenuItem({ 94 | label: 'Toggle Developer Tools', 95 | role : 'toggledevtools', 96 | })) 97 | } 98 | 99 | Menu.setApplicationMenu(mainMenu) 100 | 101 | // Show tray icon 102 | const trayMenu = Menu.buildFromTemplate([ 103 | { 104 | label: 'Show', 105 | click () { 106 | mainWindow.show() 107 | }, 108 | }, 109 | { type: 'separator' }, 110 | { 111 | label: 'Start', 112 | click () { 113 | mainWindow.webContents.send('start') 114 | }, 115 | }, 116 | { 117 | label : 'Stop', 118 | enabled: false, 119 | click () { 120 | mainWindow.webContents.send('stop') 121 | }, 122 | }, 123 | { type: 'separator' }, 124 | { 125 | label: 'Quit', 126 | click () { 127 | app.isQuiting = true 128 | app.quit() 129 | }, 130 | }, 131 | ]) 132 | 133 | tray = new Tray(path.join(__dirname, ICON)) 134 | tray.setToolTip('Recta Print') 135 | tray.setContextMenu(trayMenu) 136 | 137 | // and load the index.html of the app. 138 | mainWindow.loadURL(url.format({ 139 | protocol: 'file', 140 | slashes : true, 141 | pathname: path.join(__dirname, '../html/index.html'), 142 | })) 143 | 144 | // Open the DevTools. 145 | if (flags.dev) { 146 | await installExtension(VUEJS_DEVTOOLS) 147 | mainWindow.webContents.openDevTools() 148 | } 149 | 150 | // Emitted when minimize clicked 151 | mainWindow.on('minimize', (e) => { 152 | e.preventDefault() 153 | 154 | mainWindow.hide() 155 | }) 156 | 157 | // Emitted when close clicked 158 | mainWindow.on('close', (e) => { 159 | if (!app.isQuiting && !flags.testing) { 160 | e.preventDefault() 161 | 162 | mainWindow.hide() 163 | } 164 | }) 165 | 166 | // Emitted when the window is closed. 167 | mainWindow.on('closed', () => { 168 | // Dereference the window object, usually you would store windows 169 | // in an array if your app supports multi windows, this is the time 170 | // when you should delete the corresponding element. 171 | mainWindow = null 172 | }) 173 | 174 | ipcMain.on('started', () => { 175 | trayMenu.items[2].enabled = false 176 | trayMenu.items[3].enabled = true 177 | 178 | tray.setContextMenu(trayMenu) 179 | }) 180 | 181 | ipcMain.on('stoped', () => { 182 | trayMenu.items[2].enabled = true 183 | trayMenu.items[3].enabled = false 184 | 185 | tray.setContextMenu(trayMenu) 186 | }) 187 | } 188 | 189 | // This method will be called when Electron has finished 190 | // initialization and is ready to create browser windows. 191 | // Some APIs can only be used after this event occurs. 192 | app.on('ready', createWindow) 193 | 194 | // Quit when all windows are closed. 195 | app.on('window-all-closed', () => { 196 | // On OS X it is common for applications and their menu bar 197 | // to stay active until the user quits explicitly with Cmd + Q 198 | if (process.platform !== 'darwin') 199 | app.quit() 200 | }) 201 | 202 | app.on('activate', () => { 203 | // On OS X it's common to re-create a window in the app when the 204 | // dock icon is clicked and there are no other windows open. 205 | if (mainWindow === null) 206 | createWindow() 207 | }) 208 | 209 | // In this file you can include the rest of your app's specific main process 210 | // code. You can also put them in separate files and import them here. 211 | -------------------------------------------------------------------------------- /src/js/printer.js: -------------------------------------------------------------------------------- 1 | import EventEmitter from 'events' 2 | import Adapter from './base/adapter.js' 3 | import Usb from './adapter/usb.js' 4 | import Serial from './adapter/serial.js' 5 | import Network from './adapter/network.js' 6 | 7 | const PRINTER_ADAPTER = { 8 | USB : Usb, 9 | SERIAL : Serial, 10 | NETWORK: Network, 11 | } 12 | 13 | export default class Printer extends EventEmitter { 14 | constructor (adapter, options) { 15 | super() 16 | 17 | if (adapter instanceof Adapter) 18 | this.adapter = adapter 19 | else 20 | this.adapter = new PRINTER_ADAPTER[adapter.toUpperCase()](options) 21 | 22 | this.adapter.on('open', () => { 23 | this.emit('open') 24 | }) 25 | this.adapter.on('close', () => { 26 | this.emit('close') 27 | }) 28 | this.adapter.on('error', (e) => { 29 | this.emit('error', e) 30 | }) 31 | } 32 | 33 | get isOpen () { 34 | return this.adapter.isOpen 35 | } 36 | 37 | print (data) { 38 | this.adapter.write(data) 39 | } 40 | 41 | open () { 42 | return this.adapter.open() 43 | } 44 | 45 | close () { 46 | return this.adapter.close() 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/js/service.js: -------------------------------------------------------------------------------- 1 | import EventEmitter from 'events' 2 | import HTTP from 'http' 3 | import Socket from 'socket.io' 4 | import Printer from './printer.js' 5 | import { CFG } from './constant.js' 6 | 7 | export default class Service extends EventEmitter { 8 | constructor () { 9 | super() 10 | 11 | this.http = HTTP.createServer((req, res) => { 12 | res.end('Recta Print Service') 13 | }) 14 | this.http.setTimeout(1000) 15 | 16 | this.io = new Socket(this.http) 17 | this.io.use((socket, next) => { 18 | const token = socket.handshake.query.token 19 | const appkey = CFG.get('app.key') 20 | 21 | if (token !== appkey) 22 | return next(new Error('Not Authorized')) 23 | 24 | return next() 25 | }) 26 | this.io.on('connection', (socket) => { 27 | socket.on('message', (data) => { 28 | this.emit('message', data) 29 | 30 | this.printer.print(Buffer.from(data)) 31 | }) 32 | }) 33 | 34 | this.printer = new Printer(CFG.get('printer.adapter'), CFG.get('printer.option')) 35 | this.printer.on('open', () => { 36 | this.emit('printer:open') 37 | }) 38 | this.printer.on('close', () => { 39 | if (this.http.listening) { 40 | this.io.close(() => { 41 | this.http.close(() => { 42 | this.emit('error', new Error('Printer has closed')) 43 | this.emit('close') 44 | }) 45 | }) 46 | } 47 | 48 | this.emit('printer:close') 49 | }) 50 | this.printer.on('error', (e) => { 51 | this.emit('error', e) 52 | this.emit('printer:error', e) 53 | }) 54 | } 55 | 56 | start () { 57 | return new Promise((resolve, reject) => { 58 | this.http.listen(CFG.get('app.port'), () => { 59 | this.printer.open().then(() => { 60 | this.emit('open') 61 | 62 | return resolve() 63 | }).catch((e) => { 64 | this.http.close(() => { 65 | return reject(e) 66 | }) 67 | }) 68 | }).once('error', (error) => { 69 | return reject(error) 70 | }) 71 | }) 72 | } 73 | 74 | stop () { 75 | return new Promise((resolve, reject) => { 76 | this.io.close(() => { 77 | this.http.close(() => { 78 | this.printer.close().then(() => { 79 | this.emit('close') 80 | 81 | return resolve() 82 | }).catch((e) => { 83 | return reject(e) 84 | }) 85 | }) 86 | }) 87 | }) 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const assert = require('assert') 3 | const console = require('mocha-logger') 4 | const Application = require('spectron').Application 5 | 6 | const PLATFORM = process.platform 7 | const ARCH = process.env.BUILD_ARCH || process.arch 8 | 9 | let APP_PATH = `../out/recta-host-${PLATFORM}-${ARCH}/recta-host` 10 | 11 | if (PLATFORM === 'win32') 12 | APP_PATH += '.exe' 13 | 14 | describe('Application launch', function () { 15 | this.timeout(60000) 16 | 17 | before(() => { 18 | this.app = new Application({ 19 | path : path.join(__dirname, APP_PATH), 20 | args : ['--testing', '--debug'], 21 | startTimeout: 30000, 22 | }) 23 | return this.app.start().then(() => { 24 | return this.app.client.waitUntilWindowLoaded(30000) 25 | }) 26 | }) 27 | 28 | after(() => { 29 | return this.app.client.getMainProcessLogs().then((logs) => { 30 | if (logs.length) { 31 | logs.forEach((log) => { 32 | if (log.trim()) 33 | console.log(log.trim()) 34 | }) 35 | } 36 | 37 | if (this.app && this.app.isRunning()) 38 | return this.app.stop() 39 | }) 40 | }) 41 | 42 | it('Windows must be shown', () => { 43 | return this.app.client.getWindowCount().then((count) => { 44 | assert.equal(count, 1) 45 | }) 46 | }) 47 | 48 | it('Windows must be visible', () => { 49 | return this.app.browserWindow.isVisible().then((visible) => { 50 | assert.equal(visible, true) 51 | }) 52 | }) 53 | 54 | // Issue with LibUsb init on travis 55 | // https://github.com/tessel/node-usb/issues/194 56 | if (!process.env.TRAVIS) { 57 | it('Main component must be shown', () => { 58 | return this.app.client.waitUntilTextExists('#app-name', 'Recta Host', 30000) 59 | }) 60 | } 61 | }) 62 | --------------------------------------------------------------------------------