├── .gitignore ├── .nvmrc ├── .vscode ├── launch.json └── settings.json ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── app.ts ├── assets ├── app_icon.png ├── appauth.svg ├── appauth_circle.svg ├── appauth_electron.svg └── appauth_lockup_js.svg ├── flags.ts ├── flow.ts ├── index.html ├── index.ts ├── logger.ts ├── logo.svg ├── package-lock.json ├── package.json ├── styles.css ├── tsconfig.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *~ 3 | *.swp 4 | .idea 5 | *.iml 6 | npm-debug.log 7 | *.log 8 | *.stackdump 9 | 10 | node_modules/ 11 | bower_components/ 12 | tmp/ 13 | *.google 14 | built/ 15 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v8.11.1 2 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Debug Main Process", 6 | "type": "node", 7 | "request": "launch", 8 | "cwd": "${workspaceRoot}", 9 | "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron", 10 | "program": "${workspaceRoot}/built/index.js" 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "window.openFilesInNewWindow": "on", 4 | "editor.formatOnSave": true 5 | } -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How to become a contributor and submit your own code 2 | 3 | ## Contributor License Agreements 4 | 5 | We'd love to accept your patches! Before we can take them, we 6 | have to jump a couple of legal hurdles. 7 | 8 | Please fill out either the individual or corporate Contributor License Agreement 9 | (CLA). 10 | 11 | * If you are an individual writing original source code and you're sure you 12 | own the intellectual property, then you'll need to sign an [individual CLA] 13 | (http://code.google.com/legal/individual-cla-v1.0.html). 14 | * If you work for a company that wants to allow you to contribute your work, 15 | then you'll need to sign a [corporate CLA] 16 | (http://code.google.com/legal/corporate-cla-v1.0.html). 17 | 18 | Follow either of the two links above to access the appropriate CLA and 19 | instructions for how to sign and return it. Once we receive it, we'll be able to 20 | accept your pull requests. 21 | 22 | ## Contributing a Patch 23 | 24 | 1. Sign a Contributor License Agreement, if you have not yet done so (see 25 | details above). 26 | 2. Create your change to the repo in question. 27 | * Fork the desired repo, develop and test your code changes. 28 | * Ensure that your code is clear and comprehensible. 29 | * Ensure that your code has an appropriate set of unit tests which all pass. 30 | 3. Submit a pull request. 31 | 4. The repo owner will review your request. If it is approved, the change will 32 | be merged. If it needs additional work, the repo owner will respond with 33 | useful comments. -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AppAuth-JS + Electron 2 | 3 | ![AppAuth-JS + Electron](https://rawgit.com/googlesamples/appauth-js-electron-sample/master/logo.svg) 4 | 5 | This is an Electron Application, which uses the [AppAuth-JS](https://github.com/openid/AppAuth-JS) library. 6 | 7 | Please note that this is not an official Google product. 8 | 9 | ## Development 10 | 11 | This application has been written with [TypeScript](https://typescriptlang.org). 12 | 13 | ### Setup 14 | 15 | * Install the latest version of [Node](https://nodejs.org/en/). 16 | [NVM](https://github.com/creationix/nvm) 17 | (Node Version Manager is highly recommended). 18 | 19 | * Use `nvm install` to install the recommended Node.js version. 20 | 21 | * Download the latest version of Visual Studio Code from 22 | [here](https://code.visualstudio.com/). 23 | 24 | * Install [Yarn](https://yarnpkg.com/en/docs/install) package manager. 25 | 26 | ### Provision Dependencies 27 | 28 | * `yarn install` or `npm install` to provision all the package depencies (from the folder that contains `package.json`). 29 | 30 | Thats it! You are now ready to start. 31 | 32 | ### Development Workflow 33 | 34 | This project has a few scripts to help you with your development workflow. 35 | 36 | * `yarn run dev` or `npm run-script dev` will run the Electron application. This will also start the Typescript compiler in `watch` mode, and will automatically recompile your application as you start to make changes. Just reload the electron application to see your changes. 37 | 38 | * `yarn start` or `npm start` is to start the Electron application (without setting up watches that monitor for changes). 39 | -------------------------------------------------------------------------------- /app.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2017 Google Inc. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import {ipcRenderer} from 'electron'; 18 | import {AuthFlow, AuthStateEmitter} from './flow'; 19 | import {log} from './logger'; 20 | 21 | const SIGN_IN = 'Sign-In'; 22 | const SIGN_OUT = 'Sign-Out'; 23 | 24 | interface SnackBarOptions { 25 | message: string; 26 | timeout?: number; 27 | actionHandler?: (event: any) => void; 28 | actionText?: string; 29 | } 30 | 31 | interface UserInfo { 32 | name: string; 33 | given_name: string; 34 | family_name: string; 35 | picture: string; 36 | } 37 | 38 | export class App { 39 | private authFlow: AuthFlow = new AuthFlow(); 40 | private userInfo: UserInfo|null = null; 41 | 42 | private handleSignIn = 43 | document.querySelector('#handle-sign-in') as HTMLElement; 44 | 45 | private fetchUserInfo = 46 | document.querySelector('#handle-user-info') as HTMLElement; 47 | 48 | private userCard = document.querySelector('#user-info') as HTMLElement; 49 | 50 | private userProfileImage = 51 | document.querySelector('#user-profile-image') as HTMLImageElement; 52 | 53 | private userName = document.querySelector('#user-name') as HTMLElement; 54 | 55 | private snackbarContainer: any = 56 | document.querySelector('#appauth-snackbar') as HTMLElement; 57 | 58 | constructor() { 59 | this.initializeUi(); 60 | this.handleSignIn.addEventListener('click', (event) => { 61 | if (this.handleSignIn.textContent === SIGN_IN) { 62 | this.signIn(); 63 | } else if (this.handleSignIn.textContent === SIGN_OUT) { 64 | this.signOut(); 65 | } 66 | event.preventDefault(); 67 | }); 68 | 69 | this.fetchUserInfo.addEventListener('click', () => { 70 | this.authFlow.performWithFreshTokens().then(accessToken => { 71 | let request = 72 | new Request('https://www.googleapis.com/oauth2/v3/userinfo', { 73 | headers: new Headers({'Authorization': `Bearer ${accessToken}`}), 74 | method: 'GET', 75 | cache: 'no-cache' 76 | }); 77 | 78 | fetch(request) 79 | .then(result => result.json()) 80 | .then(user => { 81 | log('User Info ', user); 82 | this.userInfo = user; 83 | this.updateUi(); 84 | }) 85 | .catch(error => { 86 | log('Something bad happened ', error); 87 | }); 88 | }); 89 | }); 90 | 91 | this.authFlow.authStateEmitter.on( 92 | AuthStateEmitter.ON_TOKEN_RESPONSE, () => { 93 | this.updateUi(); 94 | // request app focus 95 | ipcRenderer.send('app-focus'); 96 | }); 97 | } 98 | 99 | signIn(username?: string): Promise { 100 | if (!this.authFlow.loggedIn()) { 101 | return this.authFlow.fetchServiceConfiguration().then( 102 | () => this.authFlow.makeAuthorizationRequest(username)); 103 | } else { 104 | return Promise.resolve(); 105 | } 106 | } 107 | 108 | private initializeUi() { 109 | this.handleSignIn.textContent = SIGN_IN; 110 | this.fetchUserInfo.style.display = 'none'; 111 | this.userCard.style.display = 'none'; 112 | } 113 | 114 | // update ui post logging in. 115 | private updateUi() { 116 | this.handleSignIn.textContent = SIGN_OUT; 117 | this.fetchUserInfo.style.display = ''; 118 | if (this.userInfo) { 119 | this.userProfileImage.src = `${this.userInfo.picture}?sz=96`; 120 | this.userName.textContent = this.userInfo.name; 121 | this.showSnackBar( 122 | {message: `Welcome ${this.userInfo.name}`, timeout: 4000}); 123 | this.userCard.style.display = ''; 124 | } 125 | } 126 | 127 | private showSnackBar(data: SnackBarOptions) { 128 | this.snackbarContainer.MaterialSnackbar.showSnackbar(data); 129 | } 130 | 131 | signOut() { 132 | this.authFlow.signOut(); 133 | this.userInfo = null; 134 | this.initializeUi(); 135 | } 136 | } 137 | 138 | log('Init complete'); 139 | const app = new App(); 140 | -------------------------------------------------------------------------------- /assets/app_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/googlesamples/appauth-js-electron-sample/03508eeebf133c574afd78b03d2e8e9604541676/assets/app_icon.png -------------------------------------------------------------------------------- /assets/appauth.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/appauth_circle.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/appauth_electron.svg: -------------------------------------------------------------------------------- 1 | + -------------------------------------------------------------------------------- /assets/appauth_lockup_js.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | image/svg+xml -------------------------------------------------------------------------------- /flags.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2017 Google Inc. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | /** Run in profile mode ? */ 18 | export const IS_PROFILE = false; 19 | 20 | /** should the application log ? */ 21 | export const IS_LOG = true; 22 | -------------------------------------------------------------------------------- /flow.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2017 Google Inc. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import { AuthorizationRequest } from "@openid/appauth/built/authorization_request"; 18 | import { 19 | AuthorizationNotifier, 20 | AuthorizationRequestHandler, 21 | AuthorizationRequestResponse, 22 | BUILT_IN_PARAMETERS 23 | } from "@openid/appauth/built/authorization_request_handler"; 24 | import { AuthorizationResponse } from "@openid/appauth/built/authorization_response"; 25 | import { AuthorizationServiceConfiguration } from "@openid/appauth/built/authorization_service_configuration"; 26 | import { NodeCrypto } from '@openid/appauth/built/node_support/'; 27 | import { NodeBasedHandler } from "@openid/appauth/built/node_support/node_request_handler"; 28 | import { NodeRequestor } from "@openid/appauth/built/node_support/node_requestor"; 29 | import { 30 | GRANT_TYPE_AUTHORIZATION_CODE, 31 | GRANT_TYPE_REFRESH_TOKEN, 32 | TokenRequest 33 | } from "@openid/appauth/built/token_request"; 34 | import { 35 | BaseTokenRequestHandler, 36 | TokenRequestHandler 37 | } from "@openid/appauth/built/token_request_handler"; 38 | import { 39 | TokenError, 40 | TokenResponse 41 | } from "@openid/appauth/built/token_response"; 42 | import EventEmitter = require("events"); 43 | 44 | import { log } from "./logger"; 45 | import { StringMap } from "@openid/appauth/built/types"; 46 | 47 | export class AuthStateEmitter extends EventEmitter { 48 | static ON_TOKEN_RESPONSE = "on_token_response"; 49 | } 50 | 51 | /* the Node.js based HTTP client. */ 52 | const requestor = new NodeRequestor(); 53 | 54 | /* an example open id connect provider */ 55 | const openIdConnectUrl = "https://accounts.google.com"; 56 | 57 | /* example client configuration */ 58 | const clientId = 59 | "511828570984-7nmej36h9j2tebiqmpqh835naet4vci4.apps.googleusercontent.com"; 60 | const redirectUri = "http://127.0.0.1:8000"; 61 | const scope = "openid"; 62 | 63 | export class AuthFlow { 64 | private notifier: AuthorizationNotifier; 65 | private authorizationHandler: AuthorizationRequestHandler; 66 | private tokenHandler: TokenRequestHandler; 67 | readonly authStateEmitter: AuthStateEmitter; 68 | 69 | // state 70 | private configuration: AuthorizationServiceConfiguration | undefined; 71 | 72 | private refreshToken: string | undefined; 73 | private accessTokenResponse: TokenResponse | undefined; 74 | 75 | constructor() { 76 | this.notifier = new AuthorizationNotifier(); 77 | this.authStateEmitter = new AuthStateEmitter(); 78 | this.authorizationHandler = new NodeBasedHandler(); 79 | this.tokenHandler = new BaseTokenRequestHandler(requestor); 80 | // set notifier to deliver responses 81 | this.authorizationHandler.setAuthorizationNotifier(this.notifier); 82 | // set a listener to listen for authorization responses 83 | // make refresh and access token requests. 84 | this.notifier.setAuthorizationListener((request, response, error) => { 85 | log("Authorization request complete ", request, response, error); 86 | if (response) { 87 | let codeVerifier: string | undefined; 88 | if(request.internal && request.internal.code_verifier) { 89 | codeVerifier = request.internal.code_verifier; 90 | } 91 | 92 | this.makeRefreshTokenRequest(response.code, codeVerifier) 93 | .then(result => this.performWithFreshTokens()) 94 | .then(() => { 95 | this.authStateEmitter.emit(AuthStateEmitter.ON_TOKEN_RESPONSE); 96 | log("All Done."); 97 | }); 98 | } 99 | }); 100 | } 101 | 102 | fetchServiceConfiguration(): Promise { 103 | return AuthorizationServiceConfiguration.fetchFromIssuer( 104 | openIdConnectUrl, 105 | requestor 106 | ).then(response => { 107 | log("Fetched service configuration", response); 108 | this.configuration = response; 109 | }); 110 | } 111 | 112 | makeAuthorizationRequest(username?: string) { 113 | if (!this.configuration) { 114 | log("Unknown service configuration"); 115 | return; 116 | } 117 | 118 | const extras: StringMap = { prompt: "consent", access_type: "offline" }; 119 | if (username) { 120 | extras["login_hint"] = username; 121 | } 122 | 123 | // create a request 124 | const request = new AuthorizationRequest({ 125 | client_id: clientId, 126 | redirect_uri: redirectUri, 127 | scope: scope, 128 | response_type: AuthorizationRequest.RESPONSE_TYPE_CODE, 129 | state: undefined, 130 | extras: extras 131 | }, new NodeCrypto()); 132 | 133 | log("Making authorization request ", this.configuration, request); 134 | 135 | this.authorizationHandler.performAuthorizationRequest( 136 | this.configuration, 137 | request 138 | ); 139 | } 140 | 141 | private makeRefreshTokenRequest(code: string, codeVerifier: string|undefined): Promise { 142 | if (!this.configuration) { 143 | log("Unknown service configuration"); 144 | return Promise.resolve(); 145 | } 146 | 147 | const extras: StringMap = {}; 148 | 149 | if(codeVerifier) { 150 | extras.code_verifier = codeVerifier; 151 | } 152 | 153 | // use the code to make the token request. 154 | let request = new TokenRequest({ 155 | client_id: clientId, 156 | redirect_uri: redirectUri, 157 | grant_type: GRANT_TYPE_AUTHORIZATION_CODE, 158 | code: code, 159 | refresh_token: undefined, 160 | extras: extras 161 | }); 162 | 163 | return this.tokenHandler 164 | .performTokenRequest(this.configuration, request) 165 | .then(response => { 166 | log(`Refresh Token is ${response.refreshToken}`); 167 | this.refreshToken = response.refreshToken; 168 | this.accessTokenResponse = response; 169 | return response; 170 | }) 171 | .then(() => {}); 172 | } 173 | 174 | loggedIn(): boolean { 175 | return !!this.accessTokenResponse && this.accessTokenResponse.isValid(); 176 | } 177 | 178 | signOut() { 179 | // forget all cached token state 180 | this.accessTokenResponse = undefined; 181 | } 182 | 183 | performWithFreshTokens(): Promise { 184 | if (!this.configuration) { 185 | log("Unknown service configuration"); 186 | return Promise.reject("Unknown service configuration"); 187 | } 188 | if (!this.refreshToken) { 189 | log("Missing refreshToken."); 190 | return Promise.resolve("Missing refreshToken."); 191 | } 192 | if (this.accessTokenResponse && this.accessTokenResponse.isValid()) { 193 | // do nothing 194 | return Promise.resolve(this.accessTokenResponse.accessToken); 195 | } 196 | let request = new TokenRequest({ 197 | client_id: clientId, 198 | redirect_uri: redirectUri, 199 | grant_type: GRANT_TYPE_REFRESH_TOKEN, 200 | code: undefined, 201 | refresh_token: this.refreshToken, 202 | extras: undefined 203 | }); 204 | 205 | return this.tokenHandler 206 | .performTokenRequest(this.configuration, request) 207 | .then(response => { 208 | this.accessTokenResponse = response; 209 | return response.accessToken; 210 | }); 211 | } 212 | } 213 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AppAuth-JS with Electron 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |
14 |
15 |
16 |

AppAuth-JS

17 |
18 |
19 | 20 |
21 |
22 |
23 | This example shows how one can integrate AppAuthJS and Electron. For more information about AppAuthJS, see the 24 | following link: https://github.com/openid/AppAuth-JS. 25 |
26 |
27 | 28 | 29 |
30 |
31 |
32 |
33 | 34 |
35 |
36 |
37 | 38 |
39 |
40 | 41 |
42 |
43 | 44 | 45 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2017 Google Inc. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import {app, BrowserWindow, ipcMain} from 'electron'; 18 | import url = require('url'); 19 | import path = require('path'); 20 | import {log} from './logger'; 21 | 22 | // retain a reference to the window, otherwise it gets gc-ed 23 | let w: Electron.BrowserWindow|null = null; 24 | 25 | function createWindow(): Electron.BrowserWindow { 26 | log('Creating window.'); 27 | w = new BrowserWindow( 28 | {width: 1280, height: 720, icon: 'assets/app_icon.png'}); 29 | w.loadURL(url.format({ 30 | pathname: path.join(path.dirname(__dirname), 'index.html'), 31 | protocol: 'file:', 32 | slashes: true 33 | })); 34 | w.on('close', () => { 35 | // allow window to be gc-ed 36 | w = null; 37 | }); 38 | ipcMain.on('app-focus', () => { 39 | log('Main process is gaining focus'); 40 | app.focus(); 41 | }); 42 | return w; 43 | } 44 | 45 | app.on('ready', createWindow); 46 | 47 | app.on('window-all-closed', () => { 48 | log('All windows closed'); 49 | // On macOS it is common for applications and their menu bar 50 | // to stay active until the user quits explicitly with Cmd + Q 51 | if (process.platform !== 'darwin') { 52 | app.quit() 53 | } 54 | }); 55 | 56 | app.on('activate', () => { 57 | if (w === null) { 58 | log('Creating a new window'); 59 | w = createWindow(); 60 | } 61 | }); 62 | -------------------------------------------------------------------------------- /logger.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2017 Google Inc. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 | * use this file except in compliance with the License. You may obtain a copy of 6 | * the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | * License for the specific language governing permissions and limitations under 14 | * the License. 15 | */ 16 | 17 | import {IS_LOG, IS_PROFILE} from './flags'; 18 | 19 | export function log(message: string, ...args: any[]) { 20 | if (IS_LOG) { 21 | let length = args ? args.length : 0; 22 | if (length > 0) { 23 | console.log(message, ...args); 24 | } else { 25 | console.log(message); 26 | } 27 | } 28 | }; 29 | 30 | // check to see if native support for profiling is available. 31 | const NATIVE_PROFILE_SUPPORT = 32 | typeof window !== 'undefined' && !!window.performance && !!console.profile; 33 | 34 | /** 35 | * A decorator that can profile a function. 36 | */ 37 | export function profile( 38 | target: any, propertyKey: string, descriptor: PropertyDescriptor) { 39 | if (IS_PROFILE) { 40 | return performProfile(target, propertyKey, descriptor); 41 | } else { 42 | // return as-is 43 | return descriptor; 44 | } 45 | } 46 | 47 | function performProfile( 48 | target: any, propertyKey: string, 49 | descriptor: PropertyDescriptor): PropertyDescriptor { 50 | let originalCallable = descriptor.value; 51 | // name must exist 52 | let name = originalCallable.name; 53 | if (!name) { 54 | name = 'anonymous function'; 55 | } 56 | if (NATIVE_PROFILE_SUPPORT) { 57 | descriptor.value = function(...args: any[]) { 58 | console.profile(name); 59 | let startTime = window.performance.now(); 60 | let result = originalCallable.call(this || window, ...args); 61 | let duration = window.performance.now() - startTime; 62 | console.log(`${name} took ${duration} ms`); 63 | console.profileEnd(); 64 | return result; 65 | }; 66 | } else { 67 | descriptor.value = function(...args: any[]) { 68 | log(`Profile start ${name}`); 69 | let start = Date.now(); 70 | let result = originalCallable.call(this || window, ...args); 71 | let duration = Date.now() - start; 72 | log(`Profile end ${name} took ${duration} ms.`); 73 | return result; 74 | }; 75 | } 76 | return descriptor; 77 | } 78 | -------------------------------------------------------------------------------- /logo.svg: -------------------------------------------------------------------------------- 1 | + -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "appauth-electron", 3 | "version": "0.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@openid/appauth": { 8 | "version": "1.1.1", 9 | "resolved": "https://registry.npmjs.org/@openid/appauth/-/appauth-1.1.1.tgz", 10 | "integrity": "sha512-FkOuqnV8zXRkJPeMu+u+3FQcafh3sLYKg1Pdd0yUBeVCqDQgh5qFAWexn3Yy+PAbj2ry30mST1bCoNQuPVLsdA==", 11 | "requires": { 12 | "@types/base64-js": "^1.2.5", 13 | "@types/jquery": "^3.3.6", 14 | "base64-js": "^1.3.0", 15 | "follow-redirects": "^1.5.8", 16 | "form-data": "^2.3.2", 17 | "opener": "^1.5.1" 18 | }, 19 | "dependencies": { 20 | "@types/jquery": { 21 | "version": "3.3.22", 22 | "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.3.22.tgz", 23 | "integrity": "sha512-a4JDcIhJhHYnoWCkG3xT2CZxXZeA92JeREESorg0DMQ3ZsjuKF48h7XK4l5Gl2GRa/ItGRpKMT0pyK88yRgqXQ==", 24 | "requires": { 25 | "@types/sizzle": "*" 26 | } 27 | }, 28 | "opener": { 29 | "version": "1.5.1", 30 | "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", 31 | "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==" 32 | } 33 | } 34 | }, 35 | "@types/base64-js": { 36 | "version": "1.2.5", 37 | "resolved": "http://registry.npmjs.org/@types/base64-js/-/base64-js-1.2.5.tgz", 38 | "integrity": "sha1-WCskdhaabLpGCiFNR2x0REHYc9U=" 39 | }, 40 | "@types/node": { 41 | "version": "10.12.3", 42 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.3.tgz", 43 | "integrity": "sha512-sfGmOtSMSbQ/AKG8V9xD1gmjquC9awIIZ/Kj309pHb2n3bcRAcGMQv5nJ6gCXZVsneGE4+ve8DXKRCsrg3TFzg==" 44 | }, 45 | "@types/prop-types": { 46 | "version": "15.5.6", 47 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.5.6.tgz", 48 | "integrity": "sha512-ZBFR7TROLVzCkswA3Fmqq+IIJt62/T7aY/Dmz+QkU7CaW2QFqAitCE8Ups7IzmGhcN1YWMBT4Qcoc07jU9hOJQ==" 49 | }, 50 | "@types/react": { 51 | "version": "16.7.1", 52 | "resolved": "https://registry.npmjs.org/@types/react/-/react-16.7.1.tgz", 53 | "integrity": "sha512-kxde2oP2JvHiEXiAfb8WkL+8Aa9txDRD7L8zb3BipMNRoBbcr32xy/kfpbxmWMus71yXgJDqBgLmWil6UXdLzQ==", 54 | "requires": { 55 | "@types/prop-types": "*", 56 | "csstype": "^2.2.0" 57 | } 58 | }, 59 | "@types/react-dom": { 60 | "version": "16.0.9", 61 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.0.9.tgz", 62 | "integrity": "sha512-4Z0bW+75zeQgsEg7RaNuS1k9MKhci7oQqZXxrV5KUGIyXZHHAAL3KA4rjhdH8o6foZ5xsRMSqkoM5A3yRVPR5w==", 63 | "requires": { 64 | "@types/node": "*", 65 | "@types/react": "*" 66 | } 67 | }, 68 | "@types/sizzle": { 69 | "version": "2.3.2", 70 | "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", 71 | "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==" 72 | }, 73 | "ajv": { 74 | "version": "5.5.2", 75 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 76 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 77 | "requires": { 78 | "co": "^4.6.0", 79 | "fast-deep-equal": "^1.0.0", 80 | "fast-json-stable-stringify": "^2.0.0", 81 | "json-schema-traverse": "^0.3.0" 82 | } 83 | }, 84 | "ansi-regex": { 85 | "version": "2.1.1", 86 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 87 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 88 | }, 89 | "array-find-index": { 90 | "version": "1.0.2", 91 | "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", 92 | "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" 93 | }, 94 | "asn1": { 95 | "version": "0.2.4", 96 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 97 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 98 | "requires": { 99 | "safer-buffer": "~2.1.0" 100 | } 101 | }, 102 | "assert-plus": { 103 | "version": "1.0.0", 104 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 105 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 106 | }, 107 | "asynckit": { 108 | "version": "0.4.0", 109 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 110 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 111 | }, 112 | "aws-sign2": { 113 | "version": "0.7.0", 114 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 115 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 116 | }, 117 | "aws4": { 118 | "version": "1.8.0", 119 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 120 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" 121 | }, 122 | "base64-js": { 123 | "version": "1.3.0", 124 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", 125 | "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" 126 | }, 127 | "bcrypt-pbkdf": { 128 | "version": "1.0.2", 129 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 130 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 131 | "requires": { 132 | "tweetnacl": "^0.14.3" 133 | } 134 | }, 135 | "buffer-from": { 136 | "version": "1.1.1", 137 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 138 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 139 | }, 140 | "builtin-modules": { 141 | "version": "1.1.1", 142 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 143 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" 144 | }, 145 | "camelcase": { 146 | "version": "2.1.1", 147 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 148 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" 149 | }, 150 | "camelcase-keys": { 151 | "version": "2.1.0", 152 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", 153 | "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", 154 | "requires": { 155 | "camelcase": "^2.0.0", 156 | "map-obj": "^1.0.0" 157 | } 158 | }, 159 | "caseless": { 160 | "version": "0.12.0", 161 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 162 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 163 | }, 164 | "co": { 165 | "version": "4.6.0", 166 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 167 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 168 | }, 169 | "code-point-at": { 170 | "version": "1.1.0", 171 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 172 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 173 | }, 174 | "combined-stream": { 175 | "version": "1.0.6", 176 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", 177 | "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", 178 | "requires": { 179 | "delayed-stream": "~1.0.0" 180 | } 181 | }, 182 | "concat-stream": { 183 | "version": "1.6.2", 184 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 185 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 186 | "requires": { 187 | "buffer-from": "^1.0.0", 188 | "inherits": "^2.0.3", 189 | "readable-stream": "^2.2.2", 190 | "typedarray": "^0.0.6" 191 | }, 192 | "dependencies": { 193 | "isarray": { 194 | "version": "1.0.0", 195 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 196 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 197 | }, 198 | "readable-stream": { 199 | "version": "2.3.6", 200 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 201 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 202 | "requires": { 203 | "core-util-is": "~1.0.0", 204 | "inherits": "~2.0.3", 205 | "isarray": "~1.0.0", 206 | "process-nextick-args": "~2.0.0", 207 | "safe-buffer": "~5.1.1", 208 | "string_decoder": "~1.1.1", 209 | "util-deprecate": "~1.0.1" 210 | } 211 | }, 212 | "string_decoder": { 213 | "version": "1.1.1", 214 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 215 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 216 | "requires": { 217 | "safe-buffer": "~5.1.0" 218 | } 219 | } 220 | } 221 | }, 222 | "core-util-is": { 223 | "version": "1.0.2", 224 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 225 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 226 | }, 227 | "csstype": { 228 | "version": "2.5.7", 229 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.5.7.tgz", 230 | "integrity": "sha512-Nt5VDyOTIIV4/nRFswoCKps1R5CD1hkiyjBE9/thNaNZILLEviVw9yWQw15+O+CpNjQKB/uvdcxFFOrSflY3Yw==" 231 | }, 232 | "currently-unhandled": { 233 | "version": "0.4.1", 234 | "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", 235 | "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", 236 | "requires": { 237 | "array-find-index": "^1.0.1" 238 | } 239 | }, 240 | "dashdash": { 241 | "version": "1.14.1", 242 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 243 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 244 | "requires": { 245 | "assert-plus": "^1.0.0" 246 | } 247 | }, 248 | "debug": { 249 | "version": "3.2.6", 250 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 251 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 252 | "requires": { 253 | "ms": "^2.1.1" 254 | }, 255 | "dependencies": { 256 | "ms": { 257 | "version": "2.1.1", 258 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 259 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 260 | } 261 | } 262 | }, 263 | "decamelize": { 264 | "version": "1.2.0", 265 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 266 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 267 | }, 268 | "deep-extend": { 269 | "version": "0.6.0", 270 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 271 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 272 | }, 273 | "delayed-stream": { 274 | "version": "1.0.0", 275 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 276 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 277 | }, 278 | "ecc-jsbn": { 279 | "version": "0.1.2", 280 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 281 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 282 | "requires": { 283 | "jsbn": "~0.1.0", 284 | "safer-buffer": "^2.1.0" 285 | } 286 | }, 287 | "electron": { 288 | "version": "3.0.8", 289 | "resolved": "https://registry.npmjs.org/electron/-/electron-3.0.8.tgz", 290 | "integrity": "sha512-UVj+K59lYU/vH/7TxrmDidPssFwGQZ6Ljuupugdr9h6ipMuhwgk3WRO+OlJ2TsyhKhJ6tp3AcJunuN4mprblhQ==", 291 | "requires": { 292 | "@types/node": "^8.0.24", 293 | "electron-download": "^4.1.0", 294 | "extract-zip": "^1.0.3" 295 | }, 296 | "dependencies": { 297 | "@types/node": { 298 | "version": "8.10.37", 299 | "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.37.tgz", 300 | "integrity": "sha512-Jp39foY8Euv/PG4OGPyzxis82mnjcUtXLEMA8oFMCE4ilmuJgZPdV2nZNV1moz+99EJTtcpOSgDCgATUwABKig==" 301 | } 302 | } 303 | }, 304 | "electron-download": { 305 | "version": "4.1.1", 306 | "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.1.tgz", 307 | "integrity": "sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg==", 308 | "requires": { 309 | "debug": "^3.0.0", 310 | "env-paths": "^1.0.0", 311 | "fs-extra": "^4.0.1", 312 | "minimist": "^1.2.0", 313 | "nugget": "^2.0.1", 314 | "path-exists": "^3.0.0", 315 | "rc": "^1.2.1", 316 | "semver": "^5.4.1", 317 | "sumchecker": "^2.0.2" 318 | } 319 | }, 320 | "env-paths": { 321 | "version": "1.0.0", 322 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", 323 | "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=" 324 | }, 325 | "error-ex": { 326 | "version": "1.3.2", 327 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 328 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 329 | "requires": { 330 | "is-arrayish": "^0.2.1" 331 | } 332 | }, 333 | "extend": { 334 | "version": "3.0.2", 335 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 336 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 337 | }, 338 | "extract-zip": { 339 | "version": "1.6.7", 340 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", 341 | "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", 342 | "requires": { 343 | "concat-stream": "1.6.2", 344 | "debug": "2.6.9", 345 | "mkdirp": "0.5.1", 346 | "yauzl": "2.4.1" 347 | }, 348 | "dependencies": { 349 | "debug": { 350 | "version": "2.6.9", 351 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 352 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 353 | "requires": { 354 | "ms": "2.0.0" 355 | } 356 | } 357 | } 358 | }, 359 | "extsprintf": { 360 | "version": "1.3.0", 361 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 362 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 363 | }, 364 | "fast-deep-equal": { 365 | "version": "1.1.0", 366 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 367 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" 368 | }, 369 | "fast-json-stable-stringify": { 370 | "version": "2.0.0", 371 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 372 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 373 | }, 374 | "fd-slicer": { 375 | "version": "1.0.1", 376 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", 377 | "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", 378 | "requires": { 379 | "pend": "~1.2.0" 380 | } 381 | }, 382 | "find-up": { 383 | "version": "1.1.2", 384 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 385 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 386 | "requires": { 387 | "path-exists": "^2.0.0", 388 | "pinkie-promise": "^2.0.0" 389 | }, 390 | "dependencies": { 391 | "path-exists": { 392 | "version": "2.1.0", 393 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 394 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 395 | "requires": { 396 | "pinkie-promise": "^2.0.0" 397 | } 398 | } 399 | } 400 | }, 401 | "follow-redirects": { 402 | "version": "1.5.9", 403 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.9.tgz", 404 | "integrity": "sha512-Bh65EZI/RU8nx0wbYF9shkFZlqLP+6WT/5FnA3cE/djNSuKNHJEinGGZgu/cQEkeeb2GdFOgenAmn8qaqYke2w==", 405 | "requires": { 406 | "debug": "=3.1.0" 407 | }, 408 | "dependencies": { 409 | "debug": { 410 | "version": "3.1.0", 411 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 412 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 413 | "requires": { 414 | "ms": "2.0.0" 415 | } 416 | } 417 | } 418 | }, 419 | "forever-agent": { 420 | "version": "0.6.1", 421 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 422 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 423 | }, 424 | "form-data": { 425 | "version": "2.3.2", 426 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", 427 | "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", 428 | "requires": { 429 | "asynckit": "^0.4.0", 430 | "combined-stream": "1.0.6", 431 | "mime-types": "^2.1.12" 432 | } 433 | }, 434 | "fs-extra": { 435 | "version": "4.0.3", 436 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", 437 | "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", 438 | "requires": { 439 | "graceful-fs": "^4.1.2", 440 | "jsonfile": "^4.0.0", 441 | "universalify": "^0.1.0" 442 | } 443 | }, 444 | "get-stdin": { 445 | "version": "4.0.1", 446 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", 447 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" 448 | }, 449 | "getpass": { 450 | "version": "0.1.7", 451 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 452 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 453 | "requires": { 454 | "assert-plus": "^1.0.0" 455 | } 456 | }, 457 | "graceful-fs": { 458 | "version": "4.1.15", 459 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 460 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" 461 | }, 462 | "har-schema": { 463 | "version": "2.0.0", 464 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 465 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 466 | }, 467 | "har-validator": { 468 | "version": "5.1.0", 469 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", 470 | "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", 471 | "requires": { 472 | "ajv": "^5.3.0", 473 | "har-schema": "^2.0.0" 474 | } 475 | }, 476 | "hosted-git-info": { 477 | "version": "2.7.1", 478 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", 479 | "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" 480 | }, 481 | "http-signature": { 482 | "version": "1.2.0", 483 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 484 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 485 | "requires": { 486 | "assert-plus": "^1.0.0", 487 | "jsprim": "^1.2.2", 488 | "sshpk": "^1.7.0" 489 | } 490 | }, 491 | "indent-string": { 492 | "version": "2.1.0", 493 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", 494 | "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", 495 | "requires": { 496 | "repeating": "^2.0.0" 497 | } 498 | }, 499 | "inherits": { 500 | "version": "2.0.3", 501 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 502 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 503 | }, 504 | "ini": { 505 | "version": "1.3.5", 506 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 507 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" 508 | }, 509 | "is-arrayish": { 510 | "version": "0.2.1", 511 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 512 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 513 | }, 514 | "is-builtin-module": { 515 | "version": "1.0.0", 516 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", 517 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", 518 | "requires": { 519 | "builtin-modules": "^1.0.0" 520 | } 521 | }, 522 | "is-finite": { 523 | "version": "1.0.2", 524 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 525 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 526 | "requires": { 527 | "number-is-nan": "^1.0.0" 528 | } 529 | }, 530 | "is-fullwidth-code-point": { 531 | "version": "1.0.0", 532 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 533 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 534 | "requires": { 535 | "number-is-nan": "^1.0.0" 536 | } 537 | }, 538 | "is-typedarray": { 539 | "version": "1.0.0", 540 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 541 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 542 | }, 543 | "is-utf8": { 544 | "version": "0.2.1", 545 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 546 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" 547 | }, 548 | "isarray": { 549 | "version": "0.0.1", 550 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 551 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 552 | }, 553 | "isstream": { 554 | "version": "0.1.2", 555 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 556 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 557 | }, 558 | "jsbn": { 559 | "version": "0.1.1", 560 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 561 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 562 | }, 563 | "json-schema": { 564 | "version": "0.2.3", 565 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 566 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 567 | }, 568 | "json-schema-traverse": { 569 | "version": "0.3.1", 570 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 571 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" 572 | }, 573 | "json-stringify-safe": { 574 | "version": "5.0.1", 575 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 576 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 577 | }, 578 | "jsonfile": { 579 | "version": "4.0.0", 580 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 581 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 582 | "requires": { 583 | "graceful-fs": "^4.1.6" 584 | } 585 | }, 586 | "jsprim": { 587 | "version": "1.4.1", 588 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 589 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 590 | "requires": { 591 | "assert-plus": "1.0.0", 592 | "extsprintf": "1.3.0", 593 | "json-schema": "0.2.3", 594 | "verror": "1.10.0" 595 | } 596 | }, 597 | "load-json-file": { 598 | "version": "1.1.0", 599 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", 600 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", 601 | "requires": { 602 | "graceful-fs": "^4.1.2", 603 | "parse-json": "^2.2.0", 604 | "pify": "^2.0.0", 605 | "pinkie-promise": "^2.0.0", 606 | "strip-bom": "^2.0.0" 607 | } 608 | }, 609 | "loud-rejection": { 610 | "version": "1.6.0", 611 | "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", 612 | "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", 613 | "requires": { 614 | "currently-unhandled": "^0.4.1", 615 | "signal-exit": "^3.0.0" 616 | } 617 | }, 618 | "map-obj": { 619 | "version": "1.0.1", 620 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", 621 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" 622 | }, 623 | "material-design-lite": { 624 | "version": "1.3.0", 625 | "resolved": "https://registry.npmjs.org/material-design-lite/-/material-design-lite-1.3.0.tgz", 626 | "integrity": "sha1-0ATOP+6Zoe63Sni4oyUTSl8RcdM=" 627 | }, 628 | "meow": { 629 | "version": "3.7.0", 630 | "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", 631 | "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", 632 | "requires": { 633 | "camelcase-keys": "^2.0.0", 634 | "decamelize": "^1.1.2", 635 | "loud-rejection": "^1.0.0", 636 | "map-obj": "^1.0.1", 637 | "minimist": "^1.1.3", 638 | "normalize-package-data": "^2.3.4", 639 | "object-assign": "^4.0.1", 640 | "read-pkg-up": "^1.0.1", 641 | "redent": "^1.0.0", 642 | "trim-newlines": "^1.0.0" 643 | } 644 | }, 645 | "mime-db": { 646 | "version": "1.33.0", 647 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", 648 | "integrity": "sha1-o0kgUKXLm2NFBUHjnZeI0icng9s=" 649 | }, 650 | "mime-types": { 651 | "version": "2.1.18", 652 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", 653 | "integrity": "sha1-bzI/YKg9ERRvgx/xH9ZuL+VQO7g=", 654 | "requires": { 655 | "mime-db": "~1.33.0" 656 | } 657 | }, 658 | "minimist": { 659 | "version": "1.2.0", 660 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 661 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 662 | }, 663 | "mkdirp": { 664 | "version": "0.5.1", 665 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 666 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 667 | "requires": { 668 | "minimist": "0.0.8" 669 | }, 670 | "dependencies": { 671 | "minimist": { 672 | "version": "0.0.8", 673 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 674 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 675 | } 676 | } 677 | }, 678 | "ms": { 679 | "version": "2.0.0", 680 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 681 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 682 | }, 683 | "normalize-package-data": { 684 | "version": "2.4.0", 685 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", 686 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", 687 | "requires": { 688 | "hosted-git-info": "^2.1.4", 689 | "is-builtin-module": "^1.0.0", 690 | "semver": "2 || 3 || 4 || 5", 691 | "validate-npm-package-license": "^3.0.1" 692 | } 693 | }, 694 | "nugget": { 695 | "version": "2.0.1", 696 | "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz", 697 | "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", 698 | "requires": { 699 | "debug": "^2.1.3", 700 | "minimist": "^1.1.0", 701 | "pretty-bytes": "^1.0.2", 702 | "progress-stream": "^1.1.0", 703 | "request": "^2.45.0", 704 | "single-line-log": "^1.1.2", 705 | "throttleit": "0.0.2" 706 | }, 707 | "dependencies": { 708 | "debug": { 709 | "version": "2.6.9", 710 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 711 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 712 | "requires": { 713 | "ms": "2.0.0" 714 | } 715 | } 716 | } 717 | }, 718 | "number-is-nan": { 719 | "version": "1.0.1", 720 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 721 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 722 | }, 723 | "oauth-sign": { 724 | "version": "0.9.0", 725 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 726 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 727 | }, 728 | "object-assign": { 729 | "version": "4.1.1", 730 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 731 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 732 | }, 733 | "object-keys": { 734 | "version": "0.4.0", 735 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", 736 | "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" 737 | }, 738 | "parse-json": { 739 | "version": "2.2.0", 740 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 741 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 742 | "requires": { 743 | "error-ex": "^1.2.0" 744 | } 745 | }, 746 | "path-exists": { 747 | "version": "3.0.0", 748 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 749 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 750 | }, 751 | "path-type": { 752 | "version": "1.1.0", 753 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", 754 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", 755 | "requires": { 756 | "graceful-fs": "^4.1.2", 757 | "pify": "^2.0.0", 758 | "pinkie-promise": "^2.0.0" 759 | } 760 | }, 761 | "pend": { 762 | "version": "1.2.0", 763 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 764 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" 765 | }, 766 | "performance-now": { 767 | "version": "2.1.0", 768 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 769 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 770 | }, 771 | "pify": { 772 | "version": "2.3.0", 773 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 774 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" 775 | }, 776 | "pinkie": { 777 | "version": "2.0.4", 778 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 779 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" 780 | }, 781 | "pinkie-promise": { 782 | "version": "2.0.1", 783 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 784 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 785 | "requires": { 786 | "pinkie": "^2.0.0" 787 | } 788 | }, 789 | "pretty-bytes": { 790 | "version": "1.0.4", 791 | "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", 792 | "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", 793 | "requires": { 794 | "get-stdin": "^4.0.1", 795 | "meow": "^3.1.0" 796 | } 797 | }, 798 | "process-nextick-args": { 799 | "version": "2.0.0", 800 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 801 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 802 | }, 803 | "progress-stream": { 804 | "version": "1.2.0", 805 | "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz", 806 | "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", 807 | "requires": { 808 | "speedometer": "~0.1.2", 809 | "through2": "~0.2.3" 810 | } 811 | }, 812 | "psl": { 813 | "version": "1.1.29", 814 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", 815 | "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" 816 | }, 817 | "punycode": { 818 | "version": "1.4.1", 819 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 820 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 821 | }, 822 | "qs": { 823 | "version": "6.5.2", 824 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 825 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 826 | }, 827 | "rc": { 828 | "version": "1.2.8", 829 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 830 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 831 | "requires": { 832 | "deep-extend": "^0.6.0", 833 | "ini": "~1.3.0", 834 | "minimist": "^1.2.0", 835 | "strip-json-comments": "~2.0.1" 836 | } 837 | }, 838 | "read-pkg": { 839 | "version": "1.1.0", 840 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", 841 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", 842 | "requires": { 843 | "load-json-file": "^1.0.0", 844 | "normalize-package-data": "^2.3.2", 845 | "path-type": "^1.0.0" 846 | } 847 | }, 848 | "read-pkg-up": { 849 | "version": "1.0.1", 850 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", 851 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", 852 | "requires": { 853 | "find-up": "^1.0.0", 854 | "read-pkg": "^1.0.0" 855 | } 856 | }, 857 | "readable-stream": { 858 | "version": "1.1.14", 859 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 860 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 861 | "requires": { 862 | "core-util-is": "~1.0.0", 863 | "inherits": "~2.0.1", 864 | "isarray": "0.0.1", 865 | "string_decoder": "~0.10.x" 866 | } 867 | }, 868 | "redent": { 869 | "version": "1.0.0", 870 | "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", 871 | "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", 872 | "requires": { 873 | "indent-string": "^2.1.0", 874 | "strip-indent": "^1.0.1" 875 | } 876 | }, 877 | "repeating": { 878 | "version": "2.0.1", 879 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", 880 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", 881 | "requires": { 882 | "is-finite": "^1.0.0" 883 | } 884 | }, 885 | "request": { 886 | "version": "2.88.0", 887 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 888 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 889 | "requires": { 890 | "aws-sign2": "~0.7.0", 891 | "aws4": "^1.8.0", 892 | "caseless": "~0.12.0", 893 | "combined-stream": "~1.0.6", 894 | "extend": "~3.0.2", 895 | "forever-agent": "~0.6.1", 896 | "form-data": "~2.3.2", 897 | "har-validator": "~5.1.0", 898 | "http-signature": "~1.2.0", 899 | "is-typedarray": "~1.0.0", 900 | "isstream": "~0.1.2", 901 | "json-stringify-safe": "~5.0.1", 902 | "mime-types": "~2.1.19", 903 | "oauth-sign": "~0.9.0", 904 | "performance-now": "^2.1.0", 905 | "qs": "~6.5.2", 906 | "safe-buffer": "^5.1.2", 907 | "tough-cookie": "~2.4.3", 908 | "tunnel-agent": "^0.6.0", 909 | "uuid": "^3.3.2" 910 | }, 911 | "dependencies": { 912 | "mime-db": { 913 | "version": "1.37.0", 914 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 915 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" 916 | }, 917 | "mime-types": { 918 | "version": "2.1.21", 919 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 920 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 921 | "requires": { 922 | "mime-db": "~1.37.0" 923 | } 924 | } 925 | } 926 | }, 927 | "safe-buffer": { 928 | "version": "5.1.2", 929 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 930 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 931 | }, 932 | "safer-buffer": { 933 | "version": "2.1.2", 934 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 935 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 936 | }, 937 | "semver": { 938 | "version": "5.6.0", 939 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 940 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" 941 | }, 942 | "signal-exit": { 943 | "version": "3.0.2", 944 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 945 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 946 | }, 947 | "single-line-log": { 948 | "version": "1.1.2", 949 | "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", 950 | "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=", 951 | "requires": { 952 | "string-width": "^1.0.1" 953 | } 954 | }, 955 | "spdx-correct": { 956 | "version": "3.0.2", 957 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", 958 | "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", 959 | "requires": { 960 | "spdx-expression-parse": "^3.0.0", 961 | "spdx-license-ids": "^3.0.0" 962 | } 963 | }, 964 | "spdx-exceptions": { 965 | "version": "2.2.0", 966 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", 967 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" 968 | }, 969 | "spdx-expression-parse": { 970 | "version": "3.0.0", 971 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 972 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 973 | "requires": { 974 | "spdx-exceptions": "^2.1.0", 975 | "spdx-license-ids": "^3.0.0" 976 | } 977 | }, 978 | "spdx-license-ids": { 979 | "version": "3.0.2", 980 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", 981 | "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==" 982 | }, 983 | "speedometer": { 984 | "version": "0.1.4", 985 | "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", 986 | "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=" 987 | }, 988 | "sshpk": { 989 | "version": "1.15.2", 990 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz", 991 | "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", 992 | "requires": { 993 | "asn1": "~0.2.3", 994 | "assert-plus": "^1.0.0", 995 | "bcrypt-pbkdf": "^1.0.0", 996 | "dashdash": "^1.12.0", 997 | "ecc-jsbn": "~0.1.1", 998 | "getpass": "^0.1.1", 999 | "jsbn": "~0.1.0", 1000 | "safer-buffer": "^2.0.2", 1001 | "tweetnacl": "~0.14.0" 1002 | } 1003 | }, 1004 | "string-width": { 1005 | "version": "1.0.2", 1006 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1007 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 1008 | "requires": { 1009 | "code-point-at": "^1.0.0", 1010 | "is-fullwidth-code-point": "^1.0.0", 1011 | "strip-ansi": "^3.0.0" 1012 | } 1013 | }, 1014 | "string_decoder": { 1015 | "version": "0.10.31", 1016 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1017 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 1018 | }, 1019 | "strip-ansi": { 1020 | "version": "3.0.1", 1021 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1022 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1023 | "requires": { 1024 | "ansi-regex": "^2.0.0" 1025 | } 1026 | }, 1027 | "strip-bom": { 1028 | "version": "2.0.0", 1029 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 1030 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", 1031 | "requires": { 1032 | "is-utf8": "^0.2.0" 1033 | } 1034 | }, 1035 | "strip-indent": { 1036 | "version": "1.0.1", 1037 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", 1038 | "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", 1039 | "requires": { 1040 | "get-stdin": "^4.0.1" 1041 | } 1042 | }, 1043 | "strip-json-comments": { 1044 | "version": "2.0.1", 1045 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1046 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 1047 | }, 1048 | "sumchecker": { 1049 | "version": "2.0.2", 1050 | "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", 1051 | "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", 1052 | "requires": { 1053 | "debug": "^2.2.0" 1054 | }, 1055 | "dependencies": { 1056 | "debug": { 1057 | "version": "2.6.9", 1058 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1059 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1060 | "requires": { 1061 | "ms": "2.0.0" 1062 | } 1063 | } 1064 | } 1065 | }, 1066 | "throttleit": { 1067 | "version": "0.0.2", 1068 | "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", 1069 | "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=" 1070 | }, 1071 | "through2": { 1072 | "version": "0.2.3", 1073 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", 1074 | "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", 1075 | "requires": { 1076 | "readable-stream": "~1.1.9", 1077 | "xtend": "~2.1.1" 1078 | } 1079 | }, 1080 | "tough-cookie": { 1081 | "version": "2.4.3", 1082 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 1083 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 1084 | "requires": { 1085 | "psl": "^1.1.24", 1086 | "punycode": "^1.4.1" 1087 | } 1088 | }, 1089 | "trim-newlines": { 1090 | "version": "1.0.0", 1091 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", 1092 | "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" 1093 | }, 1094 | "tunnel-agent": { 1095 | "version": "0.6.0", 1096 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1097 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1098 | "requires": { 1099 | "safe-buffer": "^5.0.1" 1100 | } 1101 | }, 1102 | "tweetnacl": { 1103 | "version": "0.14.5", 1104 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1105 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 1106 | }, 1107 | "typedarray": { 1108 | "version": "0.0.6", 1109 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1110 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 1111 | }, 1112 | "typescript": { 1113 | "version": "3.1.6", 1114 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.6.tgz", 1115 | "integrity": "sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA==", 1116 | "dev": true 1117 | }, 1118 | "universalify": { 1119 | "version": "0.1.2", 1120 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1121 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" 1122 | }, 1123 | "util-deprecate": { 1124 | "version": "1.0.2", 1125 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1126 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1127 | }, 1128 | "uuid": { 1129 | "version": "3.3.2", 1130 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 1131 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 1132 | }, 1133 | "validate-npm-package-license": { 1134 | "version": "3.0.4", 1135 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 1136 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 1137 | "requires": { 1138 | "spdx-correct": "^3.0.0", 1139 | "spdx-expression-parse": "^3.0.0" 1140 | } 1141 | }, 1142 | "verror": { 1143 | "version": "1.10.0", 1144 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1145 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1146 | "requires": { 1147 | "assert-plus": "^1.0.0", 1148 | "core-util-is": "1.0.2", 1149 | "extsprintf": "^1.2.0" 1150 | } 1151 | }, 1152 | "xtend": { 1153 | "version": "2.1.2", 1154 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", 1155 | "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", 1156 | "requires": { 1157 | "object-keys": "~0.4.0" 1158 | } 1159 | }, 1160 | "yauzl": { 1161 | "version": "2.4.1", 1162 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", 1163 | "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", 1164 | "requires": { 1165 | "fd-slicer": "~1.0.1" 1166 | } 1167 | } 1168 | } 1169 | } 1170 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "appauth-electron", 3 | "version": "0.1.0", 4 | "description": "An Electron App which uses @openid/appauth", 5 | "main": "built/index.js", 6 | "scripts": { 7 | "compile": "tsc", 8 | "watch": "tsc --watch", 9 | "start": "npm run-script compile && node_modules/.bin/electron .", 10 | "dev": "npm run-script watch & node_modules/.bin/electron ." 11 | }, 12 | "files": [ 13 | "built/**" 14 | ], 15 | "keywords": [ 16 | "AppAuth-JS", 17 | "Electron" 18 | ], 19 | "author": "rahulrav", 20 | "license": "MIT", 21 | "dependencies": { 22 | "@openid/appauth": "^1.1.1", 23 | "@types/react": "^16.7.1", 24 | "@types/react-dom": "^16.0.9", 25 | "electron": "^3.0.8", 26 | "material-design-lite": "^1.3.0" 27 | }, 28 | "devDependencies": { 29 | "typescript": "^3.1.6" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /styles.css: -------------------------------------------------------------------------------- 1 | .app-auth-card.mdl-card { 2 | margin: 2rem; 3 | width: 70vw; 4 | } 5 | 6 | .flex-container { 7 | display: flex; 8 | justify-content: center; 9 | } 10 | 11 | .appauth-logo { 12 | flex-grow: 1; 13 | background-color: #EFEFEF; 14 | width: 25vw; 15 | height: 25vw; 16 | } 17 | 18 | .app-auth-profile { 19 | margin-top: 2rem; 20 | } 21 | 22 | #user-info { 23 | height: auto; 24 | min-height: auto; 25 | padding: 1rem; 26 | } 27 | 28 | #user-name { 29 | margin-left: 1rem; 30 | align-self: center; 31 | } 32 | 33 | #user-profile-image { 34 | align-self: center; 35 | width: 6rem; 36 | height: 6rem; 37 | border-radius: 3rem; 38 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Basic Options */ 4 | "target": "es5", 5 | /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */ 6 | "module": "commonjs", 7 | /* Specify module code generation: 'commonjs', 'amd', 'system', 'umd' or 'es2015'. */ 8 | "lib": [ 9 | "dom", 10 | "es2015" 11 | ], 12 | /* Specify library files to be included in the compilation: */ 13 | "allowJs": false, 14 | /* Allow javascript files to be compiled. */ 15 | // "checkJs": true, /* Report errors in .js files. */ 16 | "jsx": "preserve", 17 | /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 18 | "declaration": true, 19 | /* Generates corresponding '.d.ts' file. */ 20 | "sourceMap": true, 21 | /* Generates corresponding '.map' file. */ 22 | // "outFile": "./", /* Concatenate and emit output to single file. */ 23 | "outDir": "built", 24 | /* Redirect output structure to the directory. */ 25 | "rootDir": "./", 26 | /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 27 | "removeComments": false, 28 | /* Do not emit comments to output. */ 29 | // "noEmit": true, /* Do not emit outputs. */ 30 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 31 | "downlevelIteration": true, 32 | /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 33 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 34 | /* Strict Type-Checking Options */ 35 | "strict": true, 36 | /* Enable all strict type-checking options. */ 37 | "noImplicitAny": true, 38 | /* Raise error on expressions and declarations with an implied 'any' type. */ 39 | "strictNullChecks": true, 40 | /* Enable strict null checks. */ 41 | "noImplicitThis": true, 42 | /* Raise error on 'this' expressions with an implied 'any' type. */ 43 | "alwaysStrict": true, 44 | /* Parse in strict mode and emit "use strict" for each source file. */ 45 | /* Additional Checks */ 46 | // "noUnusedLocals": false, /* Report errors on unused locals. */ 47 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 48 | "noImplicitReturns": true, 49 | /* Report error when not all code paths in function return a value. */ 50 | "noFallthroughCasesInSwitch": true, 51 | /* Report errors for fallthrough cases in switch statement. */ 52 | /* Module Resolution Options */ 53 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 54 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 55 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 56 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 57 | // "typeRoots": [], /* List of folders to include type definitions from. */ 58 | // "types": [], /* Type declaration files to be included in compilation. */ 59 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 60 | /* Source Map Options */ 61 | // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 62 | // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */ 63 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 64 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 65 | /* Experimental Options */ 66 | "experimentalDecorators": true, 67 | /* Enables experimental support for ES7 decorators. */ 68 | "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */ 69 | } 70 | } -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@openid/appauth@^0.2.4": 6 | version "0.2.4" 7 | resolved "https://registry.yarnpkg.com/@openid/appauth/-/appauth-0.2.4.tgz#5c397369f9a0915bc367757e0357ebb5753104f7" 8 | dependencies: 9 | "@types/form-data" "2.2.0" 10 | "@types/hapi" "^16.1.10" 11 | "@types/jasmine" "^2.6.2" 12 | "@types/jquery" "^3.2.16" 13 | "@types/node" "^8.0.47" 14 | "@types/opener" "^1.4.0" 15 | "@types/react" "^16.0.19" 16 | "@types/react-dom" "^16.0.2" 17 | "@types/request" "2.0.7" 18 | form-data "^2.3.1" 19 | hapi "^16.6.2" 20 | opener "^1.4.3" 21 | request "^2.83.0" 22 | typescript "^2.6.1" 23 | 24 | "@types/boom@*": 25 | version "4.3.8" 26 | resolved "https://registry.yarnpkg.com/@types/boom/-/boom-4.3.8.tgz#73acac4aa33d78b030a7797f4a74b4dfb058d418" 27 | 28 | "@types/catbox@*": 29 | version "7.1.4" 30 | resolved "https://registry.yarnpkg.com/@types/catbox/-/catbox-7.1.4.tgz#03f6a1631d698b6f0fed7edbd0c690f8600904bc" 31 | dependencies: 32 | "@types/boom" "*" 33 | 34 | "@types/form-data@*": 35 | version "2.2.1" 36 | resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-2.2.1.tgz#ee2b3b8eaa11c0938289953606b745b738c54b1e" 37 | dependencies: 38 | "@types/node" "*" 39 | 40 | "@types/form-data@2.2.0": 41 | version "2.2.0" 42 | resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-2.2.0.tgz#a98aac91dc99857b6af24caef7ca6df302f31565" 43 | dependencies: 44 | "@types/node" "*" 45 | 46 | "@types/hapi@^16.1.10": 47 | version "16.1.11" 48 | resolved "https://registry.yarnpkg.com/@types/hapi/-/hapi-16.1.11.tgz#a9b8fe6eee2f8cefb94f4f447d3c23a2b2c308cf" 49 | dependencies: 50 | "@types/boom" "*" 51 | "@types/catbox" "*" 52 | "@types/joi" "*" 53 | "@types/mimos" "*" 54 | "@types/node" "*" 55 | "@types/podium" "*" 56 | "@types/shot" "*" 57 | 58 | "@types/jasmine@^2.6.2": 59 | version "2.6.3" 60 | resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.6.3.tgz#586963bfdd35e38f24a0a0b63a438cf521292ed9" 61 | 62 | "@types/joi@*": 63 | version "13.0.0" 64 | resolved "https://registry.yarnpkg.com/@types/joi/-/joi-13.0.0.tgz#63c066d901e87f464fa075d02bf2f390344241fc" 65 | 66 | "@types/jquery@^3.2.16": 67 | version "3.2.16" 68 | resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.2.16.tgz#04419c404a3194350e7d3f339a90e72c88db3111" 69 | 70 | "@types/mime-db@*": 71 | version "1.27.0" 72 | resolved "https://registry.yarnpkg.com/@types/mime-db/-/mime-db-1.27.0.tgz#9bc014a1fd1fdf47649c1a54c6dd7966b8284792" 73 | 74 | "@types/mimos@*": 75 | version "3.0.1" 76 | resolved "https://registry.yarnpkg.com/@types/mimos/-/mimos-3.0.1.tgz#59d96abe1c9e487e7463fe41e8d86d76b57a441a" 77 | dependencies: 78 | "@types/mime-db" "*" 79 | 80 | "@types/node@*", "@types/node@^8.0.24", "@types/node@^8.0.47": 81 | version "8.0.51" 82 | resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.51.tgz#b31d716fb8d58eeb95c068a039b9b6292817d5fb" 83 | 84 | "@types/opener@^1.4.0": 85 | version "1.4.0" 86 | resolved "https://registry.yarnpkg.com/@types/opener/-/opener-1.4.0.tgz#7967fae45cfabfe1fa268512b1b304f5a2b1127f" 87 | dependencies: 88 | "@types/node" "*" 89 | 90 | "@types/podium@*": 91 | version "1.0.0" 92 | resolved "https://registry.yarnpkg.com/@types/podium/-/podium-1.0.0.tgz#bfaa2151be2b1d6109cc69f7faa9dac2cba3bb20" 93 | 94 | "@types/react-dom@^16.0.2", "@types/react-dom@^16.0.3": 95 | version "16.0.3" 96 | resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.0.3.tgz#8accad7eabdab4cca3e1a56f5ccb57de2da0ff64" 97 | dependencies: 98 | "@types/node" "*" 99 | "@types/react" "*" 100 | 101 | "@types/react@*", "@types/react@^16.0.19", "@types/react@^16.0.22": 102 | version "16.0.22" 103 | resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.22.tgz#19ad106e124aceebd2b4d430a278d55413ee8759" 104 | 105 | "@types/request@2.0.7": 106 | version "2.0.7" 107 | resolved "https://registry.yarnpkg.com/@types/request/-/request-2.0.7.tgz#a2aa5a57317c21971d9b024e393091ab2c99ab98" 108 | dependencies: 109 | "@types/form-data" "*" 110 | "@types/node" "*" 111 | 112 | "@types/shot@*": 113 | version "3.4.0" 114 | resolved "https://registry.yarnpkg.com/@types/shot/-/shot-3.4.0.tgz#459477c5187d3ebd303660ab099e7e9e0f3b656f" 115 | dependencies: 116 | "@types/node" "*" 117 | 118 | accept@^2.1.4: 119 | version "2.1.4" 120 | resolved "https://registry.yarnpkg.com/accept/-/accept-2.1.4.tgz#887af54ceee5c7f4430461971ec400c61d09acbb" 121 | dependencies: 122 | boom "5.x.x" 123 | hoek "4.x.x" 124 | 125 | ajv@^5.1.0: 126 | version "5.3.0" 127 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.3.0.tgz#4414ff74a50879c208ee5fdc826e32c303549eda" 128 | dependencies: 129 | co "^4.6.0" 130 | fast-deep-equal "^1.0.0" 131 | fast-json-stable-stringify "^2.0.0" 132 | json-schema-traverse "^0.3.0" 133 | 134 | ammo@^2.0.4: 135 | version "2.0.4" 136 | resolved "https://registry.yarnpkg.com/ammo/-/ammo-2.0.4.tgz#bf80aab211698ea78f63ef5e7f113dd5d9e8917f" 137 | dependencies: 138 | boom "5.x.x" 139 | hoek "4.x.x" 140 | 141 | ansi-regex@^2.0.0: 142 | version "2.1.1" 143 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 144 | 145 | array-find-index@^1.0.1: 146 | version "1.0.2" 147 | resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" 148 | 149 | asn1@~0.2.3: 150 | version "0.2.3" 151 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 152 | 153 | assert-plus@1.0.0, assert-plus@^1.0.0: 154 | version "1.0.0" 155 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 156 | 157 | asynckit@^0.4.0: 158 | version "0.4.0" 159 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 160 | 161 | aws-sign2@~0.7.0: 162 | version "0.7.0" 163 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 164 | 165 | aws4@^1.6.0: 166 | version "1.6.0" 167 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" 168 | 169 | b64@3.x.x: 170 | version "3.0.3" 171 | resolved "https://registry.yarnpkg.com/b64/-/b64-3.0.3.tgz#36afeee0d9345f046387ce6de8a6702afe5bb56e" 172 | 173 | balanced-match@^1.0.0: 174 | version "1.0.0" 175 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 176 | 177 | bcrypt-pbkdf@^1.0.0: 178 | version "1.0.1" 179 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 180 | dependencies: 181 | tweetnacl "^0.14.3" 182 | 183 | boom@4.x.x: 184 | version "4.3.1" 185 | resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" 186 | dependencies: 187 | hoek "4.x.x" 188 | 189 | boom@5.x.x, boom@^5.2.0: 190 | version "5.2.0" 191 | resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" 192 | dependencies: 193 | hoek "4.x.x" 194 | 195 | brace-expansion@^1.1.7: 196 | version "1.1.8" 197 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 198 | dependencies: 199 | balanced-match "^1.0.0" 200 | concat-map "0.0.1" 201 | 202 | builtin-modules@^1.0.0: 203 | version "1.1.1" 204 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 205 | 206 | call@^4.0.2: 207 | version "4.0.2" 208 | resolved "https://registry.yarnpkg.com/call/-/call-4.0.2.tgz#df76f5f51ee8dd48b856ac8400f7e69e6d7399c4" 209 | dependencies: 210 | boom "5.x.x" 211 | hoek "4.x.x" 212 | 213 | camelcase-keys@^2.0.0: 214 | version "2.1.0" 215 | resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" 216 | dependencies: 217 | camelcase "^2.0.0" 218 | map-obj "^1.0.0" 219 | 220 | camelcase@^2.0.0: 221 | version "2.1.1" 222 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 223 | 224 | caseless@~0.12.0: 225 | version "0.12.0" 226 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 227 | 228 | catbox-memory@^2.0.4: 229 | version "2.0.4" 230 | resolved "https://registry.yarnpkg.com/catbox-memory/-/catbox-memory-2.0.4.tgz#433e255902caf54233d1286429c8f4df14e822d5" 231 | dependencies: 232 | hoek "4.x.x" 233 | 234 | catbox@^7.1.5: 235 | version "7.1.5" 236 | resolved "https://registry.yarnpkg.com/catbox/-/catbox-7.1.5.tgz#c56f7e8e9555d27c0dc038a96ef73e57d186bb1f" 237 | dependencies: 238 | boom "5.x.x" 239 | hoek "4.x.x" 240 | joi "10.x.x" 241 | 242 | co@^4.6.0: 243 | version "4.6.0" 244 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 245 | 246 | code-point-at@^1.0.0: 247 | version "1.1.0" 248 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 249 | 250 | combined-stream@^1.0.5, combined-stream@~1.0.5: 251 | version "1.0.5" 252 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 253 | dependencies: 254 | delayed-stream "~1.0.0" 255 | 256 | concat-map@0.0.1: 257 | version "0.0.1" 258 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 259 | 260 | concat-stream@1.6.0: 261 | version "1.6.0" 262 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" 263 | dependencies: 264 | inherits "^2.0.3" 265 | readable-stream "^2.2.2" 266 | typedarray "^0.0.6" 267 | 268 | content@3.x.x: 269 | version "3.0.6" 270 | resolved "https://registry.yarnpkg.com/content/-/content-3.0.6.tgz#9c2e301e9ae515ed65a4b877d78aa5659bb1b809" 271 | dependencies: 272 | boom "5.x.x" 273 | 274 | core-util-is@1.0.2, core-util-is@~1.0.0: 275 | version "1.0.2" 276 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 277 | 278 | cryptiles@3.x.x, cryptiles@^3.1.2: 279 | version "3.1.2" 280 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" 281 | dependencies: 282 | boom "5.x.x" 283 | 284 | currently-unhandled@^0.4.1: 285 | version "0.4.1" 286 | resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" 287 | dependencies: 288 | array-find-index "^1.0.1" 289 | 290 | dashdash@^1.12.0: 291 | version "1.14.1" 292 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 293 | dependencies: 294 | assert-plus "^1.0.0" 295 | 296 | debug@2.6.9, debug@^2.1.3, debug@^2.2.0: 297 | version "2.6.9" 298 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 299 | dependencies: 300 | ms "2.0.0" 301 | 302 | decamelize@^1.1.2: 303 | version "1.2.0" 304 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 305 | 306 | deep-extend@~0.4.0: 307 | version "0.4.2" 308 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" 309 | 310 | delayed-stream@~1.0.0: 311 | version "1.0.0" 312 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 313 | 314 | ecc-jsbn@~0.1.1: 315 | version "0.1.1" 316 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 317 | dependencies: 318 | jsbn "~0.1.0" 319 | 320 | electron-download@^3.0.1: 321 | version "3.3.0" 322 | resolved "https://registry.yarnpkg.com/electron-download/-/electron-download-3.3.0.tgz#2cfd54d6966c019c4d49ad65fbe65cc9cdef68c8" 323 | dependencies: 324 | debug "^2.2.0" 325 | fs-extra "^0.30.0" 326 | home-path "^1.0.1" 327 | minimist "^1.2.0" 328 | nugget "^2.0.0" 329 | path-exists "^2.1.0" 330 | rc "^1.1.2" 331 | semver "^5.3.0" 332 | sumchecker "^1.2.0" 333 | 334 | electron@^1.7.9: 335 | version "1.8.1" 336 | resolved "https://registry.yarnpkg.com/electron/-/electron-1.8.1.tgz#19b6f39f2013e204a91a60bc3086dc7a4a07ed88" 337 | dependencies: 338 | "@types/node" "^8.0.24" 339 | electron-download "^3.0.1" 340 | extract-zip "^1.0.3" 341 | 342 | error-ex@^1.2.0: 343 | version "1.3.1" 344 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 345 | dependencies: 346 | is-arrayish "^0.2.1" 347 | 348 | es6-promise@^4.0.5: 349 | version "4.1.1" 350 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.1.1.tgz#8811e90915d9a0dba36274f0b242dbda78f9c92a" 351 | 352 | extend@~3.0.1: 353 | version "3.0.1" 354 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 355 | 356 | extract-zip@^1.0.3: 357 | version "1.6.6" 358 | resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.6.tgz#1290ede8d20d0872b429fd3f351ca128ec5ef85c" 359 | dependencies: 360 | concat-stream "1.6.0" 361 | debug "2.6.9" 362 | mkdirp "0.5.0" 363 | yauzl "2.4.1" 364 | 365 | extsprintf@1.3.0, extsprintf@^1.2.0: 366 | version "1.3.0" 367 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 368 | 369 | fast-deep-equal@^1.0.0: 370 | version "1.0.0" 371 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" 372 | 373 | fast-json-stable-stringify@^2.0.0: 374 | version "2.0.0" 375 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 376 | 377 | fd-slicer@~1.0.1: 378 | version "1.0.1" 379 | resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" 380 | dependencies: 381 | pend "~1.2.0" 382 | 383 | find-up@^1.0.0: 384 | version "1.1.2" 385 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 386 | dependencies: 387 | path-exists "^2.0.0" 388 | pinkie-promise "^2.0.0" 389 | 390 | forever-agent@~0.6.1: 391 | version "0.6.1" 392 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 393 | 394 | form-data@^2.3.1, form-data@~2.3.1: 395 | version "2.3.1" 396 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" 397 | dependencies: 398 | asynckit "^0.4.0" 399 | combined-stream "^1.0.5" 400 | mime-types "^2.1.12" 401 | 402 | fs-extra@^0.30.0: 403 | version "0.30.0" 404 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" 405 | dependencies: 406 | graceful-fs "^4.1.2" 407 | jsonfile "^2.1.0" 408 | klaw "^1.0.0" 409 | path-is-absolute "^1.0.0" 410 | rimraf "^2.2.8" 411 | 412 | fs.realpath@^1.0.0: 413 | version "1.0.0" 414 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 415 | 416 | get-stdin@^4.0.1: 417 | version "4.0.1" 418 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" 419 | 420 | getpass@^0.1.1: 421 | version "0.1.7" 422 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 423 | dependencies: 424 | assert-plus "^1.0.0" 425 | 426 | glob@^7.0.5: 427 | version "7.1.2" 428 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 429 | dependencies: 430 | fs.realpath "^1.0.0" 431 | inflight "^1.0.4" 432 | inherits "2" 433 | minimatch "^3.0.4" 434 | once "^1.3.0" 435 | path-is-absolute "^1.0.0" 436 | 437 | graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: 438 | version "4.1.11" 439 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 440 | 441 | hapi@^16.6.2: 442 | version "16.6.2" 443 | resolved "https://registry.yarnpkg.com/hapi/-/hapi-16.6.2.tgz#690554fc9c5ca7ad2f8030bbfe21d5e5886cdc14" 444 | dependencies: 445 | accept "^2.1.4" 446 | ammo "^2.0.4" 447 | boom "^5.2.0" 448 | call "^4.0.2" 449 | catbox "^7.1.5" 450 | catbox-memory "^2.0.4" 451 | cryptiles "^3.1.2" 452 | heavy "^4.0.4" 453 | hoek "^4.2.0" 454 | iron "^4.0.5" 455 | items "^2.1.1" 456 | joi "^11.1.0" 457 | mimos "^3.0.3" 458 | podium "^1.3.0" 459 | shot "^3.4.2" 460 | statehood "^5.0.3" 461 | subtext "^5.0.0" 462 | topo "^2.0.2" 463 | 464 | har-schema@^2.0.0: 465 | version "2.0.0" 466 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 467 | 468 | har-validator@~5.0.3: 469 | version "5.0.3" 470 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" 471 | dependencies: 472 | ajv "^5.1.0" 473 | har-schema "^2.0.0" 474 | 475 | hawk@~6.0.2: 476 | version "6.0.2" 477 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" 478 | dependencies: 479 | boom "4.x.x" 480 | cryptiles "3.x.x" 481 | hoek "4.x.x" 482 | sntp "2.x.x" 483 | 484 | heavy@^4.0.4: 485 | version "4.0.4" 486 | resolved "https://registry.yarnpkg.com/heavy/-/heavy-4.0.4.tgz#36c91336c00ccfe852caa4d153086335cd2f00e9" 487 | dependencies: 488 | boom "5.x.x" 489 | hoek "4.x.x" 490 | joi "10.x.x" 491 | 492 | hoek@4.x.x, hoek@^4.2.0: 493 | version "4.2.0" 494 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" 495 | 496 | home-path@^1.0.1: 497 | version "1.0.5" 498 | resolved "https://registry.yarnpkg.com/home-path/-/home-path-1.0.5.tgz#788b29815b12d53bacf575648476e6f9041d133f" 499 | 500 | hosted-git-info@^2.1.4: 501 | version "2.5.0" 502 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" 503 | 504 | http-signature@~1.2.0: 505 | version "1.2.0" 506 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 507 | dependencies: 508 | assert-plus "^1.0.0" 509 | jsprim "^1.2.2" 510 | sshpk "^1.7.0" 511 | 512 | indent-string@^2.1.0: 513 | version "2.1.0" 514 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" 515 | dependencies: 516 | repeating "^2.0.0" 517 | 518 | inflight@^1.0.4: 519 | version "1.0.6" 520 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 521 | dependencies: 522 | once "^1.3.0" 523 | wrappy "1" 524 | 525 | inherits@2, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: 526 | version "2.0.3" 527 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 528 | 529 | ini@~1.3.0: 530 | version "1.3.4" 531 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 532 | 533 | iron@4.x.x, iron@^4.0.5: 534 | version "4.0.5" 535 | resolved "https://registry.yarnpkg.com/iron/-/iron-4.0.5.tgz#4f042cceb8b9738f346b59aa734c83a89bc31428" 536 | dependencies: 537 | boom "5.x.x" 538 | cryptiles "3.x.x" 539 | hoek "4.x.x" 540 | 541 | is-arrayish@^0.2.1: 542 | version "0.2.1" 543 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 544 | 545 | is-builtin-module@^1.0.0: 546 | version "1.0.0" 547 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 548 | dependencies: 549 | builtin-modules "^1.0.0" 550 | 551 | is-finite@^1.0.0: 552 | version "1.0.2" 553 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 554 | dependencies: 555 | number-is-nan "^1.0.0" 556 | 557 | is-fullwidth-code-point@^1.0.0: 558 | version "1.0.0" 559 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 560 | dependencies: 561 | number-is-nan "^1.0.0" 562 | 563 | is-typedarray@~1.0.0: 564 | version "1.0.0" 565 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 566 | 567 | is-utf8@^0.2.0: 568 | version "0.2.1" 569 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 570 | 571 | isarray@0.0.1: 572 | version "0.0.1" 573 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 574 | 575 | isarray@~1.0.0: 576 | version "1.0.0" 577 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 578 | 579 | isemail@2.x.x: 580 | version "2.2.1" 581 | resolved "https://registry.yarnpkg.com/isemail/-/isemail-2.2.1.tgz#0353d3d9a62951080c262c2aa0a42b8ea8e9e2a6" 582 | 583 | isemail@3.x.x: 584 | version "3.0.0" 585 | resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.0.0.tgz#c89a46bb7a3361e1759f8028f9082488ecce3dff" 586 | dependencies: 587 | punycode "2.x.x" 588 | 589 | isstream@~0.1.2: 590 | version "0.1.2" 591 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 592 | 593 | items@2.x.x, items@^2.1.1: 594 | version "2.1.1" 595 | resolved "https://registry.yarnpkg.com/items/-/items-2.1.1.tgz#8bd16d9c83b19529de5aea321acaada78364a198" 596 | 597 | joi@10.x.x: 598 | version "10.6.0" 599 | resolved "https://registry.yarnpkg.com/joi/-/joi-10.6.0.tgz#52587f02d52b8b75cdb0c74f0b164a191a0e1fc2" 600 | dependencies: 601 | hoek "4.x.x" 602 | isemail "2.x.x" 603 | items "2.x.x" 604 | topo "2.x.x" 605 | 606 | joi@^11.1.0: 607 | version "11.4.0" 608 | resolved "https://registry.yarnpkg.com/joi/-/joi-11.4.0.tgz#f674897537b625e9ac3d0b7e1604c828ad913ccb" 609 | dependencies: 610 | hoek "4.x.x" 611 | isemail "3.x.x" 612 | topo "2.x.x" 613 | 614 | jsbn@~0.1.0: 615 | version "0.1.1" 616 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 617 | 618 | json-schema-traverse@^0.3.0: 619 | version "0.3.1" 620 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 621 | 622 | json-schema@0.2.3: 623 | version "0.2.3" 624 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 625 | 626 | json-stringify-safe@~5.0.1: 627 | version "5.0.1" 628 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 629 | 630 | jsonfile@^2.1.0: 631 | version "2.4.0" 632 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" 633 | optionalDependencies: 634 | graceful-fs "^4.1.6" 635 | 636 | jsprim@^1.2.2: 637 | version "1.4.1" 638 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 639 | dependencies: 640 | assert-plus "1.0.0" 641 | extsprintf "1.3.0" 642 | json-schema "0.2.3" 643 | verror "1.10.0" 644 | 645 | klaw@^1.0.0: 646 | version "1.3.1" 647 | resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" 648 | optionalDependencies: 649 | graceful-fs "^4.1.9" 650 | 651 | load-json-file@^1.0.0: 652 | version "1.1.0" 653 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 654 | dependencies: 655 | graceful-fs "^4.1.2" 656 | parse-json "^2.2.0" 657 | pify "^2.0.0" 658 | pinkie-promise "^2.0.0" 659 | strip-bom "^2.0.0" 660 | 661 | loud-rejection@^1.0.0: 662 | version "1.6.0" 663 | resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" 664 | dependencies: 665 | currently-unhandled "^0.4.1" 666 | signal-exit "^3.0.0" 667 | 668 | map-obj@^1.0.0, map-obj@^1.0.1: 669 | version "1.0.1" 670 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 671 | 672 | material-design-lite@^1.3.0: 673 | version "1.3.0" 674 | resolved "https://registry.yarnpkg.com/material-design-lite/-/material-design-lite-1.3.0.tgz#d004ce3fee99a1eeb74a78b8a325134a5f1171d3" 675 | 676 | meow@^3.1.0: 677 | version "3.7.0" 678 | resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" 679 | dependencies: 680 | camelcase-keys "^2.0.0" 681 | decamelize "^1.1.2" 682 | loud-rejection "^1.0.0" 683 | map-obj "^1.0.1" 684 | minimist "^1.1.3" 685 | normalize-package-data "^2.3.4" 686 | object-assign "^4.0.1" 687 | read-pkg-up "^1.0.1" 688 | redent "^1.0.0" 689 | trim-newlines "^1.0.0" 690 | 691 | mime-db@1.x.x: 692 | version "1.31.0" 693 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.31.0.tgz#a49cd8f3ebf3ed1a482b60561d9105ad40ca74cb" 694 | 695 | mime-db@~1.30.0: 696 | version "1.30.0" 697 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" 698 | 699 | mime-types@^2.1.12, mime-types@~2.1.17: 700 | version "2.1.17" 701 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" 702 | dependencies: 703 | mime-db "~1.30.0" 704 | 705 | mimos@^3.0.3: 706 | version "3.0.3" 707 | resolved "https://registry.yarnpkg.com/mimos/-/mimos-3.0.3.tgz#b9109072ad378c2b72f6a0101c43ddfb2b36641f" 708 | dependencies: 709 | hoek "4.x.x" 710 | mime-db "1.x.x" 711 | 712 | minimatch@^3.0.4: 713 | version "3.0.4" 714 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 715 | dependencies: 716 | brace-expansion "^1.1.7" 717 | 718 | minimist@0.0.8: 719 | version "0.0.8" 720 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 721 | 722 | minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: 723 | version "1.2.0" 724 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 725 | 726 | mkdirp@0.5.0: 727 | version "0.5.0" 728 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" 729 | dependencies: 730 | minimist "0.0.8" 731 | 732 | ms@2.0.0: 733 | version "2.0.0" 734 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 735 | 736 | nigel@2.x.x: 737 | version "2.0.2" 738 | resolved "https://registry.yarnpkg.com/nigel/-/nigel-2.0.2.tgz#93a1866fb0c52d87390aa75e2b161f4b5c75e5b1" 739 | dependencies: 740 | hoek "4.x.x" 741 | vise "2.x.x" 742 | 743 | normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: 744 | version "2.4.0" 745 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" 746 | dependencies: 747 | hosted-git-info "^2.1.4" 748 | is-builtin-module "^1.0.0" 749 | semver "2 || 3 || 4 || 5" 750 | validate-npm-package-license "^3.0.1" 751 | 752 | nugget@^2.0.0: 753 | version "2.0.1" 754 | resolved "https://registry.yarnpkg.com/nugget/-/nugget-2.0.1.tgz#201095a487e1ad36081b3432fa3cada4f8d071b0" 755 | dependencies: 756 | debug "^2.1.3" 757 | minimist "^1.1.0" 758 | pretty-bytes "^1.0.2" 759 | progress-stream "^1.1.0" 760 | request "^2.45.0" 761 | single-line-log "^1.1.2" 762 | throttleit "0.0.2" 763 | 764 | number-is-nan@^1.0.0: 765 | version "1.0.1" 766 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 767 | 768 | oauth-sign@~0.8.2: 769 | version "0.8.2" 770 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 771 | 772 | object-assign@^4.0.1: 773 | version "4.1.1" 774 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 775 | 776 | object-keys@~0.4.0: 777 | version "0.4.0" 778 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" 779 | 780 | once@^1.3.0: 781 | version "1.4.0" 782 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 783 | dependencies: 784 | wrappy "1" 785 | 786 | opener@^1.4.3: 787 | version "1.4.3" 788 | resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" 789 | 790 | parse-json@^2.2.0: 791 | version "2.2.0" 792 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 793 | dependencies: 794 | error-ex "^1.2.0" 795 | 796 | path-exists@^2.0.0, path-exists@^2.1.0: 797 | version "2.1.0" 798 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 799 | dependencies: 800 | pinkie-promise "^2.0.0" 801 | 802 | path-is-absolute@^1.0.0: 803 | version "1.0.1" 804 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 805 | 806 | path-type@^1.0.0: 807 | version "1.1.0" 808 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 809 | dependencies: 810 | graceful-fs "^4.1.2" 811 | pify "^2.0.0" 812 | pinkie-promise "^2.0.0" 813 | 814 | pend@~1.2.0: 815 | version "1.2.0" 816 | resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" 817 | 818 | performance-now@^2.1.0: 819 | version "2.1.0" 820 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 821 | 822 | pez@2.x.x: 823 | version "2.1.5" 824 | resolved "https://registry.yarnpkg.com/pez/-/pez-2.1.5.tgz#5ec2cc62500cc3eb4236d4a414cf5a17b5eb5007" 825 | dependencies: 826 | b64 "3.x.x" 827 | boom "5.x.x" 828 | content "3.x.x" 829 | hoek "4.x.x" 830 | nigel "2.x.x" 831 | 832 | pify@^2.0.0: 833 | version "2.3.0" 834 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 835 | 836 | pinkie-promise@^2.0.0: 837 | version "2.0.1" 838 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 839 | dependencies: 840 | pinkie "^2.0.0" 841 | 842 | pinkie@^2.0.0: 843 | version "2.0.4" 844 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 845 | 846 | podium@^1.3.0: 847 | version "1.3.0" 848 | resolved "https://registry.yarnpkg.com/podium/-/podium-1.3.0.tgz#3c490f54d16f10f5260cbe98641f1cb733a8851c" 849 | dependencies: 850 | hoek "4.x.x" 851 | items "2.x.x" 852 | joi "10.x.x" 853 | 854 | pretty-bytes@^1.0.2: 855 | version "1.0.4" 856 | resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84" 857 | dependencies: 858 | get-stdin "^4.0.1" 859 | meow "^3.1.0" 860 | 861 | process-nextick-args@~1.0.6: 862 | version "1.0.7" 863 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 864 | 865 | progress-stream@^1.1.0: 866 | version "1.2.0" 867 | resolved "https://registry.yarnpkg.com/progress-stream/-/progress-stream-1.2.0.tgz#2cd3cfea33ba3a89c9c121ec3347abe9ab125f77" 868 | dependencies: 869 | speedometer "~0.1.2" 870 | through2 "~0.2.3" 871 | 872 | punycode@2.x.x: 873 | version "2.1.0" 874 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" 875 | 876 | punycode@^1.4.1: 877 | version "1.4.1" 878 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 879 | 880 | qs@~6.5.1: 881 | version "6.5.1" 882 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" 883 | 884 | rc@^1.1.2: 885 | version "1.2.2" 886 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077" 887 | dependencies: 888 | deep-extend "~0.4.0" 889 | ini "~1.3.0" 890 | minimist "^1.2.0" 891 | strip-json-comments "~2.0.1" 892 | 893 | read-pkg-up@^1.0.1: 894 | version "1.0.1" 895 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 896 | dependencies: 897 | find-up "^1.0.0" 898 | read-pkg "^1.0.0" 899 | 900 | read-pkg@^1.0.0: 901 | version "1.1.0" 902 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 903 | dependencies: 904 | load-json-file "^1.0.0" 905 | normalize-package-data "^2.3.2" 906 | path-type "^1.0.0" 907 | 908 | readable-stream@^2.2.2: 909 | version "2.3.3" 910 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" 911 | dependencies: 912 | core-util-is "~1.0.0" 913 | inherits "~2.0.3" 914 | isarray "~1.0.0" 915 | process-nextick-args "~1.0.6" 916 | safe-buffer "~5.1.1" 917 | string_decoder "~1.0.3" 918 | util-deprecate "~1.0.1" 919 | 920 | readable-stream@~1.1.9: 921 | version "1.1.14" 922 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" 923 | dependencies: 924 | core-util-is "~1.0.0" 925 | inherits "~2.0.1" 926 | isarray "0.0.1" 927 | string_decoder "~0.10.x" 928 | 929 | redent@^1.0.0: 930 | version "1.0.0" 931 | resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" 932 | dependencies: 933 | indent-string "^2.1.0" 934 | strip-indent "^1.0.1" 935 | 936 | repeating@^2.0.0: 937 | version "2.0.1" 938 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 939 | dependencies: 940 | is-finite "^1.0.0" 941 | 942 | request@^2.45.0, request@^2.83.0: 943 | version "2.83.0" 944 | resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" 945 | dependencies: 946 | aws-sign2 "~0.7.0" 947 | aws4 "^1.6.0" 948 | caseless "~0.12.0" 949 | combined-stream "~1.0.5" 950 | extend "~3.0.1" 951 | forever-agent "~0.6.1" 952 | form-data "~2.3.1" 953 | har-validator "~5.0.3" 954 | hawk "~6.0.2" 955 | http-signature "~1.2.0" 956 | is-typedarray "~1.0.0" 957 | isstream "~0.1.2" 958 | json-stringify-safe "~5.0.1" 959 | mime-types "~2.1.17" 960 | oauth-sign "~0.8.2" 961 | performance-now "^2.1.0" 962 | qs "~6.5.1" 963 | safe-buffer "^5.1.1" 964 | stringstream "~0.0.5" 965 | tough-cookie "~2.3.3" 966 | tunnel-agent "^0.6.0" 967 | uuid "^3.1.0" 968 | 969 | rimraf@^2.2.8: 970 | version "2.6.2" 971 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 972 | dependencies: 973 | glob "^7.0.5" 974 | 975 | safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 976 | version "5.1.1" 977 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 978 | 979 | "semver@2 || 3 || 4 || 5", semver@^5.3.0: 980 | version "5.4.1" 981 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" 982 | 983 | shot@^3.4.2: 984 | version "3.4.2" 985 | resolved "https://registry.yarnpkg.com/shot/-/shot-3.4.2.tgz#1e5c3f6f2b26649adc42f7eb350214a5a0291d67" 986 | dependencies: 987 | hoek "4.x.x" 988 | joi "10.x.x" 989 | 990 | signal-exit@^3.0.0: 991 | version "3.0.2" 992 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 993 | 994 | single-line-log@^1.1.2: 995 | version "1.1.2" 996 | resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364" 997 | dependencies: 998 | string-width "^1.0.1" 999 | 1000 | sntp@2.x.x: 1001 | version "2.1.0" 1002 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" 1003 | dependencies: 1004 | hoek "4.x.x" 1005 | 1006 | spdx-correct@~1.0.0: 1007 | version "1.0.2" 1008 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" 1009 | dependencies: 1010 | spdx-license-ids "^1.0.2" 1011 | 1012 | spdx-expression-parse@~1.0.0: 1013 | version "1.0.4" 1014 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" 1015 | 1016 | spdx-license-ids@^1.0.2: 1017 | version "1.2.2" 1018 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" 1019 | 1020 | speedometer@~0.1.2: 1021 | version "0.1.4" 1022 | resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-0.1.4.tgz#9876dbd2a169d3115402d48e6ea6329c8816a50d" 1023 | 1024 | sshpk@^1.7.0: 1025 | version "1.13.1" 1026 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" 1027 | dependencies: 1028 | asn1 "~0.2.3" 1029 | assert-plus "^1.0.0" 1030 | dashdash "^1.12.0" 1031 | getpass "^0.1.1" 1032 | optionalDependencies: 1033 | bcrypt-pbkdf "^1.0.0" 1034 | ecc-jsbn "~0.1.1" 1035 | jsbn "~0.1.0" 1036 | tweetnacl "~0.14.0" 1037 | 1038 | statehood@^5.0.3: 1039 | version "5.0.3" 1040 | resolved "https://registry.yarnpkg.com/statehood/-/statehood-5.0.3.tgz#c07a75620db5379b60d2edd47f538002a8ac7dd6" 1041 | dependencies: 1042 | boom "5.x.x" 1043 | cryptiles "3.x.x" 1044 | hoek "4.x.x" 1045 | iron "4.x.x" 1046 | items "2.x.x" 1047 | joi "10.x.x" 1048 | 1049 | string-width@^1.0.1: 1050 | version "1.0.2" 1051 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1052 | dependencies: 1053 | code-point-at "^1.0.0" 1054 | is-fullwidth-code-point "^1.0.0" 1055 | strip-ansi "^3.0.0" 1056 | 1057 | string_decoder@~0.10.x: 1058 | version "0.10.31" 1059 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1060 | 1061 | string_decoder@~1.0.3: 1062 | version "1.0.3" 1063 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 1064 | dependencies: 1065 | safe-buffer "~5.1.0" 1066 | 1067 | stringstream@~0.0.5: 1068 | version "0.0.5" 1069 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 1070 | 1071 | strip-ansi@^3.0.0: 1072 | version "3.0.1" 1073 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1074 | dependencies: 1075 | ansi-regex "^2.0.0" 1076 | 1077 | strip-bom@^2.0.0: 1078 | version "2.0.0" 1079 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 1080 | dependencies: 1081 | is-utf8 "^0.2.0" 1082 | 1083 | strip-indent@^1.0.1: 1084 | version "1.0.1" 1085 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" 1086 | dependencies: 1087 | get-stdin "^4.0.1" 1088 | 1089 | strip-json-comments@~2.0.1: 1090 | version "2.0.1" 1091 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1092 | 1093 | subtext@^5.0.0: 1094 | version "5.0.0" 1095 | resolved "https://registry.yarnpkg.com/subtext/-/subtext-5.0.0.tgz#9c3f083018bb1586b167ad8cfd87083f5ccdfe0f" 1096 | dependencies: 1097 | boom "5.x.x" 1098 | content "3.x.x" 1099 | hoek "4.x.x" 1100 | pez "2.x.x" 1101 | wreck "12.x.x" 1102 | 1103 | sumchecker@^1.2.0: 1104 | version "1.3.1" 1105 | resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-1.3.1.tgz#79bb3b4456dd04f18ebdbc0d703a1d1daec5105d" 1106 | dependencies: 1107 | debug "^2.2.0" 1108 | es6-promise "^4.0.5" 1109 | 1110 | throttleit@0.0.2: 1111 | version "0.0.2" 1112 | resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf" 1113 | 1114 | through2@~0.2.3: 1115 | version "0.2.3" 1116 | resolved "https://registry.yarnpkg.com/through2/-/through2-0.2.3.tgz#eb3284da4ea311b6cc8ace3653748a52abf25a3f" 1117 | dependencies: 1118 | readable-stream "~1.1.9" 1119 | xtend "~2.1.1" 1120 | 1121 | topo@2.x.x, topo@^2.0.2: 1122 | version "2.0.2" 1123 | resolved "https://registry.yarnpkg.com/topo/-/topo-2.0.2.tgz#cd5615752539057c0dc0491a621c3bc6fbe1d182" 1124 | dependencies: 1125 | hoek "4.x.x" 1126 | 1127 | tough-cookie@~2.3.3: 1128 | version "2.3.3" 1129 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" 1130 | dependencies: 1131 | punycode "^1.4.1" 1132 | 1133 | trim-newlines@^1.0.0: 1134 | version "1.0.0" 1135 | resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" 1136 | 1137 | tunnel-agent@^0.6.0: 1138 | version "0.6.0" 1139 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 1140 | dependencies: 1141 | safe-buffer "^5.0.1" 1142 | 1143 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1144 | version "0.14.5" 1145 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 1146 | 1147 | typedarray@^0.0.6: 1148 | version "0.0.6" 1149 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1150 | 1151 | typescript@^2.6.1: 1152 | version "2.6.1" 1153 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.6.1.tgz#ef39cdea27abac0b500242d6726ab90e0c846631" 1154 | 1155 | util-deprecate@~1.0.1: 1156 | version "1.0.2" 1157 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1158 | 1159 | uuid@^3.1.0: 1160 | version "3.1.0" 1161 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" 1162 | 1163 | validate-npm-package-license@^3.0.1: 1164 | version "3.0.1" 1165 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" 1166 | dependencies: 1167 | spdx-correct "~1.0.0" 1168 | spdx-expression-parse "~1.0.0" 1169 | 1170 | verror@1.10.0: 1171 | version "1.10.0" 1172 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 1173 | dependencies: 1174 | assert-plus "^1.0.0" 1175 | core-util-is "1.0.2" 1176 | extsprintf "^1.2.0" 1177 | 1178 | vise@2.x.x: 1179 | version "2.0.2" 1180 | resolved "https://registry.yarnpkg.com/vise/-/vise-2.0.2.tgz#6b08e8fb4cb76e3a50cd6dd0ec37338e811a0d39" 1181 | dependencies: 1182 | hoek "4.x.x" 1183 | 1184 | wrappy@1: 1185 | version "1.0.2" 1186 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1187 | 1188 | wreck@12.x.x: 1189 | version "12.5.1" 1190 | resolved "https://registry.yarnpkg.com/wreck/-/wreck-12.5.1.tgz#cd2ffce167449e1f0242ed9cf80552e20fb6902a" 1191 | dependencies: 1192 | boom "5.x.x" 1193 | hoek "4.x.x" 1194 | 1195 | xtend@~2.1.1: 1196 | version "2.1.2" 1197 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" 1198 | dependencies: 1199 | object-keys "~0.4.0" 1200 | 1201 | yauzl@2.4.1: 1202 | version "2.4.1" 1203 | resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" 1204 | dependencies: 1205 | fd-slicer "~1.0.1" 1206 | --------------------------------------------------------------------------------