From cf1874b12de263d6f759c639e4e08184b5591dda Mon Sep 17 00:00:00 2001 From: Rory Mulligan Date: Thu, 3 Sep 2020 08:06:26 -0400 Subject: [PATCH 1/2] Adding Electron target --- package-lock.json | 526 +++++++++++++++++++++++++++++++++++------ package.json | 3 +- src/base.config.ts | 3 +- src/dev.config.ts | 2 +- src/dist.config.ts | 2 +- src/electron.config.ts | 94 ++++++++ src/main.ts | 80 ++++--- src/schema.json | 23 ++ tests/unit/main.ts | 27 ++- 9 files changed, 651 insertions(+), 109 deletions(-) create mode 100644 src/electron.config.ts diff --git a/package-lock.json b/package-lock.json index 21208f42..7074cfc6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -724,9 +724,9 @@ } }, "@dojo/framework": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@dojo/framework/-/framework-7.0.1.tgz", - "integrity": "sha512-5ZudxJ01tc58xgr+9QoHZ63ylh2lnSjFwiASu9X2MmQUsOUlE3CiyhqJhWDoOg7ZzrtMHu+PE0pe/tuQp74sPw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@dojo/framework/-/framework-7.0.2.tgz", + "integrity": "sha512-vnNoq7POZ/ao/AYzyrRfbxPVNrhwaH/8X31fkg4SW17+zpSXnpi7jsZZUobEVHbfdH4rgPiOmn7H3eiv24uhhw==", "requires": { "@types/cldrjs": "0.4.20", "@types/globalize": "0.0.34", @@ -886,11 +886,11 @@ } }, "@dojo/webpack-contrib": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@dojo/webpack-contrib/-/webpack-contrib-7.0.3.tgz", - "integrity": "sha512-3ageOTiekhr9ai6vNIHNIdLYnofFGJmHQOgDC1j7IrzuQpe3WW8h17exNDXMOxjyCYFfdvWGFDhVVH+FYPG90A==", + "version": "8.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@dojo/webpack-contrib/-/webpack-contrib-8.0.0-alpha.1.tgz", + "integrity": "sha512-7pjbALd//LmpBCdIgaEQ/0rBJlIZqFuI0aU++QaG9HSKG8f2GoOqofN5LTIxhDeYH2y79xIDnHRPmDz9mAr0UQ==", "requires": { - "@dojo/framework": "~7.0.0", + "@dojo/framework": "~7.0.2", "acorn": "6.1.1", "acorn-dynamic-import": "4.0.0", "acorn-walk": "6.1.1", @@ -902,7 +902,8 @@ "connect-history-api-fallback": "1.6.0", "copy-webpack-plugin": "4.6.0", "cssnano": "4.1.7", - "electron": "~7.1.7", + "electron": "7.1.7", + "electron-packager": "14.1.1", "eventsource-polyfill": "0.9.6", "express": "4.16.2", "filesize": "3.5.11", @@ -932,6 +933,11 @@ "wrapper-webpack-plugin": "2.0.0" }, "dependencies": { + "@types/node": { + "version": "12.12.56", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.56.tgz", + "integrity": "sha512-8OdIupOIZtmObR13fvGyTvpcuzKmMugkATeVcfNwCjGtHxhjEKmOvLqXwR8U9VOtNnZ4EXaSfNiLVsPinaCXkQ==" + }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", @@ -957,6 +963,16 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" }, + "electron": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/electron/-/electron-7.1.7.tgz", + "integrity": "sha512-aCLJ4BJwnvOckJgovNul22AYlMFDzm4S4KqKCG2iBlFJyMHBxXAKFKMsgYd40LBZWS3hcY6RHpaYjHSAPLS1pw==", + "requires": { + "@electron/get": "^1.0.1", + "@types/node": "^12.0.12", + "extract-zip": "^1.0.3" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -2028,9 +2044,9 @@ } }, "abab": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", - "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.4.tgz", + "integrity": "sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ==" }, "accepts": { "version": "1.3.7", @@ -2304,6 +2320,28 @@ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" }, + "asar": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/asar/-/asar-2.1.0.tgz", + "integrity": "sha512-d2Ovma+bfqNpvBzY/KU8oPY67ZworixTpkjSx0PCXnQi67c2cXmssaTxpFDUM0ttopXoGx/KRxNg/GDThYbXQA==", + "requires": { + "@types/glob": "^7.1.1", + "chromium-pickle-js": "^0.2.0", + "commander": "^2.20.0", + "cuint": "^0.2.2", + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "tmp-promise": "^1.0.5" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + } + } + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -2399,6 +2437,11 @@ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, + "author-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", + "integrity": "sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA=" + }, "autoprefixer": { "version": "9.8.4", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.4.tgz", @@ -2994,7 +3037,8 @@ "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "optional": true }, "got": { "version": "8.3.2", @@ -3074,6 +3118,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "optional": true, "requires": { "p-finally": "^1.0.0" } @@ -3170,7 +3215,8 @@ "boolean": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.0.1.tgz", - "integrity": "sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA==" + "integrity": "sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA==", + "optional": true }, "boxen": { "version": "0.5.1", @@ -3497,9 +3543,9 @@ }, "dependencies": { "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "requires": { "pump": "^3.0.0" } @@ -3629,6 +3675,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", + "optional": true, "requires": { "get-proxy": "^2.0.0", "isurl": "^1.0.0-alpha5", @@ -3763,6 +3810,11 @@ "tslib": "^1.9.0" } }, + "chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=" + }, "ci-info": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", @@ -3805,9 +3857,9 @@ "integrity": "sha512-QLnAjt20rZe38c8h8OJ9jPND+O4o5O8Nw0TK/P3KpNn1cmOhMu0rk6Kc3ap96c5OStQ9gAngs9+Be2sum26NOw==" }, "cldrjs": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cldrjs/-/cldrjs-0.5.1.tgz", - "integrity": "sha512-xyiP8uAm8K1IhmpDndZLraloW1yqu0L+HYdQ7O1aGPxx9Cr+BMnPANlNhSt++UKfxytL2hd2NPXgTjiy7k43Ew==" + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/cldrjs/-/cldrjs-0.5.4.tgz", + "integrity": "sha512-6QkI7oPLUZ9vA5BQAmUOfh5JIpESfnYy/M8d7Ddl9Yx+z2TAnQgnc3kbgjkIgxsk5Y0tOY+n6itMWXzQQQ2IWg==" }, "clean-css": { "version": "4.2.3", @@ -4084,6 +4136,11 @@ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, + "compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=" + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -4323,6 +4380,7 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "optional": true, "requires": { "ini": "^1.3.4", "proto-list": "~1.2.1" @@ -4701,6 +4759,24 @@ "which": "^1.2.9" } }, + "cross-zip": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/cross-zip/-/cross-zip-2.1.6.tgz", + "integrity": "sha512-xLIETNkzRcU6jGRzenJyRFxahbtP4628xEKMTI/Ql0Vu8m4h8M7uRLVi7E5OYHuJ6VQPsG4icJumKAFUvfm0+A==", + "requires": { + "rimraf": "^3.0.0" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -5129,6 +5205,11 @@ } } }, + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=" + }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -6102,7 +6183,8 @@ "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "optional": true }, "got": { "version": "7.1.0", @@ -6205,9 +6287,9 @@ "dev": true }, "electron": { - "version": "7.1.14", - "resolved": "https://registry.npmjs.org/electron/-/electron-7.1.14.tgz", - "integrity": "sha512-y9Nbja4rl+5fPVw9e/lFudwRax3a+jenzS7WXzUkjF7GI8YFxNH2eH9K9PZFNuSwc/OOCja2ul70+D44tKTQEw==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-10.1.1.tgz", + "integrity": "sha512-ZJtZHMr17AvvBosuA6XUmpehwAlGM4/n46Mw9BcyD8tpgdI6IQd0X5OU9meE3X3M8Y6Ja2Kr2udTMgtjvot2hA==", "requires": { "@electron/get": "^1.0.1", "@types/node": "^12.0.12", @@ -6215,9 +6297,118 @@ }, "dependencies": { "@types/node": { - "version": "12.12.47", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.47.tgz", - "integrity": "sha512-yzBInQFhdY8kaZmqoL2+3U5dSTMrKaYcb561VU+lDzAYvqt+2lojvBEy+hmpSNuXnPTx7m9+04CzWYOUqWME2A==" + "version": "12.12.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.55.tgz", + "integrity": "sha512-Vd6xQUVvPCTm7Nx1N7XHcpX6t047ltm7TgcsOr4gFHjeYgwZevo+V7I1lfzHnj5BT5frztZ42+RTG4MwYw63dw==" + } + } + }, + "electron-notarize": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-0.2.1.tgz", + "integrity": "sha512-oZ6/NhKeXmEKNROiFmRNfytqu3cxqC95sjooG7kBXQVEUSQkZnbiAhxVh5jXngL881G197pbwpeVPJyM7Ikmxw==", + "requires": { + "debug": "^4.1.1", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "electron-osx-sign": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.17.tgz", + "integrity": "sha512-wUJPmZJQCs1zgdlQgeIpRcvrf7M5/COQaOV68Va1J/SgmWx5KL2otgg+fAae7luw6qz9R8Gvu/Qpe9tAOu/3xQ==", + "requires": { + "bluebird": "^3.5.0", + "compare-version": "^0.1.2", + "debug": "^2.6.8", + "isbinaryfile": "^3.0.2", + "minimist": "^1.2.0", + "plist": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "electron-packager": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-14.1.1.tgz", + "integrity": "sha512-PODWJ8LFfwUCniTMy4Z5iiZyVHi4W71Pvn/SxJPC6kbI3EfZvo8n5H856XATxNUGVxlmAB5qeSbRym8/f9jISg==", + "requires": { + "@electron/get": "^1.6.0", + "asar": "^2.0.1", + "cross-zip": "^2.1.5", + "debug": "^4.0.1", + "electron-notarize": "^0.2.0", + "electron-osx-sign": "^0.4.11", + "fs-extra": "^8.1.0", + "galactus": "^0.2.1", + "get-package-info": "^1.0.0", + "junk": "^3.1.0", + "parse-author": "^2.0.0", + "plist": "^3.0.0", + "rcedit": "^2.0.0", + "resolve": "^1.1.6", + "sanitize-filename": "^1.6.0", + "semver": "^6.0.0", + "yargs-parser": "^16.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "yargs-parser": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", + "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, @@ -7392,9 +7583,9 @@ }, "dependencies": { "type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==" } } }, @@ -7402,6 +7593,7 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "optional": true, "requires": { "mime-db": "^1.28.0" } @@ -7410,6 +7602,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "optional": true, "requires": { "ext-list": "^2.0.0", "sort-keys-length": "^1.0.0" @@ -7748,12 +7941,14 @@ "filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=" + "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", + "optional": true }, "filenamify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", + "optional": true, "requires": { "filename-reserved-regex": "^2.0.0", "strip-outer": "^1.0.0", @@ -7895,6 +8090,15 @@ "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" }, + "flora-colossus": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-1.0.1.tgz", + "integrity": "sha512-d+9na7t9FyH8gBJoNDSi28mE4NgQVGGvxQ4aHtFRetjyh5SXjuus+V5EZaxFmFdXVemSOrx0lsgEl/ZMjnOWJA==", + "requires": { + "debug": "^4.1.1", + "fs-extra": "^7.0.0" + } + }, "flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", @@ -8029,6 +8233,36 @@ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, + "galactus": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/galactus/-/galactus-0.2.1.tgz", + "integrity": "sha1-y+0tIKQMH1Z5o1kI4rlBVzPnjbk=", + "requires": { + "debug": "^3.1.0", + "flora-colossus": "^1.0.0", + "fs-extra": "^4.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", @@ -8059,6 +8293,88 @@ "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" }, + "get-package-info": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz", + "integrity": "sha1-ZDJ5ZWPigRPNlHTbvQAFKYWkmZw=", + "requires": { + "bluebird": "^3.1.1", + "debug": "^2.2.0", + "lodash.get": "^4.0.0", + "read-pkg-up": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + } + } + }, "get-port": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.0.0.tgz", @@ -8068,6 +8384,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", + "optional": true, "requires": { "npm-conf": "^1.1.0" } @@ -8348,9 +8665,9 @@ }, "dependencies": { "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "optional": true } } @@ -8497,7 +8814,8 @@ "has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "optional": true }, "has-symbols": { "version": "1.0.1", @@ -8508,6 +8826,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "optional": true, "requires": { "has-symbol-support-x": "^1.4.1" } @@ -10120,7 +10439,8 @@ "is-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", + "optional": true }, "is-observable": { "version": "1.1.0", @@ -10278,6 +10598,14 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "requires": { + "buffer-alloc": "^1.2.0" + } + }, "isemail": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", @@ -10450,6 +10778,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "optional": true, "requires": { "has-to-string-tag-x": "^1.2.0", "is-object": "^1.0.1" @@ -10563,9 +10892,9 @@ }, "dependencies": { "acorn": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", - "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==" + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==" } } }, @@ -11520,8 +11849,7 @@ "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" }, "lodash.memoize": { "version": "4.1.2", @@ -12477,6 +12805,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", + "optional": true, "requires": { "config-chain": "^1.1.11", "pify": "^3.0.0" @@ -13019,6 +13348,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "optional": true, "requires": { "p-finally": "^1.0.0" } @@ -13133,6 +13463,14 @@ "safe-buffer": "^5.1.1" } }, + "parse-author": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", + "integrity": "sha1-00YL8d3Q367tQtp1QkLmX7aEqB8=", + "requires": { + "author-regex": "^1.0.0" + } + }, "parse-bmfont-ascii": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", @@ -13392,6 +13730,23 @@ "semver-compare": "^1.0.0" } }, + "plist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", + "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "requires": { + "base64-js": "^1.2.3", + "xmlbuilder": "^9.0.7", + "xmldom": "0.1.x" + }, + "dependencies": { + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + } + } + }, "pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", @@ -14941,7 +15296,8 @@ "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "optional": true }, "proxy-addr": { "version": "2.0.6", @@ -15036,14 +15392,6 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, "ws": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", @@ -15191,6 +15539,11 @@ } } }, + "rcedit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-2.2.0.tgz", + "integrity": "sha512-dhFtYmQS+V8qQIANyX6zDK+sO50ayDePKApi46ZPK8I6QeyyTDD6LManMa7a3p3c9mLM4zi9QBP41pfhQ9p7Sg==" + }, "read-all-stream": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", @@ -15606,26 +15959,26 @@ } }, "request-promise-core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", - "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", "requires": { - "lodash": "^4.17.15" + "lodash": "^4.17.19" }, "dependencies": { "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" } } }, "request-promise-native": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", - "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", "requires": { - "request-promise-core": "1.1.3", + "request-promise-core": "1.1.4", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" }, @@ -15731,7 +16084,6 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, "requires": { "glob": "^7.0.5" } @@ -16491,6 +16843,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "optional": true, "requires": { "is-plain-obj": "^1.0.0" } @@ -16499,6 +16852,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", + "optional": true, "requires": { "sort-keys": "^1.0.0" } @@ -16936,6 +17290,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "optional": true, "requires": { "escape-string-regexp": "^1.0.2" } @@ -17453,12 +17808,14 @@ "temp-dir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=" + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "optional": true }, "tempfile": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", + "optional": true, "requires": { "temp-dir": "^1.0.0", "uuid": "^3.0.1" @@ -17467,7 +17824,8 @@ "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "optional": true } } }, @@ -17744,6 +18102,33 @@ "os-tmpdir": "~1.0.2" } }, + "tmp-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-1.1.0.tgz", + "integrity": "sha512-8+Ah9aB1IRXCnIOxXZ0uFozV1nMU5xiu7hhFVUSxZ3bYu+psD4TzagCzVbexUCgNNGJnsmNDQlS4nG3mTyoNkw==", + "requires": { + "bluebird": "^3.5.0", + "tmp": "0.1.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "tmp": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", + "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "requires": { + "rimraf": "^2.6.3" + } + } + } + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -17847,6 +18232,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "optional": true, "requires": { "escape-string-regexp": "^1.0.2" } @@ -18651,7 +19037,8 @@ "url-to-options": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", + "optional": true }, "urlgrey": { "version": "0.4.4", @@ -19353,9 +19740,9 @@ } }, "ws": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", - "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==" + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" }, "x-is-string": { "version": "0.1.0", @@ -19410,6 +19797,11 @@ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, + "xmldom": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index 5f6010e4..8cd00bc2 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "tslint": "5.18.0" }, "dependencies": { - "@dojo/webpack-contrib": "~7.0.3", + "@dojo/webpack-contrib": "8.0.0-alpha.1", "@typescript-eslint/eslint-plugin": "2.34.0", "@typescript-eslint/parser": "2.34.0", "caniuse-lite": "1.0.30000973", @@ -119,6 +119,7 @@ "css-loader": "1.0.1", "css-url-relative-plugin": "1.0.0", "cssnano": "4.1.7", + "electron": "10.1.1", "eslint": "7.0.0", "eslint-loader": "4.0.2", "eslint-plugin-jsdoc": "25.4.2", diff --git a/src/base.config.ts b/src/base.config.ts index e5a7dae3..d32aa00d 100644 --- a/src/base.config.ts +++ b/src/base.config.ts @@ -202,6 +202,7 @@ export class InsertScriptPlugin { export default function webpackConfigFactory(args: any): webpack.Configuration { tsnode.register({ transpileOnly: true }); const isLegacy = args.legacy; + const base = args.target === 'electron' ? './' : args.base || '/'; const experimental = args.experimental || {}; const isExperimentalSpeed = !!experimental.speed && args.mode === 'dev'; const isTest = args.mode === 'unit' || args.mode === 'functional' || args.mode === 'test'; @@ -544,7 +545,7 @@ export default function webpackConfigFactory(args: any): webpack.Configuration { files: watchExtraFiles }), new ManifestPlugin(), - new CssUrlRelativePlugin({ root: args.base || '/' }) + new CssUrlRelativePlugin({ root: base || '/' }) ]), module: { // `file` uses the pattern `loaderPath!filePath`, hence the regex test diff --git a/src/dev.config.ts b/src/dev.config.ts index 0d4cf4b4..0675f3b0 100644 --- a/src/dev.config.ts +++ b/src/dev.config.ts @@ -24,7 +24,7 @@ function webpackConfig(args: any): webpack.Configuration { const experimental = args.experimental || {}; const isExperimentalSpeed = !!experimental.speed; const singleBundle = args.singleBundle || isExperimentalSpeed; - const base = args.base || '/'; + const base = args.target === 'electron' ? './' : args.base || '/'; const basePath = process.cwd(); const config = baseConfigFactory(args); diff --git a/src/dist.config.ts b/src/dist.config.ts index bd355ab0..2d428463 100644 --- a/src/dist.config.ts +++ b/src/dist.config.ts @@ -33,7 +33,7 @@ All rights reserved function webpackConfig(args: any): webpack.Configuration { const basePath = process.cwd(); - const base = args.base || '/'; + const base = args.target === 'electron' ? './' : args.base || '/'; const config = baseConfigFactory(args); const manifest: WebAppManifest = args.pwa && args.pwa.manifest; const { plugins, output } = config; diff --git a/src/electron.config.ts b/src/electron.config.ts new file mode 100644 index 00000000..c1be1702 --- /dev/null +++ b/src/electron.config.ts @@ -0,0 +1,94 @@ +import ElectronPlugin from '@dojo/webpack-contrib/electron-plugin/ElectronPlugin'; +const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin'); + +import * as webpack from 'webpack'; +import * as path from 'path'; +import * as fs from 'fs'; + +const basePath = process.cwd(); +const srcPath = path.join(basePath, 'src'); +const extensions = ['.ts', '.tsx', '.mjs', '.js']; +const removeEmpty = (items: any[]) => items.filter((item) => item); +const mainPath = path.join(srcPath, 'main.electron.ts'); + +function webpackConfig(args: any): webpack.Configuration { + const experimental = args.experimental || {}; + const electron = args.electron || {}; + const isExperimentalSpeed = !!experimental.speed && args.mode === 'dev'; + const baseOutputPath = path.resolve('./output'); + const outputPath = path.join(baseOutputPath, args.mode); + + return { + name: 'electron', + entry: { + 'main.electron': removeEmpty([ + '@dojo/webpack-contrib/electron-plugin/bootstrap', + fs.existsSync(mainPath) ? mainPath : null + ]) + }, + resolveLoader: { + modules: [path.resolve(__dirname, 'node_modules'), 'node_modules'] + }, + resolve: { + modules: [basePath, path.join(basePath, 'node_modules')], + extensions, + plugins: [new TsconfigPathsPlugin({ configFile: path.join(basePath, 'tsconfig.json') })] + }, + mode: args.mode === 'dev' ? 'development' : 'production', + devtool: 'source-map', + watchOptions: { ignored: /node_modules/ }, + target: 'electron-main', + plugins: [ + new ElectronPlugin({ + electron: { + browser: electron.browser || {}, + packaging: electron.packaging || {} + }, + watch: !!args.watch, + serve: !!args.serve, + port: args.port, + dist: args.mode !== 'dev' + } as any) + ], + module: { + rules: [ + { + test: /\.(gif|png|jpe?g|svg|eot|ttf|woff|woff2|ico)$/i, + loader: 'file-loader?hash=sha512&digest=hex&name=[name].[hash:base64:8].[ext]' + }, + { + test: /@dojo(\/|\\).*\.(js|mjs)$/, + enforce: 'pre', + loader: 'source-map-loader-cli', + options: { includeModulePaths: true } + }, + { + include: srcPath, + test: /\.ts(x)?$/, + use: removeEmpty([ + { + loader: 'ts-loader', + options: { + onlyCompileBundledFiles: true, + instance: 'dojo', + transpileOnly: isExperimentalSpeed, + compilerOptions: { + target: 'es2017', + module: 'esnext', + downlevelIteration: false + } + } + } + ]) + } + ] + }, + output: { + chunkFilename: '[name].js', + filename: '[name].js', + path: outputPath + } + }; +} + +export default webpackConfig; diff --git a/src/main.ts b/src/main.ts index 8dbe96dc..ca3d961d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -19,11 +19,11 @@ import devConfigFactory from './dev.config'; import unitConfigFactory from './unit.config'; import functionalConfigFactory from './functional.config'; import distConfigFactory from './dist.config'; +import electronConfigFactory from './electron.config'; import logger from './logger'; import { moveBuildOptions } from './util/eject'; import { readFileSync } from 'fs'; -export const mainEntry = 'main'; const packageJsonPath = path.join(process.cwd(), 'package.json'); const packageJson = fs.existsSync(packageJsonPath) ? require(packageJsonPath) : {}; export const packageName = packageJson.name || ''; @@ -37,20 +37,19 @@ function getLibraryName(name: string) { const libraryName = packageName ? getLibraryName(packageName) : 'main'; -const fixMultipleWatchTrigger = require('webpack-mild-compile'); const hotMiddleware = require('webpack-hot-middleware'); const connectInject = require('connect-inject'); const testModes = ['test', 'unit', 'functional']; -function createCompiler(config: webpack.Configuration) { - const compiler = webpack(config); - fixMultipleWatchTrigger(compiler); - return compiler; +// for some reason the MultiCompiler type doesn't include hooks, even though they are clearly defined on the +// object coming back. +interface MultiCompilerWithHooks extends webpack.MultiCompiler { + hooks: webpack.compilation.CompilerHooks; } -function createWatchCompiler(config: webpack.Configuration) { - const compiler = createCompiler(config); +function createWatchCompiler(configs: webpack.Configuration[]) { + const compiler = webpack(configs) as MultiCompilerWithHooks; const spinner = ora('building').start(); compiler.hooks.invalid.tap('@dojo/cli-build-app', () => { logUpdate(''); @@ -83,10 +82,10 @@ function serveStatic( } } -function build(config: webpack.Configuration, args: any) { - const compiler = createCompiler(config); +function build(configs: webpack.Configuration[], args: any) { + const compiler = webpack(configs); const spinner = ora('building').start(); - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { compiler.run((err, stats) => { spinner.stop(); if (err) { @@ -94,7 +93,7 @@ function build(config: webpack.Configuration, args: any) { } if (stats) { const runningMessage = args.serve ? `Listening on port ${args.port}...` : ''; - const hasErrors = logger(stats.toJson({ warningsFilter }), config, runningMessage, args); + const hasErrors = logger(stats.toJson({ warningsFilter }), configs, runningMessage, args); if (hasErrors) { reject({}); return; @@ -125,10 +124,15 @@ function buildNpmDependencies(): any { } } -async function fileWatch(config: webpack.Configuration, args: any, shouldResolve = false) { - return new Promise((resolve, reject) => { - const watchOptions = config.watchOptions as webpack.Compiler.WatchOptions; - const compiler = createWatchCompiler(config); +function fileWatch(configs: webpack.Configuration[], args: any, shouldResolve = false): Promise { + const [mainConfig] = configs; + let compiler: webpack.MultiCompiler; + + return new Promise((resolve, reject) => { + const watchOptions = mainConfig.watchOptions as webpack.Compiler.WatchOptions; + + compiler = createWatchCompiler(configs); + compiler.watch(watchOptions, (err, stats) => { if (err) { reject(err); @@ -139,7 +143,7 @@ async function fileWatch(config: webpack.Configuration, args: any, shouldResolve args.port }\nPlease note the serve option is not intended to be used to serve applications in production.` : 'watching...'; - logger(stats.toJson({ warningsFilter }), config, runningMessage, args); + logger(stats.toJson({ warningsFilter }), configs, runningMessage, args); } if (shouldResolve) { resolve(compiler); @@ -148,8 +152,9 @@ async function fileWatch(config: webpack.Configuration, args: any, shouldResolve }); } -async function serve(config: webpack.Configuration, args: any) { - const compiler = args.watch ? await fileWatch(config, args, true) : await build(config, args); +async function serve(configs: webpack.Configuration[], args: any) { + const [mainConfig] = configs; + let isHttps = false; const base = args.base || '/'; @@ -162,19 +167,21 @@ async function serve(config: webpack.Configuration, args: any) { next(); }); - const outputDir = (config.output && config.output.path) || process.cwd(); + const compiler = args.watch ? await fileWatch(configs, args, true) : await build(configs, args); + + const outputDir = (mainConfig.output && mainConfig.output.path) || process.cwd(); let btrOptions = args['build-time-render']; if (btrOptions) { if (args.singleBundle || (args.experimental && !!args.experimental.speed)) { btrOptions = { ...btrOptions, sync: true }; } - const jsonpName = (config.output && config.output.jsonpFunction) || 'unknown'; + const jsonpName = (mainConfig.output && mainConfig.output.jsonpFunction) || 'unknown'; const onDemandBtr = new OnDemandBtr({ buildTimeRenderOptions: btrOptions, scope: libraryName, base, - compiler, - entries: config.entry ? Object.keys(config.entry) : [], + compiler: compiler.compilers[0], + entries: mainConfig.entry ? Object.keys(mainConfig.entry) : [], outputPath: outputDir, jsonpName }); @@ -295,6 +302,13 @@ const command: Command = { choices: ['dist', 'dev', 'test', 'unit', 'functional'] }); + options('target', { + describe: 'the target', + alias: 't', + default: 'web', + choices: ['web', 'electron'] + }); + options('watch', { describe: 'watch for file changes', alias: 'w' @@ -355,7 +369,7 @@ const command: Command = { }, run(helper: Helper, args: any) { console.log = () => {}; - let config: webpack.Configuration; + let configs: webpack.Configuration[] = []; args.experimental = args.experimental || {}; args.base = url.resolve('/', args.base || ''); if (!args.base.endsWith('/')) { @@ -363,27 +377,31 @@ const command: Command = { } if (args.mode === 'dev') { - config = devConfigFactory(args); + configs.push(devConfigFactory(args)); } else if (args.mode === 'unit' || args.mode === 'test') { - config = unitConfigFactory(args); + configs.push(unitConfigFactory(args)); } else if (args.mode === 'functional') { - config = functionalConfigFactory(args); + configs.push(functionalConfigFactory(args)); } else { - config = distConfigFactory(args); + configs.push(distConfigFactory(args)); + } + + if (args.target === 'electron') { + configs.push(electronConfigFactory(args)); } if (args.serve) { if (testModes.indexOf(args.mode) !== -1) { return Promise.reject(new Error(`Cannot use \`--serve\` with \`--mode=${args.mode}\``)); } - return serve(config, args); + return serve(configs, args); } if (args.watch) { - return fileWatch(config, args); + return fileWatch(configs, args); } - return build(config, args); + return build(configs, args); }, eject(helper: Helper): EjectOutput { return { diff --git a/src/schema.json b/src/schema.json index e16f79e3..b9ff43f9 100644 --- a/src/schema.json +++ b/src/schema.json @@ -9,6 +9,13 @@ "functional" ] }, + "target": { + "type": "string", + "enum": [ + "web", + "electron" + ] + }, "watch": { "type": "boolean" }, @@ -63,6 +70,13 @@ } } }, + "electron": { + "properties": { + "browser": { + "type": "object" + } + } + }, "build-time-render": { "additionalProperties": false, "properties": { @@ -445,6 +459,12 @@ "m": { "$ref": "#/definitions/mode" }, + "target": { + "$ref": "#/definitions/target" + }, + "t": { + "$ref": "#/definitions/target" + }, "watch": { "$ref": "#/definitions/watch" }, @@ -522,6 +542,9 @@ { "$ref": "#/definitions/imageOptimizationOptions" }, { "$ref": "#/definitions/imageOptimizationFlag" } ] + }, + "electron": { + "$ref": "#/definitions/electron" } } } diff --git a/tests/unit/main.ts b/tests/unit/main.ts index f05943b3..c9ced38e 100644 --- a/tests/unit/main.ts +++ b/tests/unit/main.ts @@ -15,6 +15,7 @@ let mockDevConfig: any; let mockDistConfig: any; let mockUnitTestConfig: any; let mockFunctionalTestConfig: any; +let mockElectronTestConfig: any; let compiler: any; let isError: boolean; let stats: any; @@ -54,6 +55,7 @@ describe('command', () => { './dev.config', './dist.config', './functional.config', + './electron.config', './logger', './unit.config', 'connect-history-api-fallback', @@ -95,10 +97,12 @@ describe('command', () => { mockDistConfig = mockModule.getMock('./dist.config').default; mockUnitTestConfig = mockModule.getMock('./unit.config').default; mockFunctionalTestConfig = mockModule.getMock('./functional.config').default; + mockElectronTestConfig = mockModule.getMock('./electron.config').default; mockDevConfig.returns('dev config'); mockDistConfig.returns('dist config'); mockUnitTestConfig.returns('unit config'); mockFunctionalTestConfig.returns('functional config'); + mockElectronTestConfig.returns('electron config'); mockLogger = mockModule.getMock('./logger').default; consoleWarnStub = stub(console, 'warn'); consoleStub = stub(console, 'log'); @@ -129,7 +133,7 @@ describe('command', () => { const main = mockModule.getModuleUnderTest().default; main.run(getMockHelper(), { mode: 'dev' }).then(() => { assert.isTrue(mockDevConfig.called); - assert.isTrue(mockLogger.calledWith('stats', 'dev config')); + assert.isTrue(mockLogger.calledWith('stats', ['dev config'])); }); }); @@ -137,7 +141,7 @@ describe('command', () => { const main = mockModule.getModuleUnderTest().default; return main.run(getMockHelper(), { mode: 'dist' }).then(() => { assert.isTrue(mockDistConfig.called); - assert.isTrue(mockLogger.calledWith('stats', 'dist config')); + assert.isTrue(mockLogger.calledWith('stats', ['dist config'])); }); }); @@ -145,7 +149,7 @@ describe('command', () => { const main = mockModule.getModuleUnderTest().default; return main.run(getMockHelper(), { mode: 'unit' }).then(() => { assert.isTrue(mockUnitTestConfig.called); - assert.isTrue(mockLogger.calledWith('stats', 'unit config')); + assert.isTrue(mockLogger.calledWith('stats', ['unit config'])); }); }); @@ -153,15 +157,24 @@ describe('command', () => { const main = mockModule.getModuleUnderTest().default; return main.run(getMockHelper(), { mode: 'functional' }).then(() => { assert.isTrue(mockFunctionalTestConfig.called); - assert.isTrue(mockLogger.calledWith('stats', 'functional config')); + assert.isTrue(mockLogger.calledWith('stats', ['functional config'])); }); }); - it('falls back to unit mode and logs a warning when depracated test mode is used', () => { + it('can run electron target', () => { + const main = mockModule.getModuleUnderTest().default; + return main.run(getMockHelper(), { target: 'electron' }).then(() => { + assert.isTrue(mockDistConfig.called); + assert.isTrue(mockElectronTestConfig.called); + assert.isTrue(mockLogger.calledWith('stats', ['dist config', 'electron config'])); + }); + }); + + it('falls back to unit mode and logs a warning when deprecated test mode is used', () => { const main = mockModule.getModuleUnderTest().default; return main.run(getMockHelper(), { mode: 'test' }).then(() => { assert.isTrue(mockUnitTestConfig.called); - assert.isTrue(mockLogger.calledWith('stats', 'unit config')); + assert.isTrue(mockLogger.calledWith('stats', ['unit config'])); assert.isTrue(consoleWarnStub.calledOnce); assert.isTrue( consoleWarnStub.calledWith( @@ -282,7 +295,7 @@ describe('command', () => { ); setTimeout( dfd.callback(() => { - assert.isTrue(mockLogger.calledWith('stats', 'dist config', 'watching...')); + assert.isTrue(mockLogger.calledWith('stats', ['dist config'], 'watching...')); }), 1000 ); From a41b262a0dd4210f2f8bce37b41237c7bb16202c Mon Sep 17 00:00:00 2001 From: Rory Mulligan Date: Wed, 9 Sep 2020 12:35:23 -0400 Subject: [PATCH 2/2] Removing any cast --- src/electron.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/electron.config.ts b/src/electron.config.ts index c1be1702..dfc197ee 100644 --- a/src/electron.config.ts +++ b/src/electron.config.ts @@ -48,7 +48,7 @@ function webpackConfig(args: any): webpack.Configuration { serve: !!args.serve, port: args.port, dist: args.mode !== 'dev' - } as any) + }) ], module: { rules: [