From 25b1dff5d8b11d9360be38c99272a2dd03b29b59 Mon Sep 17 00:00:00 2001 From: Paulo Castro Date: Mon, 22 Mar 2021 16:00:20 +0000 Subject: [PATCH 1/3] Bump `patch-package` dependency and remove its own patch file Change-type: patch --- npm-shrinkwrap.json | 152 +++--------------- package.json | 2 +- patches/before-all/patch-package+6.2.2.patch | 13 -- .../pkg/expected-warnings-darwin.txt | 8 + .../test-data/pkg/expected-warnings-linux.txt | 8 + .../test-data/pkg/expected-warnings-win32.txt | 8 + 6 files changed, 43 insertions(+), 148 deletions(-) delete mode 100644 patches/before-all/patch-package+6.2.2.patch diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index a63a2cd9..c28c51f9 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -6407,137 +6407,11 @@ } }, "find-yarn-workspace-root": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz", - "integrity": "sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", "requires": { - "fs-extra": "^4.0.3", - "micromatch": "^3.1.4" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "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" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - } + "micromatch": "^4.0.2" } }, "findup-sync": { @@ -11927,18 +11801,19 @@ } }, "patch-package": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.2.2.tgz", - "integrity": "sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg==", + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.4.7.tgz", + "integrity": "sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ==", "requires": { "@yarnpkg/lockfile": "^1.1.0", "chalk": "^2.4.2", "cross-spawn": "^6.0.5", - "find-yarn-workspace-root": "^1.2.1", + "find-yarn-workspace-root": "^2.0.0", "fs-extra": "^7.0.1", "is-ci": "^2.0.0", "klaw-sync": "^6.0.0", "minimist": "^1.2.0", + "open": "^7.4.2", "rimraf": "^2.6.3", "semver": "^5.6.0", "slash": "^2.0.0", @@ -11994,6 +11869,15 @@ "graceful-fs": "^4.1.6" } }, + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", diff --git a/package.json b/package.json index f17a61bd..5d9c6bf5 100644 --- a/package.json +++ b/package.json @@ -247,7 +247,7 @@ "node-unzip-2": "^0.2.8", "oclif": "^1.16.1", "open": "^7.1.0", - "patch-package": "6.2.2", + "patch-package": "^6.4.7", "prettyjson": "^1.1.3", "progress-stream": "^2.0.0", "reconfix": "^0.1.0", diff --git a/patches/before-all/patch-package+6.2.2.patch b/patches/before-all/patch-package+6.2.2.patch deleted file mode 100644 index 2be0af49..00000000 --- a/patches/before-all/patch-package+6.2.2.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/node_modules/patch-package/dist/applyPatches.js b/node_modules/patch-package/dist/applyPatches.js -index 35a22f7..c43a3b8 100644 ---- a/node_modules/patch-package/dist/applyPatches.js -+++ b/node_modules/patch-package/dist/applyPatches.js -@@ -85,7 +85,7 @@ function applyPatchesForApp(_a) { - })) { - // yay patch was applied successfully - // print warning if version mismatch -- if (installedPackageVersion !== version) { -+ if (installedPackageVersion !== version.replace(/\.dev$/, "")) { - printVersionMismatchWarning({ - packageName: name, - actualVersion: installedPackageVersion, diff --git a/tests/test-data/pkg/expected-warnings-darwin.txt b/tests/test-data/pkg/expected-warnings-darwin.txt index 834898df..5c8c0219 100644 --- a/tests/test-data/pkg/expected-warnings-darwin.txt +++ b/tests/test-data/pkg/expected-warnings-darwin.txt @@ -56,6 +56,14 @@ The file must be distributed with executable as %2. %1: node_modules/drivelist/scripts/win32.bat %2: path-to-executable/drivelist/win32.bat +> Warning Cannot include file %1 into executable. + The file must be distributed with executable as %2. + %1: node_modules/patch-package/node_modules/open/xdg-open + %2: path-to-executable/xdg-open +> Warning Cannot include file %1 into executable. + The file must be distributed with executable as %2. + %1: node_modules/patch-package/node_modules/open/xdg-open + %2: path-to-executable/xdg-open > Warning Cannot include addon %1 into executable. The addon must be distributed with executable as %2. %1: node_modules/fsevents/fsevents.node diff --git a/tests/test-data/pkg/expected-warnings-linux.txt b/tests/test-data/pkg/expected-warnings-linux.txt index 8b7a5b0a..787f2a7d 100644 --- a/tests/test-data/pkg/expected-warnings-linux.txt +++ b/tests/test-data/pkg/expected-warnings-linux.txt @@ -56,6 +56,14 @@ The file must be distributed with executable as %2. %1: node_modules/drivelist/scripts/win32.bat %2: path-to-executable/drivelist/win32.bat +> Warning Cannot include file %1 into executable. + The file must be distributed with executable as %2. + %1: node_modules/patch-package/node_modules/open/xdg-open + %2: path-to-executable/xdg-open +> Warning Cannot include file %1 into executable. + The file must be distributed with executable as %2. + %1: node_modules/patch-package/node_modules/open/xdg-open + %2: path-to-executable/xdg-open > Warning Cannot include addon %1 into executable. The addon must be distributed with executable as %2. %1: node_modules/xxhash/build/Release/hash.node diff --git a/tests/test-data/pkg/expected-warnings-win32.txt b/tests/test-data/pkg/expected-warnings-win32.txt index 61de25fd..9bde8a02 100644 --- a/tests/test-data/pkg/expected-warnings-win32.txt +++ b/tests/test-data/pkg/expected-warnings-win32.txt @@ -58,6 +58,14 @@ The file must be distributed with executable as %2. %1: node_modules\drivelist\scripts\win32.bat %2: path-to-executable/drivelist/win32.bat +> Warning Cannot include file %1 into executable. + The file must be distributed with executable as %2. + %1: node_modules\patch-package\node_modules\open\xdg-open + %2: path-to-executable/xdg-open +> Warning Cannot include file %1 into executable. + The file must be distributed with executable as %2. + %1: node_modules\patch-package\node_modules\open\xdg-open + %2: path-to-executable/xdg-open > Warning Cannot include addon %1 into executable. The addon must be distributed with executable as %2. %1: node_modules\xxhash\build\Release\hash.node From 329b84d01e1279d13b1e0ac4f1b720af8a4b929e Mon Sep 17 00:00:00 2001 From: Paulo Castro Date: Mon, 22 Mar 2021 16:03:44 +0000 Subject: [PATCH 2/3] Add macOS uninstall script (sudo /usr/local/lib/balena-cli/bin/uninstall) Change-type: minor --- CONTRIBUTING.md | 14 +- INSTALL-ADVANCED.md | 5 +- INSTALL-MAC.md | 10 +- README.md | 4 +- doc/cli.markdown | 4 +- npm-shrinkwrap.json | 429 ++++++----------------- package.json | 2 +- patches/all/@oclif+dev-cli+1.22.2.patch | 310 ---------------- patches/all/@oclif+dev-cli+1.26.0.patch | 250 +++++++++++++ patches/all/qqjs++execa+0.10.0.dev.patch | 64 ---- patches/all/qqjs+0.3.11.dev.patch | 16 - 11 files changed, 373 insertions(+), 735 deletions(-) delete mode 100644 patches/all/@oclif+dev-cli+1.22.2.patch create mode 100644 patches/all/@oclif+dev-cli+1.26.0.patch delete mode 100644 patches/all/qqjs++execa+0.10.0.dev.patch delete mode 100644 patches/all/qqjs+0.3.11.dev.patch diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c1896463..5e83cff1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -127,11 +127,15 @@ The `INSTALL*.md` and `TROUBLESHOOTING.md` files are also manually edited. ## Windows -The `npm run build:installer` script (which generates the `.exe` executable installer on Windows) -specifically requires [MSYS2](https://www.msys2.org/) to be installed. Other than that, the -standard Command Prompt or PowerShell can be used (though MSYS2 is still handy, as it provides -'git' and a number of common unix utilities). If changes are made to npm scripts in `package.json`, -check that they also run on a standard Windows Command Prompt. +Besides the regular npm installation dependencies, the `npm run build:installer` script +that produces the `.exe` graphical installer on Windows also requires +[NSIS](https://sourceforge.net/projects/nsis/) and [MSYS2](https://www.msys2.org/) to be +installed. Be sure to add `C:\Program Files (x86)\NSIS` to the PATH, so that `makensis` +is available. MSYS2 is recommended when developing the balena CLI on Windows. + +If changes are made to npm scripts in `package.json`, don't assume that a Unix shell like +bash is available. For example, some Windows shells don't have the `cp` and `rm` commands, +which is why you'll often find `ncp` and `rimraf` used in `package.json` scripts. ## Updating the 'npm-shrinkwrap.json' file diff --git a/INSTALL-ADVANCED.md b/INSTALL-ADVANCED.md index 78a7ed3d..e1ddff91 100644 --- a/INSTALL-ADVANCED.md +++ b/INSTALL-ADVANCED.md @@ -95,9 +95,8 @@ some additional development tools to be installed first: On **Windows (not WSL),** the dependencies above and additional ones can be met by installing: * Node.js from the [Nodejs.org download page](https://nodejs.org/en/download/). -* The [MSYS2 shell](https://www.msys2.org/), which provides `git`, `make`, `g++`, `ssh`, `rsync` - and more: - * `pacman -S git openssh rsync gcc make` +* The [MSYS2 shell](https://www.msys2.org/), which provides `git`, `make`, `g++`, `7z` and more: + * `pacman -S git gcc make openssh p7zip` * [Set a Windows environment variable](https://www.onmsft.com/how-to/how-to-set-an-environment-variable-in-windows-10): `MSYS2_PATH_TYPE=inherit` * Note that a bug in the MSYS2 launch script (`msys2_shell.cmd`) makes text-based interactive CLI menus to misbehave. [Check this Github issue for a diff --git a/INSTALL-MAC.md b/INSTALL-MAC.md index 37f203c5..9f2d2973 100644 --- a/INSTALL-MAC.md +++ b/INSTALL-MAC.md @@ -22,7 +22,15 @@ Selected operating system: **macOS** * `balena help` - should print a list of available commands No further steps are required to run most CLI commands. The `balena ssh`, `build`, `deploy` -and `preload` commands may require additional software to be installed, as described below. +and `preload` commands may require additional software to be installed, as described +in the next section. + +To update the balena CLI, repeat the steps above for the new version. +To uninstall it, run the following command on a terminal prompt: + +```text +sudo /usr/local/lib/balena-cli/bin/uninstall +``` ## Additional Dependencies diff --git a/README.md b/README.md index 1784cea0..1e19f985 100644 --- a/README.md +++ b/README.md @@ -28,13 +28,13 @@ are supported. Alternative shells include: * [MSYS2](https://www.msys2.org/): * Install additional packages with the command: - `pacman -S git openssh rsync` + `pacman -S git gcc make openssh p7zip` * [Set a Windows environment variable](https://www.onmsft.com/how-to/how-to-set-an-environment-variable-in-windows-10): `MSYS2_PATH_TYPE=inherit` * Note that a bug in the MSYS2 launch script (`msys2_shell.cmd`) makes text-based interactive CLI menus to break. [Check this Github issue for a workaround](https://github.com/msys2/MINGW-packages/issues/1633#issuecomment-240583890). -* [MSYS](http://www.mingw.org/wiki/MSYS): select the `msys-rsync` and `msys-openssh` packages too +* [MSYS](http://www.mingw.org/wiki/MSYS) * [Git for Windows](https://git-for-windows.github.io/) * During the installation, you will be prompted to choose between _"Use MinTTY"_ and _"Use Windows' default console window"._ Choose the latter, because of the same [MSYS2 diff --git a/doc/cli.markdown b/doc/cli.markdown index 1c27c204..de3b3668 100644 --- a/doc/cli.markdown +++ b/doc/cli.markdown @@ -21,13 +21,13 @@ are supported. Alternative shells include: * [MSYS2](https://www.msys2.org/): * Install additional packages with the command: - `pacman -S git openssh rsync` + `pacman -S git gcc make openssh p7zip` * [Set a Windows environment variable](https://www.onmsft.com/how-to/how-to-set-an-environment-variable-in-windows-10): `MSYS2_PATH_TYPE=inherit` * Note that a bug in the MSYS2 launch script (`msys2_shell.cmd`) makes text-based interactive CLI menus to break. [Check this Github issue for a workaround](https://github.com/msys2/MINGW-packages/issues/1633#issuecomment-240583890). -* [MSYS](http://www.mingw.org/wiki/MSYS): select the `msys-rsync` and `msys-openssh` packages too +* [MSYS](http://www.mingw.org/wiki/MSYS) * [Git for Windows](https://git-for-windows.github.io/) * During the installation, you will be prompted to choose between _"Use MinTTY"_ and _"Use Windows' default console window"._ Choose the latter, because of the same [MSYS2 diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index c28c51f9..eb29c471 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -367,41 +367,26 @@ } }, "@oclif/dev-cli": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/@oclif/dev-cli/-/dev-cli-1.22.2.tgz", - "integrity": "sha512-c7633R37RxrQIpwqPKxjNRm6/jb1yuG8fd16hmNz9Nw+/MUhEtQtKHSCe9ScH8n5M06l6LEo4ldk9LEGtpaWwA==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@oclif/dev-cli/-/dev-cli-1.26.0.tgz", + "integrity": "sha512-272udZP+bG4qahoAcpWcMTJKiA+V42kRMqQM7n4tgW35brYb2UP5kK+p08PpF8sgSfRTV8MoJVJG9ax5kY82PA==", "dev": true, "requires": { - "@oclif/command": "^1.5.13", - "@oclif/config": "^1.12.12", - "@oclif/errors": "^1.2.2", - "@oclif/plugin-help": "^2.1.6", + "@oclif/command": "^1.8.0", + "@oclif/config": "^1.17.0", + "@oclif/errors": "^1.3.3", + "@oclif/plugin-help": "^3.2.0", "cli-ux": "^5.2.1", "debug": "^4.1.1", - "fs-extra": "^7.0.1", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^8.1", "github-slugger": "^1.2.1", "lodash": "^4.17.11", - "normalize-package-data": "^2.5.0", + "normalize-package-data": "^3.0.0", "qqjs": "^0.3.10", - "tslib": "^1.9.3" + "tslib": "^2.0.3" }, "dependencies": { - "@oclif/plugin-help": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-2.2.3.tgz", - "integrity": "sha512-bGHUdo5e7DjPJ0vTeRBMIrfqTRDBfyR5w0MP41u0n3r7YG5p14lvMmiCXxi6WDaP2Hw5nqx3PnkAIntCKZZN7g==", - "dev": true, - "requires": { - "@oclif/command": "^1.5.13", - "chalk": "^2.4.1", - "indent-string": "^4.0.0", - "lodash.template": "^4.4.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0", - "widest-line": "^2.0.1", - "wrap-ansi": "^4.0.0" - } - }, "ansi-escapes": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", @@ -411,36 +396,20 @@ "type-fest": "^0.11.0" } }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, "cli-ux": { - "version": "5.4.10", - "resolved": "https://registry.npmjs.org/cli-ux/-/cli-ux-5.4.10.tgz", - "integrity": "sha512-s48Efw04VtGyQEwXDrERobMc2DF2DyYQ+2nmNsM7clxOVDtbRI9OjbXRwPeS6G2aFuHy0bB8GUq5MzkmkYt7yw==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/cli-ux/-/cli-ux-5.5.1.tgz", + "integrity": "sha512-t3DT1U1C3rArLGYLpKa3m9dr/8uKZRI8HRm/rXKL7UTjm4c+Yd9zHNWg1tP8uaJkUbhmvx5SQHwb3VWpPUVdHQ==", "dev": true, "requires": { "@oclif/command": "^1.6.0", @@ -454,7 +423,7 @@ "clean-stack": "^3.0.0", "cli-progress": "^3.4.0", "extract-stack": "^2.0.0", - "fs-extra": "^9.0.1", + "fs-extra": "^8.1", "hyperlinker": "^1.0.0", "indent-string": "^4.0.0", "is-wsl": "^2.2.0", @@ -469,205 +438,79 @@ "supports-color": "^7.1.0", "supports-hyperlinks": "^2.1.0", "tslib": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==", - "dev": true - } } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, "extract-stack": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/extract-stack/-/extract-stack-2.0.0.tgz", "integrity": "sha512-AEo4zm+TenK7zQorGK1f9mJ8L14hnTDi2ZQPR+Mub1NX8zimka1mXpV5LpH8x9HoUmFSHZCfLHqWvp0Y4FxxzQ==", "dev": true }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "dependencies": { - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "hosted-git-info": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.1.tgz", + "integrity": "sha512-eT7NrxAsppPRQEBSwKSosReE+v8OzABwEScQYk5d4uxaEPlzxTIku7LINXtBGalthkLhJnq5lBI89PfK43zAKg==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "lru-cache": "^6.0.0" } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "normalize-package-data": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz", + "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "resolve": "^1.20.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" } }, "supports-hyperlinks": { @@ -678,23 +521,12 @@ "requires": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" - }, - "dependencies": { - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", "dev": true }, "type-fest": { @@ -702,80 +534,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", "dev": true - }, - "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "dev": true, - "requires": { - "string-width": "^2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "wrap-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-4.0.0.tgz", - "integrity": "sha512-uMTsj9rDb0/7kk1PbcbCcwvHUxp60fGDB/NNXpVa0Q+ic/e7y5+BwTxKfQ33VYgDppSwi/FBzpetYzo8s6tfbg==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } } } }, @@ -3540,9 +3298,9 @@ } }, "cli-progress": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.8.2.tgz", - "integrity": "sha512-qRwBxLldMSfxB+YGFgNRaj5vyyHe1yMpVeDL79c+7puGujdKJHQHydgqXDcrkvQgJ5U/d3lpf6vffSoVVUftVQ==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.9.0.tgz", + "integrity": "sha512-g7rLWfhAo/7pF+a/STFH/xPyosaL1zgADhI0OM83hl3c7S43iGvJWEAV2QuDOnQ8i6EMBj/u4+NTd0d5L+4JfA==", "dev": true, "requires": { "colors": "^1.1.2", @@ -8521,6 +8279,15 @@ "ci-info": "^2.0.0" } }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -11317,9 +11084,9 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object-treeify": { - "version": "1.1.26", - "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.26.tgz", - "integrity": "sha512-0WTfU7SGM8umY4YPpOg+oHXL66E6dPVCr+sMR6KitPmvg8CkVrHUUZYEFtx0+5Wb0HjFEsBwBYXyGRNeX7c/oQ==", + "version": "1.1.33", + "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz", + "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", "dev": true }, "object-visit": { @@ -12717,14 +12484,14 @@ } }, "parse-json": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", - "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", + "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, @@ -14341,9 +14108,9 @@ } }, "sort-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-4.0.0.tgz", - "integrity": "sha512-hlJLzrn/VN49uyNkZ8+9b+0q9DjmmYcYOnbMQtpkLrYpPwRApDPZfmqbUfJnAA3sb/nRib+nDot7Zi/1ER1fuA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-4.2.0.tgz", + "integrity": "sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==", "dev": true, "requires": { "is-plain-obj": "^2.0.0" diff --git a/package.json b/package.json index 5d9c6bf5..24add3ff 100644 --- a/package.json +++ b/package.json @@ -111,7 +111,7 @@ "devDependencies": { "@balena/lint": "^5.2.0", "@oclif/config": "^1.17.0", - "@oclif/dev-cli": "^1.22.2", + "@oclif/dev-cli": "^1.26.0", "@oclif/parser": "^3.8.5", "@octokit/plugin-throttling": "^3.3.0", "@octokit/rest": "^16.43.2", diff --git a/patches/all/@oclif+dev-cli+1.22.2.patch b/patches/all/@oclif+dev-cli+1.22.2.patch deleted file mode 100644 index 7d402689..00000000 --- a/patches/all/@oclif+dev-cli+1.22.2.patch +++ /dev/null @@ -1,310 +0,0 @@ -diff --git a/node_modules/@oclif/dev-cli/lib/commands/pack/macos.js b/node_modules/@oclif/dev-cli/lib/commands/pack/macos.js -index cd771cd..4a66939 100644 ---- a/node_modules/@oclif/dev-cli/lib/commands/pack/macos.js -+++ b/node_modules/@oclif/dev-cli/lib/commands/pack/macos.js -@@ -37,6 +37,7 @@ class PackMacos extends command_1.Command { - if (process.env.OSX_KEYCHAIN) - args.push('--keychain', process.env.OSX_KEYCHAIN); - args.push(dist); -+ console.log(`pkgbuild "${args.join('" "')}"`); - await qq.x('pkgbuild', args); - } - } -diff --git a/node_modules/@oclif/dev-cli/lib/commands/pack/win.js b/node_modules/@oclif/dev-cli/lib/commands/pack/win.js -index a9d4276..4ac508f 100644 ---- a/node_modules/@oclif/dev-cli/lib/commands/pack/win.js -+++ b/node_modules/@oclif/dev-cli/lib/commands/pack/win.js -@@ -3,11 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true }); - const command_1 = require("@oclif/command"); - const qq = require("qqjs"); - const Tarballs = require("../../tarballs"); -+const { fixPath } = require("../../util"); -+ - class PackWin extends command_1.Command { - async run() { - await this.checkForNSIS(); - const { flags } = this.parse(PackWin); -- const buildConfig = await Tarballs.buildConfig(flags.root); -+ const targets = flags.targets !== undefined ? flags.targets.split(',') : undefined; -+ const buildConfig = await Tarballs.buildConfig(flags.root, {targets}); - const { config } = buildConfig; - await Tarballs.build(buildConfig, { platform: 'win32', pack: false }); - const arches = buildConfig.targets.filter(t => t.platform === 'win32').map(t => t.arch); -@@ -17,7 +20,7 @@ class PackWin extends command_1.Command { - await qq.write([installerBase, `bin/${config.bin}`], scripts.sh(config)); - await qq.write([installerBase, `${config.bin}.nsi`], scripts.nsis(config, arch)); - await qq.mv(buildConfig.workspace({ platform: 'win32', arch }), [installerBase, 'client']); -- await qq.x(`makensis ${installerBase}/${config.bin}.nsi | grep -v "\\[compress\\]" | grep -v "^File: Descending to"`); -+ await qq.x(`makensis ${fixPath(installerBase)}/${config.bin}.nsi | grep -v "\\[compress\\]" | grep -v "^File: Descending to"`) - const o = buildConfig.dist(`win/${config.bin}-v${buildConfig.version}-${arch}.exe`); - await qq.mv([installerBase, 'installer.exe'], o); - this.log(`built ${o}`); -@@ -40,6 +43,7 @@ class PackWin extends command_1.Command { - PackWin.description = 'create windows installer from oclif CLI'; - PackWin.flags = { - root: command_1.flags.string({ char: 'r', description: 'path to oclif CLI root', default: '.', required: true }), -+ targets: command_1.flags.string({char: 't', description: 'comma-separated targets to pack (e.g.: win32-x86,win32-x64)'}), - }; - exports.default = PackWin; - const scripts = { -@@ -89,6 +93,13 @@ VIAddVersionKey /LANG=\${LANG_ENGLISH} "ProductVersion" "\${VERSION}.0" - InstallDir "\$PROGRAMFILES${arch === 'x64' ? '64' : ''}\\${config.dirname}" - - Section "${config.name} CLI \${VERSION}" -+ ; First remove any old client files. -+ ; (Remnants of old versions were causing CLI errors) -+ ; Initially tried running the Uninstall.exe, but was -+ ; unable to make script wait for completion (despite using _?) -+ DetailPrint "Removing files from previous version." -+ RMDir /r "$INSTDIR\\client" -+ - SetOutPath $INSTDIR - File /r bin - File /r client -diff --git a/node_modules/@oclif/dev-cli/lib/tarballs/build.js b/node_modules/@oclif/dev-cli/lib/tarballs/build.js -index 3e613e0..4059ff4 100644 ---- a/node_modules/@oclif/dev-cli/lib/tarballs/build.js -+++ b/node_modules/@oclif/dev-cli/lib/tarballs/build.js -@@ -17,8 +17,11 @@ const pack = async (from, to) => { - qq.cd(prevCwd); - }; - async function build(c, options = {}) { -- const { xz, config } = c; -+ const { xz, config, tmp } = c; - const prevCwd = qq.cwd(); -+ -+ console.log(`[patched @oclif/dev-cli] cwd="${prevCwd}"\n c.root="${c.root}" c.workspace()="${c.workspace()}"`); -+ - const packCLI = async () => { - const stdout = await qq.x.stdout('npm', ['pack', '--unsafe-perm'], { cwd: c.root }); - return path.join(c.root, stdout.split('\n').pop()); -@@ -34,6 +37,44 @@ async function build(c, options = {}) { - await qq.mv(f, '.'); - await qq.rm('package', tarball, 'bin/run.cmd'); - }; -+ const copyCLI = async() => { -+ const ws = c.workspace(); -+ await qq.emptyDir(ws); -+ qq.cd(ws); -+ const sources = [ -+ 'CHANGELOG.md', -+ 'INSTALL.md', -+ 'LICENSE', -+ 'README.md', -+ 'TROUBLESHOOTING.md', -+ 'automation/check-npm-version.js', -+ 'bin', -+ 'build', -+ 'npm-shrinkwrap.json', -+ 'package.json', -+ 'patches', -+ 'typings', -+ 'oclif.manifest.json', -+ ]; -+ for (const source of sources) { -+ let destDir = ws; -+ const dirname = path.dirname(source); -+ if (dirname && dirname !== '.') { -+ destDir = path.join(ws, dirname); -+ qq.mkdirp(destDir); -+ } -+ console.log(`cp "${source}" -> "${ws}"`); -+ await qq.cp(path.join(c.root, source), destDir); -+ } -+ // rename the original balena-cli ./bin/balena entry point for oclif compatibility -+ await qq.mv('bin/balena', 'bin/run'); -+ await qq.rm('bin/run.cmd'); -+ // The oclif installers are produced with `npm i --production`, while the -+ // source `bin` folder may contain a `.fast-boot.json` produced with `npm i`. -+ // This has previously led to issues preventing the CLI from starting, so -+ // delete `.fast-boot.json` (if any) from the destination folder. -+ await qq.rm('bin/.fast-boot.json'); -+ } - const updatePJSON = async () => { - qq.cd(c.workspace()); - const pjson = await qq.readJSON('package.json'); -@@ -56,7 +97,13 @@ async function build(c, options = {}) { - lockpath = qq.join(c.root, 'npm-shrinkwrap.json'); - } - await qq.cp(lockpath, '.'); -- await qq.x('npm install --production'); -+ -+ const npmVersion = await qq.x.stdout('npm', ['--version']); -+ if (require('semver').lt(npmVersion, '6.9.0')) { -+ await qq.x('npx npm@6.9.0 install --production'); -+ } else { -+ await qq.x('npm install --production'); -+ } - } - }; - const buildTarget = async (target) => { -@@ -71,7 +118,8 @@ async function build(c, options = {}) { - output: path.join(workspace, 'bin', 'node'), - platform: target.platform, - arch: target.arch, -- tmp: qq.join(config.root, 'tmp'), -+ tmp, -+ projectRootPath: c.root, - }); - if (options.pack === false) - return; -@@ -124,7 +172,8 @@ async function build(c, options = {}) { - await qq.writeJSON(c.dist(config.s3Key('manifest')), manifest); - }; - log_1.log(`gathering workspace for ${config.bin} to ${c.workspace()}`); -- await extractCLI(await packCLI()); -+ // await extractCLI(await packCLI()); -+ await copyCLI(); - await updatePJSON(); - await addDependencies(); - await bin_1.writeBinScripts({ config, baseWorkspace: c.workspace(), nodeVersion: c.nodeVersion }); -diff --git a/node_modules/@oclif/dev-cli/lib/tarballs/config.js b/node_modules/@oclif/dev-cli/lib/tarballs/config.js -index 320fc52..efe3f2f 100644 ---- a/node_modules/@oclif/dev-cli/lib/tarballs/config.js -+++ b/node_modules/@oclif/dev-cli/lib/tarballs/config.js -@@ -10,7 +10,13 @@ function gitSha(cwd, options = {}) { - } - exports.gitSha = gitSha; - async function Tmp(config) { -- const tmp = path.join(config.root, 'tmp'); -+ let tmp; -+ if (process.env.BUILD_TMP) { -+ tmp = path.join(process.env.BUILD_TMP, 'oclif'); -+ } else { -+ tmp = path.join(config.root, 'tmp'); -+ } -+ console.log(`@oclif/dev-cli tmp="${tmp}"`); - await qq.mkdirp(tmp); - return tmp; - } -@@ -36,7 +42,7 @@ async function buildConfig(root, options = {}) { - s3Config: updateConfig.s3, - nodeVersion: updateConfig.node.version || process.versions.node, - workspace(target) { -- const base = qq.join(config.root, 'tmp'); -+ const base = tmp; - if (target && target.platform) - return qq.join(base, [target.platform, target.arch].join('-'), config.s3Key('baseDir', target)); - return qq.join(base, config.s3Key('baseDir', target)); -diff --git a/node_modules/@oclif/dev-cli/lib/tarballs/node.js b/node_modules/@oclif/dev-cli/lib/tarballs/node.js -index b3918c5..073515a 100644 ---- a/node_modules/@oclif/dev-cli/lib/tarballs/node.js -+++ b/node_modules/@oclif/dev-cli/lib/tarballs/node.js -@@ -1,28 +1,58 @@ - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - const errors_1 = require("@oclif/errors"); -+const { isMSYS2 } = require('qqjs'); - const path = require("path"); - const qq = require("qqjs"); - const log_1 = require("../log"); --async function checkFor7Zip() { -- try { -- await qq.x('7z', { stdio: [0, null, 2] }); -+const { fixPath } = require("../util"); -+let try_install_7zip = true; -+async function checkFor7Zip(projectRootPath) { -+ let zPaths = [ -+ fixPath(path.join(projectRootPath, 'node_modules', '7zip', '7zip-lite', '7z.exe')), -+ '7z', -+ ]; -+ let foundPath = ''; -+ for (const zPath of zPaths) { -+ try { -+ console.log(`probing 7zip at "${zPath}"...`); -+ await qq.x(zPath, { stdio: [0, null, 2] }); -+ foundPath = zPath; -+ break; -+ } -+ catch (err) {} - } -- catch (err) { -- if (err.code === 127) -- errors_1.error('install 7-zip to package windows tarball'); -- else -- throw err; -+ if (foundPath) { -+ console.log(`found 7zip at "${foundPath}"`); -+ } else if (try_install_7zip) { -+ try_install_7zip = false; -+ console.log(`attempting "npm install 7zip"...`); -+ qq.pushd(projectRootPath); -+ try { -+ await qq.x('npm', ['install', '--no-save', '7zip']); -+ } catch (err) { -+ errors_1.error('install 7-zip to package windows tarball', true); -+ } finally { -+ qq.popd(); -+ } -+ return checkFor7Zip(projectRootPath); -+ } else { -+ errors_1.error('install 7-zip to package windows tarball', true); - } -+ return foundPath; - } --async function fetchNodeBinary({ nodeVersion, output, platform, arch, tmp }) { -+async function fetchNodeBinary({ nodeVersion, output, platform, arch, tmp, projectRootPath }) { -+ -+ console.log(`fetchNodeBinary using tmp="${tmp}`); -+ - if (arch === 'arm') - arch = 'armv7l'; - let nodeBase = `node-v${nodeVersion}-${platform}-${arch}`; - let tarball = path.join(tmp, 'node', `${nodeBase}.tar.xz`); - let url = `https://nodejs.org/dist/v${nodeVersion}/${nodeBase}.tar.xz`; -+ let zPath = ''; - if (platform === 'win32') { -- await checkFor7Zip(); -+ zPath = await checkFor7Zip(projectRootPath); - nodeBase = `node-v${nodeVersion}-win-${arch}`; - tarball = path.join(tmp, 'node', `${nodeBase}.7z`); - url = `https://nodejs.org/dist/v${nodeVersion}/${nodeBase}.7z`; -@@ -40,7 +70,8 @@ async function fetchNodeBinary({ nodeVersion, output, platform, arch, tmp }) { - const basedir = path.dirname(tarball); - await qq.mkdirp(basedir); - await qq.download(url, tarball); -- await qq.x(`grep ${path.basename(tarball)} ${shasums} | shasum -a 256 -c -`, { cwd: basedir }); -+ const shaCmd = isMSYS2 ? 'sha256sum -c -' : 'shasum -a 256 -c -'; -+ await qq.x(`grep ${path.basename(tarball)} ${fixPath(shasums)} | ${shaCmd}`, { cwd: basedir }); - }; - const extract = async () => { - log_1.log(`extracting ${nodeBase}`); -@@ -50,7 +81,7 @@ async function fetchNodeBinary({ nodeVersion, output, platform, arch, tmp }) { - await qq.mkdirp(path.dirname(cache)); - if (platform === 'win32') { - qq.pushd(nodeTmp); -- await qq.x(`7z x -bd -y ${tarball} > /dev/null`); -+ await qq.x(`"${zPath}" x -bd -y ${fixPath(tarball)} > /dev/null`); - await qq.mv([nodeBase, 'node.exe'], cache); - qq.popd(); - } -diff --git a/node_modules/@oclif/dev-cli/lib/util.js b/node_modules/@oclif/dev-cli/lib/util.js -index 17368b4..9d3fcf9 100644 ---- a/node_modules/@oclif/dev-cli/lib/util.js -+++ b/node_modules/@oclif/dev-cli/lib/util.js -@@ -1,6 +1,7 @@ - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - const _ = require("lodash"); -+const { isCygwin, isMinGW, isMSYS2 } = require('qqjs'); - function castArray(input) { - if (input === undefined) - return []; -@@ -40,3 +41,17 @@ function sortBy(arr, fn) { - } - exports.sortBy = sortBy; - exports.template = (context) => (t) => _.template(t || '')(context); -+ -+function fixPath(badPath) { -+ console.log(`fixPath MSYSTEM=${process.env.MSYSTEM} OSTYPE=${process.env.OSTYPE} isMSYS2=${isMSYS2} isMingGW=${isMinGW} isCygwin=${isCygwin}`); -+ // 'c:\myfolder' -> '/c/myfolder' or '/cygdrive/c/myfolder' -+ let fixed = badPath.replace(/\\/g, '/'); -+ if (isMSYS2 || isMinGW) { -+ fixed = fixed.replace(/^([a-zA-Z]):/, '/$1'); -+ } else if (isCygwin) { -+ fixed = fixed.replace(/^([a-zA-Z]):/, '/cygdrive/$1'); -+ } -+ console.log(`[patched @oclif/dev-cli] fixPath before="${badPath}" after="${fixed}"`); -+ return fixed; -+} -+exports.fixPath = fixPath; diff --git a/patches/all/@oclif+dev-cli+1.26.0.patch b/patches/all/@oclif+dev-cli+1.26.0.patch new file mode 100644 index 00000000..97c99142 --- /dev/null +++ b/patches/all/@oclif+dev-cli+1.26.0.patch @@ -0,0 +1,250 @@ +diff --git a/node_modules/@oclif/dev-cli/lib/commands/pack/macos.js b/node_modules/@oclif/dev-cli/lib/commands/pack/macos.js +index e0abbbe..debf799 100644 +--- a/node_modules/@oclif/dev-cli/lib/commands/pack/macos.js ++++ b/node_modules/@oclif/dev-cli/lib/commands/pack/macos.js +@@ -128,6 +128,7 @@ class PackMacos extends command_1.Command { + if (process.env.OSX_KEYCHAIN) + args.push('--keychain', process.env.OSX_KEYCHAIN); + args.push(dist); ++ console.error(`[debug] @oclif/dev-cli pkgbuild "${args.join('" "')}"`); + await qq.x('pkgbuild', args); + } + } +diff --git a/node_modules/@oclif/dev-cli/lib/commands/pack/win.js b/node_modules/@oclif/dev-cli/lib/commands/pack/win.js +index a313991..6681892 100644 +--- a/node_modules/@oclif/dev-cli/lib/commands/pack/win.js ++++ b/node_modules/@oclif/dev-cli/lib/commands/pack/win.js +@@ -51,6 +51,13 @@ VIAddVersionKey /LANG=\${LANG_ENGLISH} "ProductVersion" "\${VERSION}.0" + InstallDir "\$PROGRAMFILES${arch === 'x64' ? '64' : ''}\\${config.dirname}" + + Section "${config.name} CLI \${VERSION}" ++ ; First remove any old client files. ++ ; (Remnants of old versions were causing CLI errors) ++ ; Initially tried running the Uninstall.exe, but was ++ ; unable to make script wait for completion (despite using _?) ++ DetailPrint "Removing files from previous version." ++ RMDir /r "$INSTDIR\\client" ++ + SetOutPath $INSTDIR + File /r bin + File /r client +@@ -192,7 +199,8 @@ class PackWin extends command_1.Command { + async run() { + await this.checkForNSIS(); + const { flags } = this.parse(PackWin); +- const buildConfig = await Tarballs.buildConfig(flags.root); ++ const targets = flags.targets ? flags.targets.split(',') : undefined; ++ const buildConfig = await Tarballs.buildConfig(flags.root, { targets }); + const { config } = buildConfig; + await Tarballs.build(buildConfig, { platform: 'win32', pack: false }); + const arches = buildConfig.targets.filter(t => t.platform === 'win32').map(t => t.arch); +@@ -207,7 +215,8 @@ class PackWin extends command_1.Command { + // eslint-disable-next-line no-await-in-loop + await qq.mv(buildConfig.workspace({ platform: 'win32', arch }), [installerBase, 'client']); + // eslint-disable-next-line no-await-in-loop +- await qq.x(`makensis ${installerBase}/${config.bin}.nsi | grep -v "\\[compress\\]" | grep -v "^File: Descending to"`); ++ const { msysExec, toMsysPath } = require("../../util"); ++ await msysExec(`makensis ${toMsysPath(installerBase)}/${config.bin}.nsi | grep -v "\\[compress\\]" | grep -v "^File: Descending to"`); + const o = buildConfig.dist(`win/${config.bin}-v${buildConfig.version}-${arch}.exe`); + // eslint-disable-next-line no-await-in-loop + await qq.mv([installerBase, 'installer.exe'], o); +@@ -232,4 +241,5 @@ exports.default = PackWin; + PackWin.description = 'create windows installer from oclif CLI'; + PackWin.flags = { + root: command_1.flags.string({ char: 'r', description: 'path to oclif CLI root', default: '.', required: true }), ++ targets: command_1.flags.string({char: 't', description: 'comma-separated targets to pack (e.g.: win32-x86,win32-x64)'}), + }; +diff --git a/node_modules/@oclif/dev-cli/lib/tarballs/build.js b/node_modules/@oclif/dev-cli/lib/tarballs/build.js +index c6bd245..baa7f6f 100644 +--- a/node_modules/@oclif/dev-cli/lib/tarballs/build.js ++++ b/node_modules/@oclif/dev-cli/lib/tarballs/build.js +@@ -18,8 +18,9 @@ const pack = async (from, to) => { + qq.cd(prevCwd); + }; + async function build(c, options = {}) { +- const { xz, config } = c; ++ const { xz, config, tmp } = c; + const prevCwd = qq.cwd(); ++ console.error(`[debug] @oclif/dev-cli cwd="${prevCwd}"\n c.root="${c.root}" c.workspace()="${c.workspace()}"`); + const packCLI = async () => { + const stdout = await qq.x.stdout('npm', ['pack', '--unsafe-perm'], { cwd: c.root }); + return path.join(c.root, stdout.split('\n').pop()); +@@ -30,11 +31,19 @@ async function build(c, options = {}) { + tarball = path.basename(tarball); + tarball = qq.join([c.workspace(), tarball]); + qq.cd(c.workspace()); +- await qq.x(`tar -xzf ${tarball}`); ++ const { msysExec, toMsysPath } = require("../util"); ++ await msysExec(`tar -xzf ${toMsysPath(tarball)}`); + // eslint-disable-next-line no-await-in-loop + for (const f of await qq.ls('package', { fullpath: true })) + await qq.mv(f, '.'); + await qq.rm('package', tarball, 'bin/run.cmd'); ++ // rename the original balena-cli ./bin/balena entry point for oclif compatibility ++ await qq.mv('bin/balena', 'bin/run'); ++ // The oclif installers are a production installation, while the source ++ // `bin` folder may contain a `.fast-boot.json` file of a dev installation. ++ // This has previously led to issues preventing the CLI from starting, so ++ // delete `.fast-boot.json` (if any) from the destination folder. ++ await qq.rm('bin/.fast-boot.json'); + }; + const updatePJSON = async () => { + qq.cd(c.workspace()); +@@ -46,21 +55,21 @@ async function build(c, options = {}) { + await qq.writeJSON('package.json', pjson); + }; + const addDependencies = async () => { +- qq.cd(c.workspace()); +- const yarnRoot = findYarnWorkspaceRoot(c.root) || c.root; +- const yarn = await qq.exists([yarnRoot, 'yarn.lock']); +- if (yarn) { +- await qq.cp([yarnRoot, 'yarn.lock'], '.'); +- await qq.x('yarn --no-progress --production --non-interactive'); +- } +- else { +- let lockpath = qq.join(c.root, 'package-lock.json'); +- if (!await qq.exists(lockpath)) { +- lockpath = qq.join(c.root, 'npm-shrinkwrap.json'); +- } +- await qq.cp(lockpath, '.'); +- await qq.x('npm install --production'); ++ const ws = c.workspace(); ++ qq.cd(ws); ++ console.error(`[debug] @oclif/dev-cli copying node_modules to "${ws}"`) ++ const source = path.join(c.root, 'node_modules'); ++ if (process.platform === 'win32') { ++ // xcopy is much faster than `qq.cp(source, ws)` ++ await qq.x(`xcopy "${source}" "${ws}\\node_modules" /S /E /B /I /K /Q /Y`); ++ } else { ++ // use the shell's `cp` on macOS in order to preserve extended ++ // file attributes containing `codesign` digital signatures ++ await qq.x(`cp -pR "${source}" "${ws}"`); + } ++ console.error(`[debug] @oclif/dev-cli running "npm prune --production" in "${ws}"`); ++ await qq.x('npm prune --production'); ++ console.error(`[debug] @oclif/dev-cli done`); + }; + const buildTarget = async (target) => { + const workspace = c.workspace(target); +@@ -74,7 +83,8 @@ async function build(c, options = {}) { + output: path.join(workspace, 'bin', 'node'), + platform: target.platform, + arch: target.arch, +- tmp: qq.join(config.root, 'tmp'), ++ tmp, ++ projectRootPath: c.root, + }); + if (options.pack === false) + return; +diff --git a/node_modules/@oclif/dev-cli/lib/tarballs/config.js b/node_modules/@oclif/dev-cli/lib/tarballs/config.js +index 9754a6b..68ef6b7 100644 +--- a/node_modules/@oclif/dev-cli/lib/tarballs/config.js ++++ b/node_modules/@oclif/dev-cli/lib/tarballs/config.js +@@ -17,7 +17,10 @@ function gitSha(cwd, options = {}) { + } + exports.gitSha = gitSha; + async function Tmp(config) { +- const tmp = path.join(config.root, 'tmp'); ++ const tmp = process.env.BUILD_TMP ++ ? path.join(process.env.BUILD_TMP, 'oclif') ++ : path.join(config.root, 'tmp'); ++ console.error(`[debug] @oclif/dev-cli tmp="${tmp}"`); + await qq.mkdirp(tmp); + return tmp; + } +@@ -44,7 +47,7 @@ async function buildConfig(root, options = {}) { + s3Config: updateConfig.s3, + nodeVersion: updateConfig.node.version || process.versions.node, + workspace(target) { +- const base = qq.join(config.root, 'tmp'); ++ const base = tmp; + if (target && target.platform) + return qq.join(base, [target.platform, target.arch].join('-'), config.s3Key('baseDir', target)); + return qq.join(base, config.s3Key('baseDir', target)); +diff --git a/node_modules/@oclif/dev-cli/lib/tarballs/node.js b/node_modules/@oclif/dev-cli/lib/tarballs/node.js +index fabe5c4..e32dd76 100644 +--- a/node_modules/@oclif/dev-cli/lib/tarballs/node.js ++++ b/node_modules/@oclif/dev-cli/lib/tarballs/node.js +@@ -4,9 +4,10 @@ const errors_1 = require("@oclif/errors"); + const path = require("path"); + const qq = require("qqjs"); + const log_1 = require("../log"); ++const { isMSYS2, msysExec, toMsysPath } = require("../util"); + async function checkFor7Zip() { + try { +- await qq.x('7z', { stdio: [0, null, 2] }); ++ await msysExec('7z', { stdio: [0, null, 2] }); + } + catch (error) { + if (error.code === 127) +@@ -41,7 +42,8 @@ async function fetchNodeBinary({ nodeVersion, output, platform, arch, tmp }) { + const basedir = path.dirname(tarball); + await qq.mkdirp(basedir); + await qq.download(url, tarball); +- await qq.x(`grep ${path.basename(tarball)} ${shasums} | shasum -a 256 -c -`, { cwd: basedir }); ++ const shaCmd = isMSYS2 ? 'sha256sum -c -' : 'shasum -a 256 -c -'; ++ await msysExec(`grep ${path.basename(tarball)} ${toMsysPath(shasums)} | ${shaCmd}`, { cwd: basedir }); + }; + const extract = async () => { + log_1.log(`extracting ${nodeBase}`); +@@ -51,7 +53,7 @@ async function fetchNodeBinary({ nodeVersion, output, platform, arch, tmp }) { + await qq.mkdirp(path.dirname(cache)); + if (platform === 'win32') { + qq.pushd(nodeTmp); +- await qq.x(`7z x -bd -y ${tarball} > /dev/null`); ++ await msysExec(`7z x -bd -y ${toMsysPath(tarball)} > /dev/null`); + await qq.mv([nodeBase, 'node.exe'], cache); + qq.popd(); + } +diff --git a/node_modules/@oclif/dev-cli/lib/util.js b/node_modules/@oclif/dev-cli/lib/util.js +index b3d48b7..540bbe6 100644 +--- a/node_modules/@oclif/dev-cli/lib/util.js ++++ b/node_modules/@oclif/dev-cli/lib/util.js +@@ -40,3 +40,47 @@ function sortBy(arr, fn) { + } + exports.sortBy = sortBy; + exports.template = (context) => (t) => _.template(t || '')(context); ++ ++// OSTYPE is 'msys' for MSYS 1.0 and for MSYS2, or 'cygwin' for Cygwin ++// but note that OSTYPE is not "exported" by default, so run: export OSTYPE=$OSTYPE ++// MSYSTEM is 'MINGW32' for MSYS 1.0, 'MSYS' for MSYS2, and undefined for Cygwin ++const isCygwin = process.env.OSTYPE === 'cygwin'; ++const isMinGW = process.env.MSYSTEM && process.env.MSYSTEM.startsWith('MINGW'); ++const isMSYS2 = process.env.MSYSTEM && process.env.MSYSTEM.startsWith('MSYS'); ++const MSYSSHELLPATH = process.env.MSYSSHELLPATH || ++ (isMSYS2 ? 'C:\\msys64\\usr\\bin\\bash.exe' : ++ (isMinGW ? 'C:\\MinGW\\msys\\1.0\\bin\\bash.exe' : ++ (isCygwin ? 'C:\\cygwin64\\bin\\bash.exe' : '/bin/sh'))); ++ ++exports.isCygwin = isCygwin; ++exports.isMinGW = isMinGW; ++exports.isMSYS2 = isMSYS2; ++console.error(`[debug] @oclif/dev-cli MSYSSHELLPATH=${MSYSSHELLPATH} MSYSTEM=${process.env.MSYSTEM} OSTYPE=${process.env.OSTYPE} isMSYS2=${isMSYS2} isMingGW=${isMinGW} isCygwin=${isCygwin}`); ++ ++const qq = require("qqjs"); ++ ++/* Convert a Windows path like 'C:\tmp' to a MSYS path like '/c/tmp' */ ++function toMsysPath(windowsPath) { ++ // 'c:\myfolder' -> '/c/myfolder' or '/cygdrive/c/myfolder' ++ let msysPath = windowsPath.replace(/\\/g, '/'); ++ if (isMSYS2 || isMinGW) { ++ msysPath = msysPath.replace(/^([a-zA-Z]):/, '/$1'); ++ } else if (isCygwin) { ++ msysPath = msysPath.replace(/^([a-zA-Z]):/, '/cygdrive/$1'); ++ } ++ console.error(`[debug] @oclif/dev-cli toMsysPath before="${windowsPath}" after="${msysPath}"`); ++ return msysPath; ++} ++exports.toMsysPath = toMsysPath; ++ ++/* Like qqjs qq.x(), but using MSYS bash on Windows instead of cmd.exe */ ++async function msysExec(cmd, options = {}) { ++ if (process.platform !== 'win32') { ++ return qq.x(cmd, options); ++ } ++ const sh = MSYSSHELLPATH; ++ const args = ['-c', cmd]; ++ console.error(`[debug] @oclif/dev-cli msysExec sh="${sh}" args=${JSON.stringify(args)} options=${JSON.stringify(options)}`); ++ return qq.x(sh, args, options); ++} ++exports.msysExec = msysExec; diff --git a/patches/all/qqjs++execa+0.10.0.dev.patch b/patches/all/qqjs++execa+0.10.0.dev.patch deleted file mode 100644 index dddfc7e6..00000000 --- a/patches/all/qqjs++execa+0.10.0.dev.patch +++ /dev/null @@ -1,64 +0,0 @@ -diff --git a/node_modules/qqjs/node_modules/execa/index.js b/node_modules/qqjs/node_modules/execa/index.js -index 06f3969..8bca191 100644 ---- a/node_modules/qqjs/node_modules/execa/index.js -+++ b/node_modules/qqjs/node_modules/execa/index.js -@@ -14,6 +14,17 @@ const stdio = require('./lib/stdio'); - - const TEN_MEGABYTES = 1000 * 1000 * 10; - -+// OSTYPE is 'msys' for MSYS 1.0 and for MSYS2, or 'cygwin' for Cygwin -+// but note that OSTYPE is not "exported" by default, so run: export OSTYPE=$OSTYPE -+// MSYSTEM is 'MINGW32' for MSYS 1.0, 'MSYS' for MSYS2, and undefined for Cygwin -+const isCygwin = process.env.OSTYPE === 'cygwin'; -+const isMinGW = process.env.MSYSTEM && process.env.MSYSTEM.startsWith('MINGW'); -+const isMSYS2 = process.env.MSYSTEM && process.env.MSYSTEM.startsWith('MSYS'); -+ -+console.log(`[patched execa] detected "${ -+ isCygwin ? 'Cygwin' : isMinGW ? 'MinGW' : isMSYS2 ? 'MSYS2' : 'standard' -+}" environment (MSYSTEM="${process.env.MSYSTEM}")`); -+ - function handleArgs(cmd, args, opts) { - let parsed; - -@@ -104,13 +115,22 @@ function handleShell(fn, cmd, opts) { - - opts = Object.assign({}, opts); - -- if (process.platform === 'win32') { -+ if (isMSYS2 || isMinGW || isCygwin) { -+ file = process.env.MSYSSHELLPATH || -+ (isMSYS2 ? 'C:\\msys64\\usr\\bin\\bash.exe' : -+ (isMinGW ? 'C:\\MinGW\\msys\\1.0\\bin\\bash.exe' : -+ (isCygwin ? 'C:\\cygwin64\\bin\\bash.exe' : file))); -+ } -+ else if (process.platform === 'win32') { - opts.__winShell = true; - file = process.env.comspec || 'cmd.exe'; - args = ['/s', '/c', `"${cmd}"`]; - opts.windowsVerbatimArguments = true; - } - -+ const argStr = (args && args.length) ? `["${args.join('", "')}"]` : args; -+ console.log(`[patched execa] handleShell file="${file}" args=${argStr}`); -+ - if (opts.shell) { - file = opts.shell; - delete opts.shell; -@@ -199,6 +219,9 @@ module.exports = (cmd, args, opts) => { - const maxBuffer = parsed.opts.maxBuffer; - const joinedCmd = joinCmd(cmd, args); - -+ const argStr = (args && args.length) ? `["${args.join('", "')}"]` : args; -+ console.log(`[patched execa] parsed.cmd="${parsed.cmd}" parsed.args=${argStr}`); -+ - let spawned; - try { - spawned = childProcess.spawn(parsed.cmd, parsed.args, parsed.opts); -@@ -364,3 +387,7 @@ module.exports.sync = (cmd, args, opts) => { - module.exports.shellSync = (cmd, opts) => handleShell(module.exports.sync, cmd, opts); - - module.exports.spawn = util.deprecate(module.exports, 'execa.spawn() is deprecated. Use execa() instead.'); -+ -+module.exports.isCygwin = isCygwin; -+module.exports.isMinGW = isMinGW; -+module.exports.isMSYS2 = isMSYS2; diff --git a/patches/all/qqjs+0.3.11.dev.patch b/patches/all/qqjs+0.3.11.dev.patch deleted file mode 100644 index ad096e0c..00000000 --- a/patches/all/qqjs+0.3.11.dev.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/node_modules/qqjs/lib/exec.js b/node_modules/qqjs/lib/exec.js -index d9293a9..442fea8 100644 ---- a/node_modules/qqjs/lib/exec.js -+++ b/node_modules/qqjs/lib/exec.js -@@ -5,6 +5,11 @@ const m = { - m: {}, - get execa() { return this.m.execa = this.m.execa || require('execa'); }, - }; -+const { isCygwin, isMinGW, isMSYS2 } = require('execa'); -+exports.isCygwin = isCygwin; -+exports.isMinGW = isMinGW; -+exports.isMSYS2 = isMSYS2; -+console.log(`qqjs exec.js MSYSTEM=${process.env.MSYSTEM} OSTYPE=${process.env.OSTYPE} isMSYS2=${isMSYS2} isMingGW=${isMinGW} isCygwin=${isCygwin}`); - /** - * easy access to process.env - */ From 68b61e74245981a3b78f3332b6f5e6fb2e081c37 Mon Sep 17 00:00:00 2001 From: Paulo Castro Date: Mon, 22 Mar 2021 16:05:20 +0000 Subject: [PATCH 3/3] Refactor automation scripts (reduce need for MSYS to build on Windows) Change-type: patch --- automation/build-bin.ts | 4 ++-- automation/run.ts | 25 ------------------------- automation/utils.ts | 37 ------------------------------------- 3 files changed, 2 insertions(+), 64 deletions(-) diff --git a/automation/build-bin.ts b/automation/build-bin.ts index b42d42e1..ae16a370 100644 --- a/automation/build-bin.ts +++ b/automation/build-bin.ts @@ -34,15 +34,15 @@ import { diffLines, getSubprocessStdout, loadPackageJson, - MSYS2_BASH, ROOT, StdOutTap, whichSpawn, } from './utils'; - export const packageJSON = loadPackageJson(); export const version = 'v' + packageJSON.version; const arch = process.arch; +const MSYS2_BASH = + process.env.MSYSSHELLPATH || 'C:\\msys64\\usr\\bin\\bash.exe'; function dPath(...paths: string[]) { return path.join(ROOT, 'dist', ...paths); diff --git a/automation/run.ts b/automation/run.ts index 142442b6..dad3309f 100644 --- a/automation/run.ts +++ b/automation/run.ts @@ -27,7 +27,6 @@ import { release, updateDescriptionOfReleasesAffectedByIssue1359, } from './deploy-bin'; -import { fixPathForMsys, ROOT, runUnderMsys } from './utils'; // DEBUG set to falsy for negative values else is truthy process.env.DEBUG = ['0', 'no', 'false', '', undefined].includes( @@ -48,9 +47,6 @@ function exitWithError(error: Error | string): never { * 'build:standalone' (to build a standalone pkg package) * 'release' (to create/update a GitHub release) * - * In the case of 'build:installer', also call runUnderMsys() to switch the - * shell from cmd.exe to MSYS2 bash.exe. - * * @param args Arguments to parse (default is process.argv.slice(2)) */ export async function run(args?: string[]) { @@ -74,10 +70,6 @@ export async function run(args?: string[]) { } } - // If runUnderMsys() is called to re-execute this script under MSYS2, - // the current working dir becomes the MSYS2 homedir, so we change back. - process.chdir(ROOT); - // The BUILD_TMP env var is used as an alternative location for oclif // (patched) to copy/extract the CLI files, run npm install and then // create the NSIS executable installer for Windows. This was necessary @@ -95,23 +87,6 @@ export async function run(args?: string[]) { for (const arg of args) { try { - if (arg === 'build:installer' && process.platform === 'win32') { - // ensure running under MSYS2 - if (!process.env.MSYSTEM) { - process.env.MSYS2_PATH_TYPE = 'inherit'; - await runUnderMsys([ - fixPathForMsys(process.argv[0]), - fixPathForMsys(process.argv[1]), - arg, - ]); - continue; - } - if (process.env.MSYS2_PATH_TYPE !== 'inherit') { - throw new Error( - 'the MSYS2_PATH_TYPE env var must be set to "inherit"', - ); - } - } const cmdFunc = commands[arg]; await cmdFunc(); } catch (err) { diff --git a/automation/utils.ts b/automation/utils.ts index a55e9a5f..4b309361 100644 --- a/automation/utils.ts +++ b/automation/utils.ts @@ -18,10 +18,7 @@ import { spawn } from 'child_process'; import * as _ from 'lodash'; import * as path from 'path'; -import * as shellEscape from 'shell-escape'; -export const MSYS2_BASH = - process.env.MSYSSHELLPATH || 'C:\\msys64\\usr\\bin\\bash.exe'; export const ROOT = path.join(__dirname, '..'); /** Tap and buffer this process' stdout and stderr */ @@ -91,40 +88,6 @@ export function loadPackageJson() { return require(path.join(ROOT, 'package.json')); } -/** - * Convert e.g. 'C:\myfolder' -> '/C/myfolder' so that the path can be given - * as argument to "unix tools" like 'tar' under MSYS or MSYS2 on Windows. - */ -export function fixPathForMsys(p: string): string { - return p.replace(/\\/g, '/').replace(/^([a-zA-Z]):/, '/$1'); -} - -/** - * Run the MSYS2 bash.exe shell in a child process (child_process.spawn()). - * The given argv arguments are escaped using the 'shell-escape' package, - * so that backslashes in Windows paths, and other bash-special characters, - * are preserved. If argv is not provided, defaults to process.argv, to the - * effect that this current (parent) process is re-executed under MSYS2 bash. - * This is useful to change the default shell from cmd.exe to MSYS2 bash on - * Windows. - * @param argv Arguments to be shell-escaped and given to MSYS2 bash.exe. - */ -export async function runUnderMsys(argv?: string[]) { - const newArgv = argv || process.argv; - await new Promise((resolve, reject) => { - const args = ['-lc', shellEscape(newArgv)]; - const child = spawn(MSYS2_BASH, args, { stdio: 'inherit' }); - child.on('close', (code) => { - if (code) { - console.log(`runUnderMsys: child process exited with code ${code}`); - reject(code); - } else { - resolve(); - } - }); - }); -} - /** * Run the executable at execPath as a child process, and resolve a promise * to the executable's stdout output as a string. Reject the promise if