├── .gitignore ├── .vscode ├── launch.json ├── settings.json └── tasks.json ├── LICENSE ├── README.md ├── binding.gyp ├── index-debug.js ├── lib ├── main.js ├── windows-IAP-bridge.js └── windows-IAP-bridge.ts ├── package-lock.json ├── package.json ├── rebuild.sh └── src ├── Applications.cpp ├── Applications.h ├── GetAppLicenseAsyncWorker.cpp ├── GetAppLicenseAsyncWorker.h ├── GetApplicationsAsyncWorker.cpp ├── GetApplicationsAsyncWorker.h ├── GetCampaignIdAsyncWorker.cpp ├── GetCampaignIdAsyncWorker.h ├── GetCustomerPurchaseIdAsyncWorker.cpp ├── GetCustomerPurchaseIdAsyncWorker.h ├── GetMicrosoftAttributedAsyncWorker.cpp ├── GetMicrosoftAttributedAsyncWorker.h ├── GetStoreAppAsyncWorker.cpp ├── GetStoreAppAsyncWorker.h ├── GetStoreProductsAsyncWorker.cpp ├── GetStoreProductsAsyncWorker.h ├── RequestPurchaseAsyncWorker.cpp ├── RequestPurchaseAsyncWorker.h ├── StoreContext.cpp ├── StoreContext.h ├── UWPHelper.cpp ├── UWPHelper.h ├── WindowsStoreImpl.cpp ├── WindowsStoreImpl.h └── main.cpp /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log 3 | build 4 | bin 5 | .DS_Store -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "WindowsStore Launch", 9 | "preLaunchTask": "npm: build:dev", 10 | "type": "cppvsdbg", 11 | "request": "launch", 12 | "program": "C:\\Program Files\\nodejs\\node.exe", 13 | "args": [ 14 | "C:\\Users\\Tauseef\\work\\windowsstore\\index-debug.js" 15 | ], 16 | "stopAtEntry": false, 17 | "cwd": "${workspaceFolder}", 18 | "environment": [], 19 | "externalConsole": true 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "C_Cpp.clang_format_sortIncludes": false, 3 | "C_Cpp.clang_format_fallbackStyle": "LLVM", 4 | "C_Cpp.clang_format_style": "{ BasedOnStyle: LLVM, ColumnLimit: 120 }", 5 | "editor.formatOnPaste": true, 6 | "editor.formatOnSave": true 7 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "type": "npm", 8 | "script": "build:dev", 9 | "problemMatcher": [] 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /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 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Windows In-App Purchase Bridge 2 | ### N-API wrapper around some APIs on winrt::Windows::Services::Store namespace 3 | 4 | ## Requirements (Minimum) 5 | - Windows 10 6 | - VisualStudio 2017 7 | - Windows SDK (10.17763.0) 8 | - Node v8.11.3 9 | - node-gyp 10 | 11 | ## Installation 12 | - clone repo into your project 13 | - `cd path/to/project/` 14 | - `npm install` 15 | 16 | ## To build for an Electron app 17 | - `npm run build:electron` 18 | 19 | ## Usage 20 | ``` 21 | const electron = require('electron') 22 | const remote = electron.remote 23 | . 24 | . 25 | . 26 | const windowsIAP = require('windows-IAP-bridge') 27 | const StoreContext = new windowsIAP.StoreContext() 28 | let hwnd = remote.getCurrentWindow().getNativeWindowHandle() 29 | const storeContextResult = StoreContext.initialize(hwnd) 30 | store.getAssociatedStoreProductsAsync(['Durable'], callback) 31 | ``` 32 | 33 | ## Packaging 34 | To package your application please use https://github.com/felixrieseberg/electron-windows-store, it lets you associate your application to the store product. 35 | 36 | ## Debugging 37 | #### The project is already configured for debugging using VS Code (tested on 1.31.1) 38 | - `npm run build:dev` 39 | - set breakpoints in the C++ or JS code 40 | - Press play on the debug tab, choose `windows-IAP-bridge` from the dropdown 41 | 42 | #### Initial code examples referred while development 43 | [https://medium.com/@atulanand94/beginners-guide-to-writing-nodejs-addons-using-c-and-n-api-node-addon-api-9b3b718a9a7f](https://medium.com/@atulanand94/beginners-guide-to-writing-nodejs-addons-using-c-and-n-api-node-addon-api-9b3b718a9a7f) 44 | 45 | -------------------------------------------------------------------------------- /binding.gyp: -------------------------------------------------------------------------------- 1 | { 2 | "targets": [{ 3 | "target_name": "binding", 4 | "cflags!": [ "-fno-exceptions" ], 5 | "cflags_cc!": [ "-fno-exceptions" ], 6 | "sources": [ 7 | "src/main.cpp", 8 | "src/StoreContext.cpp", 9 | "src/WindowsStoreImpl.cpp", 10 | "src/RequestPurchaseAsyncWorker.cpp", 11 | "src/GetStoreProductsAsyncWorker.cpp", 12 | "src/GetCustomerPurchaseIdAsyncWorker.cpp", 13 | "src/GetAppLicenseAsyncWorker.cpp" 14 | ], 15 | 'include_dirs': [ 16 | ' 79 | /// Initializes the StoreContext with the handle to current window. 80 | /// Handle to window. 81 | /// 82 | /// 83 | return false 84 | } 85 | 86 | cls.prototype.getCustomerPurchaseIdAsync = function getCustomerPurchaseIdAsync(serviceTicket, publisherUserId, callback) { 87 | /// 88 | /// Function summary. 89 | /// A param. 90 | /// A param. 91 | /// 92 | } 93 | 94 | cls.prototype.getAppLicenseAsync = function getAppLicenseAsync(callback) { 95 | /// 96 | /// Function summary. 97 | /// 98 | } 99 | 100 | cls.prototype.getAssociatedStoreProductsAsync = function getAssociatedStoreProductsAsync(productKinds, callback) { 101 | /// 102 | /// Function summary. 103 | /// A param. 104 | /// 105 | } 106 | 107 | cls.prototype.requestPurchaseAsync = function requestPurchaseAsync(storeId, callback) { 108 | /// 109 | /// Function summary. 110 | /// A param. 111 | /// 112 | } 113 | 114 | cls.prototype.requestPurchaseAsync = function requestPurchaseAsync(storeId, storePurchaseProperties, callback) { 115 | /// 116 | /// Function summary. 117 | /// A param. 118 | /// A param. 119 | /// 120 | } 121 | 122 | return cls; 123 | })(); 124 | exports.StoreContext = StoreContext; 125 | 126 | StoreAppLicense = (function () { 127 | var cls = function StoreAppLicense() { 128 | this.addOnLicenses = new Object(); 129 | }; 130 | 131 | 132 | return cls; 133 | })(); 134 | exports.StoreAppLicense = StoreAppLicense; 135 | 136 | StoreProductResult = (function () { 137 | var cls = function StoreProductResult() { 138 | this.extendedError = new Number(); 139 | this.product = new StoreProduct(); 140 | }; 141 | 142 | 143 | return cls; 144 | })(); 145 | exports.StoreProductResult = StoreProductResult; 146 | 147 | StoreProductQueryResult = (function () { 148 | var cls = function StoreProductQueryResult() { 149 | this.extendedError = new Number(); 150 | this.products = new Object(); 151 | }; 152 | 153 | 154 | return cls; 155 | })(); 156 | exports.StoreProductQueryResult = StoreProductQueryResult; 157 | -------------------------------------------------------------------------------- /lib/windows-IAP-bridge.ts: -------------------------------------------------------------------------------- 1 | declare module "polarr_windows_store" { 2 | 3 | export enum StorePurchaseStatus { 4 | succeeded, 5 | alreadyPurchased, 6 | notPurchased, 7 | networkError, 8 | serverError, 9 | } 10 | 11 | export class StoreProduct { 12 | inAppOfferToken: String; 13 | price: StorePrice; 14 | storeId: String; 15 | constructor(); 16 | 17 | } 18 | 19 | export class StorePurchaseProperties { 20 | name: String; 21 | extendedJsonData: String; 22 | constructor(); 23 | constructor(name: String); 24 | 25 | } 26 | 27 | export class StoreLicense { 28 | inAppOfferToken: String; 29 | isActive: Boolean; 30 | constructor(); 31 | 32 | } 33 | 34 | export class StorePrice { 35 | currencyCode: String; 36 | formattedBasePrice: String; 37 | formattedPrice: String; 38 | formattedRecurrencePrice: String; 39 | constructor(); 40 | 41 | } 42 | 43 | export class StorePurchaseResult { 44 | extendedError: Number; 45 | status: StorePurchaseStatus; 46 | constructor(); 47 | 48 | } 49 | 50 | export class StoreContext { 51 | user: Object; 52 | constructor(); 53 | 54 | initialize(hwnd: Uint8Array): boolean; 55 | 56 | static getDefault(): StoreContext; 57 | 58 | getCustomerPurchaseIdAsync(serviceTicket: String, publisherUserId: String, callback: (error: Error, result: String) => void): void; 59 | 60 | getAppLicenseAsync(callback: (error: Error, result: StoreAppLicense) => void): void; 61 | 62 | getAssociatedStoreProductsAsync(productKinds: Object, callback: (error: Error, result: StoreProductQueryResult) => void): void; 63 | 64 | requestPurchaseAsync(storeId: String, callback: (error: Error, result: StorePurchaseResult) => void): void; 65 | requestPurchaseAsync(storeId: String, storePurchaseProperties: StorePurchaseProperties, callback: (error: Error, result: StorePurchaseResult) => void): void; 66 | 67 | } 68 | 69 | export class StoreAppLicense { 70 | addOnLicenses: Object; 71 | constructor(); 72 | 73 | } 74 | 75 | export class StoreProductResult { 76 | extendedError: Number; 77 | product: StoreProduct; 78 | constructor(); 79 | 80 | } 81 | 82 | export class StoreProductQueryResult { 83 | extendedError: Number; 84 | products: Object; 85 | constructor(); 86 | 87 | } 88 | 89 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "windows-iap-bridge", 3 | "version": "0.0.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/node": { 8 | "version": "8.10.45", 9 | "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.45.tgz", 10 | "integrity": "sha512-tGVTbA+i3qfXsLbq9rEq/hezaHY55QxQLeXQL2ejNgFAxxrgu8eMmYIOsRcl7hN1uTLVsKOOYacV/rcJM3sfgQ==", 11 | "dev": true 12 | }, 13 | "abbrev": { 14 | "version": "1.1.1", 15 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 16 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 17 | "dev": true 18 | }, 19 | "ajv": { 20 | "version": "6.10.0", 21 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", 22 | "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", 23 | "dev": true, 24 | "requires": { 25 | "fast-deep-equal": "^2.0.1", 26 | "fast-json-stable-stringify": "^2.0.0", 27 | "json-schema-traverse": "^0.4.1", 28 | "uri-js": "^4.2.2" 29 | } 30 | }, 31 | "ansi-regex": { 32 | "version": "2.1.1", 33 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 34 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 35 | "dev": true 36 | }, 37 | "ansi-styles": { 38 | "version": "3.2.1", 39 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 40 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 41 | "dev": true, 42 | "requires": { 43 | "color-convert": "^1.9.0" 44 | } 45 | }, 46 | "aproba": { 47 | "version": "1.2.0", 48 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 49 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", 50 | "dev": true 51 | }, 52 | "are-we-there-yet": { 53 | "version": "1.1.5", 54 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", 55 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", 56 | "dev": true, 57 | "requires": { 58 | "delegates": "^1.0.0", 59 | "readable-stream": "^2.0.6" 60 | }, 61 | "dependencies": { 62 | "isarray": { 63 | "version": "1.0.0", 64 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 65 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 66 | "dev": true 67 | }, 68 | "readable-stream": { 69 | "version": "2.3.6", 70 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 71 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 72 | "dev": true, 73 | "requires": { 74 | "core-util-is": "~1.0.0", 75 | "inherits": "~2.0.3", 76 | "isarray": "~1.0.0", 77 | "process-nextick-args": "~2.0.0", 78 | "safe-buffer": "~5.1.1", 79 | "string_decoder": "~1.1.1", 80 | "util-deprecate": "~1.0.1" 81 | } 82 | }, 83 | "string_decoder": { 84 | "version": "1.1.1", 85 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 86 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 87 | "dev": true, 88 | "requires": { 89 | "safe-buffer": "~5.1.0" 90 | } 91 | } 92 | } 93 | }, 94 | "array-find-index": { 95 | "version": "1.0.2", 96 | "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", 97 | "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", 98 | "dev": true 99 | }, 100 | "asn1": { 101 | "version": "0.2.4", 102 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 103 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 104 | "dev": true, 105 | "requires": { 106 | "safer-buffer": "~2.1.0" 107 | } 108 | }, 109 | "assert-plus": { 110 | "version": "1.0.0", 111 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 112 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 113 | "dev": true 114 | }, 115 | "asynckit": { 116 | "version": "0.4.0", 117 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 118 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 119 | "dev": true 120 | }, 121 | "aws-sign2": { 122 | "version": "0.7.0", 123 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 124 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 125 | "dev": true 126 | }, 127 | "aws4": { 128 | "version": "1.8.0", 129 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 130 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", 131 | "dev": true 132 | }, 133 | "balanced-match": { 134 | "version": "1.0.0", 135 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 136 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 137 | "dev": true 138 | }, 139 | "bcrypt-pbkdf": { 140 | "version": "1.0.2", 141 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 142 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 143 | "dev": true, 144 | "requires": { 145 | "tweetnacl": "^0.14.3" 146 | } 147 | }, 148 | "block-stream": { 149 | "version": "0.0.9", 150 | "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", 151 | "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", 152 | "dev": true, 153 | "requires": { 154 | "inherits": "~2.0.0" 155 | } 156 | }, 157 | "brace-expansion": { 158 | "version": "1.1.11", 159 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 160 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 161 | "dev": true, 162 | "requires": { 163 | "balanced-match": "^1.0.0", 164 | "concat-map": "0.0.1" 165 | } 166 | }, 167 | "buffer-from": { 168 | "version": "1.1.1", 169 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 170 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 171 | "dev": true 172 | }, 173 | "camelcase": { 174 | "version": "2.1.1", 175 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 176 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", 177 | "dev": true 178 | }, 179 | "camelcase-keys": { 180 | "version": "2.1.0", 181 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", 182 | "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", 183 | "dev": true, 184 | "requires": { 185 | "camelcase": "^2.0.0", 186 | "map-obj": "^1.0.0" 187 | } 188 | }, 189 | "caseless": { 190 | "version": "0.12.0", 191 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 192 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 193 | "dev": true 194 | }, 195 | "chalk": { 196 | "version": "2.4.2", 197 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 198 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 199 | "dev": true, 200 | "requires": { 201 | "ansi-styles": "^3.2.1", 202 | "escape-string-regexp": "^1.0.5", 203 | "supports-color": "^5.3.0" 204 | } 205 | }, 206 | "cli-cursor": { 207 | "version": "2.1.0", 208 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 209 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 210 | "dev": true, 211 | "requires": { 212 | "restore-cursor": "^2.0.0" 213 | } 214 | }, 215 | "cli-spinners": { 216 | "version": "2.1.0", 217 | "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.1.0.tgz", 218 | "integrity": "sha512-8B00fJOEh1HPrx4fo5eW16XmE1PcL1tGpGrxy63CXGP9nHdPBN63X75hA1zhvQuhVztJWLqV58Roj2qlNM7cAA==", 219 | "dev": true 220 | }, 221 | "cliui": { 222 | "version": "4.1.0", 223 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", 224 | "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", 225 | "dev": true, 226 | "requires": { 227 | "string-width": "^2.1.1", 228 | "strip-ansi": "^4.0.0", 229 | "wrap-ansi": "^2.0.0" 230 | }, 231 | "dependencies": { 232 | "ansi-regex": { 233 | "version": "3.0.0", 234 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 235 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 236 | "dev": true 237 | }, 238 | "is-fullwidth-code-point": { 239 | "version": "2.0.0", 240 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 241 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 242 | "dev": true 243 | }, 244 | "string-width": { 245 | "version": "2.1.1", 246 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 247 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 248 | "dev": true, 249 | "requires": { 250 | "is-fullwidth-code-point": "^2.0.0", 251 | "strip-ansi": "^4.0.0" 252 | } 253 | }, 254 | "strip-ansi": { 255 | "version": "4.0.0", 256 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 257 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 258 | "dev": true, 259 | "requires": { 260 | "ansi-regex": "^3.0.0" 261 | } 262 | } 263 | } 264 | }, 265 | "clone": { 266 | "version": "1.0.4", 267 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 268 | "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", 269 | "dev": true 270 | }, 271 | "code-point-at": { 272 | "version": "1.1.0", 273 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 274 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", 275 | "dev": true 276 | }, 277 | "color-convert": { 278 | "version": "1.9.3", 279 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 280 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 281 | "dev": true, 282 | "requires": { 283 | "color-name": "1.1.3" 284 | } 285 | }, 286 | "color-name": { 287 | "version": "1.1.3", 288 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 289 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 290 | "dev": true 291 | }, 292 | "colors": { 293 | "version": "1.3.3", 294 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", 295 | "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", 296 | "dev": true 297 | }, 298 | "combined-stream": { 299 | "version": "1.0.7", 300 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", 301 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", 302 | "dev": true, 303 | "requires": { 304 | "delayed-stream": "~1.0.0" 305 | } 306 | }, 307 | "concat-map": { 308 | "version": "0.0.1", 309 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 310 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 311 | "dev": true 312 | }, 313 | "concat-stream": { 314 | "version": "1.6.2", 315 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 316 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 317 | "dev": true, 318 | "requires": { 319 | "buffer-from": "^1.0.0", 320 | "inherits": "^2.0.3", 321 | "readable-stream": "^2.2.2", 322 | "typedarray": "^0.0.6" 323 | }, 324 | "dependencies": { 325 | "isarray": { 326 | "version": "1.0.0", 327 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 328 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 329 | "dev": true 330 | }, 331 | "readable-stream": { 332 | "version": "2.3.6", 333 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 334 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 335 | "dev": true, 336 | "requires": { 337 | "core-util-is": "~1.0.0", 338 | "inherits": "~2.0.3", 339 | "isarray": "~1.0.0", 340 | "process-nextick-args": "~2.0.0", 341 | "safe-buffer": "~5.1.1", 342 | "string_decoder": "~1.1.1", 343 | "util-deprecate": "~1.0.1" 344 | } 345 | }, 346 | "string_decoder": { 347 | "version": "1.1.1", 348 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 349 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 350 | "dev": true, 351 | "requires": { 352 | "safe-buffer": "~5.1.0" 353 | } 354 | } 355 | } 356 | }, 357 | "console-control-strings": { 358 | "version": "1.1.0", 359 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 360 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", 361 | "dev": true 362 | }, 363 | "core-util-is": { 364 | "version": "1.0.2", 365 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 366 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 367 | "dev": true 368 | }, 369 | "cross-spawn": { 370 | "version": "6.0.5", 371 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 372 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 373 | "dev": true, 374 | "requires": { 375 | "nice-try": "^1.0.4", 376 | "path-key": "^2.0.1", 377 | "semver": "^5.5.0", 378 | "shebang-command": "^1.2.0", 379 | "which": "^1.2.9" 380 | } 381 | }, 382 | "currently-unhandled": { 383 | "version": "0.4.1", 384 | "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", 385 | "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", 386 | "dev": true, 387 | "requires": { 388 | "array-find-index": "^1.0.1" 389 | } 390 | }, 391 | "dashdash": { 392 | "version": "1.14.1", 393 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 394 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 395 | "dev": true, 396 | "requires": { 397 | "assert-plus": "^1.0.0" 398 | } 399 | }, 400 | "debug": { 401 | "version": "3.2.6", 402 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 403 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 404 | "dev": true, 405 | "requires": { 406 | "ms": "^2.1.1" 407 | } 408 | }, 409 | "decamelize": { 410 | "version": "1.2.0", 411 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 412 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 413 | "dev": true 414 | }, 415 | "deep-extend": { 416 | "version": "0.6.0", 417 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 418 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 419 | "dev": true 420 | }, 421 | "defaults": { 422 | "version": "1.0.3", 423 | "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", 424 | "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", 425 | "dev": true, 426 | "requires": { 427 | "clone": "^1.0.2" 428 | } 429 | }, 430 | "delayed-stream": { 431 | "version": "1.0.0", 432 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 433 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 434 | "dev": true 435 | }, 436 | "delegates": { 437 | "version": "1.0.0", 438 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 439 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", 440 | "dev": true 441 | }, 442 | "detect-libc": { 443 | "version": "1.0.3", 444 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 445 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", 446 | "dev": true 447 | }, 448 | "ecc-jsbn": { 449 | "version": "0.1.2", 450 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 451 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 452 | "dev": true, 453 | "requires": { 454 | "jsbn": "~0.1.0", 455 | "safer-buffer": "^2.1.0" 456 | } 457 | }, 458 | "electron": { 459 | "version": "3.1.8", 460 | "resolved": "https://registry.npmjs.org/electron/-/electron-3.1.8.tgz", 461 | "integrity": "sha512-1MiFoMzxGaR0wDfwFE5Ydnuk6ry/4lKgF0c+NFyEItxM/WyEHNZPNjJAeKJ+M/0sevmZ+6W4syNZnQL5M3GgsQ==", 462 | "dev": true, 463 | "requires": { 464 | "@types/node": "^8.0.24", 465 | "electron-download": "^4.1.0", 466 | "extract-zip": "^1.0.3" 467 | } 468 | }, 469 | "electron-download": { 470 | "version": "4.1.1", 471 | "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.1.tgz", 472 | "integrity": "sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg==", 473 | "dev": true, 474 | "requires": { 475 | "debug": "^3.0.0", 476 | "env-paths": "^1.0.0", 477 | "fs-extra": "^4.0.1", 478 | "minimist": "^1.2.0", 479 | "nugget": "^2.0.1", 480 | "path-exists": "^3.0.0", 481 | "rc": "^1.2.1", 482 | "semver": "^5.4.1", 483 | "sumchecker": "^2.0.2" 484 | } 485 | }, 486 | "electron-rebuild": { 487 | "version": "1.8.4", 488 | "resolved": "https://registry.npmjs.org/electron-rebuild/-/electron-rebuild-1.8.4.tgz", 489 | "integrity": "sha512-QBUZg1due+R0bww5rNd4gEcsKczyhxyLrxSFZlKihwHRxaiHrGut532JAUe0fRz+VIU4WNSfNKyZ/ZwSGjaDhA==", 490 | "dev": true, 491 | "requires": { 492 | "colors": "^1.3.3", 493 | "debug": "^4.1.1", 494 | "detect-libc": "^1.0.3", 495 | "fs-extra": "^7.0.1", 496 | "node-abi": "^2.7.0", 497 | "node-gyp": "^3.8.0", 498 | "ora": "^3.0.0", 499 | "spawn-rx": "^3.0.0", 500 | "yargs": "^12.0.5" 501 | }, 502 | "dependencies": { 503 | "debug": { 504 | "version": "4.1.1", 505 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 506 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 507 | "dev": true, 508 | "requires": { 509 | "ms": "^2.1.1" 510 | } 511 | }, 512 | "fs-extra": { 513 | "version": "7.0.1", 514 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", 515 | "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", 516 | "dev": true, 517 | "requires": { 518 | "graceful-fs": "^4.1.2", 519 | "jsonfile": "^4.0.0", 520 | "universalify": "^0.1.0" 521 | } 522 | } 523 | } 524 | }, 525 | "end-of-stream": { 526 | "version": "1.4.1", 527 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 528 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 529 | "dev": true, 530 | "requires": { 531 | "once": "^1.4.0" 532 | } 533 | }, 534 | "env-paths": { 535 | "version": "1.0.0", 536 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", 537 | "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=", 538 | "dev": true 539 | }, 540 | "error-ex": { 541 | "version": "1.3.2", 542 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 543 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 544 | "dev": true, 545 | "requires": { 546 | "is-arrayish": "^0.2.1" 547 | } 548 | }, 549 | "escape-string-regexp": { 550 | "version": "1.0.5", 551 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 552 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 553 | "dev": true 554 | }, 555 | "execa": { 556 | "version": "1.0.0", 557 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", 558 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", 559 | "dev": true, 560 | "requires": { 561 | "cross-spawn": "^6.0.0", 562 | "get-stream": "^4.0.0", 563 | "is-stream": "^1.1.0", 564 | "npm-run-path": "^2.0.0", 565 | "p-finally": "^1.0.0", 566 | "signal-exit": "^3.0.0", 567 | "strip-eof": "^1.0.0" 568 | } 569 | }, 570 | "extend": { 571 | "version": "3.0.2", 572 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 573 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 574 | "dev": true 575 | }, 576 | "extract-zip": { 577 | "version": "1.6.7", 578 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", 579 | "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", 580 | "dev": true, 581 | "requires": { 582 | "concat-stream": "1.6.2", 583 | "debug": "2.6.9", 584 | "mkdirp": "0.5.1", 585 | "yauzl": "2.4.1" 586 | }, 587 | "dependencies": { 588 | "debug": { 589 | "version": "2.6.9", 590 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 591 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 592 | "dev": true, 593 | "requires": { 594 | "ms": "2.0.0" 595 | } 596 | }, 597 | "ms": { 598 | "version": "2.0.0", 599 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 600 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 601 | "dev": true 602 | } 603 | } 604 | }, 605 | "extsprintf": { 606 | "version": "1.3.0", 607 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 608 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 609 | "dev": true 610 | }, 611 | "fast-deep-equal": { 612 | "version": "2.0.1", 613 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 614 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 615 | "dev": true 616 | }, 617 | "fast-json-stable-stringify": { 618 | "version": "2.0.0", 619 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 620 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 621 | "dev": true 622 | }, 623 | "fd-slicer": { 624 | "version": "1.0.1", 625 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", 626 | "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", 627 | "dev": true, 628 | "requires": { 629 | "pend": "~1.2.0" 630 | } 631 | }, 632 | "find-up": { 633 | "version": "1.1.2", 634 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 635 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 636 | "dev": true, 637 | "requires": { 638 | "path-exists": "^2.0.0", 639 | "pinkie-promise": "^2.0.0" 640 | }, 641 | "dependencies": { 642 | "path-exists": { 643 | "version": "2.1.0", 644 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 645 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 646 | "dev": true, 647 | "requires": { 648 | "pinkie-promise": "^2.0.0" 649 | } 650 | } 651 | } 652 | }, 653 | "forever-agent": { 654 | "version": "0.6.1", 655 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 656 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 657 | "dev": true 658 | }, 659 | "form-data": { 660 | "version": "2.3.3", 661 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 662 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 663 | "dev": true, 664 | "requires": { 665 | "asynckit": "^0.4.0", 666 | "combined-stream": "^1.0.6", 667 | "mime-types": "^2.1.12" 668 | } 669 | }, 670 | "fs-extra": { 671 | "version": "4.0.3", 672 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", 673 | "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", 674 | "dev": true, 675 | "requires": { 676 | "graceful-fs": "^4.1.2", 677 | "jsonfile": "^4.0.0", 678 | "universalify": "^0.1.0" 679 | } 680 | }, 681 | "fs.realpath": { 682 | "version": "1.0.0", 683 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 684 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 685 | "dev": true 686 | }, 687 | "fstream": { 688 | "version": "1.0.12", 689 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", 690 | "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", 691 | "dev": true, 692 | "requires": { 693 | "graceful-fs": "^4.1.2", 694 | "inherits": "~2.0.0", 695 | "mkdirp": ">=0.5 0", 696 | "rimraf": "2" 697 | } 698 | }, 699 | "gauge": { 700 | "version": "2.7.4", 701 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 702 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 703 | "dev": true, 704 | "requires": { 705 | "aproba": "^1.0.3", 706 | "console-control-strings": "^1.0.0", 707 | "has-unicode": "^2.0.0", 708 | "object-assign": "^4.1.0", 709 | "signal-exit": "^3.0.0", 710 | "string-width": "^1.0.1", 711 | "strip-ansi": "^3.0.1", 712 | "wide-align": "^1.1.0" 713 | } 714 | }, 715 | "get-caller-file": { 716 | "version": "1.0.3", 717 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", 718 | "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", 719 | "dev": true 720 | }, 721 | "get-stdin": { 722 | "version": "4.0.1", 723 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", 724 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", 725 | "dev": true 726 | }, 727 | "get-stream": { 728 | "version": "4.1.0", 729 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 730 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 731 | "dev": true, 732 | "requires": { 733 | "pump": "^3.0.0" 734 | } 735 | }, 736 | "getpass": { 737 | "version": "0.1.7", 738 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 739 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 740 | "dev": true, 741 | "requires": { 742 | "assert-plus": "^1.0.0" 743 | } 744 | }, 745 | "glob": { 746 | "version": "7.1.3", 747 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 748 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 749 | "dev": true, 750 | "requires": { 751 | "fs.realpath": "^1.0.0", 752 | "inflight": "^1.0.4", 753 | "inherits": "2", 754 | "minimatch": "^3.0.4", 755 | "once": "^1.3.0", 756 | "path-is-absolute": "^1.0.0" 757 | } 758 | }, 759 | "graceful-fs": { 760 | "version": "4.1.15", 761 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 762 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", 763 | "dev": true 764 | }, 765 | "har-schema": { 766 | "version": "2.0.0", 767 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 768 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 769 | "dev": true 770 | }, 771 | "har-validator": { 772 | "version": "5.1.3", 773 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 774 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 775 | "dev": true, 776 | "requires": { 777 | "ajv": "^6.5.5", 778 | "har-schema": "^2.0.0" 779 | } 780 | }, 781 | "has-flag": { 782 | "version": "3.0.0", 783 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 784 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 785 | "dev": true 786 | }, 787 | "has-unicode": { 788 | "version": "2.0.1", 789 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 790 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", 791 | "dev": true 792 | }, 793 | "hosted-git-info": { 794 | "version": "2.7.1", 795 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", 796 | "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", 797 | "dev": true 798 | }, 799 | "http-signature": { 800 | "version": "1.2.0", 801 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 802 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 803 | "dev": true, 804 | "requires": { 805 | "assert-plus": "^1.0.0", 806 | "jsprim": "^1.2.2", 807 | "sshpk": "^1.7.0" 808 | } 809 | }, 810 | "indent-string": { 811 | "version": "2.1.0", 812 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", 813 | "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", 814 | "dev": true, 815 | "requires": { 816 | "repeating": "^2.0.0" 817 | } 818 | }, 819 | "inflight": { 820 | "version": "1.0.6", 821 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 822 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 823 | "dev": true, 824 | "requires": { 825 | "once": "^1.3.0", 826 | "wrappy": "1" 827 | } 828 | }, 829 | "inherits": { 830 | "version": "2.0.3", 831 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 832 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 833 | "dev": true 834 | }, 835 | "ini": { 836 | "version": "1.3.5", 837 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 838 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 839 | "dev": true 840 | }, 841 | "invert-kv": { 842 | "version": "2.0.0", 843 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", 844 | "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", 845 | "dev": true 846 | }, 847 | "is-arrayish": { 848 | "version": "0.2.1", 849 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 850 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 851 | "dev": true 852 | }, 853 | "is-finite": { 854 | "version": "1.0.2", 855 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 856 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 857 | "dev": true, 858 | "requires": { 859 | "number-is-nan": "^1.0.0" 860 | } 861 | }, 862 | "is-fullwidth-code-point": { 863 | "version": "1.0.0", 864 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 865 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 866 | "dev": true, 867 | "requires": { 868 | "number-is-nan": "^1.0.0" 869 | } 870 | }, 871 | "is-stream": { 872 | "version": "1.1.0", 873 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 874 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 875 | "dev": true 876 | }, 877 | "is-typedarray": { 878 | "version": "1.0.0", 879 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 880 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 881 | "dev": true 882 | }, 883 | "is-utf8": { 884 | "version": "0.2.1", 885 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 886 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", 887 | "dev": true 888 | }, 889 | "isarray": { 890 | "version": "0.0.1", 891 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 892 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 893 | "dev": true 894 | }, 895 | "isexe": { 896 | "version": "2.0.0", 897 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 898 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 899 | "dev": true 900 | }, 901 | "isstream": { 902 | "version": "0.1.2", 903 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 904 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 905 | "dev": true 906 | }, 907 | "jsbn": { 908 | "version": "0.1.1", 909 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 910 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 911 | "dev": true 912 | }, 913 | "json-schema": { 914 | "version": "0.2.3", 915 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 916 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 917 | "dev": true 918 | }, 919 | "json-schema-traverse": { 920 | "version": "0.4.1", 921 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 922 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 923 | "dev": true 924 | }, 925 | "json-stringify-safe": { 926 | "version": "5.0.1", 927 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 928 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 929 | "dev": true 930 | }, 931 | "jsonfile": { 932 | "version": "4.0.0", 933 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 934 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 935 | "dev": true, 936 | "requires": { 937 | "graceful-fs": "^4.1.6" 938 | } 939 | }, 940 | "jsprim": { 941 | "version": "1.4.1", 942 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 943 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 944 | "dev": true, 945 | "requires": { 946 | "assert-plus": "1.0.0", 947 | "extsprintf": "1.3.0", 948 | "json-schema": "0.2.3", 949 | "verror": "1.10.0" 950 | } 951 | }, 952 | "lcid": { 953 | "version": "2.0.0", 954 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", 955 | "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", 956 | "dev": true, 957 | "requires": { 958 | "invert-kv": "^2.0.0" 959 | } 960 | }, 961 | "load-json-file": { 962 | "version": "1.1.0", 963 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", 964 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", 965 | "dev": true, 966 | "requires": { 967 | "graceful-fs": "^4.1.2", 968 | "parse-json": "^2.2.0", 969 | "pify": "^2.0.0", 970 | "pinkie-promise": "^2.0.0", 971 | "strip-bom": "^2.0.0" 972 | } 973 | }, 974 | "locate-path": { 975 | "version": "3.0.0", 976 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 977 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 978 | "dev": true, 979 | "requires": { 980 | "p-locate": "^3.0.0", 981 | "path-exists": "^3.0.0" 982 | } 983 | }, 984 | "lodash.assign": { 985 | "version": "4.2.0", 986 | "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", 987 | "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", 988 | "dev": true 989 | }, 990 | "log-symbols": { 991 | "version": "2.2.0", 992 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", 993 | "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", 994 | "dev": true, 995 | "requires": { 996 | "chalk": "^2.0.1" 997 | } 998 | }, 999 | "loud-rejection": { 1000 | "version": "1.6.0", 1001 | "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", 1002 | "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", 1003 | "dev": true, 1004 | "requires": { 1005 | "currently-unhandled": "^0.4.1", 1006 | "signal-exit": "^3.0.0" 1007 | } 1008 | }, 1009 | "map-age-cleaner": { 1010 | "version": "0.1.3", 1011 | "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", 1012 | "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", 1013 | "dev": true, 1014 | "requires": { 1015 | "p-defer": "^1.0.0" 1016 | } 1017 | }, 1018 | "map-obj": { 1019 | "version": "1.0.1", 1020 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", 1021 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", 1022 | "dev": true 1023 | }, 1024 | "mem": { 1025 | "version": "4.3.0", 1026 | "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", 1027 | "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", 1028 | "dev": true, 1029 | "requires": { 1030 | "map-age-cleaner": "^0.1.1", 1031 | "mimic-fn": "^2.0.0", 1032 | "p-is-promise": "^2.0.0" 1033 | }, 1034 | "dependencies": { 1035 | "mimic-fn": { 1036 | "version": "2.1.0", 1037 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1038 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1039 | "dev": true 1040 | } 1041 | } 1042 | }, 1043 | "meow": { 1044 | "version": "3.7.0", 1045 | "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", 1046 | "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", 1047 | "dev": true, 1048 | "requires": { 1049 | "camelcase-keys": "^2.0.0", 1050 | "decamelize": "^1.1.2", 1051 | "loud-rejection": "^1.0.0", 1052 | "map-obj": "^1.0.1", 1053 | "minimist": "^1.1.3", 1054 | "normalize-package-data": "^2.3.4", 1055 | "object-assign": "^4.0.1", 1056 | "read-pkg-up": "^1.0.1", 1057 | "redent": "^1.0.0", 1058 | "trim-newlines": "^1.0.0" 1059 | } 1060 | }, 1061 | "mime-db": { 1062 | "version": "1.38.0", 1063 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", 1064 | "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", 1065 | "dev": true 1066 | }, 1067 | "mime-types": { 1068 | "version": "2.1.22", 1069 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", 1070 | "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", 1071 | "dev": true, 1072 | "requires": { 1073 | "mime-db": "~1.38.0" 1074 | } 1075 | }, 1076 | "mimic-fn": { 1077 | "version": "1.2.0", 1078 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 1079 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 1080 | "dev": true 1081 | }, 1082 | "minimatch": { 1083 | "version": "3.0.4", 1084 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1085 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1086 | "dev": true, 1087 | "requires": { 1088 | "brace-expansion": "^1.1.7" 1089 | } 1090 | }, 1091 | "minimist": { 1092 | "version": "1.2.0", 1093 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1094 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 1095 | "dev": true 1096 | }, 1097 | "mkdirp": { 1098 | "version": "0.5.1", 1099 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1100 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1101 | "dev": true, 1102 | "requires": { 1103 | "minimist": "0.0.8" 1104 | }, 1105 | "dependencies": { 1106 | "minimist": { 1107 | "version": "0.0.8", 1108 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1109 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1110 | "dev": true 1111 | } 1112 | } 1113 | }, 1114 | "ms": { 1115 | "version": "2.1.1", 1116 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1117 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", 1118 | "dev": true 1119 | }, 1120 | "nice-try": { 1121 | "version": "1.0.5", 1122 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1123 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1124 | "dev": true 1125 | }, 1126 | "node-abi": { 1127 | "version": "2.7.1", 1128 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.7.1.tgz", 1129 | "integrity": "sha512-OV8Bq1OrPh6z+Y4dqwo05HqrRL9YNF7QVMRfq1/pguwKLG+q9UB/Lk0x5qXjO23JjJg+/jqCHSTaG1P3tfKfuw==", 1130 | "dev": true, 1131 | "requires": { 1132 | "semver": "^5.4.1" 1133 | } 1134 | }, 1135 | "node-addon-api": { 1136 | "version": "1.6.3", 1137 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.6.3.tgz", 1138 | "integrity": "sha512-FXWH6mqjWgU8ewuahp4spec8LkroFZK2NicOv6bNwZC3kcwZUI8LeZdG80UzTSLLhK4T7MsgNwlYDVRlDdfTDg==" 1139 | }, 1140 | "node-gyp": { 1141 | "version": "3.8.0", 1142 | "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", 1143 | "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", 1144 | "dev": true, 1145 | "requires": { 1146 | "fstream": "^1.0.0", 1147 | "glob": "^7.0.3", 1148 | "graceful-fs": "^4.1.2", 1149 | "mkdirp": "^0.5.0", 1150 | "nopt": "2 || 3", 1151 | "npmlog": "0 || 1 || 2 || 3 || 4", 1152 | "osenv": "0", 1153 | "request": "^2.87.0", 1154 | "rimraf": "2", 1155 | "semver": "~5.3.0", 1156 | "tar": "^2.0.0", 1157 | "which": "1" 1158 | }, 1159 | "dependencies": { 1160 | "semver": { 1161 | "version": "5.3.0", 1162 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", 1163 | "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", 1164 | "dev": true 1165 | } 1166 | } 1167 | }, 1168 | "nopt": { 1169 | "version": "3.0.6", 1170 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", 1171 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", 1172 | "dev": true, 1173 | "requires": { 1174 | "abbrev": "1" 1175 | } 1176 | }, 1177 | "normalize-package-data": { 1178 | "version": "2.5.0", 1179 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 1180 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 1181 | "dev": true, 1182 | "requires": { 1183 | "hosted-git-info": "^2.1.4", 1184 | "resolve": "^1.10.0", 1185 | "semver": "2 || 3 || 4 || 5", 1186 | "validate-npm-package-license": "^3.0.1" 1187 | } 1188 | }, 1189 | "npm-run-path": { 1190 | "version": "2.0.2", 1191 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 1192 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 1193 | "dev": true, 1194 | "requires": { 1195 | "path-key": "^2.0.0" 1196 | } 1197 | }, 1198 | "npmlog": { 1199 | "version": "4.1.2", 1200 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 1201 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 1202 | "dev": true, 1203 | "requires": { 1204 | "are-we-there-yet": "~1.1.2", 1205 | "console-control-strings": "~1.1.0", 1206 | "gauge": "~2.7.3", 1207 | "set-blocking": "~2.0.0" 1208 | } 1209 | }, 1210 | "nugget": { 1211 | "version": "2.0.1", 1212 | "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz", 1213 | "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", 1214 | "dev": true, 1215 | "requires": { 1216 | "debug": "^2.1.3", 1217 | "minimist": "^1.1.0", 1218 | "pretty-bytes": "^1.0.2", 1219 | "progress-stream": "^1.1.0", 1220 | "request": "^2.45.0", 1221 | "single-line-log": "^1.1.2", 1222 | "throttleit": "0.0.2" 1223 | }, 1224 | "dependencies": { 1225 | "debug": { 1226 | "version": "2.6.9", 1227 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1228 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1229 | "dev": true, 1230 | "requires": { 1231 | "ms": "2.0.0" 1232 | } 1233 | }, 1234 | "ms": { 1235 | "version": "2.0.0", 1236 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1237 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1238 | "dev": true 1239 | } 1240 | } 1241 | }, 1242 | "number-is-nan": { 1243 | "version": "1.0.1", 1244 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1245 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 1246 | "dev": true 1247 | }, 1248 | "oauth-sign": { 1249 | "version": "0.9.0", 1250 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1251 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 1252 | "dev": true 1253 | }, 1254 | "object-assign": { 1255 | "version": "4.1.1", 1256 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1257 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1258 | "dev": true 1259 | }, 1260 | "object-keys": { 1261 | "version": "0.4.0", 1262 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", 1263 | "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", 1264 | "dev": true 1265 | }, 1266 | "once": { 1267 | "version": "1.4.0", 1268 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1269 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1270 | "dev": true, 1271 | "requires": { 1272 | "wrappy": "1" 1273 | } 1274 | }, 1275 | "onetime": { 1276 | "version": "2.0.1", 1277 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 1278 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 1279 | "dev": true, 1280 | "requires": { 1281 | "mimic-fn": "^1.0.0" 1282 | } 1283 | }, 1284 | "ora": { 1285 | "version": "3.4.0", 1286 | "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", 1287 | "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", 1288 | "dev": true, 1289 | "requires": { 1290 | "chalk": "^2.4.2", 1291 | "cli-cursor": "^2.1.0", 1292 | "cli-spinners": "^2.0.0", 1293 | "log-symbols": "^2.2.0", 1294 | "strip-ansi": "^5.2.0", 1295 | "wcwidth": "^1.0.1" 1296 | }, 1297 | "dependencies": { 1298 | "ansi-regex": { 1299 | "version": "4.1.0", 1300 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1301 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1302 | "dev": true 1303 | }, 1304 | "strip-ansi": { 1305 | "version": "5.2.0", 1306 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1307 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1308 | "dev": true, 1309 | "requires": { 1310 | "ansi-regex": "^4.1.0" 1311 | } 1312 | } 1313 | } 1314 | }, 1315 | "os-homedir": { 1316 | "version": "1.0.2", 1317 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1318 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 1319 | "dev": true 1320 | }, 1321 | "os-locale": { 1322 | "version": "3.1.0", 1323 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", 1324 | "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", 1325 | "dev": true, 1326 | "requires": { 1327 | "execa": "^1.0.0", 1328 | "lcid": "^2.0.0", 1329 | "mem": "^4.0.0" 1330 | } 1331 | }, 1332 | "os-tmpdir": { 1333 | "version": "1.0.2", 1334 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1335 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1336 | "dev": true 1337 | }, 1338 | "osenv": { 1339 | "version": "0.1.5", 1340 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", 1341 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", 1342 | "dev": true, 1343 | "requires": { 1344 | "os-homedir": "^1.0.0", 1345 | "os-tmpdir": "^1.0.0" 1346 | } 1347 | }, 1348 | "p-defer": { 1349 | "version": "1.0.0", 1350 | "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", 1351 | "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", 1352 | "dev": true 1353 | }, 1354 | "p-finally": { 1355 | "version": "1.0.0", 1356 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1357 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", 1358 | "dev": true 1359 | }, 1360 | "p-is-promise": { 1361 | "version": "2.1.0", 1362 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", 1363 | "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", 1364 | "dev": true 1365 | }, 1366 | "p-limit": { 1367 | "version": "2.2.0", 1368 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", 1369 | "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", 1370 | "dev": true, 1371 | "requires": { 1372 | "p-try": "^2.0.0" 1373 | } 1374 | }, 1375 | "p-locate": { 1376 | "version": "3.0.0", 1377 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 1378 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 1379 | "dev": true, 1380 | "requires": { 1381 | "p-limit": "^2.0.0" 1382 | } 1383 | }, 1384 | "p-try": { 1385 | "version": "2.2.0", 1386 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1387 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 1388 | "dev": true 1389 | }, 1390 | "parse-json": { 1391 | "version": "2.2.0", 1392 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1393 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1394 | "dev": true, 1395 | "requires": { 1396 | "error-ex": "^1.2.0" 1397 | } 1398 | }, 1399 | "path-exists": { 1400 | "version": "3.0.0", 1401 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1402 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1403 | "dev": true 1404 | }, 1405 | "path-is-absolute": { 1406 | "version": "1.0.1", 1407 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1408 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1409 | "dev": true 1410 | }, 1411 | "path-key": { 1412 | "version": "2.0.1", 1413 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1414 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1415 | "dev": true 1416 | }, 1417 | "path-parse": { 1418 | "version": "1.0.6", 1419 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1420 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 1421 | "dev": true 1422 | }, 1423 | "path-type": { 1424 | "version": "1.1.0", 1425 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", 1426 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", 1427 | "dev": true, 1428 | "requires": { 1429 | "graceful-fs": "^4.1.2", 1430 | "pify": "^2.0.0", 1431 | "pinkie-promise": "^2.0.0" 1432 | } 1433 | }, 1434 | "pend": { 1435 | "version": "1.2.0", 1436 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1437 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", 1438 | "dev": true 1439 | }, 1440 | "performance-now": { 1441 | "version": "2.1.0", 1442 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1443 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 1444 | "dev": true 1445 | }, 1446 | "pify": { 1447 | "version": "2.3.0", 1448 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1449 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1450 | "dev": true 1451 | }, 1452 | "pinkie": { 1453 | "version": "2.0.4", 1454 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1455 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 1456 | "dev": true 1457 | }, 1458 | "pinkie-promise": { 1459 | "version": "2.0.1", 1460 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1461 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1462 | "dev": true, 1463 | "requires": { 1464 | "pinkie": "^2.0.0" 1465 | } 1466 | }, 1467 | "pretty-bytes": { 1468 | "version": "1.0.4", 1469 | "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", 1470 | "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", 1471 | "dev": true, 1472 | "requires": { 1473 | "get-stdin": "^4.0.1", 1474 | "meow": "^3.1.0" 1475 | } 1476 | }, 1477 | "process-nextick-args": { 1478 | "version": "2.0.0", 1479 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 1480 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", 1481 | "dev": true 1482 | }, 1483 | "progress-stream": { 1484 | "version": "1.2.0", 1485 | "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz", 1486 | "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", 1487 | "dev": true, 1488 | "requires": { 1489 | "speedometer": "~0.1.2", 1490 | "through2": "~0.2.3" 1491 | } 1492 | }, 1493 | "psl": { 1494 | "version": "1.1.31", 1495 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", 1496 | "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", 1497 | "dev": true 1498 | }, 1499 | "pump": { 1500 | "version": "3.0.0", 1501 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1502 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1503 | "dev": true, 1504 | "requires": { 1505 | "end-of-stream": "^1.1.0", 1506 | "once": "^1.3.1" 1507 | } 1508 | }, 1509 | "punycode": { 1510 | "version": "2.1.1", 1511 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1512 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1513 | "dev": true 1514 | }, 1515 | "qs": { 1516 | "version": "6.5.2", 1517 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1518 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 1519 | "dev": true 1520 | }, 1521 | "rc": { 1522 | "version": "1.2.8", 1523 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 1524 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 1525 | "dev": true, 1526 | "requires": { 1527 | "deep-extend": "^0.6.0", 1528 | "ini": "~1.3.0", 1529 | "minimist": "^1.2.0", 1530 | "strip-json-comments": "~2.0.1" 1531 | } 1532 | }, 1533 | "read-pkg": { 1534 | "version": "1.1.0", 1535 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", 1536 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", 1537 | "dev": true, 1538 | "requires": { 1539 | "load-json-file": "^1.0.0", 1540 | "normalize-package-data": "^2.3.2", 1541 | "path-type": "^1.0.0" 1542 | } 1543 | }, 1544 | "read-pkg-up": { 1545 | "version": "1.0.1", 1546 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", 1547 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", 1548 | "dev": true, 1549 | "requires": { 1550 | "find-up": "^1.0.0", 1551 | "read-pkg": "^1.0.0" 1552 | } 1553 | }, 1554 | "readable-stream": { 1555 | "version": "1.1.14", 1556 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 1557 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 1558 | "dev": true, 1559 | "requires": { 1560 | "core-util-is": "~1.0.0", 1561 | "inherits": "~2.0.1", 1562 | "isarray": "0.0.1", 1563 | "string_decoder": "~0.10.x" 1564 | } 1565 | }, 1566 | "redent": { 1567 | "version": "1.0.0", 1568 | "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", 1569 | "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", 1570 | "dev": true, 1571 | "requires": { 1572 | "indent-string": "^2.1.0", 1573 | "strip-indent": "^1.0.1" 1574 | } 1575 | }, 1576 | "repeating": { 1577 | "version": "2.0.1", 1578 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", 1579 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", 1580 | "dev": true, 1581 | "requires": { 1582 | "is-finite": "^1.0.0" 1583 | } 1584 | }, 1585 | "request": { 1586 | "version": "2.88.0", 1587 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 1588 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 1589 | "dev": true, 1590 | "requires": { 1591 | "aws-sign2": "~0.7.0", 1592 | "aws4": "^1.8.0", 1593 | "caseless": "~0.12.0", 1594 | "combined-stream": "~1.0.6", 1595 | "extend": "~3.0.2", 1596 | "forever-agent": "~0.6.1", 1597 | "form-data": "~2.3.2", 1598 | "har-validator": "~5.1.0", 1599 | "http-signature": "~1.2.0", 1600 | "is-typedarray": "~1.0.0", 1601 | "isstream": "~0.1.2", 1602 | "json-stringify-safe": "~5.0.1", 1603 | "mime-types": "~2.1.19", 1604 | "oauth-sign": "~0.9.0", 1605 | "performance-now": "^2.1.0", 1606 | "qs": "~6.5.2", 1607 | "safe-buffer": "^5.1.2", 1608 | "tough-cookie": "~2.4.3", 1609 | "tunnel-agent": "^0.6.0", 1610 | "uuid": "^3.3.2" 1611 | } 1612 | }, 1613 | "require-directory": { 1614 | "version": "2.1.1", 1615 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1616 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 1617 | "dev": true 1618 | }, 1619 | "require-main-filename": { 1620 | "version": "1.0.1", 1621 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", 1622 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", 1623 | "dev": true 1624 | }, 1625 | "resolve": { 1626 | "version": "1.10.0", 1627 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", 1628 | "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", 1629 | "dev": true, 1630 | "requires": { 1631 | "path-parse": "^1.0.6" 1632 | } 1633 | }, 1634 | "restore-cursor": { 1635 | "version": "2.0.0", 1636 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 1637 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 1638 | "dev": true, 1639 | "requires": { 1640 | "onetime": "^2.0.0", 1641 | "signal-exit": "^3.0.2" 1642 | } 1643 | }, 1644 | "rimraf": { 1645 | "version": "2.6.3", 1646 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 1647 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 1648 | "dev": true, 1649 | "requires": { 1650 | "glob": "^7.1.3" 1651 | } 1652 | }, 1653 | "rxjs": { 1654 | "version": "6.4.0", 1655 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", 1656 | "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", 1657 | "dev": true, 1658 | "requires": { 1659 | "tslib": "^1.9.0" 1660 | } 1661 | }, 1662 | "safe-buffer": { 1663 | "version": "5.1.2", 1664 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1665 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1666 | "dev": true 1667 | }, 1668 | "safer-buffer": { 1669 | "version": "2.1.2", 1670 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1671 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1672 | "dev": true 1673 | }, 1674 | "semver": { 1675 | "version": "5.7.0", 1676 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", 1677 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", 1678 | "dev": true 1679 | }, 1680 | "set-blocking": { 1681 | "version": "2.0.0", 1682 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1683 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 1684 | "dev": true 1685 | }, 1686 | "shebang-command": { 1687 | "version": "1.2.0", 1688 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1689 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1690 | "dev": true, 1691 | "requires": { 1692 | "shebang-regex": "^1.0.0" 1693 | } 1694 | }, 1695 | "shebang-regex": { 1696 | "version": "1.0.0", 1697 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1698 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 1699 | "dev": true 1700 | }, 1701 | "signal-exit": { 1702 | "version": "3.0.2", 1703 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1704 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 1705 | "dev": true 1706 | }, 1707 | "single-line-log": { 1708 | "version": "1.1.2", 1709 | "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", 1710 | "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=", 1711 | "dev": true, 1712 | "requires": { 1713 | "string-width": "^1.0.1" 1714 | } 1715 | }, 1716 | "spawn-rx": { 1717 | "version": "3.0.0", 1718 | "resolved": "https://registry.npmjs.org/spawn-rx/-/spawn-rx-3.0.0.tgz", 1719 | "integrity": "sha512-dw4Ryg/KMNfkKa5ezAR5aZe9wNwPdKlnHEXtHOjVnyEDSPQyOpIPPRtcIiu7127SmtHhaCjw21yC43HliW0iIg==", 1720 | "dev": true, 1721 | "requires": { 1722 | "debug": "^2.5.1", 1723 | "lodash.assign": "^4.2.0", 1724 | "rxjs": "^6.3.1" 1725 | }, 1726 | "dependencies": { 1727 | "debug": { 1728 | "version": "2.6.9", 1729 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1730 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1731 | "dev": true, 1732 | "requires": { 1733 | "ms": "2.0.0" 1734 | } 1735 | }, 1736 | "ms": { 1737 | "version": "2.0.0", 1738 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1739 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1740 | "dev": true 1741 | } 1742 | } 1743 | }, 1744 | "spdx-correct": { 1745 | "version": "3.1.0", 1746 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", 1747 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", 1748 | "dev": true, 1749 | "requires": { 1750 | "spdx-expression-parse": "^3.0.0", 1751 | "spdx-license-ids": "^3.0.0" 1752 | } 1753 | }, 1754 | "spdx-exceptions": { 1755 | "version": "2.2.0", 1756 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", 1757 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", 1758 | "dev": true 1759 | }, 1760 | "spdx-expression-parse": { 1761 | "version": "3.0.0", 1762 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 1763 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 1764 | "dev": true, 1765 | "requires": { 1766 | "spdx-exceptions": "^2.1.0", 1767 | "spdx-license-ids": "^3.0.0" 1768 | } 1769 | }, 1770 | "spdx-license-ids": { 1771 | "version": "3.0.4", 1772 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", 1773 | "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", 1774 | "dev": true 1775 | }, 1776 | "speedometer": { 1777 | "version": "0.1.4", 1778 | "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", 1779 | "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=", 1780 | "dev": true 1781 | }, 1782 | "sshpk": { 1783 | "version": "1.16.1", 1784 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 1785 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 1786 | "dev": true, 1787 | "requires": { 1788 | "asn1": "~0.2.3", 1789 | "assert-plus": "^1.0.0", 1790 | "bcrypt-pbkdf": "^1.0.0", 1791 | "dashdash": "^1.12.0", 1792 | "ecc-jsbn": "~0.1.1", 1793 | "getpass": "^0.1.1", 1794 | "jsbn": "~0.1.0", 1795 | "safer-buffer": "^2.0.2", 1796 | "tweetnacl": "~0.14.0" 1797 | } 1798 | }, 1799 | "string-width": { 1800 | "version": "1.0.2", 1801 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1802 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 1803 | "dev": true, 1804 | "requires": { 1805 | "code-point-at": "^1.0.0", 1806 | "is-fullwidth-code-point": "^1.0.0", 1807 | "strip-ansi": "^3.0.0" 1808 | } 1809 | }, 1810 | "string_decoder": { 1811 | "version": "0.10.31", 1812 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1813 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 1814 | "dev": true 1815 | }, 1816 | "strip-ansi": { 1817 | "version": "3.0.1", 1818 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1819 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1820 | "dev": true, 1821 | "requires": { 1822 | "ansi-regex": "^2.0.0" 1823 | } 1824 | }, 1825 | "strip-bom": { 1826 | "version": "2.0.0", 1827 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 1828 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", 1829 | "dev": true, 1830 | "requires": { 1831 | "is-utf8": "^0.2.0" 1832 | } 1833 | }, 1834 | "strip-eof": { 1835 | "version": "1.0.0", 1836 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 1837 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", 1838 | "dev": true 1839 | }, 1840 | "strip-indent": { 1841 | "version": "1.0.1", 1842 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", 1843 | "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", 1844 | "dev": true, 1845 | "requires": { 1846 | "get-stdin": "^4.0.1" 1847 | } 1848 | }, 1849 | "strip-json-comments": { 1850 | "version": "2.0.1", 1851 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1852 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1853 | "dev": true 1854 | }, 1855 | "sumchecker": { 1856 | "version": "2.0.2", 1857 | "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", 1858 | "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", 1859 | "dev": true, 1860 | "requires": { 1861 | "debug": "^2.2.0" 1862 | }, 1863 | "dependencies": { 1864 | "debug": { 1865 | "version": "2.6.9", 1866 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1867 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1868 | "dev": true, 1869 | "requires": { 1870 | "ms": "2.0.0" 1871 | } 1872 | }, 1873 | "ms": { 1874 | "version": "2.0.0", 1875 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1876 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1877 | "dev": true 1878 | } 1879 | } 1880 | }, 1881 | "supports-color": { 1882 | "version": "5.5.0", 1883 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1884 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1885 | "dev": true, 1886 | "requires": { 1887 | "has-flag": "^3.0.0" 1888 | } 1889 | }, 1890 | "tar": { 1891 | "version": "2.2.1", 1892 | "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", 1893 | "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", 1894 | "dev": true, 1895 | "requires": { 1896 | "block-stream": "*", 1897 | "fstream": "^1.0.2", 1898 | "inherits": "2" 1899 | } 1900 | }, 1901 | "throttleit": { 1902 | "version": "0.0.2", 1903 | "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", 1904 | "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", 1905 | "dev": true 1906 | }, 1907 | "through2": { 1908 | "version": "0.2.3", 1909 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", 1910 | "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", 1911 | "dev": true, 1912 | "requires": { 1913 | "readable-stream": "~1.1.9", 1914 | "xtend": "~2.1.1" 1915 | } 1916 | }, 1917 | "tough-cookie": { 1918 | "version": "2.4.3", 1919 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 1920 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 1921 | "dev": true, 1922 | "requires": { 1923 | "psl": "^1.1.24", 1924 | "punycode": "^1.4.1" 1925 | }, 1926 | "dependencies": { 1927 | "punycode": { 1928 | "version": "1.4.1", 1929 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1930 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 1931 | "dev": true 1932 | } 1933 | } 1934 | }, 1935 | "trim-newlines": { 1936 | "version": "1.0.0", 1937 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", 1938 | "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", 1939 | "dev": true 1940 | }, 1941 | "tslib": { 1942 | "version": "1.9.3", 1943 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", 1944 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", 1945 | "dev": true 1946 | }, 1947 | "tunnel-agent": { 1948 | "version": "0.6.0", 1949 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1950 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1951 | "dev": true, 1952 | "requires": { 1953 | "safe-buffer": "^5.0.1" 1954 | } 1955 | }, 1956 | "tweetnacl": { 1957 | "version": "0.14.5", 1958 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1959 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 1960 | "dev": true 1961 | }, 1962 | "typedarray": { 1963 | "version": "0.0.6", 1964 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1965 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 1966 | "dev": true 1967 | }, 1968 | "universalify": { 1969 | "version": "0.1.2", 1970 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1971 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 1972 | "dev": true 1973 | }, 1974 | "uri-js": { 1975 | "version": "4.2.2", 1976 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1977 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1978 | "dev": true, 1979 | "requires": { 1980 | "punycode": "^2.1.0" 1981 | } 1982 | }, 1983 | "util-deprecate": { 1984 | "version": "1.0.2", 1985 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1986 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 1987 | "dev": true 1988 | }, 1989 | "uuid": { 1990 | "version": "3.3.2", 1991 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 1992 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 1993 | "dev": true 1994 | }, 1995 | "validate-npm-package-license": { 1996 | "version": "3.0.4", 1997 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 1998 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 1999 | "dev": true, 2000 | "requires": { 2001 | "spdx-correct": "^3.0.0", 2002 | "spdx-expression-parse": "^3.0.0" 2003 | } 2004 | }, 2005 | "verror": { 2006 | "version": "1.10.0", 2007 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 2008 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 2009 | "dev": true, 2010 | "requires": { 2011 | "assert-plus": "^1.0.0", 2012 | "core-util-is": "1.0.2", 2013 | "extsprintf": "^1.2.0" 2014 | } 2015 | }, 2016 | "wcwidth": { 2017 | "version": "1.0.1", 2018 | "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", 2019 | "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", 2020 | "dev": true, 2021 | "requires": { 2022 | "defaults": "^1.0.3" 2023 | } 2024 | }, 2025 | "which": { 2026 | "version": "1.3.1", 2027 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2028 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2029 | "dev": true, 2030 | "requires": { 2031 | "isexe": "^2.0.0" 2032 | } 2033 | }, 2034 | "which-module": { 2035 | "version": "2.0.0", 2036 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 2037 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 2038 | "dev": true 2039 | }, 2040 | "wide-align": { 2041 | "version": "1.1.3", 2042 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 2043 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 2044 | "dev": true, 2045 | "requires": { 2046 | "string-width": "^1.0.2 || 2" 2047 | } 2048 | }, 2049 | "wrap-ansi": { 2050 | "version": "2.1.0", 2051 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 2052 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 2053 | "dev": true, 2054 | "requires": { 2055 | "string-width": "^1.0.1", 2056 | "strip-ansi": "^3.0.1" 2057 | } 2058 | }, 2059 | "wrappy": { 2060 | "version": "1.0.2", 2061 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2062 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2063 | "dev": true 2064 | }, 2065 | "xtend": { 2066 | "version": "2.1.2", 2067 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", 2068 | "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", 2069 | "dev": true, 2070 | "requires": { 2071 | "object-keys": "~0.4.0" 2072 | } 2073 | }, 2074 | "y18n": { 2075 | "version": "4.0.0", 2076 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 2077 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", 2078 | "dev": true 2079 | }, 2080 | "yargs": { 2081 | "version": "12.0.5", 2082 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", 2083 | "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", 2084 | "dev": true, 2085 | "requires": { 2086 | "cliui": "^4.0.0", 2087 | "decamelize": "^1.2.0", 2088 | "find-up": "^3.0.0", 2089 | "get-caller-file": "^1.0.1", 2090 | "os-locale": "^3.0.0", 2091 | "require-directory": "^2.1.1", 2092 | "require-main-filename": "^1.0.1", 2093 | "set-blocking": "^2.0.0", 2094 | "string-width": "^2.0.0", 2095 | "which-module": "^2.0.0", 2096 | "y18n": "^3.2.1 || ^4.0.0", 2097 | "yargs-parser": "^11.1.1" 2098 | }, 2099 | "dependencies": { 2100 | "ansi-regex": { 2101 | "version": "3.0.0", 2102 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 2103 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 2104 | "dev": true 2105 | }, 2106 | "find-up": { 2107 | "version": "3.0.0", 2108 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 2109 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 2110 | "dev": true, 2111 | "requires": { 2112 | "locate-path": "^3.0.0" 2113 | } 2114 | }, 2115 | "is-fullwidth-code-point": { 2116 | "version": "2.0.0", 2117 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 2118 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 2119 | "dev": true 2120 | }, 2121 | "string-width": { 2122 | "version": "2.1.1", 2123 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 2124 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 2125 | "dev": true, 2126 | "requires": { 2127 | "is-fullwidth-code-point": "^2.0.0", 2128 | "strip-ansi": "^4.0.0" 2129 | } 2130 | }, 2131 | "strip-ansi": { 2132 | "version": "4.0.0", 2133 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 2134 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 2135 | "dev": true, 2136 | "requires": { 2137 | "ansi-regex": "^3.0.0" 2138 | } 2139 | } 2140 | } 2141 | }, 2142 | "yargs-parser": { 2143 | "version": "11.1.1", 2144 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", 2145 | "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", 2146 | "dev": true, 2147 | "requires": { 2148 | "camelcase": "^5.0.0", 2149 | "decamelize": "^1.2.0" 2150 | }, 2151 | "dependencies": { 2152 | "camelcase": { 2153 | "version": "5.3.1", 2154 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 2155 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 2156 | "dev": true 2157 | } 2158 | } 2159 | }, 2160 | "yauzl": { 2161 | "version": "2.4.1", 2162 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", 2163 | "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", 2164 | "dev": true, 2165 | "requires": { 2166 | "fd-slicer": "~1.0.1" 2167 | } 2168 | } 2169 | } 2170 | } 2171 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "windows-iap-bridge", 3 | "main": "lib/main.js", 4 | "version": "0.0.1", 5 | "gypfile": true, 6 | "description": "N-API wrapper around some APIs on winrt::Windows::Services::Store namespace", 7 | "scripts": { 8 | "build": "node-gyp build", 9 | "build:dev": "node-gyp build --debug", 10 | "build:electron": "node-gyp build --target=3.0.7 --runtime=electron --arch=x64 --release --dist-url=https://atom.io/download/atom-shell --abi=64", 11 | "rebuild": "node-gyp rebuild", 12 | "clean": "node-gyp clean" 13 | }, 14 | "author": "tauseefk", 15 | "license": "ISC", 16 | "devDependencies": { 17 | "electron": "^3.0.7", 18 | "electron-rebuild": "^1.8.2" 19 | }, 20 | "dependencies": { 21 | "node-addon-api": "^1.5.0" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /rebuild.sh: -------------------------------------------------------------------------------- 1 | node-gyp rebuild 2 | .\\node_modules\\.bin\\electron-rebuild -------------------------------------------------------------------------------- /src/Applications.cpp: -------------------------------------------------------------------------------- 1 | #include "Applications.h" 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include "winrt/Windows.Storage.h" 10 | #include "winrt/Windows.Data.Json.h" 11 | 12 | using namespace winrt; 13 | using namespace Windows::Storage; 14 | using namespace Windows::Data::Json; 15 | 16 | std::mutex Applications::s_mutex; 17 | std::vector Applications::s_applications; 18 | 19 | Applications::Applications() {} 20 | 21 | Applications::~Applications() {} 22 | 23 | HRESULT Applications::GetApplications(std::string &result) { 24 | HRESULT hr = UpdateApplications(); 25 | JsonObject root; 26 | JsonArray apps; 27 | 28 | if (SUCCEEDED(hr)) { 29 | DWORD count = Applications::GetNumApplications(); 30 | for (DWORD i = 0; i < count; i++) { 31 | JsonValue value = JsonValue::CreateStringValue(Applications::GetApplication(i)); 32 | apps.Append(value); 33 | } 34 | } 35 | 36 | root.Insert(L"applications", apps); 37 | result = winrt::to_string(root.Stringify()); 38 | 39 | return hr; 40 | } 41 | 42 | DWORD Applications::GetNumApplications() { 43 | std::lock_guard lock(s_mutex); 44 | return static_cast(s_applications.size()); 45 | } 46 | 47 | const LPWSTR Applications::GetApplication(DWORD index) { 48 | std::lock_guard lock(s_mutex); 49 | if (index < s_applications.size()) { 50 | return (const LPWSTR)s_applications[index].c_str(); 51 | } 52 | 53 | return nullptr; 54 | } 55 | 56 | std::wstring GetDisplayName(IShellItem *psi, SIGDN sigdn) { 57 | LPWSTR pszName = nullptr; 58 | std::wstring result; 59 | HRESULT hr = psi->GetDisplayName(sigdn, &pszName); 60 | if (SUCCEEDED(hr)) { 61 | result = pszName; 62 | CoTaskMemFree(pszName); 63 | } 64 | 65 | return result; 66 | } 67 | 68 | std::wstring GetParsingPath(IShellItem2 *psi2) { 69 | LPWSTR pszValue; 70 | std::wstring result; 71 | HRESULT hr = psi2->GetString(PKEY_ParsingPath, &pszValue); 72 | if (SUCCEEDED(hr)) { 73 | result = pszValue; 74 | CoTaskMemFree(pszValue); 75 | } 76 | return result; 77 | } 78 | 79 | HRESULT LaunchUWPApp(LPCWSTR aumid) { 80 | CComPtr AppActivationMgr = nullptr; 81 | HRESULT hr = CoCreateInstance(CLSID_ApplicationActivationManager, nullptr, CLSCTX_LOCAL_SERVER, 82 | IID_PPV_ARGS(&AppActivationMgr)); 83 | if (SUCCEEDED(hr)) { 84 | DWORD pid = 0; 85 | hr = AppActivationMgr->ActivateApplication(aumid, nullptr, AO_NONE, &pid); 86 | } 87 | return hr; 88 | } 89 | 90 | HRESULT LaunchAppFromShortCut(IShellItem *psi) { 91 | HRESULT hr; 92 | IShellLink *psl; 93 | 94 | // save the shortcut file to the app's temporary folder as we are only going to use it once 95 | auto localFolder = ApplicationData::Current().TemporaryFolder(); 96 | auto path = localFolder.Path() + L"\\shortcut.lnk"; 97 | 98 | // Get a pointer to the IShellLink interface. 99 | hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID *)&psl); 100 | if (SUCCEEDED(hr)) { 101 | IPersistFile *ppf = nullptr; 102 | 103 | PIDLIST_ABSOLUTE pidl; 104 | 105 | hr = SHGetIDListFromObject(psi, &pidl); 106 | if (SUCCEEDED(hr)) { 107 | // set the shortcut info for this app 108 | hr = psl->SetIDList(pidl); 109 | CoTaskMemFree(pidl); 110 | } 111 | 112 | // Query IShellLink for the IPersistFile interface, used for saving the 113 | // shortcut in persistent storage. 114 | if (SUCCEEDED(hr)) { 115 | hr = psl->QueryInterface(IID_IPersistFile, (LPVOID *)&ppf); 116 | if (SUCCEEDED(hr)) { 117 | // Save the link by calling IPersistFile::Save. 118 | hr = ppf->Save(path.c_str(), TRUE); 119 | ppf->Release(); 120 | if (SUCCEEDED(hr)) { 121 | // launch the app using its newly created shortcut 122 | HINSTANCE hInstance = ShellExecuteW(NULL, NULL, path.c_str(), L"", NULL, SW_SHOWNORMAL); 123 | #pragma warning(disable : 4302 4311) 124 | int result = (int)hInstance; 125 | #pragma warning(default : 4302 4311) 126 | 127 | if (result >= 32) { 128 | hr = S_OK; 129 | } else { 130 | hr = result; 131 | } 132 | } 133 | } 134 | } 135 | psl->Release(); 136 | } 137 | return hr; 138 | } 139 | 140 | BOOL Applications::LaunchApplication(const std::wstring &name) { 141 | IShellItem *psiFolder; 142 | bool found = false; 143 | 144 | HRESULT hr = SHGetKnownFolderItem(FOLDERID_AppsFolder, KF_FLAG_DEFAULT, NULL, IID_PPV_ARGS(&psiFolder)); 145 | if (SUCCEEDED(hr)) { 146 | IEnumShellItems *pesi; 147 | hr = psiFolder->BindToHandler(NULL, BHID_EnumItems, IID_PPV_ARGS(&pesi)); 148 | if (hr == S_OK) { 149 | IShellItem *psi; 150 | while (pesi->Next(1, &psi, NULL) == S_OK && !found) { 151 | IShellItem2 *psi2; 152 | if (SUCCEEDED(psi->QueryInterface(IID_PPV_ARGS(&psi2)))) { 153 | auto appName = GetDisplayName(psi2, SIGDN_NORMALDISPLAY); 154 | if (!appName.empty()) { 155 | if (appName == name) { 156 | found = true; 157 | hr = LaunchAppFromShortCut(psi); 158 | if (hr != S_OK) // We may be on Windows 10S. We can only launch UWP apps 159 | { 160 | auto aumid = GetParsingPath(psi2); 161 | hr = LaunchUWPApp(aumid.c_str()); 162 | } 163 | } 164 | } 165 | psi2->Release(); 166 | } 167 | psi->Release(); 168 | } 169 | psiFolder->Release(); 170 | } 171 | } 172 | 173 | return SUCCEEDED(hr); 174 | } 175 | 176 | HRESULT Applications::UpdateApplications() { 177 | std::lock_guard lock(s_mutex); 178 | s_applications.clear(); 179 | 180 | IShellItem *psiFolder; 181 | HRESULT hr = SHGetKnownFolderItem(FOLDERID_AppsFolder, KF_FLAG_DEFAULT, NULL, IID_PPV_ARGS(&psiFolder)); 182 | if (SUCCEEDED(hr)) { 183 | IEnumShellItems *pesi; 184 | hr = psiFolder->BindToHandler(NULL, BHID_EnumItems, IID_PPV_ARGS(&pesi)); 185 | if (SUCCEEDED(hr)) { 186 | IShellItem *psi; 187 | while (pesi->Next(1, &psi, NULL) == S_OK) { 188 | IShellItem2 *psi2; 189 | if (SUCCEEDED(psi->QueryInterface(IID_PPV_ARGS(&psi2)))) { 190 | auto name = GetDisplayName(psi2, SIGDN_NORMALDISPLAY); 191 | if (!name.empty()) { 192 | s_applications.push_back(name); 193 | } 194 | psi2->Release(); 195 | } 196 | psi->Release(); 197 | } 198 | psiFolder->Release(); 199 | } 200 | } 201 | 202 | return hr; 203 | } 204 | -------------------------------------------------------------------------------- /src/Applications.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #define WIN32_LEAN_AND_MEAN 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | class Applications { 10 | public: 11 | Applications(); 12 | ~Applications(); 13 | 14 | static HRESULT GetApplications(std::string &result); 15 | 16 | private: 17 | static HRESULT UpdateApplications(); 18 | static DWORD GetNumApplications(); 19 | static const LPWSTR GetApplication(DWORD index); 20 | static BOOL LaunchApplication(const std::wstring &name); 21 | 22 | static std::mutex s_mutex; 23 | static std::vector s_applications; 24 | }; 25 | -------------------------------------------------------------------------------- /src/GetAppLicenseAsyncWorker.cpp: -------------------------------------------------------------------------------- 1 | #include "GetAppLicenseAsyncWorker.h" 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | GetAppLicenseAsyncWorker::GetAppLicenseAsyncWorker(const Napi::Function &callback, WindowsStoreImpl *pImpl) 8 | : Napi::AsyncWorker(callback), m_pImpl(pImpl), m_result(NULL) {} 9 | 10 | void GetAppLicenseAsyncWorker::Execute() { m_result = m_pImpl->GetStoreAppLicense(); } 11 | 12 | void GetAppLicenseAsyncWorker::OnOK() { 13 | Napi::Env env = Env(); 14 | Napi::Object obj = Napi::Object::New(env); 15 | Napi::Object addOnLicensesObj = Napi::Object::New(env); 16 | auto addOnLicenses = m_result.AddOnLicenses(); 17 | auto head = addOnLicenses.First(); 18 | while (head.HasCurrent()) { 19 | auto current = head.Current(); 20 | Napi::Object addOnLicense = Napi::Object::New(env); 21 | addOnLicense.Set("isActive", current.Value().IsActive()); 22 | addOnLicensesObj.Set(winrt::to_string(current.Key()), addOnLicense); 23 | head.MoveNext(); 24 | } 25 | obj.Set("addOnLicenses", addOnLicensesObj); 26 | Callback().MakeCallback(Receiver().Value(), { 27 | env.Null(), // error first callback 28 | obj // value sent back to the callback 29 | }); 30 | } 31 | 32 | void GetAppLicenseAsyncWorker::OnError(const Napi::Error &e) { 33 | Napi::Env env = Env(); 34 | 35 | Callback().MakeCallback(Receiver().Value(), {e.Value(), env.Undefined()}); 36 | } 37 | -------------------------------------------------------------------------------- /src/GetAppLicenseAsyncWorker.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include "WindowsStoreImpl.h" 5 | #include 6 | 7 | class GetAppLicenseAsyncWorker : public Napi::AsyncWorker { 8 | public: 9 | GetAppLicenseAsyncWorker(const Napi::Function &callback, WindowsStoreImpl *pImpl); 10 | 11 | protected: 12 | virtual void Execute() override; 13 | virtual void OnOK() override; 14 | virtual void OnError(const Napi::Error &e) override; 15 | 16 | private: 17 | WindowsStoreImpl *m_pImpl; 18 | std::string m_storeId; 19 | Napi::Array m_productKinds; 20 | winrt::Windows::Services::Store::StoreAppLicense m_result; 21 | }; 22 | -------------------------------------------------------------------------------- /src/GetApplicationsAsyncWorker.cpp: -------------------------------------------------------------------------------- 1 | #include "GetApplicationsAsyncWorker.h" 2 | #include "Applications.h" 3 | #include 4 | #include 5 | 6 | GetApplicationsAsyncWorker::GetApplicationsAsyncWorker(const Napi::Function &callback, WindowsStoreImpl *pImpl) 7 | : Napi::AsyncWorker(callback), m_pImpl(pImpl), m_result("") {} 8 | 9 | void GetApplicationsAsyncWorker::Execute() { HRESULT hr = Applications::GetApplications(m_result); } 10 | 11 | void GetApplicationsAsyncWorker::OnOK() { 12 | Napi::Env env = Env(); 13 | 14 | Callback().MakeCallback(Receiver().Value(), {env.Null(), Napi::String::New(env, m_result)}); 15 | } 16 | 17 | void GetApplicationsAsyncWorker::OnError(const Napi::Error &e) { 18 | Napi::Env env = Env(); 19 | 20 | Callback().MakeCallback(Receiver().Value(), {e.Value(), env.Undefined()}); 21 | } 22 | -------------------------------------------------------------------------------- /src/GetApplicationsAsyncWorker.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include "WindowsStoreImpl.h" 5 | 6 | class GetApplicationsAsyncWorker : public Napi::AsyncWorker { 7 | public: 8 | GetApplicationsAsyncWorker(const Napi::Function &callback, WindowsStoreImpl *pImpl); 9 | 10 | protected: 11 | virtual void Execute() override; 12 | virtual void OnOK() override; 13 | virtual void OnError(const Napi::Error &e) override; 14 | 15 | private: 16 | WindowsStoreImpl *m_pImpl; 17 | std::string m_result; 18 | }; 19 | -------------------------------------------------------------------------------- /src/GetCampaignIdAsyncWorker.cpp: -------------------------------------------------------------------------------- 1 | #include "GetCampaignIdAsyncWorker.h" 2 | #include 3 | #include 4 | 5 | GetCampaignIdAsyncWorker::GetCampaignIdAsyncWorker(const Napi::Function &callback, WindowsStoreImpl *pImpl) 6 | : Napi::AsyncWorker(callback), m_pImpl(pImpl), m_result("") {} 7 | 8 | void GetCampaignIdAsyncWorker::Execute() { m_result = m_pImpl->GetCampaignId(); } 9 | 10 | void GetCampaignIdAsyncWorker::OnOK() { 11 | Napi::Env env = Env(); 12 | 13 | Callback().MakeCallback(Receiver().Value(), {env.Null(), Napi::String::New(env, m_result)}); 14 | } 15 | 16 | void GetCampaignIdAsyncWorker::OnError(const Napi::Error &e) { 17 | Napi::Env env = Env(); 18 | 19 | Callback().MakeCallback(Receiver().Value(), {e.Value(), env.Undefined()}); 20 | } 21 | -------------------------------------------------------------------------------- /src/GetCampaignIdAsyncWorker.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include "WindowsStoreImpl.h" 5 | 6 | class GetCampaignIdAsyncWorker : public Napi::AsyncWorker { 7 | public: 8 | GetCampaignIdAsyncWorker(const Napi::Function &callback, WindowsStoreImpl *pImpl); 9 | 10 | protected: 11 | virtual void Execute() override; 12 | virtual void OnOK() override; 13 | virtual void OnError(const Napi::Error &e) override; 14 | 15 | private: 16 | WindowsStoreImpl *m_pImpl; 17 | std::string m_result; 18 | }; 19 | -------------------------------------------------------------------------------- /src/GetCustomerPurchaseIdAsyncWorker.cpp: -------------------------------------------------------------------------------- 1 | #include "GetCustomerPurchaseIdAsyncWorker.h" 2 | #include 3 | #include 4 | 5 | GetCustomerPurchaseIdAsyncWorker::GetCustomerPurchaseIdAsyncWorker(const Napi::Function &callback, std::string token, 6 | std::string type, WindowsStoreImpl *pImpl) 7 | : Napi::AsyncWorker(callback), m_token(token), m_type(type), m_pImpl(pImpl), m_result("") {} 8 | 9 | void GetCustomerPurchaseIdAsyncWorker::Execute() { 10 | m_result = m_pImpl->GetCustomerPurchaseId(m_token, m_type); 11 | m_pImpl->GetCustomerPurchaseIdAsync(m_token, m_type); 12 | } 13 | 14 | void GetCustomerPurchaseIdAsyncWorker::OnOK() { 15 | Napi::Env env = Env(); 16 | 17 | Callback().MakeCallback(Receiver().Value(), {env.Null(), Napi::String::New(env, m_result)}); 18 | } 19 | 20 | void GetCustomerPurchaseIdAsyncWorker::OnError(const Napi::Error &e) { 21 | Napi::Env env = Env(); 22 | 23 | Callback().MakeCallback(Receiver().Value(), {e.Value(), env.Undefined()}); 24 | } 25 | -------------------------------------------------------------------------------- /src/GetCustomerPurchaseIdAsyncWorker.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "WindowsStoreImpl.h" 4 | #include 5 | 6 | class GetCustomerPurchaseIdAsyncWorker : public Napi::AsyncWorker { 7 | public: 8 | GetCustomerPurchaseIdAsyncWorker(const Napi::Function &callback, std::string token, std::string type, 9 | WindowsStoreImpl *pImpl); 10 | 11 | protected: 12 | virtual void Execute() override; 13 | virtual void OnOK() override; 14 | virtual void OnError(const Napi::Error &e) override; 15 | 16 | private: 17 | WindowsStoreImpl *m_pImpl; 18 | std::string m_token, m_type, m_result; 19 | }; 20 | -------------------------------------------------------------------------------- /src/GetMicrosoftAttributedAsyncWorker.cpp: -------------------------------------------------------------------------------- 1 | #include "GetMicrosoftAttributedAsyncWorker.h" 2 | #include 3 | #include 4 | 5 | GetMicrosoftAttributedAsyncWorker::GetMicrosoftAttributedAsyncWorker(const Napi::Function &callback, 6 | WindowsStoreImpl *pImpl) 7 | : Napi::AsyncWorker(callback), m_pImpl(pImpl), m_result(false) {} 8 | 9 | void GetMicrosoftAttributedAsyncWorker::Execute() { m_result = m_pImpl->GetIsMicrosoftAccrued(); } 10 | 11 | void GetMicrosoftAttributedAsyncWorker::OnOK() { 12 | Napi::Env env = Env(); 13 | 14 | Callback().MakeCallback(Receiver().Value(), {env.Null(), Napi::Boolean::New(env, m_result)}); 15 | } 16 | 17 | void GetMicrosoftAttributedAsyncWorker::OnError(const Napi::Error &e) { 18 | Napi::Env env = Env(); 19 | 20 | Callback().MakeCallback(Receiver().Value(), {e.Value(), env.Undefined()}); 21 | } 22 | -------------------------------------------------------------------------------- /src/GetMicrosoftAttributedAsyncWorker.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include "WindowsStoreImpl.h" 5 | 6 | class GetMicrosoftAttributedAsyncWorker : public Napi::AsyncWorker { 7 | public: 8 | GetMicrosoftAttributedAsyncWorker(const Napi::Function &callback, WindowsStoreImpl *pImpl); 9 | 10 | protected: 11 | virtual void Execute() override; 12 | virtual void OnOK() override; 13 | virtual void OnError(const Napi::Error &e) override; 14 | 15 | private: 16 | WindowsStoreImpl *m_pImpl; 17 | bool m_result; 18 | }; 19 | -------------------------------------------------------------------------------- /src/GetStoreAppAsyncWorker.cpp: -------------------------------------------------------------------------------- 1 | #include "GetStoreAppAsyncWorker.h" 2 | #include 3 | #include 4 | 5 | GetStoreAppAsyncWorker::GetStoreAppAsyncWorker(const Napi::Function &callback, std::string storeId, 6 | WindowsStoreImpl *pImpl) 7 | : Napi::AsyncWorker(callback), m_storeId(storeId), m_pImpl(pImpl), m_result(E_FAIL) {} 8 | 9 | void GetStoreAppAsyncWorker::Execute() { m_result = m_pImpl->GetStoreApp(m_storeId); } 10 | 11 | void GetStoreAppAsyncWorker::OnOK() { 12 | Napi::Env env = Env(); 13 | 14 | Callback().MakeCallback(Receiver().Value(), {env.Null(), Napi::Number::New(env, m_result)}); 15 | } 16 | 17 | void GetStoreAppAsyncWorker::OnError(const Napi::Error &e) { 18 | Napi::Env env = Env(); 19 | 20 | Callback().MakeCallback(Receiver().Value(), {e.Value(), env.Undefined()}); 21 | } 22 | -------------------------------------------------------------------------------- /src/GetStoreAppAsyncWorker.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "WindowsStoreImpl.h" 4 | #include 5 | 6 | class GetStoreAppAsyncWorker : public Napi::AsyncWorker { 7 | public: 8 | GetStoreAppAsyncWorker(const Napi::Function &callback, std::string storeId, WindowsStoreImpl *pImpl); 9 | 10 | protected: 11 | virtual void Execute() override; 12 | virtual void OnOK() override; 13 | virtual void OnError(const Napi::Error &e) override; 14 | 15 | private: 16 | WindowsStoreImpl *m_pImpl; 17 | std::string m_storeId; 18 | int m_result; 19 | }; 20 | -------------------------------------------------------------------------------- /src/GetStoreProductsAsyncWorker.cpp: -------------------------------------------------------------------------------- 1 | #include "GetStoreProductsAsyncWorker.h" 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | GetStoreProductsAsyncWorker::GetStoreProductsAsyncWorker(const Napi::Function &callback, Napi::Array &productKinds, 8 | WindowsStoreImpl *pImpl) 9 | : Napi::AsyncWorker(callback), m_productKinds(productKinds), m_pImpl(pImpl), m_result(NULL) {} 10 | 11 | void GetStoreProductsAsyncWorker::Execute() { m_result = m_pImpl->GetStoreProducts(m_productKinds); } 12 | 13 | void GetStoreProductsAsyncWorker::OnOK() { 14 | Napi::Env env = Env(); 15 | Napi::Object obj = Napi::Object::New(env); 16 | while (m_result.HasCurrent()) { 17 | Napi::Object storeProd = Napi::Object::New(env); 18 | Napi::Object storePrice = Napi::Object::New(env); 19 | winrt::Windows::Foundation::Collections::IKeyValuePair 21 | current = m_result.Current(); 22 | 23 | storeProd.Set("inAppOfferToken", winrt::to_string(current.Value().InAppOfferToken())); 24 | 25 | auto price = current.Value().Price(); 26 | storePrice.Set("formattedRecurrencePrice", winrt::to_string(price.FormattedRecurrencePrice())); 27 | storePrice.Set("formattedBasePrice", winrt::to_string(price.FormattedBasePrice())); 28 | storePrice.Set("formattedPrice", winrt::to_string(price.FormattedPrice())); 29 | storePrice.Set("currencyCode", winrt::to_string(price.CurrencyCode())); 30 | storeProd.Set("price", storePrice); 31 | storeProd.Set("storeId", winrt::to_string(current.Key())); 32 | 33 | obj.Set(winrt::to_string(current.Key()), storeProd); 34 | m_result.MoveNext(); 35 | } 36 | Callback().MakeCallback(Receiver().Value(), { 37 | env.Null(), // error first callback 38 | obj // value sent back to the callback 39 | }); 40 | } 41 | 42 | void GetStoreProductsAsyncWorker::OnError(const Napi::Error &e) { 43 | Napi::Env env = Env(); 44 | 45 | Callback().MakeCallback(Receiver().Value(), {e.Value(), env.Undefined()}); 46 | } 47 | -------------------------------------------------------------------------------- /src/GetStoreProductsAsyncWorker.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include "WindowsStoreImpl.h" 5 | #include 6 | 7 | class GetStoreProductsAsyncWorker : public Napi::AsyncWorker { 8 | public: 9 | GetStoreProductsAsyncWorker(const Napi::Function &callback, Napi::Array &productKinds, WindowsStoreImpl *pImpl); 10 | 11 | protected: 12 | virtual void Execute() override; 13 | virtual void OnOK() override; 14 | virtual void OnError(const Napi::Error &e) override; 15 | 16 | private: 17 | WindowsStoreImpl *m_pImpl; 18 | Napi::Array m_productKinds; 19 | winrt::Windows::Foundation::Collections::IIterator> 21 | m_result; 22 | }; 23 | -------------------------------------------------------------------------------- /src/RequestPurchaseAsyncWorker.cpp: -------------------------------------------------------------------------------- 1 | #include "RequestPurchaseAsyncWorker.h" 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | RequestPurchaseAsyncWorker::RequestPurchaseAsyncWorker( 8 | const Napi::Function &callback, std::string storeId, 9 | winrt::Windows::Services::Store::StorePurchaseProperties purchaseProperties, WindowsStoreImpl *pImpl) 10 | : Napi::AsyncWorker(callback), m_storeId(storeId), m_purchaseProperties(purchaseProperties), m_pImpl(pImpl), 11 | m_result(NULL, NULL) {} 12 | 13 | void RequestPurchaseAsyncWorker::Execute() { 14 | m_result = m_pImpl->RequestPurchaseAsync(m_storeId, m_purchaseProperties); 15 | } 16 | 17 | void RequestPurchaseAsyncWorker::OnOK() { 18 | Napi::Env env = Env(); 19 | Napi::Object obj = Napi::Object::New(env); 20 | if (m_result.extended_error != NULL) { 21 | obj.Set("extendedError", m_result.extended_error); 22 | } 23 | if (m_result.status != NULL) { 24 | obj.Set("status", m_result.status); 25 | } 26 | Callback().MakeCallback(Receiver().Value(), { 27 | env.Null(), // error first callback 28 | obj // this is apparently the value sent back to the callback 29 | }); 30 | } 31 | 32 | void RequestPurchaseAsyncWorker::OnError(const Napi::Error &e) { 33 | Napi::Env env = Env(); 34 | 35 | Callback().MakeCallback(Receiver().Value(), {e.Value(), env.Undefined()}); 36 | } 37 | -------------------------------------------------------------------------------- /src/RequestPurchaseAsyncWorker.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "WindowsStoreImpl.h" 4 | #include 5 | 6 | class RequestPurchaseAsyncWorker : public Napi::AsyncWorker { 7 | public: 8 | RequestPurchaseAsyncWorker(const Napi::Function &callback, std::string storeId, 9 | winrt::Windows::Services::Store::StorePurchaseProperties purchaseProperties, 10 | WindowsStoreImpl *pImpl); 11 | 12 | protected: 13 | virtual void Execute() override; 14 | virtual void OnOK() override; 15 | virtual void OnError(const Napi::Error &e) override; 16 | 17 | private: 18 | WindowsStoreImpl *m_pImpl; 19 | std::string m_storeId; 20 | WindowsStoreImpl::StorePurchaseResult m_result; 21 | winrt::Windows::Services::Store::StorePurchaseProperties m_purchaseProperties; 22 | }; 23 | -------------------------------------------------------------------------------- /src/StoreContext.cpp: -------------------------------------------------------------------------------- 1 | #include "StoreContext.h" 2 | #include "GetCustomerPurchaseIdAsyncWorker.h" 3 | #include "GetStoreProductsAsyncWorker.h" 4 | #include "RequestPurchaseAsyncWorker.h" 5 | #include "GetAppLicenseAsyncWorker.h" 6 | #include 7 | #include 8 | #include 9 | 10 | Napi::FunctionReference StoreContext::constructor; 11 | 12 | WindowsStoreImpl *StoreContext::GetInternalInstance() { return this->m_impl; } 13 | 14 | Napi::Object StoreContext::Init(Napi::Env env, Napi::Object exports) { 15 | Napi::HandleScope scope(env); 16 | 17 | Napi::Function func = 18 | DefineClass(env, "StoreContext", 19 | { 20 | InstanceMethod("initialize", &StoreContext::Initialize), 21 | InstanceMethod("getAppLocalStorageFolder", &StoreContext::GetAppLocalStorageFolder), 22 | InstanceMethod("getAssociatedStoreProductsAsync", &StoreContext::GetAssociatedStoreProductsAsync), 23 | InstanceMethod("getCustomerPurchaseIdAsync", &StoreContext::GetCustomerPurchaseIdAsync), 24 | InstanceMethod("requestPurchaseAsync", &StoreContext::RequestPurchaseAsync), 25 | InstanceMethod("getAppLicenseAsync", &StoreContext::GetAppLicenseAsync), 26 | }); 27 | 28 | constructor = Napi::Persistent(func); 29 | constructor.SuppressDestruct(); 30 | 31 | exports.Set("StoreContext", func); 32 | return exports; 33 | } 34 | 35 | StoreContext::StoreContext(const Napi::CallbackInfo &info) : Napi::ObjectWrap(info) { 36 | Napi::Env env = info.Env(); 37 | Napi::HandleScope scope(env); 38 | 39 | if (info.Length() == 1 && info[0].IsObject()) { 40 | Napi::Object object_parent = info[0].As(); 41 | StoreContext *example_parent = Napi::ObjectWrap::Unwrap(object_parent); 42 | WindowsStoreImpl *parent_actual_class_instance = example_parent->GetInternalInstance(); 43 | this->m_impl = new WindowsStoreImpl(); 44 | return; 45 | } 46 | 47 | this->m_impl = new WindowsStoreImpl(); 48 | } 49 | 50 | Napi::Value StoreContext::Initialize(const Napi::CallbackInfo &info) { 51 | Napi::Env env = info.Env(); 52 | Napi::HandleScope scope(env); 53 | Napi::Buffer bufferData = info[0].As>(); 54 | uint32_t handle = *reinterpret_cast(bufferData.Data()); 55 | HWND hwnd = (HWND)handle; 56 | bool result = this->m_impl->Initialize(hwnd); 57 | return Napi::Boolean::New(info.Env(), result); 58 | } 59 | 60 | void StoreContext::GetCustomerPurchaseIdAsync(const Napi::CallbackInfo &info) { 61 | Napi::Env env = info.Env(); 62 | Napi::HandleScope scope(env); 63 | 64 | Napi::String token = info[0].As(); 65 | Napi::String type = info[1].As(); 66 | Napi::Function cb = info[2].As(); 67 | (new GetCustomerPurchaseIdAsyncWorker(cb, token, type, GetInternalInstance()))->Queue(); 68 | } 69 | 70 | Napi::Value StoreContext::GetAppLocalStorageFolder(const Napi::CallbackInfo &info) { 71 | Napi::Env env = info.Env(); 72 | Napi::HandleScope scope(env); 73 | std::string path = WindowsStoreImpl::GetAppLocalStorageFolder(); 74 | return Napi::String::New(info.Env(), path); 75 | } 76 | 77 | void StoreContext::GetAssociatedStoreProductsAsync(const Napi::CallbackInfo &info) { 78 | Napi::Env env = info.Env(); 79 | Napi::HandleScope scope(env); 80 | Napi::Array productKinds = info[0].As(); 81 | Napi::Function cb = info[1].As(); 82 | (new GetStoreProductsAsyncWorker(cb, productKinds, GetInternalInstance()))->Queue(); 83 | } 84 | 85 | void StoreContext::RequestPurchaseAsync(const Napi::CallbackInfo &info) { 86 | Napi::Env env = info.Env(); 87 | Napi::HandleScope scope(env); 88 | if (info.Length() < 3) { 89 | Napi::TypeError::New(env, "Too few arguments.").ThrowAsJavaScriptException(); 90 | } 91 | Napi::String storeId = info[0].As(); 92 | Napi::String purchaseProperties = info[1].As(); 93 | winrt::Windows::Services::Store::StorePurchaseProperties storePurchaseProperties( 94 | winrt::to_hstring(purchaseProperties.Utf8Value())); 95 | Napi::Function cb = info[2].As(); 96 | (new RequestPurchaseAsyncWorker(cb, storeId, storePurchaseProperties, GetInternalInstance()))->Queue(); 97 | } 98 | 99 | void StoreContext::GetAppLicenseAsync(const Napi::CallbackInfo &info) { 100 | Napi::Env env = info.Env(); 101 | Napi::HandleScope scope(env); 102 | Napi::Function cb = info[0].As(); 103 | (new GetAppLicenseAsyncWorker(cb, GetInternalInstance()))->Queue(); 104 | } -------------------------------------------------------------------------------- /src/StoreContext.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include "WindowsStoreImpl.h" 5 | 6 | class StoreContext : public Napi::ObjectWrap { 7 | public: 8 | static Napi::Object Init(Napi::Env env, Napi::Object exports); 9 | StoreContext(const Napi::CallbackInfo &info); 10 | WindowsStoreImpl *GetInternalInstance(); 11 | 12 | private: 13 | static Napi::FunctionReference constructor; 14 | Napi::Value GetAppLocalStorageFolder(const Napi::CallbackInfo &info); 15 | void GetAssociatedStoreProductsAsync(const Napi::CallbackInfo &info); 16 | void GetCustomerPurchaseIdAsync(const Napi::CallbackInfo &info); 17 | void RequestPurchaseAsync(const Napi::CallbackInfo &info); 18 | void GetAppLicenseAsync(const Napi::CallbackInfo &info); 19 | 20 | Napi::Value Initialize(const Napi::CallbackInfo &info); 21 | WindowsStoreImpl *m_impl; 22 | }; 23 | -------------------------------------------------------------------------------- /src/UWPHelper.cpp: -------------------------------------------------------------------------------- 1 | 2 | #pragma once 3 | 4 | #include 5 | #include "winrt/Windows.Services.Store.h" 6 | #include "winrt/Windows.Data.Json.h" 7 | #include 8 | #include 9 | #include "UWPHelper.h" 10 | 11 | using namespace winrt; 12 | using namespace Windows::Services::Store; 13 | using namespace Windows::Data::Json; 14 | 15 | namespace UWPHelper { 16 | enum class AttributionScope { User = 27, Device = 28 }; 17 | 18 | enum class CampaignIdScope { User = 25, Device = 26 }; 19 | 20 | bool initialize() { 21 | winrt::init_apartment(); 22 | return true; 23 | } 24 | 25 | // Note: blocks until completion 26 | int getStoreApp(HWND hwnd, std::string id) { 27 | std::wstring w(id.begin(), id.end()); 28 | StoreContext context = StoreContext::GetDefault(); 29 | auto initWindow = context.try_as(); 30 | if (initWindow != nullptr) { 31 | initWindow->Initialize(hwnd); 32 | } 33 | Windows::Foundation::Collections::IVector apps{winrt::single_threaded_vector()}; 34 | apps.Append(w.c_str()); 35 | auto result = context.RequestDownloadAndInstallStorePackagesAsync(apps).get(); 36 | return (int)result.OverallState(); 37 | } 38 | 39 | bool getIsMicrosoftAccrued(AttributionScope scope) { 40 | bool isAccrued = false; 41 | StoreContext context = StoreContext::GetDefault(); 42 | auto result = StoreRequestHelper::SendRequestAsync(context, static_cast(scope), L"{}").get(); 43 | if (result.ExtendedError() == S_OK) { 44 | JsonObject jsonObject = JsonObject::Parse(result.Response()); 45 | if (jsonObject != nullptr && jsonObject.HasKey(L"IsMicrosoftAccrued")) { 46 | isAccrued = jsonObject.GetNamedBoolean(L"IsMicrosoftAccrued", false); 47 | } 48 | } 49 | 50 | return isAccrued; 51 | } 52 | 53 | bool isMicrosoftAttributed() { 54 | bool isAccrued = getIsMicrosoftAccrued(AttributionScope::User); 55 | if (!isAccrued) { 56 | isAccrued = getIsMicrosoftAccrued(AttributionScope::Device); 57 | } 58 | return false; 59 | } 60 | 61 | std::string getCampaignId(CampaignIdScope scope) { 62 | std::string cid = ""; 63 | StoreContext context = StoreContext::GetDefault(); 64 | auto result = StoreRequestHelper::SendRequestAsync(context, static_cast(scope), L"{}").get(); 65 | if (result.ExtendedError() == S_OK) { 66 | JsonObject jsonObject = JsonObject::Parse(result.Response()); 67 | if (jsonObject != nullptr && jsonObject.HasKey(L"Cid")) { 68 | auto value = jsonObject.GetNamedString(L"Cid", L""); 69 | cid = winrt::to_string(value); 70 | } 71 | } 72 | 73 | return cid; 74 | } 75 | 76 | std::string getCampaignId() { 77 | std::string result = ""; 78 | result = getCampaignId(CampaignIdScope::User); 79 | if (result.empty()) { 80 | result = getCampaignId(CampaignIdScope::Device); 81 | } 82 | return result; 83 | } 84 | 85 | } // namespace UWPHelper 86 | -------------------------------------------------------------------------------- /src/UWPHelper.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | namespace UWPHelper { 6 | bool initialize(); 7 | int getStoreApp(HWND hwnd, std::string id); 8 | bool isMicrosoftAttributed(); 9 | std::string getCampaignId(); 10 | } // namespace UWPHelper 11 | -------------------------------------------------------------------------------- /src/WindowsStoreImpl.cpp: -------------------------------------------------------------------------------- 1 | #include "WindowsStoreImpl.h" 2 | 3 | #include 4 | #include "winrt/Windows.Data.Json.h" 5 | #include "winrt/Windows.Storage.h" 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | using namespace winrt; 13 | using namespace Windows::Data::Json; 14 | using namespace Windows::Services::Store; 15 | using namespace Windows::Storage; 16 | using namespace std::chrono_literals; 17 | 18 | #pragma comment(lib, "Shell32.lib") 19 | 20 | WindowsStoreImpl::WindowsStoreImpl() : m_storeContext(nullptr) {} 21 | 22 | WindowsStoreImpl::~WindowsStoreImpl() { 23 | if (m_storeContext != nullptr) { 24 | m_storeContext.OfflineLicensesChanged(m_eventRegistrationToken); 25 | } 26 | } 27 | 28 | bool WindowsStoreImpl::Initialize(HWND hwnd) { 29 | winrt::init_apartment(); 30 | m_hwnd = hwnd; 31 | return true; 32 | } 33 | 34 | // Note: blocks until completion 35 | int WindowsStoreImpl::GetStoreApp(std::string id) { 36 | std::wstring w(id.begin(), id.end()); 37 | StoreContext context = StoreContext::GetDefault(); 38 | auto initWindow = context.try_as(); 39 | if (initWindow != nullptr) { 40 | HRESULT hr = initWindow->Initialize(m_hwnd); 41 | } 42 | 43 | Windows::Foundation::Collections::IVector apps{winrt::single_threaded_vector()}; 44 | apps.Append(w.c_str()); 45 | auto result = context.RequestDownloadAndInstallStorePackagesAsync(apps).get(); 46 | return (int)result.OverallState(); 47 | } 48 | 49 | Windows::Foundation::Collections::IIterator> 51 | WindowsStoreImpl::GetStoreProducts(Napi::Array productKinds) { 52 | 53 | StoreContext context = StoreContext::GetDefault(); 54 | auto initWindow = context.try_as(); 55 | if (initWindow != nullptr) { 56 | HRESULT hr = initWindow->Initialize(m_hwnd); 57 | } 58 | 59 | Windows::Foundation::Collections::IVector wProductKinds{winrt::single_threaded_vector()}, 60 | wStoreIds{winrt::single_threaded_vector()}; 61 | wProductKinds.Append(winrt::to_hstring("Application")); 62 | wProductKinds.Append(winrt::to_hstring("Consumable")); 63 | wProductKinds.Append(winrt::to_hstring("Durable")); 64 | wProductKinds.Append(winrt::to_hstring("UnmanagedConsumable")); 65 | 66 | auto res = context.GetAssociatedStoreProductsAsync(wProductKinds).get(); 67 | auto associatedProd = res.Products(); 68 | return associatedProd.First(); 69 | } 70 | 71 | winrt::Windows::Services::Store::StoreAppLicense WindowsStoreImpl::GetStoreAppLicense() { 72 | StoreContext context = StoreContext::GetDefault(); 73 | auto initWindow = context.try_as(); 74 | if (initWindow != nullptr) { 75 | HRESULT hr = initWindow->Initialize(m_hwnd); 76 | } 77 | 78 | auto result = context.GetAppLicenseAsync().get(); 79 | return result; 80 | } 81 | 82 | bool WindowsStoreImpl::GetIsMicrosoftAccrued() { 83 | bool isAccrued = GetIsMicrosoftAccrued(AttributionScope::User); 84 | if (!isAccrued) { 85 | isAccrued = GetIsMicrosoftAccrued(AttributionScope::Device); 86 | } 87 | return false; 88 | } 89 | 90 | bool WindowsStoreImpl::GetIsMicrosoftAccrued(AttributionScope scope) { 91 | bool isAccrued = false; 92 | StoreContext context = StoreContext::GetDefault(); 93 | auto result = StoreRequestHelper::SendRequestAsync(context, static_cast(scope), L"{}").get(); 94 | if (result.ExtendedError() == S_OK) { 95 | JsonObject jsonObject = JsonObject::Parse(result.Response()); 96 | if (jsonObject != nullptr && jsonObject.HasKey(L"IsMicrosoftAccrued")) { 97 | isAccrued = jsonObject.GetNamedBoolean(L"IsMicrosoftAccrued", false); 98 | } 99 | } 100 | 101 | return isAccrued; 102 | } 103 | 104 | std::string WindowsStoreImpl::GetCampaignId(CampaignIdScope scope) { 105 | std::string cid = ""; 106 | StoreContext context = StoreContext::GetDefault(); 107 | auto result = StoreRequestHelper::SendRequestAsync(context, static_cast(scope), L"{}").get(); 108 | if (result.ExtendedError() == S_OK) { 109 | JsonObject jsonObject = JsonObject::Parse(result.Response()); 110 | if (jsonObject != nullptr && jsonObject.HasKey(L"Cid")) { 111 | auto value = jsonObject.GetNamedString(L"Cid", L""); 112 | cid = winrt::to_string(value); 113 | } 114 | } 115 | 116 | return cid; 117 | } 118 | 119 | std::string WindowsStoreImpl::GetCampaignId() { 120 | std::string result = ""; 121 | result = GetCampaignId(CampaignIdScope::User); 122 | if (result.empty()) { 123 | result = GetCampaignId(CampaignIdScope::Device); 124 | } 125 | return result; 126 | } 127 | 128 | std::string WindowsStoreImpl::GetAppLocalStorageFolder() { 129 | PWSTR ppszPath; 130 | HRESULT hr = SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &ppszPath); 131 | if (SUCCEEDED(hr)) { 132 | return winrt::to_string(ppszPath); 133 | } 134 | return ""; 135 | } 136 | 137 | std::string WindowsStoreImpl::GetCustomerPurchaseId(std::string token, std::string id) { 138 | std::wstring w_token(token.begin(), token.end()); 139 | std::wstring w_id(id.begin(), id.end()); 140 | StoreContext context = StoreContext::GetDefault(); 141 | auto initWindow = context.try_as(); 142 | if (initWindow != nullptr) { 143 | HRESULT hr = initWindow->Initialize(m_hwnd); 144 | } 145 | 146 | auto result = context.GetCustomerPurchaseIdAsync(w_token, w_id).get(); 147 | if (result.empty()) { 148 | return ""; 149 | } else { 150 | return winrt::to_string(result); 151 | } 152 | } 153 | 154 | Windows::Foundation::IAsyncAction WindowsStoreImpl::GetCustomerPurchaseIdAsync(std::string token, std::string id) { 155 | // co_await winrt::resume_background(); 156 | 157 | std::wstring w_token(token.begin(), token.end()); 158 | std::wstring w_id(id.begin(), id.end()); 159 | StoreContext context = StoreContext::GetDefault(); 160 | auto initWindow = context.try_as(); 161 | if (initWindow != nullptr) { 162 | HRESULT hr = initWindow->Initialize(m_hwnd); 163 | } 164 | 165 | hstring result = co_await context.GetCustomerPurchaseIdAsync(w_token, w_id); // ignore the co_await error squiggly 166 | co_return; 167 | } 168 | 169 | WindowsStoreImpl::StorePurchaseResult WindowsStoreImpl::RequestPurchaseAsync(std::string storeId) { 170 | StoreContext context = StoreContext::GetDefault(); 171 | auto initWindow = context.try_as(); 172 | if (initWindow != nullptr) { 173 | HRESULT hr = initWindow->Initialize(m_hwnd); 174 | } 175 | 176 | auto result = context.RequestPurchaseAsync(to_hstring(storeId)).get(); 177 | 178 | if (result.ExtendedError() == S_OK) { 179 | return WindowsStoreImpl::StorePurchaseResult(NULL, static_cast(result.Status())); 180 | } else { 181 | return WindowsStoreImpl::StorePurchaseResult(result.ExtendedError(), NULL); 182 | } 183 | } 184 | 185 | WindowsStoreImpl::StorePurchaseResult 186 | WindowsStoreImpl::RequestPurchaseAsync(std::string storeId, StorePurchaseProperties &purchaseProperties) { 187 | StoreContext context = StoreContext::GetDefault(); 188 | auto initWindow = context.try_as(); 189 | if (initWindow != nullptr) { 190 | HRESULT hr = initWindow->Initialize(m_hwnd); 191 | } 192 | 193 | auto result = context.RequestPurchaseAsync(to_hstring(storeId), purchaseProperties).get(); 194 | 195 | if (result.ExtendedError() == S_OK) { 196 | return WindowsStoreImpl::StorePurchaseResult(NULL, static_cast(result.Status())); 197 | } else { 198 | return WindowsStoreImpl::StorePurchaseResult(result.ExtendedError(), NULL); 199 | } 200 | } -------------------------------------------------------------------------------- /src/WindowsStoreImpl.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #define WIN32_LEAN_AND_MEAN 4 | #include 5 | #include "winrt/Windows.Services.Store.h" 6 | #include "winrt/Windows.Foundation.h" 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | enum class AttributionScope { User = 27, Device = 28 }; 13 | 14 | enum class CampaignIdScope { User = 25, Device = 26 }; 15 | 16 | class WindowsStoreImpl { 17 | public: 18 | struct StorePurchaseResult { 19 | int extended_error; 20 | int status; 21 | StorePurchaseResult(int extendedError, int stat) : extended_error(extendedError), status(stat) {} 22 | }; 23 | 24 | struct StoreProduct { 25 | std::string in_app_purchase_token; 26 | StoreProduct(std::string inAppPurchaseToken) : in_app_purchase_token(inAppPurchaseToken) {} 27 | }; 28 | 29 | public: 30 | WindowsStoreImpl(); 31 | ~WindowsStoreImpl(); 32 | bool Initialize(HWND hwnd); 33 | int GetStoreApp(std::string id); 34 | winrt::Windows::Foundation::Collections::IIterator> 36 | GetStoreProducts(Napi::Array productKinds); 37 | winrt::Windows::Services::Store::StoreAppLicense GetStoreAppLicense(); 38 | bool GetIsMicrosoftAccrued(); 39 | std::string GetCampaignId(); 40 | static std::string GetAppLocalStorageFolder(); 41 | 42 | std::string GetCustomerPurchaseId(std::string token, std::string id); 43 | winrt::Windows::Foundation::IAsyncAction GetCustomerPurchaseIdAsync(std::string token, std::string id); 44 | StorePurchaseResult RequestPurchaseAsync(std::string storeId); 45 | StorePurchaseResult 46 | RequestPurchaseAsync(std::string storeId, 47 | winrt::Windows::Services::Store::StorePurchaseProperties &purchaseProperties); 48 | 49 | private: 50 | bool GetIsMicrosoftAccrued(AttributionScope scope); 51 | std::string GetCampaignId(CampaignIdScope scope); 52 | winrt::Windows::Services::Store::StoreContext m_storeContext; 53 | winrt::event_token m_eventRegistrationToken; 54 | void *m_userData; 55 | HWND m_hwnd; 56 | }; 57 | -------------------------------------------------------------------------------- /src/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "StoreContext.h" 3 | 4 | Napi::Object InitAll(Napi::Env env, Napi::Object exports) { return StoreContext::Init(env, exports); } 5 | 6 | NODE_API_MODULE(NODE_GYP_MODULE_NAME, InitAll); 7 | --------------------------------------------------------------------------------