├── .clang-format ├── .gitignore ├── CMakeLists.txt ├── README.md ├── config ├── init.cmake └── qtweb.cmake ├── package-lock.json ├── package.json ├── public └── index.html ├── scripts └── install.js ├── src ├── cpp │ ├── QWebChannel │ │ ├── nwebchannel.hpp │ │ ├── qwebchannel_wrap.cpp │ │ └── qwebchannel_wrap.h │ ├── QWebEnginePage │ │ ├── qwebenginepage_wrap.cpp │ │ └── qwebenginepage_wrap.h │ ├── QWebEngineSettings │ │ ├── qwebenginesettings_wrap.cpp │ │ └── qwebenginesettings_wrap.h │ ├── QWebEngineView │ │ ├── nwebengineview.hpp │ │ ├── qwebengineview_wrap.cpp │ │ └── qwebengineview_wrap.h │ ├── init │ │ └── init.cpp │ └── main.cpp ├── demo-transparent.ts ├── demo.ts ├── index.ts └── lib │ ├── QWebChannel.ts │ ├── QWebEnginePage.ts │ ├── QWebEngineSettings.ts │ ├── QWebEngineView.ts │ └── utils │ └── addon.ts └── tsconfig.json /.clang-format: -------------------------------------------------------------------------------- 1 | BasedOnStyle: Google 2 | IndentWidth: 2 3 | --- 4 | Language: Cpp 5 | 6 | PointerAlignment: Left 7 | AlwaysBreakAfterReturnType: None 8 | SortIncludes: true -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | build 3 | dist 4 | .vscode/ -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.1) 2 | # -------------- Plugin Config --------------- 3 | execute_process(COMMAND node -p "require('@nodegui/nodegui/plugin').CMAKE_HELPER_FILE" 4 | WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} 5 | OUTPUT_VARIABLE NODEGUI_PLUGIN_CMAKE_HELPER 6 | ) 7 | string(REPLACE "\n" "" NODEGUI_PLUGIN_CMAKE_HELPER ${NODEGUI_PLUGIN_CMAKE_HELPER}) 8 | string(REPLACE "\"" "" NODEGUI_PLUGIN_CMAKE_HELPER ${NODEGUI_PLUGIN_CMAKE_HELPER}) 9 | 10 | include("${NODEGUI_PLUGIN_CMAKE_HELPER}") 11 | include(./config/init.cmake) 12 | 13 | # -------------- User Config --------------- 14 | set(PLUGIN_ADDON_NAME "nodegui_plugin_webview") 15 | 16 | project(${PLUGIN_ADDON_NAME}) 17 | 18 | add_library(${PLUGIN_ADDON_NAME} SHARED 19 | "${CMAKE_JS_SRC}" 20 | "${PROJECT_SOURCE_DIR}/src/cpp/main.cpp" 21 | "${PROJECT_SOURCE_DIR}/src/cpp/QWebEngineView/qwebengineview_wrap.cpp" 22 | "${PROJECT_SOURCE_DIR}/src/cpp/QWebEngineView/nwebengineview.hpp" 23 | "${PROJECT_SOURCE_DIR}/src/cpp/QWebEngineSettings/qwebenginesettings_wrap.cpp" 24 | "${PROJECT_SOURCE_DIR}/src/cpp/QWebEnginePage/qwebenginepage_wrap.cpp" 25 | "${PROJECT_SOURCE_DIR}/src/cpp/QWebChannel/qwebchannel_wrap.cpp" 26 | "${PROJECT_SOURCE_DIR}/src/cpp/QWebChannel/nwebchannel.hpp" 27 | ) 28 | 29 | AddQtWebSupport(${PLUGIN_ADDON_NAME}) 30 | AddPluginConfig(${PLUGIN_ADDON_NAME}) 31 | 32 | target_include_directories(${PLUGIN_ADDON_NAME} PRIVATE 33 | "${CMAKE_JS_INC}" 34 | "${PROJECT_SOURCE_DIR}" 35 | ) 36 | target_link_libraries(${PLUGIN_ADDON_NAME} PRIVATE 37 | "${CMAKE_JS_LIB}" 38 | Qt5::WebEngineCore 39 | Qt5::WebEngineWidgets 40 | Qt5::Core 41 | Qt5::Widgets 42 | Qt5::Gui 43 | ) 44 | 45 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NodeGui Webview plugin [WIP] 2 | 3 | Start with `demo.ts` to understand how it all works. 4 | 5 | More details soon. 6 | 7 | 8 | Demo: 9 | 10 | 11 | -------------------------------------------------------------------------------- /config/init.cmake: -------------------------------------------------------------------------------- 1 | 2 | include(./config/qtweb.cmake) 3 | 4 | # Create a separate init plugin to be loaded before Nodegui loads 5 | set(PLUGIN_ADDON_NAME "nodegui_plugin_webview_init") 6 | 7 | project(${PLUGIN_ADDON_NAME}) 8 | 9 | add_library(${PLUGIN_ADDON_NAME} SHARED 10 | "${CMAKE_JS_SRC}" 11 | "${PROJECT_SOURCE_DIR}/src/cpp/init/init.cpp" 12 | ) 13 | AddNapiSupport(${PLUGIN_ADDON_NAME}) 14 | AddQtWebSupport(${PLUGIN_ADDON_NAME}) 15 | 16 | target_include_directories(${PLUGIN_ADDON_NAME} PRIVATE 17 | "${CMAKE_JS_INC}" 18 | "${PROJECT_SOURCE_DIR}" 19 | ) 20 | target_link_libraries(${PLUGIN_ADDON_NAME} PRIVATE 21 | "${CMAKE_JS_LIB}" 22 | Qt5::WebEngine 23 | ) 24 | -------------------------------------------------------------------------------- /config/qtweb.cmake: -------------------------------------------------------------------------------- 1 | macro(AddQtWebSupport addonName) 2 | 3 | execute_process(COMMAND node -p "require('@nodegui/nodegui/config/qtConfig.js').qtCmakeDir" 4 | WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} 5 | OUTPUT_VARIABLE QT_CMAKE_HOME_DIR 6 | ) 7 | 8 | string(REPLACE "\n" "" QT_CMAKE_HOME_DIR "${QT_CMAKE_HOME_DIR}") 9 | string(REPLACE "\"" "" QT_CMAKE_HOME_DIR "${QT_CMAKE_HOME_DIR}") 10 | 11 | message(STATUS "Using QT installation for ${addonName} QT_CMAKE_HOME_DIR:${QT_CMAKE_HOME_DIR}") 12 | 13 | set(Qt5_DIR ${QT_CMAKE_HOME_DIR}) 14 | find_package(Qt5 REQUIRED COMPONENTS WebEngine WebEngineCore WebEngineWidgets) 15 | 16 | endmacro(AddQtWebSupport addonName) 17 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodegui-plugin-webview", 3 | "version": "1.1.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "7zip-bin": { 8 | "version": "5.0.3", 9 | "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.0.3.tgz", 10 | "integrity": "sha512-GLyWIFBbGvpKPGo55JyRZAo4lVbnBiD52cKlw/0Vt+wnmKvWJkpZvsjVoaIolyBXDeAQKSicRtqFNPem9w0WYA==" 11 | }, 12 | "7zip-min": { 13 | "version": "1.1.1", 14 | "resolved": "https://registry.npmjs.org/7zip-min/-/7zip-min-1.1.1.tgz", 15 | "integrity": "sha512-GPTk3xycxB0NjRM1SKAUL7TWXjgFAyzwXkamkk5YgSLd6OneeWBw+fxULctrVr4XqPBBh+LyqpHlyj9ryfpqoQ==", 16 | "requires": { 17 | "7zip-bin": "^5.0.3" 18 | } 19 | }, 20 | "@nodegui/artifact-installer": { 21 | "version": "1.1.0", 22 | "resolved": "https://registry.npmjs.org/@nodegui/artifact-installer/-/artifact-installer-1.1.0.tgz", 23 | "integrity": "sha512-x/rIewhjnLhf2b3lAy5ZIPSTS39LRpwMTKeEg6sn4RwvWwyNmreGzpvGi6Gkbl6FUpftn70nfOBOpaeO3hO8PQ==", 24 | "requires": { 25 | "7zip-min": "^1.1.1", 26 | "env-paths": "^2.2.0", 27 | "make-dir": "^3.0.0", 28 | "node-fetch": "^2.6.0", 29 | "progress": "^2.0.3" 30 | } 31 | }, 32 | "@nodegui/nodegui": { 33 | "version": "0.30.2", 34 | "resolved": "https://registry.npmjs.org/@nodegui/nodegui/-/nodegui-0.30.2.tgz", 35 | "integrity": "sha512-UhUCH6bqaaeMoRFfQBMc0mEozwtF4slV3agwUHkEw9zuLcM+1JZewKIiaKnSHMtYdrbgkIohTDsYxlwHgAXv+A==", 36 | "dev": true, 37 | "requires": { 38 | "@nodegui/artifact-installer": "^1.1.0", 39 | "@nodegui/qode": "^2.1.0", 40 | "cmake-js": "^6.1.0", 41 | "cross-env": "^7.0.3", 42 | "cuid": "^2.1.6", 43 | "manage-path": "^2.0.0", 44 | "memoize-one": "^5.1.1", 45 | "node-addon-api": "^3.1.0", 46 | "postcss-nodegui-autoprefixer": "0.0.7" 47 | }, 48 | "dependencies": { 49 | "cmake-js": { 50 | "version": "6.1.0", 51 | "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-6.1.0.tgz", 52 | "integrity": "sha512-utmukLQftpgrCpGRCaHnkv4K27HZNNFqmBl4vnvccy0xp4c1erxjFU/Lq4wn5ngAhFZmpwBPQfoKWKThjSBiwg==", 53 | "dev": true, 54 | "requires": { 55 | "debug": "^4", 56 | "fs-extra": "^5.0.0", 57 | "is-iojs": "^1.0.1", 58 | "lodash": "^4", 59 | "memory-stream": "0", 60 | "npmlog": "^1.2.0", 61 | "rc": "^1.2.7", 62 | "request": "^2.54.0", 63 | "semver": "^5.0.3", 64 | "splitargs": "0", 65 | "tar": "^4", 66 | "unzipper": "^0.8.13", 67 | "url-join": "0", 68 | "which": "^1.0.9", 69 | "yargs": "^3.6.0" 70 | } 71 | }, 72 | "cross-env": { 73 | "version": "7.0.3", 74 | "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", 75 | "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", 76 | "dev": true, 77 | "requires": { 78 | "cross-spawn": "^7.0.1" 79 | } 80 | }, 81 | "fs-minipass": { 82 | "version": "1.2.7", 83 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", 84 | "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", 85 | "dev": true, 86 | "requires": { 87 | "minipass": "^2.6.0" 88 | } 89 | }, 90 | "minimist": { 91 | "version": "1.2.5", 92 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 93 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 94 | "dev": true 95 | }, 96 | "minipass": { 97 | "version": "2.9.0", 98 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", 99 | "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", 100 | "dev": true, 101 | "requires": { 102 | "safe-buffer": "^5.1.2", 103 | "yallist": "^3.0.0" 104 | } 105 | }, 106 | "minizlib": { 107 | "version": "1.3.3", 108 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", 109 | "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", 110 | "dev": true, 111 | "requires": { 112 | "minipass": "^2.9.0" 113 | } 114 | }, 115 | "mkdirp": { 116 | "version": "0.5.5", 117 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 118 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 119 | "dev": true, 120 | "requires": { 121 | "minimist": "^1.2.5" 122 | } 123 | }, 124 | "node-addon-api": { 125 | "version": "3.1.0", 126 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.1.0.tgz", 127 | "integrity": "sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==", 128 | "dev": true 129 | }, 130 | "semver": { 131 | "version": "5.7.1", 132 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 133 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 134 | "dev": true 135 | }, 136 | "tar": { 137 | "version": "4.4.13", 138 | "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", 139 | "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", 140 | "dev": true, 141 | "requires": { 142 | "chownr": "^1.1.1", 143 | "fs-minipass": "^1.2.5", 144 | "minipass": "^2.8.6", 145 | "minizlib": "^1.2.1", 146 | "mkdirp": "^0.5.0", 147 | "safe-buffer": "^5.1.2", 148 | "yallist": "^3.0.3" 149 | } 150 | }, 151 | "yallist": { 152 | "version": "3.1.1", 153 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 154 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 155 | "dev": true 156 | } 157 | } 158 | }, 159 | "@nodegui/qode": { 160 | "version": "2.1.0", 161 | "resolved": "https://registry.npmjs.org/@nodegui/qode/-/qode-2.1.0.tgz", 162 | "integrity": "sha512-R31K60Vba4yO2Fy3qXXJkt7XMZnitDhuAVaibSGSbcBJbHhJh0+pDQjzZve1+uY7tCHFIY0oRq3tb70o/BrPZQ==", 163 | "dev": true, 164 | "requires": { 165 | "env-paths": "^2.2.0", 166 | "make-dir": "^3.0.2", 167 | "node-fetch": "^2.6.0", 168 | "progress": "^2.0.3", 169 | "tar": "^6.0.1" 170 | } 171 | }, 172 | "@types/node": { 173 | "version": "12.12.29", 174 | "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.29.tgz", 175 | "integrity": "sha512-yo8Qz0ygADGFptISDj3pOC9wXfln/5pQaN/ysDIzOaAWXt73cNHmtEC8zSO2Y+kse/txmwIAJzkYZ5fooaS5DQ==", 176 | "dev": true 177 | }, 178 | "ajv": { 179 | "version": "6.12.0", 180 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", 181 | "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", 182 | "requires": { 183 | "fast-deep-equal": "^3.1.1", 184 | "fast-json-stable-stringify": "^2.0.0", 185 | "json-schema-traverse": "^0.4.1", 186 | "uri-js": "^4.2.2" 187 | } 188 | }, 189 | "amdefine": { 190 | "version": "1.0.1", 191 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 192 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" 193 | }, 194 | "ansi": { 195 | "version": "0.3.1", 196 | "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", 197 | "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=" 198 | }, 199 | "ansi-regex": { 200 | "version": "2.1.1", 201 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 202 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 203 | }, 204 | "ansi-styles": { 205 | "version": "3.2.1", 206 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 207 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 208 | "dev": true, 209 | "requires": { 210 | "color-convert": "^1.9.0" 211 | } 212 | }, 213 | "are-we-there-yet": { 214 | "version": "1.0.6", 215 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz", 216 | "integrity": "sha1-otKMkxAqpsyWJFomy5VN4G7FPww=", 217 | "requires": { 218 | "delegates": "^1.0.0", 219 | "readable-stream": "^2.0.0 || ^1.1.13" 220 | }, 221 | "dependencies": { 222 | "isarray": { 223 | "version": "1.0.0", 224 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 225 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 226 | }, 227 | "readable-stream": { 228 | "version": "2.3.7", 229 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 230 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 231 | "requires": { 232 | "core-util-is": "~1.0.0", 233 | "inherits": "~2.0.3", 234 | "isarray": "~1.0.0", 235 | "process-nextick-args": "~2.0.0", 236 | "safe-buffer": "~5.1.1", 237 | "string_decoder": "~1.1.1", 238 | "util-deprecate": "~1.0.1" 239 | } 240 | }, 241 | "string_decoder": { 242 | "version": "1.1.1", 243 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 244 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 245 | "requires": { 246 | "safe-buffer": "~5.1.0" 247 | } 248 | } 249 | } 250 | }, 251 | "asn1": { 252 | "version": "0.2.4", 253 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 254 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 255 | "requires": { 256 | "safer-buffer": "~2.1.0" 257 | } 258 | }, 259 | "assert-plus": { 260 | "version": "1.0.0", 261 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 262 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 263 | }, 264 | "asynckit": { 265 | "version": "0.4.0", 266 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 267 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 268 | }, 269 | "aws-sign2": { 270 | "version": "0.7.0", 271 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 272 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 273 | }, 274 | "aws4": { 275 | "version": "1.9.1", 276 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", 277 | "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" 278 | }, 279 | "balanced-match": { 280 | "version": "1.0.0", 281 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 282 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 283 | }, 284 | "bcrypt-pbkdf": { 285 | "version": "1.0.2", 286 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 287 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 288 | "requires": { 289 | "tweetnacl": "^0.14.3" 290 | } 291 | }, 292 | "big-integer": { 293 | "version": "1.6.48", 294 | "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", 295 | "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==" 296 | }, 297 | "binary": { 298 | "version": "0.3.0", 299 | "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", 300 | "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", 301 | "requires": { 302 | "buffers": "~0.1.1", 303 | "chainsaw": "~0.1.0" 304 | } 305 | }, 306 | "bluebird": { 307 | "version": "3.4.7", 308 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", 309 | "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" 310 | }, 311 | "brace-expansion": { 312 | "version": "1.1.11", 313 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 314 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 315 | "requires": { 316 | "balanced-match": "^1.0.0", 317 | "concat-map": "0.0.1" 318 | } 319 | }, 320 | "buffer-indexof-polyfill": { 321 | "version": "1.0.1", 322 | "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.1.tgz", 323 | "integrity": "sha1-qfuAbOgUXVQoUQznLyeLs2OmOL8=" 324 | }, 325 | "buffer-shims": { 326 | "version": "1.0.0", 327 | "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", 328 | "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" 329 | }, 330 | "buffers": { 331 | "version": "0.1.1", 332 | "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", 333 | "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" 334 | }, 335 | "camelcase": { 336 | "version": "2.1.1", 337 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 338 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" 339 | }, 340 | "caseless": { 341 | "version": "0.12.0", 342 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 343 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 344 | }, 345 | "chainsaw": { 346 | "version": "0.1.0", 347 | "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", 348 | "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", 349 | "requires": { 350 | "traverse": ">=0.3.0 <0.4" 351 | } 352 | }, 353 | "chalk": { 354 | "version": "2.4.2", 355 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 356 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 357 | "dev": true, 358 | "requires": { 359 | "ansi-styles": "^3.2.1", 360 | "escape-string-regexp": "^1.0.5", 361 | "supports-color": "^5.3.0" 362 | }, 363 | "dependencies": { 364 | "supports-color": { 365 | "version": "5.5.0", 366 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 367 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 368 | "dev": true, 369 | "requires": { 370 | "has-flag": "^3.0.0" 371 | } 372 | } 373 | } 374 | }, 375 | "chownr": { 376 | "version": "1.1.4", 377 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 378 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" 379 | }, 380 | "cliui": { 381 | "version": "3.2.0", 382 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", 383 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", 384 | "requires": { 385 | "string-width": "^1.0.1", 386 | "strip-ansi": "^3.0.1", 387 | "wrap-ansi": "^2.0.0" 388 | } 389 | }, 390 | "cmake-js": { 391 | "version": "5.3.2", 392 | "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-5.3.2.tgz", 393 | "integrity": "sha512-OsRQ3ZgoV3nJ+3bZr9MEvSuhGS7xc3LgmPZ2gCXlLqF5Wxi6mUQNK70dm/2UUf4/QNBssdYWB5Y7BSRX9FFUrg==", 394 | "requires": { 395 | "bluebird": "^3", 396 | "debug": "^4", 397 | "fs-extra": "^5.0.0", 398 | "is-iojs": "^1.0.1", 399 | "lodash": "^4", 400 | "memory-stream": "0", 401 | "npmlog": "^1.2.0", 402 | "rc": "^1.2.7", 403 | "request": "^2.54.0", 404 | "semver": "^5.0.3", 405 | "splitargs": "0", 406 | "tar": "^4", 407 | "traceur": "0.0.x", 408 | "unzipper": "^0.8.13", 409 | "url-join": "0", 410 | "which": "^1.0.9", 411 | "yargs": "^3.6.0" 412 | }, 413 | "dependencies": { 414 | "fs-minipass": { 415 | "version": "1.2.7", 416 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", 417 | "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", 418 | "requires": { 419 | "minipass": "^2.6.0" 420 | } 421 | }, 422 | "minipass": { 423 | "version": "2.9.0", 424 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", 425 | "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", 426 | "requires": { 427 | "safe-buffer": "^5.1.2", 428 | "yallist": "^3.0.0" 429 | } 430 | }, 431 | "minizlib": { 432 | "version": "1.3.3", 433 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", 434 | "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", 435 | "requires": { 436 | "minipass": "^2.9.0" 437 | } 438 | }, 439 | "mkdirp": { 440 | "version": "0.5.5", 441 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 442 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 443 | "requires": { 444 | "minimist": "^1.2.5" 445 | } 446 | }, 447 | "semver": { 448 | "version": "5.7.1", 449 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 450 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 451 | }, 452 | "tar": { 453 | "version": "4.4.13", 454 | "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", 455 | "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", 456 | "requires": { 457 | "chownr": "^1.1.1", 458 | "fs-minipass": "^1.2.5", 459 | "minipass": "^2.8.6", 460 | "minizlib": "^1.2.1", 461 | "mkdirp": "^0.5.0", 462 | "safe-buffer": "^5.1.2", 463 | "yallist": "^3.0.3" 464 | } 465 | }, 466 | "yallist": { 467 | "version": "3.1.1", 468 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 469 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 470 | } 471 | } 472 | }, 473 | "code-point-at": { 474 | "version": "1.1.0", 475 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 476 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 477 | }, 478 | "color-convert": { 479 | "version": "1.9.3", 480 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 481 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 482 | "dev": true, 483 | "requires": { 484 | "color-name": "1.1.3" 485 | } 486 | }, 487 | "color-name": { 488 | "version": "1.1.3", 489 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 490 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 491 | "dev": true 492 | }, 493 | "combined-stream": { 494 | "version": "1.0.8", 495 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 496 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 497 | "requires": { 498 | "delayed-stream": "~1.0.0" 499 | } 500 | }, 501 | "commander": { 502 | "version": "2.9.0", 503 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", 504 | "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", 505 | "requires": { 506 | "graceful-readlink": ">= 1.0.0" 507 | } 508 | }, 509 | "concat-map": { 510 | "version": "0.0.1", 511 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 512 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 513 | }, 514 | "core-util-is": { 515 | "version": "1.0.2", 516 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 517 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 518 | }, 519 | "cross-env": { 520 | "version": "6.0.3", 521 | "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz", 522 | "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==", 523 | "requires": { 524 | "cross-spawn": "^7.0.0" 525 | } 526 | }, 527 | "cross-spawn": { 528 | "version": "7.0.1", 529 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", 530 | "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", 531 | "requires": { 532 | "path-key": "^3.1.0", 533 | "shebang-command": "^2.0.0", 534 | "which": "^2.0.1" 535 | }, 536 | "dependencies": { 537 | "which": { 538 | "version": "2.0.2", 539 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 540 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 541 | "requires": { 542 | "isexe": "^2.0.0" 543 | } 544 | } 545 | } 546 | }, 547 | "cuid": { 548 | "version": "2.1.8", 549 | "resolved": "https://registry.npmjs.org/cuid/-/cuid-2.1.8.tgz", 550 | "integrity": "sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==", 551 | "dev": true 552 | }, 553 | "dashdash": { 554 | "version": "1.14.1", 555 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 556 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 557 | "requires": { 558 | "assert-plus": "^1.0.0" 559 | } 560 | }, 561 | "debug": { 562 | "version": "4.1.1", 563 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 564 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 565 | "requires": { 566 | "ms": "^2.1.1" 567 | } 568 | }, 569 | "decamelize": { 570 | "version": "1.2.0", 571 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 572 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 573 | }, 574 | "deep-extend": { 575 | "version": "0.6.0", 576 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 577 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 578 | }, 579 | "delayed-stream": { 580 | "version": "1.0.0", 581 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 582 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 583 | }, 584 | "delegates": { 585 | "version": "1.0.0", 586 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 587 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 588 | }, 589 | "duplexer2": { 590 | "version": "0.1.4", 591 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", 592 | "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", 593 | "requires": { 594 | "readable-stream": "^2.0.2" 595 | }, 596 | "dependencies": { 597 | "isarray": { 598 | "version": "1.0.0", 599 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 600 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 601 | }, 602 | "readable-stream": { 603 | "version": "2.3.7", 604 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 605 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 606 | "requires": { 607 | "core-util-is": "~1.0.0", 608 | "inherits": "~2.0.3", 609 | "isarray": "~1.0.0", 610 | "process-nextick-args": "~2.0.0", 611 | "safe-buffer": "~5.1.1", 612 | "string_decoder": "~1.1.1", 613 | "util-deprecate": "~1.0.1" 614 | } 615 | }, 616 | "string_decoder": { 617 | "version": "1.1.1", 618 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 619 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 620 | "requires": { 621 | "safe-buffer": "~5.1.0" 622 | } 623 | } 624 | } 625 | }, 626 | "ecc-jsbn": { 627 | "version": "0.1.2", 628 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 629 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 630 | "requires": { 631 | "jsbn": "~0.1.0", 632 | "safer-buffer": "^2.1.0" 633 | } 634 | }, 635 | "env-paths": { 636 | "version": "2.2.0", 637 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", 638 | "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==" 639 | }, 640 | "escape-string-regexp": { 641 | "version": "1.0.5", 642 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 643 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 644 | "dev": true 645 | }, 646 | "extend": { 647 | "version": "3.0.2", 648 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 649 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 650 | }, 651 | "extsprintf": { 652 | "version": "1.3.0", 653 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 654 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 655 | }, 656 | "fast-deep-equal": { 657 | "version": "3.1.1", 658 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", 659 | "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" 660 | }, 661 | "fast-json-stable-stringify": { 662 | "version": "2.1.0", 663 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 664 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 665 | }, 666 | "forever-agent": { 667 | "version": "0.6.1", 668 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 669 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 670 | }, 671 | "form-data": { 672 | "version": "2.3.3", 673 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 674 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 675 | "requires": { 676 | "asynckit": "^0.4.0", 677 | "combined-stream": "^1.0.6", 678 | "mime-types": "^2.1.12" 679 | } 680 | }, 681 | "fs-extra": { 682 | "version": "5.0.0", 683 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", 684 | "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", 685 | "requires": { 686 | "graceful-fs": "^4.1.2", 687 | "jsonfile": "^4.0.0", 688 | "universalify": "^0.1.0" 689 | } 690 | }, 691 | "fs-minipass": { 692 | "version": "2.1.0", 693 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", 694 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", 695 | "dev": true, 696 | "requires": { 697 | "minipass": "^3.0.0" 698 | } 699 | }, 700 | "fs.realpath": { 701 | "version": "1.0.0", 702 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 703 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 704 | }, 705 | "fstream": { 706 | "version": "1.0.12", 707 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", 708 | "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", 709 | "requires": { 710 | "graceful-fs": "^4.1.2", 711 | "inherits": "~2.0.0", 712 | "mkdirp": ">=0.5 0", 713 | "rimraf": "2" 714 | }, 715 | "dependencies": { 716 | "mkdirp": { 717 | "version": "0.5.5", 718 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 719 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 720 | "requires": { 721 | "minimist": "^1.2.5" 722 | } 723 | } 724 | } 725 | }, 726 | "gauge": { 727 | "version": "1.2.7", 728 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", 729 | "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", 730 | "requires": { 731 | "ansi": "^0.3.0", 732 | "has-unicode": "^2.0.0", 733 | "lodash.pad": "^4.1.0", 734 | "lodash.padend": "^4.1.0", 735 | "lodash.padstart": "^4.1.0" 736 | } 737 | }, 738 | "getpass": { 739 | "version": "0.1.7", 740 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 741 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 742 | "requires": { 743 | "assert-plus": "^1.0.0" 744 | } 745 | }, 746 | "glob": { 747 | "version": "7.1.6", 748 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 749 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 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.2.3", 761 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", 762 | "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" 763 | }, 764 | "graceful-readlink": { 765 | "version": "1.0.1", 766 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", 767 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" 768 | }, 769 | "har-schema": { 770 | "version": "2.0.0", 771 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 772 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 773 | }, 774 | "har-validator": { 775 | "version": "5.1.3", 776 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 777 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 778 | "requires": { 779 | "ajv": "^6.5.5", 780 | "har-schema": "^2.0.0" 781 | } 782 | }, 783 | "has-flag": { 784 | "version": "3.0.0", 785 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 786 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 787 | "dev": true 788 | }, 789 | "has-unicode": { 790 | "version": "2.0.1", 791 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 792 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" 793 | }, 794 | "http-signature": { 795 | "version": "1.2.0", 796 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 797 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 798 | "requires": { 799 | "assert-plus": "^1.0.0", 800 | "jsprim": "^1.2.2", 801 | "sshpk": "^1.7.0" 802 | } 803 | }, 804 | "inflight": { 805 | "version": "1.0.6", 806 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 807 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 808 | "requires": { 809 | "once": "^1.3.0", 810 | "wrappy": "1" 811 | } 812 | }, 813 | "inherits": { 814 | "version": "2.0.4", 815 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 816 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 817 | }, 818 | "ini": { 819 | "version": "1.3.8", 820 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 821 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 822 | }, 823 | "invert-kv": { 824 | "version": "1.0.0", 825 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 826 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" 827 | }, 828 | "is-fullwidth-code-point": { 829 | "version": "1.0.0", 830 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 831 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 832 | "requires": { 833 | "number-is-nan": "^1.0.0" 834 | } 835 | }, 836 | "is-iojs": { 837 | "version": "1.1.0", 838 | "resolved": "https://registry.npmjs.org/is-iojs/-/is-iojs-1.1.0.tgz", 839 | "integrity": "sha1-TBEDO11dlNbqs3dd7cm+fQCDJfE=" 840 | }, 841 | "is-typedarray": { 842 | "version": "1.0.0", 843 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 844 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 845 | }, 846 | "isarray": { 847 | "version": "0.0.1", 848 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 849 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 850 | }, 851 | "isexe": { 852 | "version": "2.0.0", 853 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 854 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 855 | }, 856 | "isstream": { 857 | "version": "0.1.2", 858 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 859 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 860 | }, 861 | "jsbn": { 862 | "version": "0.1.1", 863 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 864 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 865 | }, 866 | "json-schema": { 867 | "version": "0.2.3", 868 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 869 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 870 | }, 871 | "json-schema-traverse": { 872 | "version": "0.4.1", 873 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 874 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 875 | }, 876 | "json-stringify-safe": { 877 | "version": "5.0.1", 878 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 879 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 880 | }, 881 | "jsonfile": { 882 | "version": "4.0.0", 883 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 884 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 885 | "requires": { 886 | "graceful-fs": "^4.1.6" 887 | } 888 | }, 889 | "jsprim": { 890 | "version": "1.4.1", 891 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 892 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 893 | "requires": { 894 | "assert-plus": "1.0.0", 895 | "extsprintf": "1.3.0", 896 | "json-schema": "0.2.3", 897 | "verror": "1.10.0" 898 | } 899 | }, 900 | "lcid": { 901 | "version": "1.0.0", 902 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 903 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 904 | "requires": { 905 | "invert-kv": "^1.0.0" 906 | } 907 | }, 908 | "listenercount": { 909 | "version": "1.0.1", 910 | "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", 911 | "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" 912 | }, 913 | "lodash": { 914 | "version": "4.17.21", 915 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 916 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 917 | }, 918 | "lodash.pad": { 919 | "version": "4.5.1", 920 | "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", 921 | "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=" 922 | }, 923 | "lodash.padend": { 924 | "version": "4.6.1", 925 | "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", 926 | "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=" 927 | }, 928 | "lodash.padstart": { 929 | "version": "4.6.1", 930 | "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", 931 | "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=" 932 | }, 933 | "make-dir": { 934 | "version": "3.0.2", 935 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", 936 | "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", 937 | "requires": { 938 | "semver": "^6.0.0" 939 | } 940 | }, 941 | "manage-path": { 942 | "version": "2.0.0", 943 | "resolved": "https://registry.npmjs.org/manage-path/-/manage-path-2.0.0.tgz", 944 | "integrity": "sha1-9M+EV7km7u4qg7FzUBQUvHbrlZc=", 945 | "dev": true 946 | }, 947 | "memoize-one": { 948 | "version": "5.1.1", 949 | "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.1.1.tgz", 950 | "integrity": "sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA==", 951 | "dev": true 952 | }, 953 | "memory-stream": { 954 | "version": "0.0.3", 955 | "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-0.0.3.tgz", 956 | "integrity": "sha1-6+jdHDuLw4wOeUHp3dWuvmtN6D8=", 957 | "requires": { 958 | "readable-stream": "~1.0.26-2" 959 | } 960 | }, 961 | "mime-db": { 962 | "version": "1.43.0", 963 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", 964 | "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" 965 | }, 966 | "mime-types": { 967 | "version": "2.1.26", 968 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", 969 | "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", 970 | "requires": { 971 | "mime-db": "1.43.0" 972 | } 973 | }, 974 | "minimatch": { 975 | "version": "3.0.4", 976 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 977 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 978 | "requires": { 979 | "brace-expansion": "^1.1.7" 980 | } 981 | }, 982 | "minimist": { 983 | "version": "1.2.5", 984 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 985 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 986 | }, 987 | "minipass": { 988 | "version": "3.1.3", 989 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", 990 | "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", 991 | "dev": true, 992 | "requires": { 993 | "yallist": "^4.0.0" 994 | } 995 | }, 996 | "minizlib": { 997 | "version": "2.1.2", 998 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", 999 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", 1000 | "dev": true, 1001 | "requires": { 1002 | "minipass": "^3.0.0", 1003 | "yallist": "^4.0.0" 1004 | } 1005 | }, 1006 | "mkdirp": { 1007 | "version": "1.0.4", 1008 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 1009 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 1010 | "dev": true 1011 | }, 1012 | "ms": { 1013 | "version": "2.1.2", 1014 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1015 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1016 | }, 1017 | "node-addon-api": { 1018 | "version": "1.7.1", 1019 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.1.tgz", 1020 | "integrity": "sha512-2+DuKodWvwRTrCfKOeR24KIc5unKjOh8mz17NCzVnHWfjAdDqbfbjqh7gUT+BkXBRQM52+xCHciKWonJ3CbJMQ==" 1021 | }, 1022 | "node-fetch": { 1023 | "version": "2.6.1", 1024 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 1025 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 1026 | }, 1027 | "npmlog": { 1028 | "version": "1.2.1", 1029 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", 1030 | "integrity": "sha1-KOe+YZYJtT960d0wChDWTXFiaLY=", 1031 | "requires": { 1032 | "ansi": "~0.3.0", 1033 | "are-we-there-yet": "~1.0.0", 1034 | "gauge": "~1.2.0" 1035 | } 1036 | }, 1037 | "number-is-nan": { 1038 | "version": "1.0.1", 1039 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1040 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 1041 | }, 1042 | "oauth-sign": { 1043 | "version": "0.9.0", 1044 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1045 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 1046 | }, 1047 | "once": { 1048 | "version": "1.4.0", 1049 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1050 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1051 | "requires": { 1052 | "wrappy": "1" 1053 | } 1054 | }, 1055 | "os-locale": { 1056 | "version": "1.4.0", 1057 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", 1058 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", 1059 | "requires": { 1060 | "lcid": "^1.0.0" 1061 | } 1062 | }, 1063 | "path-is-absolute": { 1064 | "version": "1.0.1", 1065 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1066 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1067 | }, 1068 | "path-key": { 1069 | "version": "3.1.1", 1070 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1071 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" 1072 | }, 1073 | "performance-now": { 1074 | "version": "2.1.0", 1075 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1076 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 1077 | }, 1078 | "postcss": { 1079 | "version": "7.0.35", 1080 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", 1081 | "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", 1082 | "dev": true, 1083 | "requires": { 1084 | "chalk": "^2.4.2", 1085 | "source-map": "^0.6.1", 1086 | "supports-color": "^6.1.0" 1087 | } 1088 | }, 1089 | "postcss-nodegui-autoprefixer": { 1090 | "version": "0.0.7", 1091 | "resolved": "https://registry.npmjs.org/postcss-nodegui-autoprefixer/-/postcss-nodegui-autoprefixer-0.0.7.tgz", 1092 | "integrity": "sha512-cPNAIz9siY+ssc3ecdPaeflfdc2HRS6tgQGu59YKLiiaZT3iMw578l1LTFfmEnJtv1RvNEQUNn/YjHyySXla2Q==", 1093 | "dev": true, 1094 | "requires": { 1095 | "postcss": "^7.0.17" 1096 | } 1097 | }, 1098 | "process-nextick-args": { 1099 | "version": "2.0.1", 1100 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1101 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1102 | }, 1103 | "progress": { 1104 | "version": "2.0.3", 1105 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1106 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" 1107 | }, 1108 | "psl": { 1109 | "version": "1.7.0", 1110 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", 1111 | "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==" 1112 | }, 1113 | "punycode": { 1114 | "version": "2.1.1", 1115 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1116 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1117 | }, 1118 | "qs": { 1119 | "version": "6.5.2", 1120 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1121 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 1122 | }, 1123 | "rc": { 1124 | "version": "1.2.8", 1125 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 1126 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 1127 | "requires": { 1128 | "deep-extend": "^0.6.0", 1129 | "ini": "~1.3.0", 1130 | "minimist": "^1.2.0", 1131 | "strip-json-comments": "~2.0.1" 1132 | } 1133 | }, 1134 | "readable-stream": { 1135 | "version": "1.0.34", 1136 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 1137 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 1138 | "requires": { 1139 | "core-util-is": "~1.0.0", 1140 | "inherits": "~2.0.1", 1141 | "isarray": "0.0.1", 1142 | "string_decoder": "~0.10.x" 1143 | } 1144 | }, 1145 | "request": { 1146 | "version": "2.88.2", 1147 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 1148 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 1149 | "requires": { 1150 | "aws-sign2": "~0.7.0", 1151 | "aws4": "^1.8.0", 1152 | "caseless": "~0.12.0", 1153 | "combined-stream": "~1.0.6", 1154 | "extend": "~3.0.2", 1155 | "forever-agent": "~0.6.1", 1156 | "form-data": "~2.3.2", 1157 | "har-validator": "~5.1.3", 1158 | "http-signature": "~1.2.0", 1159 | "is-typedarray": "~1.0.0", 1160 | "isstream": "~0.1.2", 1161 | "json-stringify-safe": "~5.0.1", 1162 | "mime-types": "~2.1.19", 1163 | "oauth-sign": "~0.9.0", 1164 | "performance-now": "^2.1.0", 1165 | "qs": "~6.5.2", 1166 | "safe-buffer": "^5.1.2", 1167 | "tough-cookie": "~2.5.0", 1168 | "tunnel-agent": "^0.6.0", 1169 | "uuid": "^3.3.2" 1170 | } 1171 | }, 1172 | "rimraf": { 1173 | "version": "2.7.1", 1174 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 1175 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 1176 | "requires": { 1177 | "glob": "^7.1.3" 1178 | } 1179 | }, 1180 | "rsvp": { 1181 | "version": "3.6.2", 1182 | "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", 1183 | "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==" 1184 | }, 1185 | "safe-buffer": { 1186 | "version": "5.1.2", 1187 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1188 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1189 | }, 1190 | "safer-buffer": { 1191 | "version": "2.1.2", 1192 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1193 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1194 | }, 1195 | "semver": { 1196 | "version": "6.3.0", 1197 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1198 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 1199 | }, 1200 | "setimmediate": { 1201 | "version": "1.0.5", 1202 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 1203 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 1204 | }, 1205 | "shebang-command": { 1206 | "version": "2.0.0", 1207 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1208 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1209 | "requires": { 1210 | "shebang-regex": "^3.0.0" 1211 | } 1212 | }, 1213 | "shebang-regex": { 1214 | "version": "3.0.0", 1215 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1216 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" 1217 | }, 1218 | "source-map": { 1219 | "version": "0.6.1", 1220 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1221 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1222 | "dev": true 1223 | }, 1224 | "source-map-support": { 1225 | "version": "0.2.10", 1226 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", 1227 | "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", 1228 | "requires": { 1229 | "source-map": "0.1.32" 1230 | }, 1231 | "dependencies": { 1232 | "source-map": { 1233 | "version": "0.1.32", 1234 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", 1235 | "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", 1236 | "requires": { 1237 | "amdefine": ">=0.0.4" 1238 | } 1239 | } 1240 | } 1241 | }, 1242 | "splitargs": { 1243 | "version": "0.0.7", 1244 | "resolved": "https://registry.npmjs.org/splitargs/-/splitargs-0.0.7.tgz", 1245 | "integrity": "sha1-/p965lc3GzOxDLgNoUPPgknPazs=" 1246 | }, 1247 | "sshpk": { 1248 | "version": "1.16.1", 1249 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 1250 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 1251 | "requires": { 1252 | "asn1": "~0.2.3", 1253 | "assert-plus": "^1.0.0", 1254 | "bcrypt-pbkdf": "^1.0.0", 1255 | "dashdash": "^1.12.0", 1256 | "ecc-jsbn": "~0.1.1", 1257 | "getpass": "^0.1.1", 1258 | "jsbn": "~0.1.0", 1259 | "safer-buffer": "^2.0.2", 1260 | "tweetnacl": "~0.14.0" 1261 | } 1262 | }, 1263 | "string-width": { 1264 | "version": "1.0.2", 1265 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1266 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 1267 | "requires": { 1268 | "code-point-at": "^1.0.0", 1269 | "is-fullwidth-code-point": "^1.0.0", 1270 | "strip-ansi": "^3.0.0" 1271 | } 1272 | }, 1273 | "string_decoder": { 1274 | "version": "0.10.31", 1275 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 1276 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 1277 | }, 1278 | "strip-ansi": { 1279 | "version": "3.0.1", 1280 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1281 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1282 | "requires": { 1283 | "ansi-regex": "^2.0.0" 1284 | } 1285 | }, 1286 | "strip-json-comments": { 1287 | "version": "2.0.1", 1288 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1289 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 1290 | }, 1291 | "supports-color": { 1292 | "version": "6.1.0", 1293 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", 1294 | "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", 1295 | "dev": true, 1296 | "requires": { 1297 | "has-flag": "^3.0.0" 1298 | } 1299 | }, 1300 | "tar": { 1301 | "version": "6.1.0", 1302 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", 1303 | "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", 1304 | "dev": true, 1305 | "requires": { 1306 | "chownr": "^2.0.0", 1307 | "fs-minipass": "^2.0.0", 1308 | "minipass": "^3.0.0", 1309 | "minizlib": "^2.1.1", 1310 | "mkdirp": "^1.0.3", 1311 | "yallist": "^4.0.0" 1312 | }, 1313 | "dependencies": { 1314 | "chownr": { 1315 | "version": "2.0.0", 1316 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", 1317 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", 1318 | "dev": true 1319 | } 1320 | } 1321 | }, 1322 | "tough-cookie": { 1323 | "version": "2.5.0", 1324 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 1325 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 1326 | "requires": { 1327 | "psl": "^1.1.28", 1328 | "punycode": "^2.1.1" 1329 | } 1330 | }, 1331 | "traceur": { 1332 | "version": "0.0.111", 1333 | "resolved": "https://registry.npmjs.org/traceur/-/traceur-0.0.111.tgz", 1334 | "integrity": "sha1-wE3nTRRpbDNzQn3k/Ajsr5E/w6E=", 1335 | "requires": { 1336 | "commander": "2.9.x", 1337 | "glob": "5.0.x", 1338 | "rsvp": "^3.0.13", 1339 | "semver": "^4.3.3", 1340 | "source-map-support": "~0.2.8" 1341 | }, 1342 | "dependencies": { 1343 | "glob": { 1344 | "version": "5.0.15", 1345 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 1346 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", 1347 | "requires": { 1348 | "inflight": "^1.0.4", 1349 | "inherits": "2", 1350 | "minimatch": "2 || 3", 1351 | "once": "^1.3.0", 1352 | "path-is-absolute": "^1.0.0" 1353 | } 1354 | }, 1355 | "semver": { 1356 | "version": "4.3.6", 1357 | "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", 1358 | "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=" 1359 | } 1360 | } 1361 | }, 1362 | "traverse": { 1363 | "version": "0.3.9", 1364 | "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", 1365 | "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" 1366 | }, 1367 | "tunnel-agent": { 1368 | "version": "0.6.0", 1369 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1370 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1371 | "requires": { 1372 | "safe-buffer": "^5.0.1" 1373 | } 1374 | }, 1375 | "tweetnacl": { 1376 | "version": "0.14.5", 1377 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1378 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 1379 | }, 1380 | "typescript": { 1381 | "version": "3.8.3", 1382 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", 1383 | "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", 1384 | "dev": true 1385 | }, 1386 | "universalify": { 1387 | "version": "0.1.2", 1388 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1389 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" 1390 | }, 1391 | "unzipper": { 1392 | "version": "0.8.14", 1393 | "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.8.14.tgz", 1394 | "integrity": "sha512-8rFtE7EP5ssOwGpN2dt1Q4njl0N1hUXJ7sSPz0leU2hRdq6+pra57z4YPBlVqm40vcgv6ooKZEAx48fMTv9x4w==", 1395 | "requires": { 1396 | "big-integer": "^1.6.17", 1397 | "binary": "~0.3.0", 1398 | "bluebird": "~3.4.1", 1399 | "buffer-indexof-polyfill": "~1.0.0", 1400 | "duplexer2": "~0.1.4", 1401 | "fstream": "~1.0.10", 1402 | "listenercount": "~1.0.1", 1403 | "readable-stream": "~2.1.5", 1404 | "setimmediate": "~1.0.4" 1405 | }, 1406 | "dependencies": { 1407 | "isarray": { 1408 | "version": "1.0.0", 1409 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1410 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1411 | }, 1412 | "process-nextick-args": { 1413 | "version": "1.0.7", 1414 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 1415 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" 1416 | }, 1417 | "readable-stream": { 1418 | "version": "2.1.5", 1419 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", 1420 | "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", 1421 | "requires": { 1422 | "buffer-shims": "^1.0.0", 1423 | "core-util-is": "~1.0.0", 1424 | "inherits": "~2.0.1", 1425 | "isarray": "~1.0.0", 1426 | "process-nextick-args": "~1.0.6", 1427 | "string_decoder": "~0.10.x", 1428 | "util-deprecate": "~1.0.1" 1429 | } 1430 | } 1431 | } 1432 | }, 1433 | "uri-js": { 1434 | "version": "4.2.2", 1435 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1436 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1437 | "requires": { 1438 | "punycode": "^2.1.0" 1439 | } 1440 | }, 1441 | "url-join": { 1442 | "version": "0.0.1", 1443 | "resolved": "https://registry.npmjs.org/url-join/-/url-join-0.0.1.tgz", 1444 | "integrity": "sha1-HbSK1CLTQCRpqH99l73r/k+x48g=" 1445 | }, 1446 | "util-deprecate": { 1447 | "version": "1.0.2", 1448 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1449 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1450 | }, 1451 | "uuid": { 1452 | "version": "3.4.0", 1453 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 1454 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 1455 | }, 1456 | "verror": { 1457 | "version": "1.10.0", 1458 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1459 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1460 | "requires": { 1461 | "assert-plus": "^1.0.0", 1462 | "core-util-is": "1.0.2", 1463 | "extsprintf": "^1.2.0" 1464 | } 1465 | }, 1466 | "which": { 1467 | "version": "1.3.1", 1468 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1469 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1470 | "requires": { 1471 | "isexe": "^2.0.0" 1472 | } 1473 | }, 1474 | "window-size": { 1475 | "version": "0.1.4", 1476 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", 1477 | "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" 1478 | }, 1479 | "wrap-ansi": { 1480 | "version": "2.1.0", 1481 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 1482 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 1483 | "requires": { 1484 | "string-width": "^1.0.1", 1485 | "strip-ansi": "^3.0.1" 1486 | } 1487 | }, 1488 | "wrappy": { 1489 | "version": "1.0.2", 1490 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1491 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1492 | }, 1493 | "y18n": { 1494 | "version": "3.2.1", 1495 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", 1496 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" 1497 | }, 1498 | "yallist": { 1499 | "version": "4.0.0", 1500 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1501 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1502 | "dev": true 1503 | }, 1504 | "yargs": { 1505 | "version": "3.32.0", 1506 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", 1507 | "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", 1508 | "requires": { 1509 | "camelcase": "^2.0.1", 1510 | "cliui": "^3.0.3", 1511 | "decamelize": "^1.1.1", 1512 | "os-locale": "^1.4.0", 1513 | "string-width": "^1.0.1", 1514 | "window-size": "^0.1.4", 1515 | "y18n": "^3.2.0" 1516 | } 1517 | } 1518 | } 1519 | } 1520 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodegui-plugin-webview", 3 | "version": "1.1.1", 4 | "description": "Webview plugin for NodeGui", 5 | "main": "dist/index.js", 6 | "typings": "dist/index.d.ts", 7 | "scripts": { 8 | "build": "cross-env tsc && npm run build:addon", 9 | "build:addon": "cross-env CMAKE_BUILD_PARALLEL_LEVEL=8 cmake-js compile", 10 | "dev": "cross-env npm run build && qode dist/demo.js", 11 | "postinstall": "node ./scripts/install.js && npm run build:addon" 12 | }, 13 | "author": "Atul R", 14 | "license": "MIT", 15 | "peerDependencies": { 16 | "@nodegui/nodegui": ">=0.30.2" 17 | }, 18 | "dependencies": { 19 | "@nodegui/artifact-installer": "^1.1.0", 20 | "cmake-js": "^6.1.0", 21 | "cross-env": "^7.0.3", 22 | "node-addon-api": "^3.1.0" 23 | }, 24 | "devDependencies": { 25 | "@nodegui/nodegui": "^0.30.2", 26 | "@types/node": "^14.14.32", 27 | "typescript": "^4.2.3" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Document 8 | 19 | 20 | 21 |

Transparent Background

22 |
23 | 24 | 25 | -------------------------------------------------------------------------------- /scripts/install.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const { setupArtifact } = require("@nodegui/artifact-installer"); 4 | const { 5 | miniQt, 6 | useCustomQt, 7 | qtHome 8 | } = require("@nodegui/nodegui/config/qtConfig"); 9 | const os = require("os"); 10 | const path = require("path"); 11 | const fs = require("fs"); 12 | 13 | const checkIfExists = fullPath => { 14 | return () => fs.existsSync(fullPath); 15 | }; 16 | 17 | function getMiniQtWebviewArtifacts() { 18 | if (miniQt.version !== "5.14.1") { 19 | throw new Error( 20 | `Unsupported miniqt version ${miniQt.version}. Please raise an issue ticket on the plugin repo. This plugin only supports miniQt version 5.14.1, the author of the plugin will need to update the download links.` 21 | ); 22 | } 23 | 24 | switch (os.platform()) { 25 | case "darwin": { 26 | return { 27 | artifacts: [ 28 | { 29 | name: "Qt WebEngine", 30 | link: `https://download.qt.io/online/qtsdkrepository/mac_x64/desktop/qt5_5141/qt.qt5.5141.qtwebengine.clang_64/5.14.1-0-202001241000qtwebengine-MacOS-MacOS_10_13-Clang-MacOS-MacOS_10_13-X86_64.7z`, 31 | skipSetup: checkIfExists( 32 | path.resolve( 33 | qtHome, 34 | "lib", 35 | "cmake", 36 | "Qt5WebEngine", 37 | "Qt5WebEngineConfig.cmake" 38 | ) 39 | ) 40 | }, 41 | { 42 | name: "Qt Declarative", 43 | link: `https://download.qt.io/online/qtsdkrepository/mac_x64/desktop/qt5_5141/qt.qt5.5141.clang_64/5.14.1-0-202001241000qtdeclarative-MacOS-MacOS_10_13-Clang-MacOS-MacOS_10_13-X86_64.7z`, 44 | skipSetup: checkIfExists(path.resolve(qtHome, "bin", "qmlmin")) 45 | }, 46 | { 47 | name: "Qt WebChannel", 48 | link: `https://download.qt.io/online/qtsdkrepository/mac_x64/desktop/qt5_5141/qt.qt5.5141.clang_64/5.14.1-0-202001241000qtwebchannel-MacOS-MacOS_10_13-Clang-MacOS-MacOS_10_13-X86_64.7z`, 49 | skipSetup: checkIfExists( 50 | path.resolve( 51 | qtHome, 52 | "lib", 53 | "cmake", 54 | "Qt5WebChannel", 55 | "Qt5WebChannelConfig.cmake" 56 | ) 57 | ) 58 | }, 59 | { 60 | name: "Qt Location", 61 | link: `https://download.qt.io/online/qtsdkrepository/mac_x64/desktop/qt5_5141/qt.qt5.5141.clang_64/5.14.1-0-202001241000qtlocation-MacOS-MacOS_10_13-Clang-MacOS-MacOS_10_13-X86_64.7z`, 62 | skipSetup: checkIfExists( 63 | path.resolve( 64 | qtHome, 65 | "lib", 66 | "cmake", 67 | "Qt5Location", 68 | "Qt5LocationConfig.cmake" 69 | ) 70 | ) 71 | } 72 | ] 73 | }; 74 | } 75 | case "win32": { 76 | return { 77 | artifacts: [ 78 | { 79 | name: "Qt WebEngine", 80 | link: `https://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_5141/qt.qt5.5141.qtwebengine.win64_msvc2017_64/5.14.1-0-202001240957qtwebengine-Windows-Windows_10-MSVC2017-Windows-Windows_10-X86_64.7z`, 81 | skipSetup: checkIfExists( 82 | path.resolve( 83 | qtHome, 84 | "lib", 85 | "cmake", 86 | "Qt5WebEngine", 87 | "Qt5WebEngineConfig.cmake" 88 | ) 89 | ) 90 | }, 91 | { 92 | name: "Qt Declarative", 93 | link: `https://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_5141/qt.qt5.5141.win64_msvc2017_64/5.14.1-0-202001240957qtdeclarative-Windows-Windows_10-MSVC2017-Windows-Windows_10-X86_64.7z`, 94 | skipSetup: checkIfExists(path.resolve(qtHome, "bin", "Qt5Qml.dll")) 95 | }, 96 | { 97 | name: "Qt WebChannel", 98 | link: `https://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_5141/qt.qt5.5141.win64_msvc2017_64/5.14.1-0-202001240957qtwebchannel-Windows-Windows_10-MSVC2017-Windows-Windows_10-X86_64.7z`, 99 | skipSetup: checkIfExists( 100 | path.resolve(qtHome, "bin", "Qt5WebChannel.dll") 101 | ) 102 | }, 103 | { 104 | name: "Qt Location", 105 | link: `https://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_5141/qt.qt5.5141.win64_msvc2017_64/5.14.1-0-202001240957qtlocation-Windows-Windows_10-MSVC2017-Windows-Windows_10-X86_64.7z`, 106 | skipSetup: checkIfExists( 107 | path.resolve(qtHome, "bin", "Qt5Location.dll") 108 | ) 109 | } 110 | ] 111 | }; 112 | } 113 | case "linux": { 114 | return { 115 | artifacts: [ 116 | { 117 | name: "Qt WebEngine", 118 | link: `https://download.qt.io/online/qtsdkrepository/linux_x64/desktop/qt5_5141/qt.qt5.5141.qtwebengine.gcc_64/5.14.1-0-202001240953qtwebengine-Linux-RHEL_7_6-GCC-Linux-RHEL_7_6-X86_64.7z`, 119 | skipSetup: checkIfExists( 120 | path.resolve(qtHome, "bin", "Qt5Location.dll") 121 | ) 122 | }, 123 | { 124 | name: "Qt Declarative", 125 | link: `https://download.qt.io/online/qtsdkrepository/linux_x64/desktop/qt5_5141/qt.qt5.5141.gcc_64/5.14.1-0-202001240953qtdeclarative-Linux-RHEL_7_6-GCC-Linux-RHEL_7_6-X86_64.7z`, 126 | skipSetup: checkIfExists(path.resolve(qtHome, "bin", "qmlmin")) 127 | }, 128 | { 129 | name: "Qt WebChannel", 130 | link: `https://download.qt.io/online/qtsdkrepository/linux_x64/desktop/qt5_5141/qt.qt5.5141.gcc_64/5.14.1-0-202001240953qtwebchannel-Linux-RHEL_7_6-GCC-Linux-RHEL_7_6-X86_64.7z`, 131 | skipSetup: checkIfExists( 132 | path.resolve( 133 | qtHome, 134 | "lib", 135 | "cmake", 136 | "Qt5WebChannel", 137 | "Qt5WebChannelConfig.cmake" 138 | ) 139 | ) 140 | }, 141 | { 142 | name: "Qt Location", 143 | link: `https://download.qt.io/online/qtsdkrepository/linux_x64/desktop/qt5_5141/qt.qt5.5141.gcc_64/5.14.1-0-202001240953qtlocation-Linux-RHEL_7_6-GCC-Linux-RHEL_7_6-X86_64.7z`, 144 | skipSetup: checkIfExists( 145 | path.resolve( 146 | qtHome, 147 | "lib", 148 | "cmake", 149 | "Qt5Location", 150 | "Qt5LocationConfig.cmake" 151 | ) 152 | ) 153 | } 154 | ] 155 | }; 156 | } 157 | } 158 | } 159 | 160 | async function setupQt() { 161 | const webviewArtifacts = getMiniQtWebviewArtifacts(); 162 | return Promise.all( 163 | webviewArtifacts.artifacts.map(async artifact => 164 | setupArtifact({ 165 | outDir: miniQt.setupDir, 166 | id: "nodegui-mini-qtwebview", //cache-id 167 | displayName: `${artifact.name} for Minimal Qt: ${miniQt.version} installation`, 168 | downloadLink: artifact.link, 169 | skipSetup: artifact.skipSetup 170 | }) 171 | ) 172 | ); 173 | } 174 | 175 | if (!useCustomQt) { 176 | console.log(`Minimal Qt ${miniQt.version} setup:`); 177 | 178 | setupQt().catch(err => { 179 | console.error(err); 180 | process.exit(1); 181 | }); 182 | } else { 183 | console.log( 184 | `CustomQt detected at ${qtHome} . Hence, skipping Mini Qt installation...` 185 | ); 186 | } 187 | -------------------------------------------------------------------------------- /src/cpp/QWebChannel/nwebchannel.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | #include 6 | 7 | #include "nodegui/core/Events/eventwidget.h" 8 | #include "nodegui/core/Events/eventwidget_macro.h" 9 | 10 | class DLL_EXPORT NWebChannel : public QWebChannel, public EventWidget { 11 | Q_OBJECT 12 | EVENTWIDGET_IMPLEMENTATIONS(QWebChannel) 13 | public: 14 | using QWebChannel::QWebChannel; 15 | 16 | void connectSignalsToEventEmitter() { } 17 | }; -------------------------------------------------------------------------------- /src/cpp/QWebChannel/qwebchannel_wrap.cpp: -------------------------------------------------------------------------------- 1 | #include "qwebchannel_wrap.h" 2 | 3 | #include 4 | #include 5 | #include 6 | 7 | #include "nodegui/Extras/Utils/nutils.h" 8 | #include "nodegui/QtCore/QObject/qobject_wrap.h" 9 | 10 | Napi::FunctionReference QWebChannelWrap::constructor; 11 | 12 | Napi::Object QWebChannelWrap::init(Napi::Env env, Napi::Object exports) { 13 | Napi::HandleScope scope(env); 14 | char CLASSNAME[] = "QWebChannel"; 15 | Napi::Function func = DefineClass( 16 | env, CLASSNAME, 17 | {InstanceMethod("registerObject", &QWebChannelWrap::registerObject), 18 | InstanceMethod("deregisterObject", &QWebChannelWrap::deregisterObject), 19 | COMPONENT_WRAPPED_METHODS_EXPORT_DEFINE(QWebChannelWrap)}); 20 | constructor = Napi::Persistent(func); 21 | exports.Set(CLASSNAME, func); 22 | return exports; 23 | } 24 | 25 | QWebChannelWrap::QWebChannelWrap(const Napi::CallbackInfo& info) 26 | : Napi::ObjectWrap(info) { 27 | Napi::Env env = info.Env(); 28 | Napi::HandleScope scope(env); 29 | 30 | if (info[0].IsExternal()) { 31 | this->instance = info[0].As>().Data(); 32 | } else if (info.Length() == 1) { 33 | Napi::Object parentObject = info[0].As(); 34 | QObjectWrap* parentWrap = 35 | Napi::ObjectWrap::Unwrap(parentObject); 36 | this->instance = new NWebChannel(parentWrap->getInternalInstance()); 37 | } else if (info.Length() == 0) { 38 | this->instance = new NWebChannel(); 39 | } else { 40 | Napi::TypeError::New(env, "Incorrect initialization of QWebChannelWrap") 41 | .ThrowAsJavaScriptException(); 42 | } 43 | this->rawData = extrautils::configureComponent(this->getInternalInstance()); 44 | } 45 | 46 | QWebChannelWrap::~QWebChannelWrap() { extrautils::safeDelete(this->instance); } 47 | 48 | NWebChannel* QWebChannelWrap::getInternalInstance() { return this->instance; } 49 | 50 | Napi::Value QWebChannelWrap::registerObject(const Napi::CallbackInfo& info) { 51 | Napi::Env env = info.Env(); 52 | Napi::HandleScope scope(env); 53 | 54 | Napi::String napiName = info[0].As(); 55 | std::string name = napiName.Utf8Value(); 56 | 57 | Napi::Object napiObject = info[1].As(); 58 | QObjectWrap* objectWrap = Napi::ObjectWrap::Unwrap(napiObject); 59 | 60 | this->instance->registerObject(QString::fromUtf8(name.c_str()), 61 | objectWrap->getInternalInstance()); 62 | return env.Null(); 63 | } 64 | 65 | Napi::Value QWebChannelWrap::deregisterObject(const Napi::CallbackInfo& info) { 66 | Napi::Env env = info.Env(); 67 | Napi::HandleScope scope(env); 68 | 69 | Napi::Object napiObject = info[0].As(); 70 | QObjectWrap* objectWrap = Napi::ObjectWrap::Unwrap(napiObject); 71 | 72 | this->instance->deregisterObject(objectWrap->getInternalInstance()); 73 | return env.Null(); 74 | } 75 | -------------------------------------------------------------------------------- /src/cpp/QWebChannel/qwebchannel_wrap.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | 6 | #include 7 | 8 | #include "QtCore/QObject/qobject_macro.h" 9 | #include "nwebchannel.hpp" 10 | 11 | class DLL_EXPORT QWebChannelWrap : public Napi::ObjectWrap { 12 | QOBJECT_WRAPPED_METHODS_DECLARATION 13 | private: 14 | QPointer instance; 15 | 16 | public: 17 | static Napi::FunctionReference constructor; 18 | static Napi::Object init(Napi::Env env, Napi::Object exports); 19 | QWebChannelWrap(const Napi::CallbackInfo& info); 20 | ~QWebChannelWrap(); 21 | NWebChannel* getInternalInstance(); 22 | // Wrapped methods 23 | Napi::Value registerObject(const Napi::CallbackInfo& info); 24 | Napi::Value deregisterObject(const Napi::CallbackInfo& info); 25 | }; 26 | -------------------------------------------------------------------------------- /src/cpp/QWebEnginePage/qwebenginepage_wrap.cpp: -------------------------------------------------------------------------------- 1 | #include "qwebenginepage_wrap.h" 2 | 3 | #include "Extras/Utils/nutils.h" 4 | #include "src/cpp/QWebChannel/qwebchannel_wrap.h" 5 | #include 6 | 7 | 8 | Napi::FunctionReference QWebEnginePageWrap::constructor; 9 | 10 | Napi::Object QWebEnginePageWrap::init(Napi::Env env, Napi::Object exports) { 11 | Napi::HandleScope scope(env); 12 | char CLASSNAME[] = "QWebEnginePage"; 13 | Napi::Function func = DefineClass( 14 | env, CLASSNAME, 15 | {InstanceMethod("setWebChannel", &QWebEnginePageWrap::setWebChannel), 16 | InstanceMethod("webChannel", &QWebEnginePageWrap::webChannel), 17 | InstanceMethod("runJavaScript", &QWebEnginePageWrap::runJavaScript), 18 | InstanceMethod("setBackgroundColor", &QWebEnginePageWrap::setBackgroundColor), 19 | COMPONENT_WRAPPED_METHODS_EXPORT_DEFINE(QWebEnginePageWrap)}); 20 | constructor = Napi::Persistent(func); 21 | exports.Set(CLASSNAME, func); 22 | return exports; 23 | } 24 | 25 | QWebEnginePageWrap::QWebEnginePageWrap(const Napi::CallbackInfo& info) 26 | : Napi::ObjectWrap(info) { 27 | Napi::Env env = info.Env(); 28 | Napi::HandleScope scope(env); 29 | if (info[0].IsExternal()) { 30 | this->instance = info[0].As>().Data(); 31 | } else { 32 | Napi::TypeError::New(env, "Incorrect initialization of QWebEnginePageWrap") 33 | .ThrowAsJavaScriptException(); 34 | } 35 | this->rawData = extrautils::configureComponent(this->getInternalInstance()); 36 | } 37 | 38 | QWebEnginePage* QWebEnginePageWrap::getInternalInstance() { 39 | return this->instance; 40 | } 41 | 42 | Napi::Value QWebEnginePageWrap::runJavaScript(const Napi::CallbackInfo& info) { 43 | Napi::Env env = info.Env(); 44 | Napi::HandleScope scope(env); 45 | 46 | Napi::String napiScript = info[0].As(); 47 | std::string script = napiScript.Utf8Value(); 48 | 49 | this->instance->runJavaScript(QString::fromUtf8(script.c_str())); 50 | return env.Null(); 51 | } 52 | 53 | Napi::Value QWebEnginePageWrap::setWebChannel(const Napi::CallbackInfo& info) { 54 | Napi::Env env = info.Env(); 55 | Napi::HandleScope scope(env); 56 | 57 | Napi::Object channel = info[0].As(); 58 | QWebChannelWrap* channelWrap = 59 | Napi::ObjectWrap::Unwrap(channel); 60 | 61 | this->instance->setWebChannel(channelWrap->getInternalInstance()); 62 | return env.Null(); 63 | } 64 | 65 | Napi::Value QWebEnginePageWrap::webChannel(const Napi::CallbackInfo& info) { 66 | Napi::Env env = info.Env(); 67 | Napi::HandleScope scope(env); 68 | 69 | QWebChannel* webChannel = this->instance->webChannel(); 70 | return QWebChannelWrap::constructor.New( 71 | {Napi::External::New(env, webChannel)}); 72 | } 73 | 74 | Napi::Value QWebEnginePageWrap::setBackgroundColor(const Napi::CallbackInfo& info) { 75 | Napi::Env env = info.Env(); 76 | Napi::HandleScope scope(env); 77 | Napi::Object colorObject = info[0].As(); 78 | QColorWrap* colorWrap = Napi::ObjectWrap::Unwrap(colorObject); 79 | this->instance->setBackgroundColor(*colorWrap->getInternalInstance()); 80 | return env.Null(); 81 | } 82 | -------------------------------------------------------------------------------- /src/cpp/QWebEnginePage/qwebenginepage_wrap.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | 7 | class QWebEnginePageWrap : public Napi::ObjectWrap { 8 | COMPONENT_WRAPPED_METHODS_DECLARATION 9 | 10 | private: 11 | QWebEnginePage* instance; 12 | 13 | public: 14 | static Napi::FunctionReference constructor; 15 | static Napi::Object init(Napi::Env env, Napi::Object exports); 16 | QWebEnginePageWrap(const Napi::CallbackInfo& info); 17 | QWebEnginePage* getInternalInstance(); 18 | // Wrapped methods 19 | Napi::Value runJavaScript(const Napi::CallbackInfo& info); 20 | Napi::Value setWebChannel(const Napi::CallbackInfo& info); 21 | Napi::Value webChannel(const Napi::CallbackInfo& info); 22 | Napi::Value setBackgroundColor(const Napi::CallbackInfo& info); 23 | }; 24 | -------------------------------------------------------------------------------- /src/cpp/QWebEngineSettings/qwebenginesettings_wrap.cpp: -------------------------------------------------------------------------------- 1 | #include "qwebenginesettings_wrap.h" 2 | 3 | #include "Extras/Utils/nutils.h" 4 | 5 | Napi::FunctionReference QWebEngineSettingsWrap::constructor; 6 | 7 | Napi::Object QWebEngineSettingsWrap::init(Napi::Env env, Napi::Object exports) { 8 | Napi::HandleScope scope(env); 9 | char CLASSNAME[] = "QWebEngineSettings"; 10 | Napi::Function func = DefineClass( 11 | env, CLASSNAME, 12 | {InstanceMethod("setUnknownUrlSchemePolicy", 13 | &QWebEngineSettingsWrap::setUnknownUrlSchemePolicy), 14 | COMPONENT_WRAPPED_METHODS_EXPORT_DEFINE(QWebEngineSettingsWrap)}); 15 | constructor = Napi::Persistent(func); 16 | exports.Set(CLASSNAME, func); 17 | return exports; 18 | } 19 | 20 | QWebEngineSettingsWrap::QWebEngineSettingsWrap(const Napi::CallbackInfo& info) 21 | : Napi::ObjectWrap(info) { 22 | Napi::Env env = info.Env(); 23 | Napi::HandleScope scope(env); 24 | if (info[0].IsExternal()) { 25 | this->instance = info[0].As>().Data(); 26 | } else { 27 | Napi::TypeError::New(env, 28 | "Incorrect initialization of QWebEngineSettingsWrap") 29 | .ThrowAsJavaScriptException(); 30 | } 31 | this->rawData = extrautils::configureComponent(this->getInternalInstance()); 32 | } 33 | 34 | QWebEngineSettings* QWebEngineSettingsWrap::getInternalInstance() { 35 | return this->instance; 36 | } 37 | 38 | Napi::Value QWebEngineSettingsWrap::setUnknownUrlSchemePolicy( 39 | const Napi::CallbackInfo& info) { 40 | Napi::Env env = info.Env(); 41 | Napi::HandleScope scope(env); 42 | Napi::Number mode = info[0].As(); 43 | this->instance->setUnknownUrlSchemePolicy( 44 | static_cast( 45 | mode.Int32Value())); 46 | return env.Null(); 47 | } 48 | -------------------------------------------------------------------------------- /src/cpp/QWebEngineSettings/qwebenginesettings_wrap.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | 7 | class QWebEngineSettingsWrap : public Napi::ObjectWrap { 8 | COMPONENT_WRAPPED_METHODS_DECLARATION 9 | 10 | private: 11 | QWebEngineSettings* instance; 12 | 13 | public: 14 | static Napi::FunctionReference constructor; 15 | static Napi::Object init(Napi::Env env, Napi::Object exports); 16 | QWebEngineSettingsWrap(const Napi::CallbackInfo& info); 17 | QWebEngineSettings* getInternalInstance(); 18 | // Wrapped methods 19 | Napi::Value setUnknownUrlSchemePolicy(const Napi::CallbackInfo& info); 20 | }; 21 | -------------------------------------------------------------------------------- /src/cpp/QWebEngineView/nwebengineview.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | #include 6 | #include "nodegui/QtWidgets/QWidget/qwidget_macro.h" 7 | 8 | class NWebEngineView : public QWebEngineView, public NodeWidget { 9 | Q_OBJECT 10 | NODEWIDGET_IMPLEMENTATIONS(QWebEngineView) 11 | public: 12 | using QWebEngineView::QWebEngineView; 13 | 14 | void connectSignalsToEventEmitter() { 15 | QWIDGET_SIGNALS 16 | // Qt Connects: Implement all signal connects here 17 | QObject::connect(this, &QWebEngineView::loadFinished, [=](bool ok) { 18 | Napi::Env env = this->emitOnNode.Env(); 19 | Napi::HandleScope scope(env); 20 | this->emitOnNode.Call( 21 | {Napi::Value::From(env, "loadFinished"), Napi::Value::From(env, ok)}); 22 | }); 23 | QObject::connect(this, &QWebEngineView::loadProgress, [=](int progress) { 24 | Napi::Env env = this->emitOnNode.Env(); 25 | Napi::HandleScope scope(env); 26 | this->emitOnNode.Call({Napi::Value::From(env, "loadProgress"), 27 | Napi::Value::From(env, progress)}); 28 | }); 29 | QObject::connect(this, &QWebEngineView::loadStarted, [=]() { 30 | Napi::Env env = this->emitOnNode.Env(); 31 | Napi::HandleScope scope(env); 32 | this->emitOnNode.Call({Napi::Value::From(env, "loadStarted")}); 33 | }); 34 | QObject::connect(this, &QWebEngineView::selectionChanged, [=]() { 35 | Napi::Env env = this->emitOnNode.Env(); 36 | Napi::HandleScope scope(env); 37 | this->emitOnNode.Call({Napi::Value::From(env, "selectionChanged")}); 38 | }); 39 | QObject::connect(this, &QWebEngineView::urlChanged, [=](QUrl url) { 40 | Napi::Env env = this->emitOnNode.Env(); 41 | Napi::HandleScope scope(env); 42 | this->emitOnNode.Call( 43 | {Napi::Value::From(env, "urlChanged"), 44 | Napi::Value::From(env, url.toString().toStdString())}); 45 | }); 46 | QObject::connect(this, &QWebEngineView::titleChanged, [=](QString title) { 47 | Napi::Env env = this->emitOnNode.Env(); 48 | Napi::HandleScope scope(env); 49 | this->emitOnNode.Call({Napi::Value::From(env, "titleChanged"), 50 | Napi::Value::From(env, title.toStdString())}); 51 | }); 52 | } 53 | }; 54 | -------------------------------------------------------------------------------- /src/cpp/QWebEngineView/qwebengineview_wrap.cpp: -------------------------------------------------------------------------------- 1 | #include "qwebengineview_wrap.h" 2 | 3 | #include "src/cpp/QWebEngineSettings/qwebenginesettings_wrap.h" 4 | #include "src/cpp/QWebEnginePage/qwebenginepage_wrap.h" 5 | #include 6 | #include 7 | #include "nodegui/Extras/Utils/nutils.h" 8 | #include "nodegui/QtWidgets/QWidget/qwidget_wrap.h" 9 | 10 | Napi::FunctionReference QWebEngineViewWrap::constructor; 11 | 12 | Napi::Object QWebEngineViewWrap::init(Napi::Env env, Napi::Object exports) { 13 | Napi::HandleScope scope(env); 14 | char CLASSNAME[] = "QWebEngineView"; 15 | Napi::Function func = 16 | DefineClass(env, CLASSNAME, 17 | {InstanceMethod("settings", &QWebEngineViewWrap::settings), 18 | InstanceMethod("page", &QWebEngineViewWrap::page), 19 | QWIDGET_WRAPPED_METHODS_EXPORT_DEFINE(QWebEngineViewWrap)}); 20 | constructor = Napi::Persistent(func); 21 | exports.Set(CLASSNAME, func); 22 | return exports; 23 | } 24 | 25 | NWebEngineView* QWebEngineViewWrap::getInternalInstance() { 26 | return this->instance; 27 | } 28 | 29 | QWebEngineViewWrap::QWebEngineViewWrap(const Napi::CallbackInfo& info) 30 | : Napi::ObjectWrap(info) { 31 | Napi::Env env = info.Env(); 32 | Napi::HandleScope scope(env); 33 | 34 | if (info.Length() == 1) { 35 | Napi::Object parentObject = info[0].As(); 36 | NodeWidgetWrap* parentWidgetWrap = 37 | Napi::ObjectWrap::Unwrap(parentObject); 38 | this->instance = 39 | new NWebEngineView(parentWidgetWrap->getInternalInstance()); 40 | } else if (info.Length() == 0) { 41 | this->instance = new NWebEngineView(); 42 | } else { 43 | Napi::TypeError::New(env, "Wrong number of arguments") 44 | .ThrowAsJavaScriptException(); 45 | } 46 | this->rawData = extrautils::configureQWidget( 47 | this->getInternalInstance(), this->getInternalInstance()->getFlexNode(), 48 | true); 49 | } 50 | 51 | QWebEngineViewWrap::~QWebEngineViewWrap() { 52 | extrautils::safeDelete(this->instance); 53 | } 54 | 55 | Napi::Value QWebEngineViewWrap::settings(const Napi::CallbackInfo& info) { 56 | Napi::Env env = info.Env(); 57 | Napi::HandleScope scope(env); 58 | QWebEngineSettings* settings = this->instance->settings(); 59 | return QWebEngineSettingsWrap::constructor.New( 60 | {Napi::External::New(env, settings)}); 61 | } 62 | 63 | Napi::Value QWebEngineViewWrap::page(const Napi::CallbackInfo& info) { 64 | Napi::Env env = info.Env(); 65 | Napi::HandleScope scope(env); 66 | QWebEnginePage* page = this->instance->page(); 67 | return QWebEnginePageWrap::constructor.New( 68 | {Napi::External::New(env, page)}); 69 | } -------------------------------------------------------------------------------- /src/cpp/QWebEngineView/qwebengineview_wrap.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | #include 6 | #include "nodegui/QtWidgets/QWidget/qwidget_macro.h" 7 | #include "nwebengineview.hpp" 8 | 9 | class QWebEngineViewWrap : public Napi::ObjectWrap { 10 | QWIDGET_WRAPPED_METHODS_DECLARATION 11 | private: 12 | QPointer instance; 13 | 14 | public: 15 | static Napi::Object init(Napi::Env env, Napi::Object exports); 16 | QWebEngineViewWrap(const Napi::CallbackInfo& info); 17 | ~QWebEngineViewWrap(); 18 | NWebEngineView* getInternalInstance(); 19 | // class constructor 20 | static Napi::FunctionReference constructor; 21 | // wrapped methods 22 | Napi::Value settings(const Napi::CallbackInfo& info); 23 | Napi::Value page(const Napi::CallbackInfo& info); 24 | }; 25 | -------------------------------------------------------------------------------- /src/cpp/init/init.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | Napi::Object Main(Napi::Env env, Napi::Object exports) { 5 | QtWebEngine::initialize(); 6 | return exports; 7 | } 8 | 9 | NODE_API_MODULE(NODE_GYP_MODULE_NAME, Main) 10 | -------------------------------------------------------------------------------- /src/cpp/main.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include "src/cpp/QWebEngineSettings/qwebenginesettings_wrap.h" 4 | #include "src/cpp/QWebEnginePage/qwebenginepage_wrap.h" 5 | #include "src/cpp/QWebEngineView/qwebengineview_wrap.h" 6 | #include "src/cpp/QWebChannel/qwebchannel_wrap.h" 7 | 8 | Napi::Object Main(Napi::Env env, Napi::Object exports) { 9 | QWebEngineViewWrap::init(env, exports); 10 | QWebEngineSettingsWrap::init(env, exports); 11 | QWebEnginePageWrap::init(env, exports); 12 | QWebChannelWrap::init(env, exports); 13 | return exports; 14 | } 15 | 16 | NODE_API_MODULE(NODE_GYP_MODULE_NAME, Main) 17 | -------------------------------------------------------------------------------- /src/demo-transparent.ts: -------------------------------------------------------------------------------- 1 | import path from "path"; 2 | import { 3 | WidgetAttribute, 4 | WidgetEventTypes, 5 | QPainter, 6 | QColor, 7 | PenStyle, 8 | WindowType, 9 | } from "@nodegui/nodegui"; 10 | import { QWebEngineView, QWebChannel } from "."; 11 | 12 | const index = "file://" + path.resolve(__dirname, "..", "public/index.html"); 13 | 14 | const webview = new QWebEngineView(); 15 | 16 | webview.setAttribute(WidgetAttribute.WA_TranslucentBackground, true); 17 | webview.setAttribute(WidgetAttribute.WA_OpaquePaintEvent, true); 18 | webview.setAttribute(WidgetAttribute.WA_AlwaysStackOnTop, true); 19 | 20 | webview.load(index); 21 | 22 | webview.addEventListener("urlChanged", (url) => { 23 | console.log("changed to", url); 24 | }); 25 | 26 | webview.addEventListener("selectionChanged", () => { 27 | console.log("selection", webview.property("selectedText").toString()); 28 | }); 29 | 30 | webview.addEventListener("loadFinished", () => { 31 | const js = `alert('nodeui');`; 32 | const page = webview.page(); 33 | page.runJavaScript(js); 34 | }); 35 | 36 | const color = new QColor("transparent"); 37 | 38 | webview.addEventListener(WidgetEventTypes.Paint, () => { 39 | webview.page().setBackgroundColor(color); 40 | }); 41 | 42 | const channel = new QWebChannel(); 43 | webview.page().setWebChannel(channel); 44 | webview.page().setBackgroundColor(color); 45 | 46 | webview.show(); 47 | (global as any).wv = webview; 48 | -------------------------------------------------------------------------------- /src/demo.ts: -------------------------------------------------------------------------------- 1 | import { QWebEngineView, QWebChannel } from "./index"; 2 | // import { 3 | // QMainWindow, 4 | // QWidget, 5 | // FlexLayout, 6 | // QPushButton 7 | // } from "@nodegui/nodegui"; 8 | 9 | // const win = new QMainWindow(); 10 | // const center = new QWidget(); 11 | const webview = new QWebEngineView(); 12 | webview.setInlineStyle("align-self:'stretch';"); 13 | webview.load("http://google.com"); 14 | webview.addEventListener("urlChanged", (url) => { 15 | console.log("changed to", url); 16 | }); 17 | webview.addEventListener("selectionChanged", () => { 18 | console.log("selection", webview.property("selectedText").toString()); 19 | }); 20 | webview.addEventListener("loadFinished", () => { 21 | const js = `alert('nodeui');`; 22 | const page = webview.page(); 23 | page.runJavaScript(js); 24 | }); 25 | 26 | const channel = new QWebChannel(); 27 | webview.page().setWebChannel(channel); 28 | 29 | webview.show(); 30 | (global as any).wv = webview; 31 | 32 | // const button = new QPushButton(); 33 | // button.setText("Hello"); 34 | 35 | // center.setLayout(new FlexLayout()); 36 | // center.layout?.addWidget(webview); 37 | // center.layout?.addWidget(button); 38 | // win.setCentralWidget(center); 39 | // win.show(); 40 | // (global as any).win = win; 41 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | //@ts-ignore 2 | import "../build/Release/nodegui_plugin_webview_init.node"; 3 | 4 | export { QWebEngineView, QWebEngineViewSignals } from "./lib/QWebEngineView"; 5 | export { QWebChannel } from "./lib/QWebChannel"; 6 | export { 7 | QWebEngineSettings, 8 | UnknownUrlSchemePolicy 9 | } from "./lib/QWebEngineSettings"; 10 | -------------------------------------------------------------------------------- /src/lib/QWebChannel.ts: -------------------------------------------------------------------------------- 1 | import { 2 | QObject, 3 | Component, 4 | NativeElement, 5 | checkIfNativeElement, 6 | } from "@nodegui/nodegui"; 7 | import addon from "./utils/addon"; 8 | 9 | export class QWebChannel extends Component { 10 | native: NativeElement; 11 | constructor(arg?: NativeElement | QObject) { 12 | super(); 13 | if (checkIfNativeElement(arg)) { 14 | this.native = arg as NativeElement; 15 | } else if (arg instanceof QObject) { 16 | this.native = new addon.QWebChannel(arg.native); 17 | } else if (!arg) { 18 | this.native = new addon.QWebChannel(new QObject().native); 19 | } else { 20 | throw new Error( 21 | "QWebChannel cannot be initialised this way. Use webengineview.settings()" 22 | ); 23 | } 24 | } 25 | registerObject(name: string, obj: QObject): void { 26 | this.native.registerObject(name, obj.native); 27 | } 28 | 29 | deregisterObject(obj: QObject): void { 30 | this.native.deregisterObject(obj.native); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/lib/QWebEnginePage.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Component, 3 | NativeElement, 4 | checkIfNativeElement, 5 | QColor 6 | } from "@nodegui/nodegui"; 7 | import { QWebChannel } from "./QWebChannel"; 8 | 9 | export class QWebEnginePage extends Component { 10 | native: NativeElement; 11 | constructor(native: NativeElement) { 12 | super(); 13 | if (checkIfNativeElement(native)) { 14 | this.native = native; 15 | } else { 16 | throw new Error( 17 | "QWebEnginePage cannot be initialised this way. Use webengineview.settings()" 18 | ); 19 | } 20 | } 21 | runJavaScript(script: string): void { 22 | this.native.runJavaScript(script); 23 | } 24 | setWebChannel(channel: QWebChannel): void { 25 | this.native.setWebChannel(channel.native); 26 | } 27 | 28 | webChannel(): QWebChannel { 29 | return new QWebChannel(this.native.webChannel()); 30 | } 31 | 32 | setBackgroundColor(color: QColor): void { 33 | this.native.setBackgroundColor(color.native); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/lib/QWebEngineSettings.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Component, 3 | NativeElement, 4 | checkIfNativeElement 5 | } from "@nodegui/nodegui"; 6 | 7 | export class QWebEngineSettings extends Component { 8 | native: NativeElement; 9 | constructor(native: NativeElement) { 10 | super(); 11 | if (checkIfNativeElement(native)) { 12 | this.native = native; 13 | } else { 14 | throw new Error( 15 | "QWebEngineSettings cannot be initialised this way. Use webengineview.settings()" 16 | ); 17 | } 18 | } 19 | setUnknownUrlSchemePolicy(policy: UnknownUrlSchemePolicy): void { 20 | this.native.setUnknownUrlSchemePolicy(policy); 21 | } 22 | } 23 | 24 | export enum UnknownUrlSchemePolicy { 25 | DisallowUnknownUrlSchemes = 1, 26 | AllowUnknownUrlSchemesFromUserInteraction, 27 | AllowAllUnknownUrlSchemes 28 | } 29 | -------------------------------------------------------------------------------- /src/lib/QWebEngineView.ts: -------------------------------------------------------------------------------- 1 | import { 2 | NativeElement, 3 | NodeWidget, 4 | QUrl, 5 | QWidgetSignals 6 | } from "@nodegui/nodegui"; 7 | import addon from "./utils/addon"; 8 | import { QWebEngineSettings } from "./QWebEngineSettings"; 9 | import { QWebEnginePage } from "./QWebEnginePage"; 10 | 11 | export interface QWebEngineViewSignals extends QWidgetSignals { 12 | loadFinished: (ok: boolean) => void; 13 | loadProgress: (progress: number) => void; 14 | loadStarted: () => void; 15 | selectionChanged: () => void; 16 | urlChanged: (url: string) => void; 17 | titleChanged: (title: string) => void; 18 | } 19 | 20 | export class QWebEngineView extends NodeWidget { 21 | native: NativeElement; 22 | constructor(parent?: NodeWidget) { 23 | let native; 24 | if (parent) { 25 | native = new addon.QWebEngineView(parent.native); 26 | } else { 27 | native = new addon.QWebEngineView(); 28 | } 29 | super(native); 30 | this.native = native; 31 | this.nodeParent = parent; 32 | } 33 | load(url: string) { 34 | this.setProperty("url", url); 35 | } 36 | url(): QUrl { 37 | return QUrl.fromQVariant(this.property("url")); 38 | } 39 | settings(): QWebEngineSettings { 40 | return new QWebEngineSettings(this.native.settings()); 41 | } 42 | 43 | page(): QWebEnginePage { 44 | return new QWebEnginePage(this.native.page()); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/lib/utils/addon.ts: -------------------------------------------------------------------------------- 1 | //@ts-ignore 2 | import addon from "../../../build/Release/nodegui_plugin_webview.node"; 3 | 4 | export default addon; 5 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2015", 4 | "module": "commonjs", 5 | "declaration": true, 6 | "sourceMap": false, 7 | "outDir": "./dist", 8 | "strict": true, 9 | "moduleResolution": "node", 10 | "esModuleInterop": true, 11 | "resolveJsonModule": true 12 | }, 13 | "include": ["src"] 14 | } 15 | --------------------------------------------------------------------------------