@automattic/vip 4.1.6 → 4.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/dev-env.lando.template.yml.ejs +1 -1
- package/dist/bin/vip-app-deploy-token-generate.js +110 -78
- package/dist/bin/vip-app-deploy-token.js +24 -16
- package/dist/bin/vip-app-deploy-validate.js +45 -41
- package/dist/bin/vip-app-deploy.js +222 -215
- package/dist/bin/vip-app-list.js +59 -43
- package/dist/bin/vip-app.js +97 -66
- package/dist/bin/vip-backup-db.js +36 -29
- package/dist/bin/vip-backup.js +16 -9
- package/dist/bin/vip-cache-purge-url.js +93 -55
- package/dist/bin/vip-cache.js +23 -14
- package/dist/bin/vip-config-envvar-delete.js +74 -73
- package/dist/bin/vip-config-envvar-get-all.js +68 -68
- package/dist/bin/vip-config-envvar-get.js +46 -46
- package/dist/bin/vip-config-envvar-list.js +54 -57
- package/dist/bin/vip-config-envvar-set.js +102 -96
- package/dist/bin/vip-config-envvar.js +38 -24
- package/dist/bin/vip-config-software-get.js +88 -75
- package/dist/bin/vip-config-software-update.js +116 -120
- package/dist/bin/vip-config-software.js +31 -21
- package/dist/bin/vip-config.js +25 -17
- package/dist/bin/vip-db-phpmyadmin.js +40 -39
- package/dist/bin/vip-db.js +13 -12
- package/dist/bin/vip-defensive-mode-configure.js +197 -197
- package/dist/bin/vip-defensive-mode-disable.js +43 -35
- package/dist/bin/vip-defensive-mode-enable.js +47 -38
- package/dist/bin/vip-defensive-mode.js +28 -17
- package/dist/bin/vip-dev-env-create.js +147 -104
- package/dist/bin/vip-dev-env-destroy.js +48 -39
- package/dist/bin/vip-dev-env-envvar-delete.js +60 -49
- package/dist/bin/vip-dev-env-envvar-get-all.js +52 -45
- package/dist/bin/vip-dev-env-envvar-get.js +48 -37
- package/dist/bin/vip-dev-env-envvar-list.js +48 -41
- package/dist/bin/vip-dev-env-envvar-set.js +83 -70
- package/dist/bin/vip-dev-env-envvar.js +38 -23
- package/dist/bin/vip-dev-env-exec.js +81 -74
- package/dist/bin/vip-dev-env-import-media.js +34 -26
- package/dist/bin/vip-dev-env-import-sql.js +65 -51
- package/dist/bin/vip-dev-env-import.js +23 -14
- package/dist/bin/vip-dev-env-info.js +59 -50
- package/dist/bin/vip-dev-env-list.js +34 -31
- package/dist/bin/vip-dev-env-logs.js +59 -49
- package/dist/bin/vip-dev-env-purge.js +71 -63
- package/dist/bin/vip-dev-env-shell.js +82 -71
- package/dist/bin/vip-dev-env-start.js +77 -65
- package/dist/bin/vip-dev-env-stop.js +80 -74
- package/dist/bin/vip-dev-env-sync-sql.js +80 -72
- package/dist/bin/vip-dev-env-sync.js +18 -11
- package/dist/bin/vip-dev-env-update.js +93 -84
- package/dist/bin/vip-dev-env.js +25 -8
- package/dist/bin/vip-edge-workers-build.js +82 -54
- package/dist/bin/vip-edge-workers-delete.js +84 -52
- package/dist/bin/vip-edge-workers-deploy.js +186 -126
- package/dist/bin/vip-edge-workers-disable.js +75 -44
- package/dist/bin/vip-edge-workers-enable.js +86 -54
- package/dist/bin/vip-edge-workers-get.js +108 -88
- package/dist/bin/vip-edge-workers-init.js +83 -53
- package/dist/bin/vip-edge-workers-list.js +89 -54
- package/dist/bin/vip-edge-workers-new.js +98 -69
- package/dist/bin/vip-edge-workers-validate.js +123 -82
- package/dist/bin/vip-edge-workers.js +19 -6
- package/dist/bin/vip-export-sql.js +75 -69
- package/dist/bin/vip-export.js +12 -7
- package/dist/bin/vip-import-media-abort.js +99 -73
- package/dist/bin/vip-import-media-status.js +83 -51
- package/dist/bin/vip-import-media.js +165 -166
- package/dist/bin/vip-import-sql-status.js +75 -45
- package/dist/bin/vip-import-sql.js +536 -596
- package/dist/bin/vip-import-validate-files.js +122 -141
- package/dist/bin/vip-import-validate-sql.js +52 -16
- package/dist/bin/vip-import.js +16 -7
- package/dist/bin/vip-logout.js +17 -13
- package/dist/bin/vip-logs.js +209 -183
- package/dist/bin/vip-search-replace.js +85 -53
- package/dist/bin/vip-slowlogs.js +168 -147
- package/dist/bin/vip-sync.js +163 -133
- package/dist/bin/vip-whoami.js +71 -35
- package/dist/bin/vip-wp.js +506 -549
- package/dist/bin/vip.js +161 -116
- package/dist/commands/backup-db.js +183 -149
- package/dist/commands/dev-env-import-sql.js +162 -117
- package/dist/commands/dev-env-sync-sql.js +372 -330
- package/dist/commands/export-sql.js +441 -425
- package/dist/commands/phpmyadmin.js +232 -212
- package/dist/commands/wp-ssh.js +218 -187
- package/dist/lib/analytics/clients/tracks.js +84 -91
- package/dist/lib/analytics/index.js +27 -27
- package/dist/lib/api/app.js +37 -36
- package/dist/lib/api/cache-purge.js +17 -20
- package/dist/lib/api/constants.js +5 -6
- package/dist/lib/api/edge-workers.js +84 -135
- package/dist/lib/api/error-debug.js +10 -13
- package/dist/lib/api/feature-flags.js +16 -17
- package/dist/lib/api/http.js +47 -48
- package/dist/lib/api/user.js +17 -18
- package/dist/lib/api.js +107 -116
- package/dist/lib/app-logs/app-logs.js +24 -25
- package/dist/lib/app-slowlogs/app-slowlogs.js +23 -24
- package/dist/lib/app-slowlogs/types.js +2 -1
- package/dist/lib/app.js +6 -8
- package/dist/lib/backup-storage-availability/backup-storage-availability.js +119 -119
- package/dist/lib/backup-storage-availability/docker-machine-not-found-error.js +5 -6
- package/dist/lib/cli/apiConfig.js +71 -41
- package/dist/lib/cli/command.js +1120 -873
- package/dist/lib/cli/config.js +29 -29
- package/dist/lib/cli/envAlias.js +35 -50
- package/dist/lib/cli/exit.js +19 -19
- package/dist/lib/cli/format.js +172 -172
- package/dist/lib/cli/progress.js +193 -236
- package/dist/lib/cli/prompt.js +14 -15
- package/dist/lib/cli/runtime-mode.js +5 -6
- package/dist/lib/client-file-uploader.js +489 -641
- package/dist/lib/config/software.js +206 -212
- package/dist/lib/constants/dev-environment.js +40 -37
- package/dist/lib/constants/file-size.js +6 -7
- package/dist/lib/constants/vipgo.js +24 -12
- package/dist/lib/custom-deploy/custom-deploy.js +138 -120
- package/dist/lib/database.js +88 -85
- package/dist/lib/defensive-mode/api.js +41 -46
- package/dist/lib/defensive-mode/cli-helpers.js +40 -40
- package/dist/lib/dev-environment/dev-environment-cli.js +776 -735
- package/dist/lib/dev-environment/dev-environment-configuration-file.js +224 -191
- package/dist/lib/dev-environment/dev-environment-core.js +697 -732
- package/dist/lib/dev-environment/dev-environment-database.js +57 -41
- package/dist/lib/dev-environment/dev-environment-lando.js +734 -666
- package/dist/lib/dev-environment/docker-utils.js +96 -90
- package/dist/lib/dev-environment/env-vars.js +61 -59
- package/dist/lib/dev-environment/lando-loader.js +6 -7
- package/dist/lib/dev-environment/types.js +2 -1
- package/dist/lib/edge-workers/confirmation.js +42 -36
- package/dist/lib/edge-workers/deployment.js +150 -159
- package/dist/lib/edge-workers/index.js +68 -85
- package/dist/lib/edge-workers/location.js +26 -26
- package/dist/lib/edge-workers/output.js +14 -15
- package/dist/lib/edge-workers/project.js +123 -132
- package/dist/lib/edge-workers/toolchains/assemblyscript/constants.js +6 -8
- package/dist/lib/edge-workers/toolchains/assemblyscript/index.js +100 -101
- package/dist/lib/edge-workers/toolchains/assemblyscript/templates.js +31 -33
- package/dist/lib/edge-workers/toolchains/index.js +15 -15
- package/dist/lib/edge-workers/types.js +10 -38
- package/dist/lib/edge-workers/validation.js +161 -150
- package/dist/lib/env.js +16 -17
- package/dist/lib/envvar/api-delete.js +16 -18
- package/dist/lib/envvar/api-get-all.js +15 -19
- package/dist/lib/envvar/api-get.js +8 -9
- package/dist/lib/envvar/api-list.js +16 -21
- package/dist/lib/envvar/api-set.js +20 -19
- package/dist/lib/envvar/api.js +34 -29
- package/dist/lib/envvar/input.js +29 -34
- package/dist/lib/envvar/logging.js +9 -11
- package/dist/lib/envvar/read-file.js +6 -7
- package/dist/lib/http/download-file.js +76 -44
- package/dist/lib/http/proxy-agent.js +37 -40
- package/dist/lib/http/proxy-dispatcher.js +69 -71
- package/dist/lib/keychain/insecure.js +40 -36
- package/dist/lib/keychain/keychain.js +2 -1
- package/dist/lib/keychain/secure.js +16 -15
- package/dist/lib/keychain.js +22 -22
- package/dist/lib/live-backup-copy.js +117 -115
- package/dist/lib/logout.js +17 -19
- package/dist/lib/media-import/config.js +15 -14
- package/dist/lib/media-import/media-file-import.js +9 -13
- package/dist/lib/media-import/progress.js +53 -65
- package/dist/lib/media-import/status.js +241 -256
- package/dist/lib/media-import/utils.js +15 -15
- package/dist/lib/node-version-check.js +16 -16
- package/dist/lib/promise.js +16 -17
- package/dist/lib/read-file.js +48 -16
- package/dist/lib/rechallenge/client.js +37 -43
- package/dist/lib/rechallenge/errors.js +38 -37
- package/dist/lib/rechallenge/flow.js +148 -123
- package/dist/lib/rechallenge/index.js +23 -24
- package/dist/lib/rechallenge/link.js +153 -151
- package/dist/lib/rechallenge/open-browser.js +14 -17
- package/dist/lib/rechallenge/token-cache.js +83 -86
- package/dist/lib/rechallenge/types.js +5 -14
- package/dist/lib/retry.js +93 -129
- package/dist/lib/search-and-replace.js +164 -148
- package/dist/lib/site-import/db-file-import.js +12 -16
- package/dist/lib/site-import/status.js +291 -291
- package/dist/lib/token.js +86 -87
- package/dist/lib/tracker.js +51 -62
- package/dist/lib/types/graphql/rate-limit-exceeded-error.js +2 -1
- package/dist/lib/types.js +2 -1
- package/dist/lib/user-error.js +6 -8
- package/dist/lib/utils.js +81 -87
- package/dist/lib/validations/custom-deploy.js +218 -186
- package/dist/lib/validations/is-multi-site-sql-dump.js +6 -6
- package/dist/lib/validations/is-multi-site.js +83 -50
- package/dist/lib/validations/is-multisite-domain-mapped.js +92 -62
- package/dist/lib/validations/line-by-line.js +78 -46
- package/dist/lib/validations/site-type.js +59 -63
- package/dist/lib/validations/sql-insert-parser.js +415 -0
- package/dist/lib/validations/sql.js +551 -431
- package/dist/lib/validations/utils.js +27 -29
- package/dist/lib/vip-import-validate-files.js +481 -490
- package/dist/lib/wp/helpers.js +41 -45
- package/dist/lib/wp/readline.js +21 -57
- package/dist/lib/xdg-data.js +11 -12
- package/helpers/mark-cli-executable.js +9 -0
- package/node_modules/@apollo/client/CHANGELOG.md +10 -0
- package/node_modules/@apollo/client/__cjs/cache/inmemory/helpers.cjs +5 -0
- package/node_modules/@apollo/client/__cjs/cache/inmemory/helpers.cjs.map +1 -1
- package/node_modules/@apollo/client/__cjs/cache/inmemory/inMemoryCache.cjs +2 -1
- package/node_modules/@apollo/client/__cjs/cache/inmemory/inMemoryCache.cjs.map +1 -1
- package/node_modules/@apollo/client/__cjs/cache/inmemory/key-extractor.cjs +14 -2
- package/node_modules/@apollo/client/__cjs/cache/inmemory/key-extractor.cjs.map +1 -1
- package/node_modules/@apollo/client/__cjs/cache/inmemory/policies.cjs +16 -0
- package/node_modules/@apollo/client/__cjs/cache/inmemory/policies.cjs.map +1 -1
- package/node_modules/@apollo/client/__cjs/cache/inmemory/policies.d.cts +2 -0
- package/node_modules/@apollo/client/__cjs/cache/inmemory/writeToStore.cjs +3 -2
- package/node_modules/@apollo/client/__cjs/cache/inmemory/writeToStore.cjs.map +1 -1
- package/node_modules/@apollo/client/__cjs/core/QueryInfo.cjs +9 -1
- package/node_modules/@apollo/client/__cjs/core/QueryInfo.cjs.map +1 -1
- package/node_modules/@apollo/client/__cjs/core/QueryInfo.d.cts +1 -1
- package/node_modules/@apollo/client/__cjs/core/QueryManager.cjs +10 -3
- package/node_modules/@apollo/client/__cjs/core/QueryManager.cjs.map +1 -1
- package/node_modules/@apollo/client/__cjs/react/hooks/useFragment.cjs.map +1 -1
- package/node_modules/@apollo/client/__cjs/react/hooks/useFragment.d.cts +42 -43
- package/node_modules/@apollo/client/__cjs/version.cjs +1 -1
- package/node_modules/@apollo/client/cache/inmemory/helpers.js +5 -0
- package/node_modules/@apollo/client/cache/inmemory/helpers.js.map +1 -1
- package/node_modules/@apollo/client/cache/inmemory/inMemoryCache.js +2 -1
- package/node_modules/@apollo/client/cache/inmemory/inMemoryCache.js.map +1 -1
- package/node_modules/@apollo/client/cache/inmemory/key-extractor.js +14 -2
- package/node_modules/@apollo/client/cache/inmemory/key-extractor.js.map +1 -1
- package/node_modules/@apollo/client/cache/inmemory/policies.d.ts +2 -0
- package/node_modules/@apollo/client/cache/inmemory/policies.js +17 -1
- package/node_modules/@apollo/client/cache/inmemory/policies.js.map +1 -1
- package/node_modules/@apollo/client/cache/inmemory/writeToStore.js +3 -2
- package/node_modules/@apollo/client/cache/inmemory/writeToStore.js.map +1 -1
- package/node_modules/@apollo/client/core/QueryInfo.d.ts +1 -1
- package/node_modules/@apollo/client/core/QueryInfo.js +10 -2
- package/node_modules/@apollo/client/core/QueryInfo.js.map +1 -1
- package/node_modules/@apollo/client/core/QueryManager.js +10 -3
- package/node_modules/@apollo/client/core/QueryManager.js.map +1 -1
- package/node_modules/@apollo/client/package.json +1 -1
- package/node_modules/@apollo/client/react/hooks/useFragment.d.ts +42 -43
- package/node_modules/@apollo/client/react/hooks/useFragment.js.map +1 -1
- package/node_modules/@apollo/client/react/hooks-compiled/useFragment.d.ts +42 -43
- package/node_modules/@apollo/client/react/hooks-compiled/useFragment.js.map +1 -1
- package/node_modules/@apollo/client/version.js +1 -1
- package/node_modules/@automattic/vip-search-replace/README.md +6 -1
- package/node_modules/@automattic/vip-search-replace/lib/index.js +46 -14
- package/node_modules/@automattic/vip-search-replace/package.json +1 -1
- package/node_modules/@types/node/README.md +1 -1
- package/node_modules/@types/node/package.json +2 -2
- package/node_modules/@types/node/zlib.d.ts +752 -0
- package/node_modules/check-disk-space/README.md +92 -32
- package/node_modules/check-disk-space/dist/check-disk-space.d.mts +58 -0
- package/node_modules/check-disk-space/dist/check-disk-space.mjs +170 -190
- package/node_modules/check-disk-space/package.json +43 -71
- package/node_modules/cpu-features/build/Makefile +2 -2
- package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/filesystem.o.d +1 -1
- package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_linux_or_android.o.d +1 -1
- package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_macos_or_iphone.o.d +1 -1
- package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_windows.o.d +1 -1
- package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_arm_linux_or_android.o.d +1 -1
- package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_mips_linux_or_android.o.d +1 -1
- package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_ppc_linux.o.d +1 -1
- package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_freebsd.o.d +1 -1
- package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_linux_or_android.o.d +1 -1
- package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_macos.o.d +1 -1
- package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_windows.o.d +1 -1
- package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/stack_line_reader.o.d +1 -1
- package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/string_view.o.d +1 -1
- package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpufeatures/src/binding.o.d +157 -145
- package/node_modules/cpu-features/build/Release/cpufeatures.node +0 -0
- package/node_modules/cpu-features/build/Release/obj.target/cpufeatures/src/binding.o +0 -0
- package/node_modules/cpu-features/build/Release/obj.target/cpufeatures.node +0 -0
- package/node_modules/cpu-features/build/config.gypi +100 -31
- package/node_modules/cpu-features/build/cpufeatures.target.mk +14 -14
- package/node_modules/cpu-features/build/deps/cpu_features/cpu_features.target.mk +14 -14
- package/node_modules/ssh2/lib/protocol/crypto/build/Makefile +2 -2
- package/node_modules/ssh2/lib/protocol/crypto/build/Release/.deps/Release/obj.target/sshcrypto/src/binding.o.d.raw +136 -0
- package/node_modules/ssh2/lib/protocol/crypto/build/sshcrypto.target.mk +14 -14
- package/node_modules/undici/docs/docs/api/Interceptors.md +15 -2
- package/node_modules/undici/lib/dispatcher/client-h2.js +78 -3
- package/node_modules/undici/lib/dispatcher/pool-base.js +20 -3
- package/node_modules/undici/package.json +3 -3
- package/node_modules/undici/types/api.d.ts +1 -1
- package/node_modules/undici/types/utility.d.ts +4 -4
- package/package.json +44 -13
- package/dist/lib/analytics/clients/client.js +0 -1
- package/dist/lib/analytics/clients/pendo.js +0 -78
- package/helpers/check-version.js +0 -16
- package/node_modules/check-disk-space/dist/check-disk-space.cjs +0 -210
- package/node_modules/check-disk-space/dist/check-disk-space.d.ts +0 -53
- package/node_modules/fetch-retry/.eslintignore +0 -1
- package/node_modules/fetch-retry/.eslintrc.yml +0 -20
- package/node_modules/fetch-retry/.github/workflows/node.js.yml +0 -32
- package/node_modules/fetch-retry/.husky/pre-commit +0 -6
- package/node_modules/fetch-retry/.nycrc.json +0 -24
- package/node_modules/fetch-retry/.travis.yml +0 -3
- package/node_modules/fetch-retry/LICENSE +0 -21
- package/node_modules/fetch-retry/README.md +0 -128
- package/node_modules/fetch-retry/dist/fetch-retry.umd.js +0 -151
- package/node_modules/fetch-retry/index.d.ts +0 -29
- package/node_modules/fetch-retry/index.js +0 -143
- package/node_modules/fetch-retry/package.json +0 -41
- package/node_modules/fetch-retry/rollup.config.js +0 -12
- package/node_modules/fetch-retry/test/.eslintrc.yml +0 -7
- package/node_modules/fetch-retry/test/integration/index.js +0 -212
- package/node_modules/fetch-retry/test/integration/mock-api/index.js +0 -42
- package/node_modules/fetch-retry/test/unit/index.js +0 -1169
- package/node_modules/ssh2/lib/protocol/crypto/build/Release/.deps/Release/obj.target/sshcrypto/src/binding.o.d +0 -265
- package/node_modules/ssh2/lib/protocol/crypto/build/Release/.deps/Release/obj.target/sshcrypto.node.d +0 -1
- package/node_modules/ssh2/lib/protocol/crypto/build/Release/.deps/Release/sshcrypto.node.d +0 -1
- package/node_modules/ssh2/lib/protocol/crypto/build/Release/obj.target/sshcrypto/src/binding.o +0 -0
- package/node_modules/ssh2/lib/protocol/crypto/build/Release/obj.target/sshcrypto.node +0 -0
- package/node_modules/ssh2/lib/protocol/crypto/build/Release/sshcrypto.node +0 -0
package/dist/lib/cli/command.js
CHANGED
|
@@ -1,40 +1,329 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.formatFatalError = formatFatalError;
|
|
40
|
+
exports.uncaughtError = uncaughtError;
|
|
41
|
+
exports.default = default_1;
|
|
6
42
|
exports.getEnvIdentifier = getEnvIdentifier;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
43
|
+
exports.containsAppEnvArgument = containsAppEnvArgument;
|
|
44
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
45
|
+
const commander_1 = require("commander");
|
|
46
|
+
const debug_1 = __importDefault(require("debug"));
|
|
47
|
+
const enquirer_1 = require("enquirer");
|
|
48
|
+
const graphql_tag_1 = __importDefault(require("graphql-tag"));
|
|
49
|
+
const node_child_process_1 = require("node:child_process");
|
|
50
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
51
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
52
|
+
const node_util_1 = __importDefault(require("node:util"));
|
|
53
|
+
const envAlias_1 = require("./envAlias");
|
|
54
|
+
const exit = __importStar(require("./exit"));
|
|
55
|
+
const format_1 = require("./format");
|
|
56
|
+
const prompt_1 = require("./prompt");
|
|
57
|
+
const package_json_1 = __importDefault(require("../../../package.json"));
|
|
58
|
+
const api_1 = __importDefault(require("../../lib/api"));
|
|
59
|
+
const app_1 = __importDefault(require("../../lib/api/app"));
|
|
60
|
+
const tracker_1 = require("../../lib/tracker");
|
|
61
|
+
const utils_1 = require("../../lib/utils");
|
|
62
|
+
const user_error_1 = __importDefault(require("../user-error"));
|
|
63
|
+
const secretFragments = [
|
|
64
|
+
'password',
|
|
65
|
+
'passwd',
|
|
66
|
+
'passphrase',
|
|
67
|
+
'secret',
|
|
68
|
+
'token',
|
|
69
|
+
'credential',
|
|
70
|
+
'authorization',
|
|
71
|
+
'cookie',
|
|
72
|
+
'privatekey',
|
|
73
|
+
'apikey',
|
|
74
|
+
'signature',
|
|
75
|
+
];
|
|
76
|
+
/**
|
|
77
|
+
* Determines if a given property key is considered secret.
|
|
78
|
+
* Secret properties are typically sensitive information like passwords, tokens, and API keys.
|
|
79
|
+
*
|
|
80
|
+
* @param {string|symbol} key - The property key to check.
|
|
81
|
+
* @returns {boolean} True if the property is considered secret, false otherwise.
|
|
82
|
+
*/
|
|
83
|
+
function isSecretProperty(key) {
|
|
84
|
+
const normalized = String(key)
|
|
85
|
+
.replace(/[^a-z0-9]/gi, '')
|
|
86
|
+
.toLowerCase();
|
|
87
|
+
return (normalized === 'key' || secretFragments.some(fragment => normalized.includes(fragment)));
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Redacts sensitive information from a diagnostic text value.
|
|
91
|
+
*
|
|
92
|
+
* @param {string} value - The diagnostic text to redact.
|
|
93
|
+
* @returns {string} The redacted diagnostic text.
|
|
94
|
+
*/
|
|
95
|
+
function redactDiagnosticText(value) {
|
|
96
|
+
return value
|
|
97
|
+
.replace(/\b((?:https?|wss?|socks[45]h?|ftp):\/\/)[^/?#\s]+@/gi, '$1[REDACTED]@')
|
|
98
|
+
.replace(/([?&])([^?=&\s]+)=([^?&#\s]*)/g, (match, separator, key) => {
|
|
99
|
+
try {
|
|
100
|
+
return isSecretProperty(decodeURIComponent(key))
|
|
101
|
+
? `${separator}${key}=[REDACTED]`
|
|
102
|
+
: match;
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return `${separator}[REDACTED]`;
|
|
106
|
+
}
|
|
107
|
+
})
|
|
108
|
+
.replace(/\b(Bearer|Basic)\s+\S+/gi, '$1 [REDACTED]');
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Reads a property from a diagnostic value safely.
|
|
112
|
+
* Returns '[Unreadable property]' if the property cannot be accessed.
|
|
113
|
+
*
|
|
114
|
+
* @param {Record<string, unknown>|Error|null|undefined} value - The diagnostic value to read from.
|
|
115
|
+
* @param {string} key - The property key to read.
|
|
116
|
+
* @returns {unknown} The property value or '[Unreadable property]' if inaccessible.
|
|
117
|
+
*/
|
|
118
|
+
function readDiagnosticProperty(value, key) {
|
|
119
|
+
try {
|
|
120
|
+
return /** @type {Record<string, unknown>|null|undefined} */ (value)?.[key];
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return '[Unreadable property]';
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Creates a shallow copy of a diagnostic value, redacting sensitive information.
|
|
128
|
+
*
|
|
129
|
+
* @param {unknown} value - The diagnostic value to copy.
|
|
130
|
+
* @returns {unknown} The copied diagnostic value with sensitive information redacted.
|
|
131
|
+
*/
|
|
132
|
+
function createDiagnosticCopy(value) {
|
|
133
|
+
if (!(value instanceof Error)) {
|
|
134
|
+
if (Array.isArray(value)) {
|
|
135
|
+
return [];
|
|
136
|
+
}
|
|
137
|
+
return Object.create(Object.getPrototypeOf(value) === null ? null : Object.prototype);
|
|
138
|
+
}
|
|
139
|
+
const copy = new Error(); // NOSONAR
|
|
140
|
+
copy.stack = undefined;
|
|
141
|
+
for (const key of ['message', 'stack', 'name']) {
|
|
142
|
+
const text = readDiagnosticProperty(value, key);
|
|
143
|
+
if (typeof text === 'string' && (key !== 'name' || text !== 'Error')) {
|
|
144
|
+
Object.defineProperty(copy, key, {
|
|
145
|
+
value: redactDiagnosticText(text),
|
|
146
|
+
configurable: true,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return copy;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Copies diagnostic properties from a value to its shallow copy, redacting sensitive information.
|
|
154
|
+
*
|
|
155
|
+
* @param {object} value - The original diagnostic value.
|
|
156
|
+
* @param {unknown} copy - The shallow copy of the diagnostic value.
|
|
157
|
+
* @param {WeakMap<object, unknown>} seen - A WeakMap tracking already seen objects to handle circular references.
|
|
158
|
+
* @param {number} depth - The current depth of the recursive sanitization.
|
|
159
|
+
* @returns {void} This function does not return a value.
|
|
160
|
+
*/
|
|
161
|
+
function copyDiagnosticProperties(value, copy, seen, depth) {
|
|
162
|
+
const isError = value instanceof Error;
|
|
163
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
164
|
+
if (key === node_util_1.default.inspect.custom ||
|
|
165
|
+
(isError && ['message', 'stack', 'name'].includes(/** @type {string} */ (key))) ||
|
|
166
|
+
(Array.isArray(copy) && key === 'length')) {
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
170
|
+
const secret = isSecretProperty(key) ||
|
|
171
|
+
(typeof key === 'string' && /^(?:body|bodyText|requestBody|responseBody)$/i.test(key)) ||
|
|
172
|
+
(isError &&
|
|
173
|
+
key === 'input' &&
|
|
174
|
+
readDiagnosticProperty(value, 'code') === 'ERR_INVALID_URL');
|
|
175
|
+
/** @type {unknown} */
|
|
176
|
+
let propertyValue = '[Accessor]';
|
|
177
|
+
if (secret) {
|
|
178
|
+
propertyValue = '[REDACTED]';
|
|
179
|
+
}
|
|
180
|
+
else if (descriptor && 'value' in descriptor) {
|
|
181
|
+
propertyValue = sanitizeDiagnostic(descriptor.value, seen, depth + 1);
|
|
182
|
+
}
|
|
183
|
+
Object.defineProperty(copy, key, {
|
|
184
|
+
value: propertyValue,
|
|
185
|
+
enumerable: descriptor?.enumerable ?? true,
|
|
186
|
+
configurable: true,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Copy own diagnostic data before inspection so nested secrets are redacted and
|
|
192
|
+
* accessors and custom inspectors cannot run while the snapshot is rendered.
|
|
193
|
+
*
|
|
194
|
+
* @param {unknown} value - The diagnostic value to sanitize.
|
|
195
|
+
* @param {WeakMap<object, unknown>} [seen] - A WeakMap tracking already seen objects to handle circular references.
|
|
196
|
+
* @param {number} [depth] - The current depth of the recursive sanitization.
|
|
197
|
+
* @returns {unknown} The sanitized diagnostic value.
|
|
198
|
+
*/
|
|
199
|
+
function sanitizeDiagnostic(value, seen = new WeakMap(), depth = 0) {
|
|
200
|
+
try {
|
|
201
|
+
if (typeof value === 'string' || typeof value === 'symbol') {
|
|
202
|
+
return redactDiagnosticText(String(value));
|
|
203
|
+
}
|
|
204
|
+
if (typeof value === 'function') {
|
|
205
|
+
return '[Function]';
|
|
206
|
+
}
|
|
207
|
+
if (value === null || typeof value !== 'object') {
|
|
208
|
+
return value;
|
|
209
|
+
}
|
|
210
|
+
if (seen.has(value)) {
|
|
211
|
+
return seen.get(value);
|
|
212
|
+
}
|
|
213
|
+
if (depth > 5) {
|
|
214
|
+
return '[Object]';
|
|
215
|
+
}
|
|
216
|
+
const copy = createDiagnosticCopy(value);
|
|
217
|
+
seen.set(value, copy);
|
|
218
|
+
copyDiagnosticProperties(value, copy, seen, depth);
|
|
219
|
+
return copy;
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
return '[Uninspectable value]';
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Renders any thrown value as a single line without throwing.
|
|
227
|
+
*
|
|
228
|
+
* `String()` prints plain objects as "[object Object]" and throws for objects
|
|
229
|
+
* without a prototype, so objects are inspected instead.
|
|
230
|
+
*
|
|
231
|
+
* @param {unknown} value The value to render.
|
|
232
|
+
* @returns {string} A one-line description of the value.
|
|
233
|
+
*/
|
|
234
|
+
function describeValue(value) {
|
|
235
|
+
try {
|
|
236
|
+
const safeValue = sanitizeDiagnostic(value);
|
|
237
|
+
return typeof safeValue === 'object' && safeValue !== null
|
|
238
|
+
? node_util_1.default.inspect(safeValue, {
|
|
239
|
+
depth: 0,
|
|
240
|
+
breakLength: Infinity,
|
|
241
|
+
showHidden: true,
|
|
242
|
+
customInspect: false,
|
|
243
|
+
})
|
|
244
|
+
: String(safeValue);
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
return '[Uninspectable value]';
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Inspects sanitized diagnostic data, returning a placeholder on failure.
|
|
252
|
+
*
|
|
253
|
+
* @param {unknown} value The value to inspect.
|
|
254
|
+
* @returns {string} The inspected string.
|
|
255
|
+
*/
|
|
256
|
+
function inspect(value) {
|
|
257
|
+
try {
|
|
258
|
+
return node_util_1.default.inspect(sanitizeDiagnostic(value), {
|
|
259
|
+
depth: 5,
|
|
260
|
+
showHidden: true,
|
|
261
|
+
customInspect: false,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
return '[Uninspectable value]';
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Builds a human-readable, multi-line description of a fatal error for display.
|
|
270
|
+
*
|
|
271
|
+
* Bare native rejections (e.g. keytar's "An unknown error occurred.") arrive as
|
|
272
|
+
* Errors whose stack is only the message line, so the usual stack print reveals
|
|
273
|
+
* nothing. In those cases — and whenever the error carries extra own properties
|
|
274
|
+
* that would otherwise be lost — we append a sanitized `util.inspect` dump so
|
|
275
|
+
* diagnostic properties survive without printing credentials.
|
|
276
|
+
*
|
|
277
|
+
* @param {unknown} err The thrown value.
|
|
278
|
+
* @returns {string} The formatted details to print.
|
|
279
|
+
*/
|
|
280
|
+
function formatFatalError(err) {
|
|
281
|
+
err = sanitizeDiagnostic(err);
|
|
282
|
+
if (!(err instanceof Error)) {
|
|
283
|
+
// Plain objects would stringify to "[object Object]"; inspect them instead.
|
|
284
|
+
return typeof err === 'object' && err !== null ? inspect(err) : String(err);
|
|
285
|
+
}
|
|
286
|
+
const lines = [];
|
|
287
|
+
if (err.stack) {
|
|
288
|
+
lines.push(err.stack);
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
lines.push(err.message);
|
|
292
|
+
}
|
|
293
|
+
if (err.code !== undefined) {
|
|
294
|
+
lines.push(`Code: ${describeValue(err.code)}`);
|
|
295
|
+
}
|
|
296
|
+
if (err.cause !== undefined) {
|
|
297
|
+
lines.push(`Cause: ${inspect(err.cause)}`);
|
|
298
|
+
}
|
|
299
|
+
// A stack with no frames beyond the message line tells us nothing, and extra
|
|
300
|
+
// own properties would be dropped by the stack/message print above. In either
|
|
301
|
+
// case, dump the sanitized object to preserve diagnostic properties.
|
|
302
|
+
const stackHasFrames = Boolean(err.stack) && /\n[ \t]+at\s/.test(err.stack);
|
|
303
|
+
const hasExtraOwnProps = Object.getOwnPropertyNames(err).some(prop => !['message', 'stack', 'name'].includes(prop));
|
|
304
|
+
if (!stackHasFrames || hasExtraOwnProps) {
|
|
305
|
+
lines.push(inspect(err));
|
|
306
|
+
}
|
|
307
|
+
return lines.join('\n');
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Last-resort handler for uncaught exceptions and unhandled rejections.
|
|
311
|
+
*
|
|
312
|
+
* @param {unknown} err The thrown value, which need not be an Error.
|
|
313
|
+
*/
|
|
27
314
|
function uncaughtError(err) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
315
|
+
// Error raised when trying to write to an already closed stream
|
|
316
|
+
if (readDiagnosticProperty(err, 'code') === 'EPIPE') {
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
if (err instanceof user_error_1.default) {
|
|
320
|
+
exit.withError(err);
|
|
321
|
+
}
|
|
322
|
+
console.log(chalk_1.default.red('✕'), 'Please contact VIP Support with the following information:');
|
|
323
|
+
console.log(chalk_1.default.dim(formatFatalError(err)));
|
|
324
|
+
console.log(chalk_1.default.dim('Hint: re-run with the environment variable DEBUG=@automattic/vip:* to print verbose logs, even when the failure happens before argument parsing.'));
|
|
325
|
+
const message = describeValue(err instanceof Error ? readDiagnosticProperty(err, 'message') : err);
|
|
326
|
+
exit.withError(`Unexpected error: ${message}`);
|
|
38
327
|
}
|
|
39
328
|
process.on('uncaughtException', uncaughtError);
|
|
40
329
|
process.on('unhandledRejection', uncaughtError);
|
|
@@ -42,473 +331,466 @@ let _opts = {};
|
|
|
42
331
|
let alreadyConfirmedDebugAttachment = false;
|
|
43
332
|
const RESERVED_AUTO_SHORT_ALIASES = new Set(['h', 'v', 'd']);
|
|
44
333
|
function normalizeUsage(program, usage) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
334
|
+
if (!usage) {
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
const [rootCommand, ...rest] = usage.trim().split(/\s+/);
|
|
338
|
+
if (rootCommand) {
|
|
339
|
+
program.name(rootCommand);
|
|
340
|
+
}
|
|
341
|
+
if (rest.length) {
|
|
342
|
+
const usageString = rest.join(' ');
|
|
343
|
+
program.usage(usageString.includes('[options]') ? usageString : `${usageString} [options]`);
|
|
344
|
+
}
|
|
56
345
|
}
|
|
57
346
|
function createOptionDefinition(name, description, defaultValue, parseFn, usedShortNames) {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
parser
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
347
|
+
const isArray = Array.isArray(name);
|
|
348
|
+
const shortName = isArray ? name[0] : null;
|
|
349
|
+
const longName = isArray ? name[1] : name;
|
|
350
|
+
const normalizedLongName = String(longName).trim().replace(/^--?/, '');
|
|
351
|
+
const explicitShortName = shortName ? String(shortName).trim().replace(/^-/, '') : null;
|
|
352
|
+
let normalizedShortName = explicitShortName;
|
|
353
|
+
if (!normalizedShortName) {
|
|
354
|
+
const autoShortName = normalizedLongName.charAt(0);
|
|
355
|
+
const canUseAutoShortName = autoShortName &&
|
|
356
|
+
!RESERVED_AUTO_SHORT_ALIASES.has(autoShortName) &&
|
|
357
|
+
!usedShortNames.has(autoShortName);
|
|
358
|
+
if (canUseAutoShortName) {
|
|
359
|
+
normalizedShortName = autoShortName;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
if (normalizedShortName) {
|
|
363
|
+
usedShortNames.add(normalizedShortName);
|
|
364
|
+
}
|
|
365
|
+
const isBooleanOption = typeof defaultValue === 'boolean';
|
|
366
|
+
const usesOptionalValue = !isBooleanOption;
|
|
367
|
+
const parseOptionValue = value => {
|
|
368
|
+
if (parseFn) {
|
|
369
|
+
return parseFn(value);
|
|
370
|
+
}
|
|
371
|
+
return value;
|
|
372
|
+
};
|
|
373
|
+
let parser;
|
|
374
|
+
if (usesOptionalValue) {
|
|
375
|
+
parser = (value, previousValue) => {
|
|
376
|
+
const parsedValue = parseOptionValue(value);
|
|
377
|
+
if (previousValue === undefined) {
|
|
378
|
+
return parsedValue;
|
|
379
|
+
}
|
|
380
|
+
if (Array.isArray(previousValue)) {
|
|
381
|
+
return [...previousValue, parsedValue];
|
|
382
|
+
}
|
|
383
|
+
return [previousValue, parsedValue];
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
let flags = `--${normalizedLongName}`;
|
|
387
|
+
if (usesOptionalValue) {
|
|
388
|
+
flags += ' [value]';
|
|
389
|
+
}
|
|
390
|
+
if (normalizedShortName) {
|
|
391
|
+
flags = `-${normalizedShortName}, ${flags}`;
|
|
392
|
+
}
|
|
393
|
+
return {
|
|
394
|
+
flags,
|
|
395
|
+
description,
|
|
396
|
+
defaultValue,
|
|
397
|
+
parser,
|
|
398
|
+
normalizedShortName,
|
|
93
399
|
};
|
|
94
|
-
}
|
|
95
|
-
let flags = `--${normalizedLongName}`;
|
|
96
|
-
if (usesOptionalValue) {
|
|
97
|
-
flags += ' [value]';
|
|
98
|
-
}
|
|
99
|
-
if (normalizedShortName) {
|
|
100
|
-
flags = `-${normalizedShortName}, ${flags}`;
|
|
101
|
-
}
|
|
102
|
-
return {
|
|
103
|
-
flags,
|
|
104
|
-
description,
|
|
105
|
-
defaultValue,
|
|
106
|
-
parser,
|
|
107
|
-
normalizedShortName
|
|
108
|
-
};
|
|
109
400
|
}
|
|
110
401
|
function isOptionToken(arg) {
|
|
111
|
-
|
|
402
|
+
return arg !== '-' && arg.startsWith('-');
|
|
112
403
|
}
|
|
113
404
|
class CommanderArgsCompat {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
};
|
|
118
|
-
this.sub = [];
|
|
119
|
-
this.examplesList = [];
|
|
120
|
-
this.usedShortNames = new Set();
|
|
121
|
-
this.shortOptionsExpectingValue = new Set();
|
|
122
|
-
this.longOptionsExpectingValue = new Set();
|
|
123
|
-
this.knownShortOptions = new Set();
|
|
124
|
-
this.knownLongOptions = new Set();
|
|
125
|
-
this._opts = opts;
|
|
126
|
-
this.program = new _commander.Command();
|
|
127
|
-
this.program.allowUnknownOption(true);
|
|
128
|
-
this.program.allowExcessArguments(true);
|
|
129
|
-
this.program.helpOption(false);
|
|
130
|
-
normalizeUsage(this.program, this._opts.usage);
|
|
131
|
-
this.optionDefaults = new Map();
|
|
132
|
-
}
|
|
133
|
-
option(name, description, defaultValue, parseFn) {
|
|
134
|
-
const definition = createOptionDefinition(name, description, defaultValue, parseFn, this.usedShortNames);
|
|
135
|
-
const {
|
|
136
|
-
flags,
|
|
137
|
-
parser,
|
|
138
|
-
normalizedShortName
|
|
139
|
-
} = definition;
|
|
140
|
-
const normalizedLongName = String(Array.isArray(name) ? name[1] : name).trim().replace(/^--?/, '');
|
|
141
|
-
const isValueOption = typeof defaultValue !== 'boolean';
|
|
142
|
-
this.knownLongOptions.add(normalizedLongName);
|
|
143
|
-
if (normalizedShortName) {
|
|
144
|
-
this.knownShortOptions.add(normalizedShortName);
|
|
145
|
-
}
|
|
146
|
-
if (isValueOption && normalizedShortName) {
|
|
147
|
-
this.shortOptionsExpectingValue.add(normalizedShortName);
|
|
148
|
-
}
|
|
149
|
-
if (isValueOption) {
|
|
150
|
-
this.longOptionsExpectingValue.add(normalizedLongName);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// When there's a parser, track the default separately and don't pass it to Commander.
|
|
154
|
-
// This prevents the parser from incorrectly accumulating the default value with the first explicit value.
|
|
155
|
-
if (parser && defaultValue !== undefined) {
|
|
156
|
-
this.optionDefaults.set(normalizedLongName, defaultValue);
|
|
157
|
-
this.program.option(flags, description, parser);
|
|
158
|
-
} else if (parser) {
|
|
159
|
-
this.program.option(flags, description, parser);
|
|
160
|
-
} else if (defaultValue !== undefined) {
|
|
161
|
-
this.program.option(flags, description, defaultValue);
|
|
162
|
-
} else {
|
|
163
|
-
this.program.option(flags, description);
|
|
164
|
-
}
|
|
165
|
-
return this;
|
|
166
|
-
}
|
|
167
|
-
command(name, description = '') {
|
|
168
|
-
this.details.commands.push({
|
|
169
|
-
usage: name,
|
|
170
|
-
description
|
|
171
|
-
});
|
|
172
|
-
return this;
|
|
173
|
-
}
|
|
174
|
-
example(usage, description) {
|
|
175
|
-
this.examplesList.push({
|
|
176
|
-
usage,
|
|
177
|
-
description
|
|
178
|
-
});
|
|
179
|
-
return this;
|
|
180
|
-
}
|
|
181
|
-
examples(examples = []) {
|
|
182
|
-
for (const example of examples) {
|
|
183
|
-
this.example(example.usage, example.description);
|
|
184
|
-
}
|
|
185
|
-
return this;
|
|
186
|
-
}
|
|
187
|
-
showVersion() {
|
|
188
|
-
console.log(_package.default.version);
|
|
189
|
-
process.exit(0);
|
|
190
|
-
}
|
|
191
|
-
showHelp() {
|
|
192
|
-
const lines = [this.program.helpInformation().trimEnd()];
|
|
193
|
-
if (this.details.commands.length) {
|
|
194
|
-
lines.push('');
|
|
195
|
-
lines.push('Commands:');
|
|
196
|
-
for (const entry of this.details.commands) {
|
|
197
|
-
const commandName = entry.usage.padEnd(26, ' ');
|
|
198
|
-
lines.push(` ${commandName}${entry.description}`);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
if (this.examplesList.length) {
|
|
202
|
-
lines.push('');
|
|
203
|
-
lines.push('Examples:');
|
|
204
|
-
for (const example of this.examplesList) {
|
|
205
|
-
lines.push(` - ${example.description}`);
|
|
206
|
-
lines.push(` $ ${example.usage}`);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
console.log(lines.join('\n'));
|
|
210
|
-
process.exit(0);
|
|
211
|
-
}
|
|
212
|
-
isDefined(value, key) {
|
|
213
|
-
if (key !== 'commands') {
|
|
214
|
-
return false;
|
|
215
|
-
}
|
|
216
|
-
return this.details.commands.some(entry => entry.usage === value);
|
|
217
|
-
}
|
|
218
|
-
parse(argv) {
|
|
219
|
-
this.program.parse(this.normalizeShortOptionEqualsSyntax(argv), {
|
|
220
|
-
from: 'node'
|
|
221
|
-
});
|
|
222
|
-
this.sub = this.program.args.slice();
|
|
223
|
-
const opts = this.program.opts();
|
|
224
|
-
|
|
225
|
-
// Apply tracked defaults for options with parsers
|
|
226
|
-
for (const [optionName, defaultValue] of this.optionDefaults) {
|
|
227
|
-
if (opts[optionName] === undefined) {
|
|
228
|
-
opts[optionName] = defaultValue;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
return opts;
|
|
232
|
-
}
|
|
233
|
-
normalizeShortOptionEqualsSyntax(argv) {
|
|
234
|
-
const normalizedArgv = argv.slice(0, 2);
|
|
235
|
-
for (const arg of argv.slice(2)) {
|
|
236
|
-
const shortOptionEqualsMatch = /^-([A-Za-z0-9])=(.*)$/.exec(arg);
|
|
237
|
-
if (!shortOptionEqualsMatch) {
|
|
238
|
-
normalizedArgv.push(arg);
|
|
239
|
-
continue;
|
|
240
|
-
}
|
|
241
|
-
const shortOptionName = shortOptionEqualsMatch[1];
|
|
242
|
-
const optionValue = shortOptionEqualsMatch[2];
|
|
243
|
-
if (!this.shortOptionsExpectingValue.has(shortOptionName)) {
|
|
244
|
-
normalizedArgv.push(arg);
|
|
245
|
-
continue;
|
|
246
|
-
}
|
|
247
|
-
normalizedArgv.push(`-${shortOptionName}`, optionValue);
|
|
248
|
-
}
|
|
249
|
-
return normalizedArgv;
|
|
250
|
-
}
|
|
251
|
-
findSubcommand(argv) {
|
|
252
|
-
const searchStart = argv[2] === '--' ? 3 : 2;
|
|
253
|
-
const dashDashIndex = argv.indexOf('--', searchStart);
|
|
254
|
-
const searchEnd = dashDashIndex === -1 ? argv.length : dashDashIndex;
|
|
255
|
-
for (let index = searchStart; index < searchEnd; index++) {
|
|
256
|
-
const arg = argv[index];
|
|
257
|
-
if (this.isDefined(arg, 'commands')) {
|
|
258
|
-
return {
|
|
259
|
-
index,
|
|
260
|
-
name: arg
|
|
405
|
+
constructor(opts) {
|
|
406
|
+
this.details = {
|
|
407
|
+
commands: [],
|
|
261
408
|
};
|
|
262
|
-
|
|
263
|
-
|
|
409
|
+
this.sub = [];
|
|
410
|
+
this.examplesList = [];
|
|
411
|
+
this.usedShortNames = new Set();
|
|
412
|
+
this.shortOptionsExpectingValue = new Set();
|
|
413
|
+
this.longOptionsExpectingValue = new Set();
|
|
414
|
+
this.knownShortOptions = new Set();
|
|
415
|
+
this.knownLongOptions = new Set();
|
|
416
|
+
this._opts = opts;
|
|
417
|
+
this.program = new commander_1.Command();
|
|
418
|
+
this.program.allowUnknownOption(true);
|
|
419
|
+
this.program.allowExcessArguments(true);
|
|
420
|
+
this.program.helpOption(false);
|
|
421
|
+
normalizeUsage(this.program, this._opts.usage);
|
|
422
|
+
this.optionDefaults = new Map();
|
|
423
|
+
}
|
|
424
|
+
option(name, description, defaultValue, parseFn) {
|
|
425
|
+
const definition = createOptionDefinition(name, description, defaultValue, parseFn, this.usedShortNames);
|
|
426
|
+
const { flags, parser, normalizedShortName } = definition;
|
|
427
|
+
const normalizedLongName = String(Array.isArray(name) ? name[1] : name)
|
|
428
|
+
.trim()
|
|
429
|
+
.replace(/^--?/, '');
|
|
430
|
+
const isValueOption = typeof defaultValue !== 'boolean';
|
|
431
|
+
this.knownLongOptions.add(normalizedLongName);
|
|
432
|
+
if (normalizedShortName) {
|
|
433
|
+
this.knownShortOptions.add(normalizedShortName);
|
|
434
|
+
}
|
|
435
|
+
if (isValueOption && normalizedShortName) {
|
|
436
|
+
this.shortOptionsExpectingValue.add(normalizedShortName);
|
|
437
|
+
}
|
|
438
|
+
if (isValueOption) {
|
|
439
|
+
this.longOptionsExpectingValue.add(normalizedLongName);
|
|
440
|
+
}
|
|
441
|
+
// When there's a parser, track the default separately and don't pass it to Commander.
|
|
442
|
+
// This prevents the parser from incorrectly accumulating the default value with the first explicit value.
|
|
443
|
+
if (parser && defaultValue !== undefined) {
|
|
444
|
+
this.optionDefaults.set(normalizedLongName, defaultValue);
|
|
445
|
+
this.program.option(flags, description, parser);
|
|
446
|
+
}
|
|
447
|
+
else if (parser) {
|
|
448
|
+
this.program.option(flags, description, parser);
|
|
449
|
+
}
|
|
450
|
+
else if (defaultValue !== undefined) {
|
|
451
|
+
this.program.option(flags, description, defaultValue);
|
|
452
|
+
}
|
|
453
|
+
else {
|
|
454
|
+
this.program.option(flags, description);
|
|
455
|
+
}
|
|
456
|
+
return this;
|
|
457
|
+
}
|
|
458
|
+
command(name, description = '') {
|
|
459
|
+
this.details.commands.push({
|
|
460
|
+
usage: name,
|
|
461
|
+
description,
|
|
462
|
+
});
|
|
463
|
+
return this;
|
|
464
|
+
}
|
|
465
|
+
example(usage, description) {
|
|
466
|
+
this.examplesList.push({
|
|
467
|
+
usage,
|
|
468
|
+
description,
|
|
469
|
+
});
|
|
470
|
+
return this;
|
|
471
|
+
}
|
|
472
|
+
examples(examples = []) {
|
|
473
|
+
for (const example of examples) {
|
|
474
|
+
this.example(example.usage, example.description);
|
|
475
|
+
}
|
|
476
|
+
return this;
|
|
477
|
+
}
|
|
478
|
+
showVersion() {
|
|
479
|
+
console.log(package_json_1.default.version);
|
|
480
|
+
process.exit(0);
|
|
481
|
+
}
|
|
482
|
+
showHelp() {
|
|
483
|
+
const lines = [this.program.helpInformation().trimEnd()];
|
|
484
|
+
if (this.details.commands.length) {
|
|
485
|
+
lines.push('');
|
|
486
|
+
lines.push('Commands:');
|
|
487
|
+
for (const entry of this.details.commands) {
|
|
488
|
+
const commandName = entry.usage.padEnd(26, ' ');
|
|
489
|
+
lines.push(` ${commandName}${entry.description}`);
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
if (this.examplesList.length) {
|
|
493
|
+
lines.push('');
|
|
494
|
+
lines.push('Examples:');
|
|
495
|
+
for (const example of this.examplesList) {
|
|
496
|
+
lines.push(` - ${example.description}`);
|
|
497
|
+
lines.push(` $ ${example.usage}`);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
console.log(lines.join('\n'));
|
|
501
|
+
process.exit(0);
|
|
502
|
+
}
|
|
503
|
+
isDefined(value, key) {
|
|
504
|
+
if (key !== 'commands') {
|
|
505
|
+
return false;
|
|
506
|
+
}
|
|
507
|
+
return this.details.commands.some(entry => entry.usage === value);
|
|
508
|
+
}
|
|
509
|
+
parse(argv) {
|
|
510
|
+
this.program.parse(this.normalizeShortOptionEqualsSyntax(argv), { from: 'node' });
|
|
511
|
+
this.sub = this.program.args.slice();
|
|
512
|
+
const opts = this.program.opts();
|
|
513
|
+
// Apply tracked defaults for options with parsers
|
|
514
|
+
for (const [optionName, defaultValue] of this.optionDefaults) {
|
|
515
|
+
if (opts[optionName] === undefined) {
|
|
516
|
+
opts[optionName] = defaultValue;
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
return opts;
|
|
520
|
+
}
|
|
521
|
+
normalizeShortOptionEqualsSyntax(argv) {
|
|
522
|
+
const normalizedArgv = argv.slice(0, 2);
|
|
523
|
+
for (const arg of argv.slice(2)) {
|
|
524
|
+
const shortOptionEqualsMatch = /^-([A-Za-z0-9])=(.*)$/.exec(arg);
|
|
525
|
+
if (!shortOptionEqualsMatch) {
|
|
526
|
+
normalizedArgv.push(arg);
|
|
527
|
+
continue;
|
|
528
|
+
}
|
|
529
|
+
const shortOptionName = shortOptionEqualsMatch[1];
|
|
530
|
+
const optionValue = shortOptionEqualsMatch[2];
|
|
531
|
+
if (!this.shortOptionsExpectingValue.has(shortOptionName)) {
|
|
532
|
+
normalizedArgv.push(arg);
|
|
533
|
+
continue;
|
|
534
|
+
}
|
|
535
|
+
normalizedArgv.push(`-${shortOptionName}`, optionValue);
|
|
536
|
+
}
|
|
537
|
+
return normalizedArgv;
|
|
538
|
+
}
|
|
539
|
+
findSubcommand(argv) {
|
|
540
|
+
const searchStart = argv[2] === '--' ? 3 : 2;
|
|
541
|
+
const dashDashIndex = argv.indexOf('--', searchStart);
|
|
542
|
+
const searchEnd = dashDashIndex === -1 ? argv.length : dashDashIndex;
|
|
543
|
+
for (let index = searchStart; index < searchEnd; index++) {
|
|
544
|
+
const arg = argv[index];
|
|
545
|
+
if (this.isDefined(arg, 'commands')) {
|
|
546
|
+
return { index, name: arg };
|
|
547
|
+
}
|
|
548
|
+
if (!isOptionToken(arg)) {
|
|
549
|
+
return null;
|
|
550
|
+
}
|
|
551
|
+
const nextArg = argv[index + 1];
|
|
552
|
+
const optionHasInlineValue = arg.includes('=');
|
|
553
|
+
const nextArgCouldBeOptionValue = nextArg && !isOptionToken(nextArg) && !this.isDefined(nextArg, 'commands');
|
|
554
|
+
if (!optionHasInlineValue && nextArgCouldBeOptionValue) {
|
|
555
|
+
index++;
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
if (dashDashIndex > -1 && this.isDefined(argv[dashDashIndex + 1], 'commands')) {
|
|
559
|
+
return { index: dashDashIndex + 1, name: argv[dashDashIndex + 1] };
|
|
560
|
+
}
|
|
561
|
+
return null;
|
|
562
|
+
}
|
|
563
|
+
findUnknownOption(argv) {
|
|
564
|
+
const dashDashIndex = argv.indexOf('--', 2);
|
|
565
|
+
const searchEnd = dashDashIndex === -1 ? argv.length : dashDashIndex;
|
|
566
|
+
for (let index = 2; index < searchEnd; index++) {
|
|
567
|
+
const arg = argv[index];
|
|
568
|
+
if (!isOptionToken(arg)) {
|
|
569
|
+
continue;
|
|
570
|
+
}
|
|
571
|
+
if (arg.startsWith('--')) {
|
|
572
|
+
const [tokenName] = arg.slice(2).split('=');
|
|
573
|
+
if (!this.knownLongOptions.has(tokenName)) {
|
|
574
|
+
return tokenName;
|
|
575
|
+
}
|
|
576
|
+
const hasInlineValue = arg.includes('=');
|
|
577
|
+
const nextArg = argv[index + 1];
|
|
578
|
+
if (this.longOptionsExpectingValue.has(tokenName) &&
|
|
579
|
+
!hasInlineValue &&
|
|
580
|
+
nextArg &&
|
|
581
|
+
!isOptionToken(nextArg)) {
|
|
582
|
+
index++;
|
|
583
|
+
}
|
|
584
|
+
continue;
|
|
585
|
+
}
|
|
586
|
+
const shortEqualsMatch = /^-([A-Za-z0-9])=(.*)$/.exec(arg);
|
|
587
|
+
if (shortEqualsMatch) {
|
|
588
|
+
const shortName = shortEqualsMatch[1];
|
|
589
|
+
if (!this.knownShortOptions.has(shortName)) {
|
|
590
|
+
return shortName;
|
|
591
|
+
}
|
|
592
|
+
continue;
|
|
593
|
+
}
|
|
594
|
+
const shortMatch = /^-([A-Za-z0-9])$/.exec(arg);
|
|
595
|
+
if (shortMatch) {
|
|
596
|
+
const shortName = shortMatch[1];
|
|
597
|
+
if (!this.knownShortOptions.has(shortName)) {
|
|
598
|
+
return shortName;
|
|
599
|
+
}
|
|
600
|
+
const nextArg = argv[index + 1];
|
|
601
|
+
if (this.shortOptionsExpectingValue.has(shortName) &&
|
|
602
|
+
nextArg &&
|
|
603
|
+
!isOptionToken(nextArg)) {
|
|
604
|
+
index++;
|
|
605
|
+
}
|
|
606
|
+
continue;
|
|
607
|
+
}
|
|
608
|
+
return arg.replace(/^-+/, '');
|
|
609
|
+
}
|
|
264
610
|
return null;
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
const
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
const
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
const
|
|
316
|
-
if (
|
|
317
|
-
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
if (wpFlagsWithoutValue.has(arg)) {
|
|
348
|
-
continue;
|
|
349
|
-
}
|
|
350
|
-
expectOptionValue = true;
|
|
351
|
-
continue;
|
|
352
|
-
}
|
|
353
|
-
if (/^-[A-Za-z0-9]+=/.test(arg)) {
|
|
354
|
-
continue;
|
|
355
|
-
}
|
|
356
|
-
return true;
|
|
357
|
-
}
|
|
358
|
-
return false;
|
|
359
|
-
}
|
|
360
|
-
async executeSubcommand(argv, parsedAlias, subcommand) {
|
|
361
|
-
const currentScript = argv[1];
|
|
362
|
-
const subcommandName = subcommand.name;
|
|
363
|
-
const extension = _nodePath.default.extname(currentScript);
|
|
364
|
-
const baseScriptPath = extension ? currentScript.slice(0, -extension.length) : currentScript;
|
|
365
|
-
const childScriptPath = extension ? `${baseScriptPath}-${subcommandName}${extension}` : `${baseScriptPath}-${subcommandName}`;
|
|
366
|
-
const aliasFromRawArgv = argv.slice(2).find(arg => (0, _envAlias.isAlias)(arg));
|
|
367
|
-
const rawArgsBeforeSubcommand = parsedAlias.argv.slice(2, subcommand.index);
|
|
368
|
-
const hasSeparatorBeforeSubcommand = rawArgsBeforeSubcommand.includes('--');
|
|
369
|
-
const argsBeforeSubcommand = rawArgsBeforeSubcommand.filter(arg => arg !== '--');
|
|
370
|
-
const subcommandArgs = parsedAlias.argv.slice(subcommand.index + 1);
|
|
371
|
-
const hasWpCommandPayload = this.hasWpCommandPayload(subcommandArgs);
|
|
372
|
-
const hasSeparator = argv.includes('--');
|
|
373
|
-
if (subcommandName === 'wp' && hasWpCommandPayload && !hasSeparator) {
|
|
374
|
-
exit.withError('A double dash ("--") must separate the arguments of "vip" from those of "wp". Run "vip wp --help" for examples.');
|
|
375
|
-
}
|
|
376
|
-
let childArgs = [...argsBeforeSubcommand, ...(hasSeparatorBeforeSubcommand ? ['--'] : []), ...subcommandArgs];
|
|
377
|
-
if (aliasFromRawArgv) {
|
|
378
|
-
childArgs = [aliasFromRawArgv, ...childArgs];
|
|
379
|
-
}
|
|
380
|
-
let runResult;
|
|
381
|
-
if (_nodeFs.default.existsSync(childScriptPath)) {
|
|
382
|
-
runResult = (0, _nodeChild_process.spawnSync)(process.execPath, [childScriptPath, ...childArgs], {
|
|
383
|
-
stdio: 'inherit',
|
|
384
|
-
env: process.env
|
|
385
|
-
});
|
|
386
|
-
} else {
|
|
387
|
-
const fallbackCommand = `${_nodePath.default.basename(baseScriptPath)}-${subcommandName}`;
|
|
388
|
-
runResult = (0, _nodeChild_process.spawnSync)(fallbackCommand, childArgs, {
|
|
389
|
-
stdio: 'inherit',
|
|
390
|
-
env: process.env,
|
|
391
|
-
shell: process.platform === 'win32'
|
|
392
|
-
});
|
|
393
|
-
}
|
|
394
|
-
if (runResult.error) {
|
|
395
|
-
throw runResult.error;
|
|
396
|
-
}
|
|
397
|
-
process.exit(runResult.status ?? 1);
|
|
398
|
-
}
|
|
611
|
+
}
|
|
612
|
+
hasWpCommandPayload(subcommandArgs) {
|
|
613
|
+
const wpFlagsWithoutValue = new Set(['--help', '-h', '--version', '-v', '--yes', '-y']);
|
|
614
|
+
let expectOptionValue = false;
|
|
615
|
+
for (const arg of subcommandArgs) {
|
|
616
|
+
if (expectOptionValue) {
|
|
617
|
+
if (!isOptionToken(arg)) {
|
|
618
|
+
expectOptionValue = false;
|
|
619
|
+
continue;
|
|
620
|
+
}
|
|
621
|
+
expectOptionValue = false;
|
|
622
|
+
}
|
|
623
|
+
if (!isOptionToken(arg)) {
|
|
624
|
+
return true;
|
|
625
|
+
}
|
|
626
|
+
if (arg.startsWith('--')) {
|
|
627
|
+
if (arg.includes('=') || wpFlagsWithoutValue.has(arg)) {
|
|
628
|
+
continue;
|
|
629
|
+
}
|
|
630
|
+
expectOptionValue = true;
|
|
631
|
+
continue;
|
|
632
|
+
}
|
|
633
|
+
if (/^-[A-Za-z0-9]$/.test(arg)) {
|
|
634
|
+
if (wpFlagsWithoutValue.has(arg)) {
|
|
635
|
+
continue;
|
|
636
|
+
}
|
|
637
|
+
expectOptionValue = true;
|
|
638
|
+
continue;
|
|
639
|
+
}
|
|
640
|
+
if (/^-[A-Za-z0-9]+=/.test(arg)) {
|
|
641
|
+
continue;
|
|
642
|
+
}
|
|
643
|
+
return true;
|
|
644
|
+
}
|
|
645
|
+
return false;
|
|
646
|
+
}
|
|
647
|
+
async executeSubcommand(argv, parsedAlias, subcommand) {
|
|
648
|
+
const currentScript = argv[1];
|
|
649
|
+
const subcommandName = subcommand.name;
|
|
650
|
+
const extension = node_path_1.default.extname(currentScript);
|
|
651
|
+
const baseScriptPath = extension ? currentScript.slice(0, -extension.length) : currentScript;
|
|
652
|
+
const childScriptPath = extension
|
|
653
|
+
? `${baseScriptPath}-${subcommandName}${extension}`
|
|
654
|
+
: `${baseScriptPath}-${subcommandName}`;
|
|
655
|
+
const aliasFromRawArgv = argv.slice(2).find(arg => (0, envAlias_1.isAlias)(arg));
|
|
656
|
+
const rawArgsBeforeSubcommand = parsedAlias.argv.slice(2, subcommand.index);
|
|
657
|
+
const hasSeparatorBeforeSubcommand = rawArgsBeforeSubcommand.includes('--');
|
|
658
|
+
const argsBeforeSubcommand = rawArgsBeforeSubcommand.filter(arg => arg !== '--');
|
|
659
|
+
const subcommandArgs = parsedAlias.argv.slice(subcommand.index + 1);
|
|
660
|
+
const hasWpCommandPayload = this.hasWpCommandPayload(subcommandArgs);
|
|
661
|
+
const hasSeparator = argv.includes('--');
|
|
662
|
+
if (subcommandName === 'wp' && hasWpCommandPayload && !hasSeparator) {
|
|
663
|
+
exit.withError('A double dash ("--") must separate the arguments of "vip" from those of "wp". Run "vip wp --help" for examples.');
|
|
664
|
+
}
|
|
665
|
+
let childArgs = [
|
|
666
|
+
...argsBeforeSubcommand,
|
|
667
|
+
...(hasSeparatorBeforeSubcommand ? ['--'] : []),
|
|
668
|
+
...subcommandArgs,
|
|
669
|
+
];
|
|
670
|
+
if (aliasFromRawArgv) {
|
|
671
|
+
childArgs = [aliasFromRawArgv, ...childArgs];
|
|
672
|
+
}
|
|
673
|
+
let runResult;
|
|
674
|
+
if (node_fs_1.default.existsSync(childScriptPath)) {
|
|
675
|
+
runResult = (0, node_child_process_1.spawnSync)(process.execPath, [childScriptPath, ...childArgs], {
|
|
676
|
+
stdio: 'inherit',
|
|
677
|
+
env: process.env,
|
|
678
|
+
});
|
|
679
|
+
}
|
|
680
|
+
else {
|
|
681
|
+
const fallbackCommand = `${node_path_1.default.basename(baseScriptPath)}-${subcommandName}`;
|
|
682
|
+
runResult = (0, node_child_process_1.spawnSync)(fallbackCommand, childArgs, {
|
|
683
|
+
stdio: 'inherit',
|
|
684
|
+
env: process.env,
|
|
685
|
+
shell: process.platform === 'win32',
|
|
686
|
+
});
|
|
687
|
+
}
|
|
688
|
+
if (runResult.error) {
|
|
689
|
+
throw runResult.error;
|
|
690
|
+
}
|
|
691
|
+
process.exit(runResult.status ?? 1);
|
|
692
|
+
}
|
|
399
693
|
}
|
|
400
|
-
|
|
401
694
|
/**
|
|
402
695
|
* @param {string[]} argv
|
|
403
696
|
*/
|
|
404
697
|
// eslint-disable-next-line complexity
|
|
405
698
|
CommanderArgsCompat.prototype.argv = async function (argv, cb) {
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
const
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
// Set the site in options.app
|
|
503
|
-
let res;
|
|
504
|
-
if (_opts.appContext) {
|
|
505
|
-
// If --app is not set, try to infer the app context
|
|
506
|
-
if (!options.app) {
|
|
507
|
-
const api = (0, _api.default)();
|
|
508
|
-
await (0, _tracker.trackEvent)('command_appcontext_list_fetch');
|
|
509
|
-
try {
|
|
510
|
-
res = await api.query({
|
|
511
|
-
query: (0, _graphqlTag.default)`query Apps( $first: Int, $after: String ) {
|
|
699
|
+
if (process.execArgv.includes('--inspect') && !alreadyConfirmedDebugAttachment) {
|
|
700
|
+
await (0, enquirer_1.prompt)({
|
|
701
|
+
type: 'confirm',
|
|
702
|
+
name: 'confirm',
|
|
703
|
+
message: "\nAttach the debugger, once you see 'Debugger attached' above hit 'y' to continue",
|
|
704
|
+
});
|
|
705
|
+
alreadyConfirmedDebugAttachment = true;
|
|
706
|
+
}
|
|
707
|
+
const parsedAlias = (0, envAlias_1.parseEnvAliasFromArgv)(argv);
|
|
708
|
+
const options = this.parse(parsedAlias.argv);
|
|
709
|
+
// If there's a sub-command, run that instead
|
|
710
|
+
const dispatchSubcommand = this.findSubcommand(parsedAlias.argv);
|
|
711
|
+
if (dispatchSubcommand) {
|
|
712
|
+
await this.executeSubcommand(argv, parsedAlias, dispatchSubcommand);
|
|
713
|
+
return {};
|
|
714
|
+
}
|
|
715
|
+
if (!_opts.wildcardCommand) {
|
|
716
|
+
const unknownOption = this.findUnknownOption(parsedAlias.argv);
|
|
717
|
+
if (unknownOption) {
|
|
718
|
+
await (0, tracker_1.trackEvent)('command_validation_error', {
|
|
719
|
+
error: `Unknown option: ${unknownOption}`,
|
|
720
|
+
});
|
|
721
|
+
exit.withError(`The option "${unknownOption}" is unknown. Did you mean the following one?\n-h, --help Retrieve a description, examples, and available options for a (sub)command.`);
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
if (_opts.format && !options.format) {
|
|
725
|
+
options.format = 'table';
|
|
726
|
+
}
|
|
727
|
+
if (options.h || options.help) {
|
|
728
|
+
this.showHelp();
|
|
729
|
+
}
|
|
730
|
+
if (options.v || options.version) {
|
|
731
|
+
this.showVersion();
|
|
732
|
+
}
|
|
733
|
+
if (options.debug || options.d) {
|
|
734
|
+
debug_1.default.enable(options.debug === true ? '*' : options.debug);
|
|
735
|
+
}
|
|
736
|
+
// If we have both an --app/--env and an alias, we need to give a warning
|
|
737
|
+
if (parsedAlias.app && (options.app || options.env)) {
|
|
738
|
+
exit.withError('Please only use an environment alias, or the --app and --env parameters, but not both');
|
|
739
|
+
}
|
|
740
|
+
// If there is an alias, use it to populate the app/env options
|
|
741
|
+
if (parsedAlias.app) {
|
|
742
|
+
options.app = parsedAlias.app;
|
|
743
|
+
options.env = parsedAlias.env; // Can be undefined
|
|
744
|
+
}
|
|
745
|
+
const validationError = validateOpts(options);
|
|
746
|
+
if (validationError) {
|
|
747
|
+
const error = validationError.toString();
|
|
748
|
+
await (0, tracker_1.trackEvent)('command_validation_error', { error });
|
|
749
|
+
exit.withError(error);
|
|
750
|
+
}
|
|
751
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
752
|
+
const { default: updateNotifier } = await import('update-notifier');
|
|
753
|
+
updateNotifier({ pkg: package_json_1.default, updateCheckInterval: 1000 * 60 * 60 * 24 }).notify({
|
|
754
|
+
isGlobal: true,
|
|
755
|
+
});
|
|
756
|
+
}
|
|
757
|
+
const customCommands = this.details.commands;
|
|
758
|
+
// Show help if no args passed
|
|
759
|
+
if (Boolean(customCommands.length) && !this.sub.length) {
|
|
760
|
+
await (0, tracker_1.trackEvent)('command_help_view');
|
|
761
|
+
this.showHelp();
|
|
762
|
+
return {};
|
|
763
|
+
}
|
|
764
|
+
// Show help if required arg is missing
|
|
765
|
+
if (_opts.requiredArgs > this.sub.length) {
|
|
766
|
+
await (0, tracker_1.trackEvent)('command_validation_error', {
|
|
767
|
+
error: 'Missing required arg',
|
|
768
|
+
});
|
|
769
|
+
this.showHelp();
|
|
770
|
+
return {};
|
|
771
|
+
}
|
|
772
|
+
// Show help if subcommand is invalid
|
|
773
|
+
const subCommands = this.details.commands.map(cmd => cmd.usage);
|
|
774
|
+
if (!_opts.wildcardCommand &&
|
|
775
|
+
this.sub[_opts.requiredArgs] &&
|
|
776
|
+
subCommands.length &&
|
|
777
|
+
0 > subCommands.indexOf(this.sub[_opts.requiredArgs])) {
|
|
778
|
+
const subcommand = this.sub.join(' ');
|
|
779
|
+
await (0, tracker_1.trackEvent)('command_validation_error', {
|
|
780
|
+
error: `Invalid subcommand: ${subcommand}`,
|
|
781
|
+
});
|
|
782
|
+
exit.withError(`\`${subcommand}\` is not a valid subcommand. See \`vip --help\``);
|
|
783
|
+
}
|
|
784
|
+
// Set the site in options.app
|
|
785
|
+
let res;
|
|
786
|
+
if (_opts.appContext) {
|
|
787
|
+
// If --app is not set, try to infer the app context
|
|
788
|
+
if (!options.app) {
|
|
789
|
+
const api = (0, api_1.default)();
|
|
790
|
+
await (0, tracker_1.trackEvent)('command_appcontext_list_fetch');
|
|
791
|
+
try {
|
|
792
|
+
res = await api.query({
|
|
793
|
+
query: (0, graphql_tag_1.default) `query Apps( $first: Int, $after: String ) {
|
|
512
794
|
apps( first: $first, after: $after ) {
|
|
513
795
|
total
|
|
514
796
|
nextCursor
|
|
@@ -518,408 +800,373 @@ CommanderArgsCompat.prototype.argv = async function (argv, cb) {
|
|
|
518
800
|
}
|
|
519
801
|
}
|
|
520
802
|
${_opts.appQueryFragments || ''}`,
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
});
|
|
624
|
-
exit.withError(`Could not find any non-production environments for ${_chalk.default.blueBright(options.app.name)}.`);
|
|
625
|
-
} else if (options.app.environments.length === 1) {
|
|
626
|
-
options.env = options.app.environments[0];
|
|
627
|
-
} else if (options.app.environments.length > 1) {
|
|
628
|
-
const environmentNames = options.app.environments.map(envObject => getEnvIdentifier(envObject));
|
|
629
|
-
let envSelection;
|
|
630
|
-
try {
|
|
631
|
-
envSelection = await (0, _enquirer.prompt)({
|
|
632
|
-
type: 'select',
|
|
633
|
-
name: 'env',
|
|
634
|
-
message: 'Which environment?',
|
|
635
|
-
choices: environmentNames
|
|
636
|
-
});
|
|
637
|
-
} catch (err) {
|
|
638
|
-
if (!err) {
|
|
639
|
-
process.exit();
|
|
640
|
-
}
|
|
641
|
-
exit.withError(err.message || err);
|
|
642
|
-
}
|
|
643
|
-
|
|
644
|
-
// Get full environment info after user selection
|
|
645
|
-
envSelection.env = options.app.environments.find(envObject => getEnvIdentifier(envObject) === envSelection.env);
|
|
646
|
-
if (!envSelection.env?.id) {
|
|
647
|
-
await (0, _tracker.trackEvent)('command_childcontext_list_select_error', {
|
|
648
|
-
error: 'Invalid environment selected'
|
|
649
|
-
});
|
|
650
|
-
exit.withError(`Environment ${_chalk.default.blueBright(getEnvIdentifier(envSelection.env))} does not exist`);
|
|
651
|
-
}
|
|
652
|
-
await (0, _tracker.trackEvent)('command_childcontext_list_select_success');
|
|
653
|
-
options.env = envSelection.env;
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
// Negotiate flag values
|
|
658
|
-
if (_opts.module === 'import-media') {
|
|
659
|
-
if ([true, 'true', 'yes'].includes(options.saveErrorLog)) {
|
|
660
|
-
options.saveErrorLog = 'true';
|
|
661
|
-
} else if ([false, 'false', 'no'].includes(options.saveErrorLog)) {
|
|
662
|
-
options.saveErrorLog = 'false';
|
|
663
|
-
} else {
|
|
664
|
-
options.saveErrorLog = 'prompt';
|
|
665
|
-
}
|
|
666
|
-
}
|
|
667
|
-
|
|
668
|
-
// Prompt for confirmation if necessary
|
|
669
|
-
if (_opts.requireConfirm && !options.force) {
|
|
670
|
-
/** @type {import('./format').Tuple[]} */
|
|
671
|
-
const info = [];
|
|
672
|
-
if (options.app) {
|
|
673
|
-
info.push({
|
|
674
|
-
key: 'App',
|
|
675
|
-
value: `${options.app.name} (id: ${options.app.id})`
|
|
676
|
-
});
|
|
677
|
-
}
|
|
678
|
-
if (options.env) {
|
|
679
|
-
const envName = getEnvIdentifier(options.env);
|
|
680
|
-
info.push({
|
|
681
|
-
key: 'Environment',
|
|
682
|
-
value: `${envName} (id: ${options.env.id})`
|
|
683
|
-
});
|
|
684
|
-
}
|
|
685
|
-
let message = 'Are you sure?';
|
|
686
|
-
if ('string' === typeof _opts.requireConfirm) {
|
|
687
|
-
message = _opts.requireConfirm;
|
|
688
|
-
}
|
|
689
|
-
switch (_opts.module) {
|
|
690
|
-
case 'import-sql':
|
|
691
|
-
{
|
|
692
|
-
const site = options.env;
|
|
693
|
-
if (site?.primaryDomain) {
|
|
694
|
-
const primaryDomainName = site.primaryDomain.name;
|
|
695
|
-
info.push({
|
|
696
|
-
key: 'Primary Domain Name',
|
|
697
|
-
value: primaryDomainName
|
|
698
|
-
});
|
|
699
|
-
}
|
|
700
|
-
|
|
701
|
-
// Site launched details
|
|
702
|
-
const haveLaunchedField = Object.hasOwn(site, 'launched');
|
|
703
|
-
if (haveLaunchedField) {
|
|
704
|
-
const launched = site.launched ? '✅ Yes' : `${_chalk.default.red('x')} No`;
|
|
705
|
-
info.push({
|
|
706
|
-
key: 'Launched?',
|
|
707
|
-
value: `${_chalk.default.cyan(launched)}`
|
|
708
|
-
});
|
|
709
|
-
}
|
|
710
|
-
if (this.sub.length) {
|
|
711
|
-
info.push({
|
|
712
|
-
key: 'SQL File',
|
|
713
|
-
value: `${_chalk.default.blueBright(this.sub)}`
|
|
714
|
-
});
|
|
715
|
-
}
|
|
716
|
-
options.skipValidate = Object.hasOwn(options, 'skipValidate') && Boolean(options.skipValidate) && !['false', 'no'].includes(options.skipValidate);
|
|
717
|
-
if (options.skipValidate) {
|
|
718
|
-
info.push({
|
|
719
|
-
key: 'Pre-Upload Validations',
|
|
720
|
-
value: _chalk.default.red('SKIPPED!')
|
|
803
|
+
variables: {
|
|
804
|
+
first: 100,
|
|
805
|
+
after: null, // TODO make dynamic?
|
|
806
|
+
},
|
|
807
|
+
});
|
|
808
|
+
}
|
|
809
|
+
catch (err) {
|
|
810
|
+
const message = err.toString();
|
|
811
|
+
await (0, tracker_1.trackEvent)('command_appcontext_list_fetch_error', {
|
|
812
|
+
error: message,
|
|
813
|
+
});
|
|
814
|
+
exit.withError(`Failed to get app (${_opts.appQuery}) details: ${message}`);
|
|
815
|
+
}
|
|
816
|
+
if (!res.data?.apps?.edges?.length) {
|
|
817
|
+
await (0, tracker_1.trackEvent)('command_appcontext_list_fetch_error', {
|
|
818
|
+
error: 'No apps found',
|
|
819
|
+
});
|
|
820
|
+
exit.withError("Couldn't find any apps");
|
|
821
|
+
}
|
|
822
|
+
const appNames = res.data.apps.edges.map(cur => cur.name);
|
|
823
|
+
let appSelection;
|
|
824
|
+
try {
|
|
825
|
+
appSelection = await (0, enquirer_1.prompt)({
|
|
826
|
+
type: 'autocomplete',
|
|
827
|
+
name: 'app',
|
|
828
|
+
message: 'Which app?',
|
|
829
|
+
limit: 10,
|
|
830
|
+
choices: appNames,
|
|
831
|
+
});
|
|
832
|
+
}
|
|
833
|
+
catch (err) {
|
|
834
|
+
if (!err) {
|
|
835
|
+
process.exit();
|
|
836
|
+
}
|
|
837
|
+
exit.withError(err.message || err);
|
|
838
|
+
}
|
|
839
|
+
// Copy all app information
|
|
840
|
+
appSelection.app = res.data.apps.edges.find(cur => cur.name === appSelection.app);
|
|
841
|
+
if (!appSelection.app?.id) {
|
|
842
|
+
await (0, tracker_1.trackEvent)('command_appcontext_list_select_error', {
|
|
843
|
+
error: 'Invalid app selected',
|
|
844
|
+
});
|
|
845
|
+
exit.withError(`App ${chalk_1.default.blueBright(appSelection.app.name)} could not be located`);
|
|
846
|
+
}
|
|
847
|
+
await (0, tracker_1.trackEvent)('command_appcontext_list_select_success');
|
|
848
|
+
options.app = { ...appSelection.app };
|
|
849
|
+
}
|
|
850
|
+
else {
|
|
851
|
+
let appLookup;
|
|
852
|
+
try {
|
|
853
|
+
appLookup = await (0, app_1.default)(options.app, _opts.appQuery, _opts.appQueryFragments);
|
|
854
|
+
}
|
|
855
|
+
catch (err) {
|
|
856
|
+
await (0, tracker_1.trackEvent)('command_appcontext_param_error', {
|
|
857
|
+
error: 'App lookup failed',
|
|
858
|
+
});
|
|
859
|
+
// Get error message, if available.
|
|
860
|
+
const apiErrorMsg = (0, utils_1.parseApiError)(err);
|
|
861
|
+
let errorMsg = `Unable to find app ${chalk_1.default.blueBright(options.app)}: `;
|
|
862
|
+
if (apiErrorMsg) {
|
|
863
|
+
errorMsg += apiErrorMsg;
|
|
864
|
+
}
|
|
865
|
+
else {
|
|
866
|
+
// Should happen rarely, if ever. Let's include stack trace for debugging.
|
|
867
|
+
errorMsg += 'Unknown error. If this persists, please contact VIP support.\n' + err.stack;
|
|
868
|
+
}
|
|
869
|
+
exit.withError(errorMsg);
|
|
870
|
+
}
|
|
871
|
+
if (!appLookup?.id) {
|
|
872
|
+
await (0, tracker_1.trackEvent)('command_appcontext_param_error', {
|
|
873
|
+
error: 'Invalid app specified',
|
|
874
|
+
});
|
|
875
|
+
exit.withError(`App ${chalk_1.default.blueBright(options.app)} does not exist`);
|
|
876
|
+
}
|
|
877
|
+
await (0, tracker_1.trackEvent)('command_appcontext_param_select');
|
|
878
|
+
options.app = { ...appLookup };
|
|
879
|
+
}
|
|
880
|
+
if (_opts.childEnvContext) {
|
|
881
|
+
options.app.environments = options.app.environments.filter(cur => cur.id !== options.app.id);
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
if ((_opts.envContext || _opts.childEnvContext) && options.app) {
|
|
885
|
+
if (options.env) {
|
|
886
|
+
if (_opts.childEnvContext && options.env.toLowerCase() === 'production') {
|
|
887
|
+
await (0, tracker_1.trackEvent)('command_childcontext_param_error', {
|
|
888
|
+
error: 'Cannot use `production`',
|
|
889
|
+
});
|
|
890
|
+
exit.withError('Environment production is not allowed for this command');
|
|
891
|
+
}
|
|
892
|
+
const env = options.app.environments.find(cur => getEnvIdentifier(cur).toLowerCase() === options.env.toLowerCase());
|
|
893
|
+
if (!env) {
|
|
894
|
+
await (0, tracker_1.trackEvent)('command_childcontext_param_error', {
|
|
895
|
+
error: `Invalid child environment (${options.env}) specified`,
|
|
896
|
+
});
|
|
897
|
+
exit.withError(`Environment ${chalk_1.default.blueBright(options.env)} for app ${chalk_1.default.blueBright(options.app.name)} does not exist`);
|
|
898
|
+
}
|
|
899
|
+
options.env = env;
|
|
900
|
+
}
|
|
901
|
+
else if (!options.app?.environments?.length) {
|
|
902
|
+
console.log('To set up a new development environment, please contact VIP Support.');
|
|
903
|
+
await (0, tracker_1.trackEvent)('command_childcontext_fetch_error', {
|
|
904
|
+
error: 'No child environments found',
|
|
721
905
|
});
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
906
|
+
exit.withError(`Could not find any non-production environments for ${chalk_1.default.blueBright(options.app.name)}.`);
|
|
907
|
+
}
|
|
908
|
+
else if (options.app.environments.length === 1) {
|
|
909
|
+
options.env = options.app.environments[0];
|
|
910
|
+
}
|
|
911
|
+
else if (options.app.environments.length > 1) {
|
|
912
|
+
const environmentNames = options.app.environments.map(envObject => getEnvIdentifier(envObject));
|
|
913
|
+
let envSelection;
|
|
914
|
+
try {
|
|
915
|
+
envSelection = await (0, enquirer_1.prompt)({
|
|
916
|
+
type: 'select',
|
|
917
|
+
name: 'env',
|
|
918
|
+
message: 'Which environment?',
|
|
919
|
+
choices: environmentNames,
|
|
920
|
+
});
|
|
921
|
+
}
|
|
922
|
+
catch (err) {
|
|
923
|
+
if (!err) {
|
|
924
|
+
process.exit();
|
|
925
|
+
}
|
|
926
|
+
exit.withError(err.message || err);
|
|
927
|
+
}
|
|
928
|
+
// Get full environment info after user selection
|
|
929
|
+
envSelection.env = options.app.environments.find(envObject => getEnvIdentifier(envObject) === envSelection.env);
|
|
930
|
+
if (!envSelection.env?.id) {
|
|
931
|
+
await (0, tracker_1.trackEvent)('command_childcontext_list_select_error', {
|
|
932
|
+
error: 'Invalid environment selected',
|
|
933
|
+
});
|
|
934
|
+
exit.withError(`Environment ${chalk_1.default.blueBright(getEnvIdentifier(envSelection.env))} does not exist`);
|
|
935
|
+
}
|
|
936
|
+
await (0, tracker_1.trackEvent)('command_childcontext_list_select_success');
|
|
937
|
+
options.env = envSelection.env;
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
// Negotiate flag values
|
|
941
|
+
if (_opts.module === 'import-media') {
|
|
942
|
+
if ([true, 'true', 'yes'].includes(options.saveErrorLog)) {
|
|
943
|
+
options.saveErrorLog = 'true';
|
|
944
|
+
}
|
|
945
|
+
else if ([false, 'false', 'no'].includes(options.saveErrorLog)) {
|
|
946
|
+
options.saveErrorLog = 'false';
|
|
947
|
+
}
|
|
948
|
+
else {
|
|
949
|
+
options.saveErrorLog = 'prompt';
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
// Prompt for confirmation if necessary
|
|
953
|
+
if (_opts.requireConfirm && !options.force) {
|
|
954
|
+
/** @type {import('./format').Tuple[]} */
|
|
955
|
+
const info = [];
|
|
956
|
+
if (options.app) {
|
|
957
|
+
info.push({ key: 'App', value: `${options.app.name} (id: ${options.app.id})` });
|
|
958
|
+
}
|
|
959
|
+
if (options.env) {
|
|
960
|
+
const envName = getEnvIdentifier(options.env);
|
|
961
|
+
info.push({ key: 'Environment', value: `${envName} (id: ${options.env.id})` });
|
|
962
|
+
}
|
|
963
|
+
let message = 'Are you sure?';
|
|
964
|
+
if ('string' === typeof _opts.requireConfirm) {
|
|
965
|
+
message = _opts.requireConfirm;
|
|
966
|
+
}
|
|
967
|
+
switch (_opts.module) {
|
|
968
|
+
case 'import-sql': {
|
|
969
|
+
const site = options.env;
|
|
970
|
+
if (site?.primaryDomain) {
|
|
971
|
+
const primaryDomainName = site.primaryDomain.name;
|
|
972
|
+
info.push({ key: 'Primary Domain Name', value: primaryDomainName });
|
|
973
|
+
}
|
|
974
|
+
// Site launched details
|
|
975
|
+
const haveLaunchedField = Object.hasOwn(site, 'launched');
|
|
976
|
+
if (haveLaunchedField) {
|
|
977
|
+
const launched = site.launched ? '✅ Yes' : `${chalk_1.default.red('x')} No`;
|
|
978
|
+
info.push({ key: 'Launched?', value: `${chalk_1.default.cyan(launched)}` });
|
|
979
|
+
}
|
|
980
|
+
if (this.sub.length) {
|
|
981
|
+
info.push({ key: 'SQL File', value: `${chalk_1.default.blueBright(this.sub)}` });
|
|
982
|
+
}
|
|
983
|
+
options.skipValidate =
|
|
984
|
+
Object.hasOwn(options, 'skipValidate') &&
|
|
985
|
+
Boolean(options.skipValidate) &&
|
|
986
|
+
!['false', 'no'].includes(options.skipValidate);
|
|
987
|
+
if (options.skipValidate) {
|
|
988
|
+
info.push({ key: 'Pre-Upload Validations', value: chalk_1.default.red('SKIPPED!') });
|
|
989
|
+
}
|
|
990
|
+
// Show S-R params if the `search-replace` flag is set
|
|
991
|
+
const searchReplace = options.searchReplace;
|
|
992
|
+
const assignSRValues = (from, to) => {
|
|
993
|
+
const pairs = {
|
|
994
|
+
From: `${from}`,
|
|
995
|
+
To: `${to}`,
|
|
996
|
+
};
|
|
997
|
+
return pairs;
|
|
998
|
+
};
|
|
999
|
+
if (searchReplace) {
|
|
1000
|
+
const searchReplaceValues = (0, format_1.formatSearchReplaceValues)(searchReplace, assignSRValues);
|
|
1001
|
+
// Format data into a user-friendly table
|
|
1002
|
+
info.push({
|
|
1003
|
+
key: 'Replacements',
|
|
1004
|
+
value: '\n' + (0, format_1.formatData)(searchReplaceValues, 'table'),
|
|
1005
|
+
});
|
|
1006
|
+
}
|
|
1007
|
+
break;
|
|
1008
|
+
}
|
|
1009
|
+
case 'sync': {
|
|
1010
|
+
const { backup, canSync, errors } = options.env.syncPreview;
|
|
1011
|
+
if (!canSync) {
|
|
1012
|
+
// User can not sync due to some error(s)
|
|
1013
|
+
// Shows the first error in the array
|
|
1014
|
+
exit.withError(`Could not sync to this environment: ${errors[0].message}`);
|
|
1015
|
+
}
|
|
1016
|
+
// remove __typename from replacements.
|
|
1017
|
+
// can not be deleted afterwards if deconstructed
|
|
1018
|
+
const replacements = options.env.syncPreview.replacements.map(rep => {
|
|
1019
|
+
const { from, to } = rep;
|
|
1020
|
+
return { from, to };
|
|
1021
|
+
});
|
|
1022
|
+
if (backup) {
|
|
1023
|
+
info.push({ key: 'From backup', value: new Date(backup.createdAt).toUTCString() });
|
|
1024
|
+
}
|
|
1025
|
+
info.push({ key: 'Replacements', value: '\n' + (0, format_1.formatData)(replacements, 'table') });
|
|
1026
|
+
break;
|
|
1027
|
+
}
|
|
1028
|
+
case 'import-media': {
|
|
1029
|
+
const isUrl = this.sub.length &&
|
|
1030
|
+
(String(this.sub).startsWith('http://') ||
|
|
1031
|
+
String(this.sub).startsWith('https://'));
|
|
1032
|
+
const archiveLabel = isUrl ? 'Archive URL' : 'Archive Path';
|
|
1033
|
+
info.push({ key: archiveLabel, value: chalk_1.default.blue.underline(this.sub) });
|
|
1034
|
+
// Update confirmation message if it's a local path
|
|
1035
|
+
if (!isUrl && 'string' === typeof _opts.requireConfirm) {
|
|
1036
|
+
message = message.replaceAll('the URL', 'the path');
|
|
1037
|
+
}
|
|
1038
|
+
options.overwriteExistingFiles =
|
|
1039
|
+
Object.hasOwn(options, 'overwriteExistingFiles') &&
|
|
1040
|
+
Boolean(options.overwriteExistingFiles) &&
|
|
1041
|
+
!['false', 'no'].includes(options.overwriteExistingFiles);
|
|
1042
|
+
info.push({
|
|
1043
|
+
key: 'Overwrite any existing files',
|
|
1044
|
+
value: options.overwriteExistingFiles ? '✅ Yes' : `${chalk_1.default.red('x')} No`,
|
|
1045
|
+
});
|
|
1046
|
+
options.importIntermediateImages =
|
|
1047
|
+
Object.hasOwn(options, 'importIntermediateImages') &&
|
|
1048
|
+
Boolean(options.importIntermediateImages) &&
|
|
1049
|
+
!['false', 'no'].includes(options.importIntermediateImages);
|
|
1050
|
+
info.push({
|
|
1051
|
+
key: 'Import intermediate image files',
|
|
1052
|
+
value: options.importIntermediateImages ? '✅ Yes' : `${chalk_1.default.red('x')} No`,
|
|
1053
|
+
});
|
|
1054
|
+
options.exportFileErrorsToJson =
|
|
1055
|
+
Object.hasOwn(options, 'exportFileErrorsToJson') &&
|
|
1056
|
+
Boolean(options.exportFileErrorsToJson) &&
|
|
1057
|
+
!['false', 'no'].includes(options.exportFileErrorsToJson);
|
|
1058
|
+
info.push({
|
|
1059
|
+
key: 'Export any file errors encountered to a JSON file instead of a plain text file.',
|
|
1060
|
+
value: options.exportFileErrorsToJson ? '✅ Yes' : `${chalk_1.default.red('x')} No`,
|
|
1061
|
+
});
|
|
1062
|
+
info.push({
|
|
1063
|
+
key: 'Download file-error logs?',
|
|
1064
|
+
value: options.saveErrorLog,
|
|
1065
|
+
});
|
|
1066
|
+
break;
|
|
1067
|
+
}
|
|
1068
|
+
default:
|
|
1069
|
+
}
|
|
1070
|
+
const skipPrompt = _opts.skipConfirmPrompt || false;
|
|
1071
|
+
const yes = await (0, prompt_1.confirm)(info, message, skipPrompt);
|
|
1072
|
+
if (!yes) {
|
|
1073
|
+
await (0, tracker_1.trackEvent)('command_confirm_cancel');
|
|
1074
|
+
return {};
|
|
1075
|
+
}
|
|
1076
|
+
await (0, tracker_1.trackEvent)('command_confirm_success');
|
|
1077
|
+
}
|
|
1078
|
+
if (cb) {
|
|
1079
|
+
res = await cb(this.sub, options);
|
|
1080
|
+
if (_opts.format && res) {
|
|
1081
|
+
if (res.header) {
|
|
1082
|
+
if (options.format !== 'json') {
|
|
1083
|
+
console.log((0, format_1.formatData)(res.header, 'keyValue'));
|
|
1084
|
+
}
|
|
1085
|
+
res = res.data;
|
|
1086
|
+
}
|
|
1087
|
+
res = res.map(row => {
|
|
1088
|
+
const out = { ...row };
|
|
1089
|
+
if (out.__typename) {
|
|
1090
|
+
// Apollo injects __typename
|
|
1091
|
+
delete out.__typename;
|
|
1092
|
+
}
|
|
1093
|
+
return out;
|
|
740
1094
|
});
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
}
|
|
744
|
-
case 'sync':
|
|
745
|
-
{
|
|
746
|
-
const {
|
|
747
|
-
backup,
|
|
748
|
-
canSync,
|
|
749
|
-
errors
|
|
750
|
-
} = options.env.syncPreview;
|
|
751
|
-
if (!canSync) {
|
|
752
|
-
// User can not sync due to some error(s)
|
|
753
|
-
// Shows the first error in the array
|
|
754
|
-
exit.withError(`Could not sync to this environment: ${errors[0].message}`);
|
|
755
|
-
}
|
|
756
|
-
|
|
757
|
-
// remove __typename from replacements.
|
|
758
|
-
// can not be deleted afterwards if deconstructed
|
|
759
|
-
const replacements = options.env.syncPreview.replacements.map(rep => {
|
|
760
|
-
const {
|
|
761
|
-
from,
|
|
762
|
-
to
|
|
763
|
-
} = rep;
|
|
764
|
-
return {
|
|
765
|
-
from,
|
|
766
|
-
to
|
|
767
|
-
};
|
|
768
|
-
});
|
|
769
|
-
if (backup) {
|
|
770
|
-
info.push({
|
|
771
|
-
key: 'From backup',
|
|
772
|
-
value: new Date(backup.createdAt).toUTCString()
|
|
1095
|
+
await (0, tracker_1.trackEvent)('command_output', {
|
|
1096
|
+
format: options.format,
|
|
773
1097
|
});
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
}
|
|
781
|
-
case 'import-media':
|
|
782
|
-
{
|
|
783
|
-
const isUrl = this.sub.length && (String(this.sub).startsWith('http://') || String(this.sub).startsWith('https://'));
|
|
784
|
-
const archiveLabel = isUrl ? 'Archive URL' : 'Archive Path';
|
|
785
|
-
info.push({
|
|
786
|
-
key: archiveLabel,
|
|
787
|
-
value: _chalk.default.blue.underline(this.sub)
|
|
788
|
-
});
|
|
789
|
-
|
|
790
|
-
// Update confirmation message if it's a local path
|
|
791
|
-
if (!isUrl && 'string' === typeof _opts.requireConfirm) {
|
|
792
|
-
message = message.replaceAll('the URL', 'the path');
|
|
793
|
-
}
|
|
794
|
-
options.overwriteExistingFiles = Object.hasOwn(options, 'overwriteExistingFiles') && Boolean(options.overwriteExistingFiles) && !['false', 'no'].includes(options.overwriteExistingFiles);
|
|
795
|
-
info.push({
|
|
796
|
-
key: 'Overwrite any existing files',
|
|
797
|
-
value: options.overwriteExistingFiles ? '✅ Yes' : `${_chalk.default.red('x')} No`
|
|
798
|
-
});
|
|
799
|
-
options.importIntermediateImages = Object.hasOwn(options, 'importIntermediateImages') && Boolean(options.importIntermediateImages) && !['false', 'no'].includes(options.importIntermediateImages);
|
|
800
|
-
info.push({
|
|
801
|
-
key: 'Import intermediate image files',
|
|
802
|
-
value: options.importIntermediateImages ? '✅ Yes' : `${_chalk.default.red('x')} No`
|
|
803
|
-
});
|
|
804
|
-
options.exportFileErrorsToJson = Object.hasOwn(options, 'exportFileErrorsToJson') && Boolean(options.exportFileErrorsToJson) && !['false', 'no'].includes(options.exportFileErrorsToJson);
|
|
805
|
-
info.push({
|
|
806
|
-
key: 'Export any file errors encountered to a JSON file instead of a plain text file.',
|
|
807
|
-
value: options.exportFileErrorsToJson ? '✅ Yes' : `${_chalk.default.red('x')} No`
|
|
808
|
-
});
|
|
809
|
-
info.push({
|
|
810
|
-
key: 'Download file-error logs?',
|
|
811
|
-
value: options.saveErrorLog
|
|
812
|
-
});
|
|
813
|
-
break;
|
|
814
|
-
}
|
|
815
|
-
default:
|
|
816
|
-
}
|
|
817
|
-
const skipPrompt = _opts.skipConfirmPrompt || false;
|
|
818
|
-
const yes = await (0, _prompt.confirm)(info, message, skipPrompt);
|
|
819
|
-
if (!yes) {
|
|
820
|
-
await (0, _tracker.trackEvent)('command_confirm_cancel');
|
|
821
|
-
return {};
|
|
822
|
-
}
|
|
823
|
-
await (0, _tracker.trackEvent)('command_confirm_success');
|
|
824
|
-
}
|
|
825
|
-
if (cb) {
|
|
826
|
-
res = await cb(this.sub, options);
|
|
827
|
-
if (_opts.format && res) {
|
|
828
|
-
if (res.header) {
|
|
829
|
-
if (options.format !== 'json') {
|
|
830
|
-
console.log((0, _format.formatData)(res.header, 'keyValue'));
|
|
831
|
-
}
|
|
832
|
-
res = res.data;
|
|
833
|
-
}
|
|
834
|
-
res = res.map(row => {
|
|
835
|
-
const out = {
|
|
836
|
-
...row
|
|
837
|
-
};
|
|
838
|
-
if (out.__typename) {
|
|
839
|
-
// Apollo injects __typename
|
|
840
|
-
delete out.__typename;
|
|
841
|
-
}
|
|
842
|
-
return out;
|
|
843
|
-
});
|
|
844
|
-
await (0, _tracker.trackEvent)('command_output', {
|
|
845
|
-
format: options.format
|
|
846
|
-
});
|
|
847
|
-
const formattedOut = (0, _format.formatData)(res, options.format);
|
|
848
|
-
console.log(formattedOut);
|
|
849
|
-
return {};
|
|
850
|
-
}
|
|
851
|
-
}
|
|
852
|
-
return options;
|
|
1098
|
+
const formattedOut = (0, format_1.formatData)(res, options.format);
|
|
1099
|
+
console.log(formattedOut);
|
|
1100
|
+
return {};
|
|
1101
|
+
}
|
|
1102
|
+
}
|
|
1103
|
+
return options;
|
|
853
1104
|
};
|
|
854
|
-
|
|
855
1105
|
/**
|
|
856
1106
|
* @returns {Error|undefined}
|
|
857
1107
|
*/
|
|
858
1108
|
function validateOpts(opts) {
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
}
|
|
867
|
-
if (opts.env) {
|
|
868
|
-
if (typeof opts.env !== 'string' && typeof opts.env !== 'number') {
|
|
869
|
-
return new Error('Invalid --env');
|
|
1109
|
+
if (opts.app) {
|
|
1110
|
+
if (typeof opts.app !== 'string' && typeof opts.app !== 'number') {
|
|
1111
|
+
return new Error('Invalid --app');
|
|
1112
|
+
}
|
|
1113
|
+
if (opts.app.length < 1) {
|
|
1114
|
+
return new Error('Invalid --app');
|
|
1115
|
+
}
|
|
870
1116
|
}
|
|
871
|
-
if (opts.env
|
|
872
|
-
|
|
1117
|
+
if (opts.env) {
|
|
1118
|
+
if (typeof opts.env !== 'string' && typeof opts.env !== 'number') {
|
|
1119
|
+
return new Error('Invalid --env');
|
|
1120
|
+
}
|
|
1121
|
+
if (opts.env.length < 1) {
|
|
1122
|
+
return new Error('Invalid --env');
|
|
1123
|
+
}
|
|
873
1124
|
}
|
|
874
|
-
}
|
|
875
1125
|
}
|
|
876
|
-
|
|
877
1126
|
/**
|
|
878
1127
|
* @returns {CommanderArgsCompat}
|
|
879
1128
|
*/
|
|
880
|
-
function
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
return args;
|
|
1129
|
+
function default_1(opts) {
|
|
1130
|
+
_opts = {
|
|
1131
|
+
appContext: false,
|
|
1132
|
+
appQuery: 'id,name',
|
|
1133
|
+
childEnvContext: false,
|
|
1134
|
+
envContext: false,
|
|
1135
|
+
format: false,
|
|
1136
|
+
requireConfirm: false,
|
|
1137
|
+
requiredArgs: 0,
|
|
1138
|
+
wildcardCommand: false,
|
|
1139
|
+
...opts,
|
|
1140
|
+
};
|
|
1141
|
+
const args = new CommanderArgsCompat(_opts);
|
|
1142
|
+
if (_opts.appContext || _opts.requireConfirm) {
|
|
1143
|
+
args.option('app', 'Target an application. Accepts a string value for the application name or an integer for the application ID.');
|
|
1144
|
+
}
|
|
1145
|
+
if (_opts.envContext || _opts.childEnvContext) {
|
|
1146
|
+
args.option('env', 'Target an environment. Accepts a string value for the environment type.');
|
|
1147
|
+
}
|
|
1148
|
+
if (_opts.requireConfirm) {
|
|
1149
|
+
args.option('force', 'Skip confirmation.', false);
|
|
1150
|
+
}
|
|
1151
|
+
if (_opts.format) {
|
|
1152
|
+
args.option('format', 'Render output in a particular format. Accepts “table“ (default), “csv“, and “json“.');
|
|
1153
|
+
}
|
|
1154
|
+
// Add help and version to all subcommands
|
|
1155
|
+
args.option(['h', 'help'], 'Retrieve a description, examples, and available options for a (sub)command.', false);
|
|
1156
|
+
args.option(['v', 'version'], 'Retrieve the version number of VIP-CLI currently installed on the local machine.', false);
|
|
1157
|
+
args.option(['d', 'debug'], 'Generate verbose output during command execution to help identify or fix errors or bugs.');
|
|
1158
|
+
return args;
|
|
911
1159
|
}
|
|
912
1160
|
function getEnvIdentifier(env) {
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
return identifier;
|
|
1161
|
+
let identifier = env.type;
|
|
1162
|
+
// If the env has a unique name (happens when site has multiple envs of a type), add on name
|
|
1163
|
+
// for disambiguation. Only on non-main-env
|
|
1164
|
+
if (env.name !== env.type && env.name && env.appId !== env.id) {
|
|
1165
|
+
identifier = `${identifier}.${env.name}`;
|
|
1166
|
+
}
|
|
1167
|
+
return identifier;
|
|
921
1168
|
}
|
|
922
1169
|
function containsAppEnvArgument(argv) {
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
}
|
|
1170
|
+
const parsedAlias = (0, envAlias_1.parseEnvAliasFromArgv)(argv);
|
|
1171
|
+
return Boolean(parsedAlias.app || parsedAlias.env || argv.includes('--app') || argv.includes('--env'));
|
|
1172
|
+
}
|