@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.
Files changed (311) hide show
  1. package/assets/dev-env.lando.template.yml.ejs +1 -1
  2. package/dist/bin/vip-app-deploy-token-generate.js +110 -78
  3. package/dist/bin/vip-app-deploy-token.js +24 -16
  4. package/dist/bin/vip-app-deploy-validate.js +45 -41
  5. package/dist/bin/vip-app-deploy.js +222 -215
  6. package/dist/bin/vip-app-list.js +59 -43
  7. package/dist/bin/vip-app.js +97 -66
  8. package/dist/bin/vip-backup-db.js +36 -29
  9. package/dist/bin/vip-backup.js +16 -9
  10. package/dist/bin/vip-cache-purge-url.js +93 -55
  11. package/dist/bin/vip-cache.js +23 -14
  12. package/dist/bin/vip-config-envvar-delete.js +74 -73
  13. package/dist/bin/vip-config-envvar-get-all.js +68 -68
  14. package/dist/bin/vip-config-envvar-get.js +46 -46
  15. package/dist/bin/vip-config-envvar-list.js +54 -57
  16. package/dist/bin/vip-config-envvar-set.js +102 -96
  17. package/dist/bin/vip-config-envvar.js +38 -24
  18. package/dist/bin/vip-config-software-get.js +88 -75
  19. package/dist/bin/vip-config-software-update.js +116 -120
  20. package/dist/bin/vip-config-software.js +31 -21
  21. package/dist/bin/vip-config.js +25 -17
  22. package/dist/bin/vip-db-phpmyadmin.js +40 -39
  23. package/dist/bin/vip-db.js +13 -12
  24. package/dist/bin/vip-defensive-mode-configure.js +197 -197
  25. package/dist/bin/vip-defensive-mode-disable.js +43 -35
  26. package/dist/bin/vip-defensive-mode-enable.js +47 -38
  27. package/dist/bin/vip-defensive-mode.js +28 -17
  28. package/dist/bin/vip-dev-env-create.js +147 -104
  29. package/dist/bin/vip-dev-env-destroy.js +48 -39
  30. package/dist/bin/vip-dev-env-envvar-delete.js +60 -49
  31. package/dist/bin/vip-dev-env-envvar-get-all.js +52 -45
  32. package/dist/bin/vip-dev-env-envvar-get.js +48 -37
  33. package/dist/bin/vip-dev-env-envvar-list.js +48 -41
  34. package/dist/bin/vip-dev-env-envvar-set.js +83 -70
  35. package/dist/bin/vip-dev-env-envvar.js +38 -23
  36. package/dist/bin/vip-dev-env-exec.js +81 -74
  37. package/dist/bin/vip-dev-env-import-media.js +34 -26
  38. package/dist/bin/vip-dev-env-import-sql.js +65 -51
  39. package/dist/bin/vip-dev-env-import.js +23 -14
  40. package/dist/bin/vip-dev-env-info.js +59 -50
  41. package/dist/bin/vip-dev-env-list.js +34 -31
  42. package/dist/bin/vip-dev-env-logs.js +59 -49
  43. package/dist/bin/vip-dev-env-purge.js +71 -63
  44. package/dist/bin/vip-dev-env-shell.js +82 -71
  45. package/dist/bin/vip-dev-env-start.js +77 -65
  46. package/dist/bin/vip-dev-env-stop.js +80 -74
  47. package/dist/bin/vip-dev-env-sync-sql.js +80 -72
  48. package/dist/bin/vip-dev-env-sync.js +18 -11
  49. package/dist/bin/vip-dev-env-update.js +93 -84
  50. package/dist/bin/vip-dev-env.js +25 -8
  51. package/dist/bin/vip-edge-workers-build.js +82 -54
  52. package/dist/bin/vip-edge-workers-delete.js +84 -52
  53. package/dist/bin/vip-edge-workers-deploy.js +186 -126
  54. package/dist/bin/vip-edge-workers-disable.js +75 -44
  55. package/dist/bin/vip-edge-workers-enable.js +86 -54
  56. package/dist/bin/vip-edge-workers-get.js +108 -88
  57. package/dist/bin/vip-edge-workers-init.js +83 -53
  58. package/dist/bin/vip-edge-workers-list.js +89 -54
  59. package/dist/bin/vip-edge-workers-new.js +98 -69
  60. package/dist/bin/vip-edge-workers-validate.js +123 -82
  61. package/dist/bin/vip-edge-workers.js +19 -6
  62. package/dist/bin/vip-export-sql.js +75 -69
  63. package/dist/bin/vip-export.js +12 -7
  64. package/dist/bin/vip-import-media-abort.js +99 -73
  65. package/dist/bin/vip-import-media-status.js +83 -51
  66. package/dist/bin/vip-import-media.js +165 -166
  67. package/dist/bin/vip-import-sql-status.js +75 -45
  68. package/dist/bin/vip-import-sql.js +536 -596
  69. package/dist/bin/vip-import-validate-files.js +122 -141
  70. package/dist/bin/vip-import-validate-sql.js +52 -16
  71. package/dist/bin/vip-import.js +16 -7
  72. package/dist/bin/vip-logout.js +17 -13
  73. package/dist/bin/vip-logs.js +209 -183
  74. package/dist/bin/vip-search-replace.js +85 -53
  75. package/dist/bin/vip-slowlogs.js +168 -147
  76. package/dist/bin/vip-sync.js +163 -133
  77. package/dist/bin/vip-whoami.js +71 -35
  78. package/dist/bin/vip-wp.js +506 -549
  79. package/dist/bin/vip.js +161 -116
  80. package/dist/commands/backup-db.js +183 -149
  81. package/dist/commands/dev-env-import-sql.js +162 -117
  82. package/dist/commands/dev-env-sync-sql.js +372 -330
  83. package/dist/commands/export-sql.js +441 -425
  84. package/dist/commands/phpmyadmin.js +232 -212
  85. package/dist/commands/wp-ssh.js +218 -187
  86. package/dist/lib/analytics/clients/tracks.js +84 -91
  87. package/dist/lib/analytics/index.js +27 -27
  88. package/dist/lib/api/app.js +37 -36
  89. package/dist/lib/api/cache-purge.js +17 -20
  90. package/dist/lib/api/constants.js +5 -6
  91. package/dist/lib/api/edge-workers.js +84 -135
  92. package/dist/lib/api/error-debug.js +10 -13
  93. package/dist/lib/api/feature-flags.js +16 -17
  94. package/dist/lib/api/http.js +47 -48
  95. package/dist/lib/api/user.js +17 -18
  96. package/dist/lib/api.js +107 -116
  97. package/dist/lib/app-logs/app-logs.js +24 -25
  98. package/dist/lib/app-slowlogs/app-slowlogs.js +23 -24
  99. package/dist/lib/app-slowlogs/types.js +2 -1
  100. package/dist/lib/app.js +6 -8
  101. package/dist/lib/backup-storage-availability/backup-storage-availability.js +119 -119
  102. package/dist/lib/backup-storage-availability/docker-machine-not-found-error.js +5 -6
  103. package/dist/lib/cli/apiConfig.js +71 -41
  104. package/dist/lib/cli/command.js +1120 -873
  105. package/dist/lib/cli/config.js +29 -29
  106. package/dist/lib/cli/envAlias.js +35 -50
  107. package/dist/lib/cli/exit.js +19 -19
  108. package/dist/lib/cli/format.js +172 -172
  109. package/dist/lib/cli/progress.js +193 -236
  110. package/dist/lib/cli/prompt.js +14 -15
  111. package/dist/lib/cli/runtime-mode.js +5 -6
  112. package/dist/lib/client-file-uploader.js +489 -641
  113. package/dist/lib/config/software.js +206 -212
  114. package/dist/lib/constants/dev-environment.js +40 -37
  115. package/dist/lib/constants/file-size.js +6 -7
  116. package/dist/lib/constants/vipgo.js +24 -12
  117. package/dist/lib/custom-deploy/custom-deploy.js +138 -120
  118. package/dist/lib/database.js +88 -85
  119. package/dist/lib/defensive-mode/api.js +41 -46
  120. package/dist/lib/defensive-mode/cli-helpers.js +40 -40
  121. package/dist/lib/dev-environment/dev-environment-cli.js +776 -735
  122. package/dist/lib/dev-environment/dev-environment-configuration-file.js +224 -191
  123. package/dist/lib/dev-environment/dev-environment-core.js +697 -732
  124. package/dist/lib/dev-environment/dev-environment-database.js +57 -41
  125. package/dist/lib/dev-environment/dev-environment-lando.js +734 -666
  126. package/dist/lib/dev-environment/docker-utils.js +96 -90
  127. package/dist/lib/dev-environment/env-vars.js +61 -59
  128. package/dist/lib/dev-environment/lando-loader.js +6 -7
  129. package/dist/lib/dev-environment/types.js +2 -1
  130. package/dist/lib/edge-workers/confirmation.js +42 -36
  131. package/dist/lib/edge-workers/deployment.js +150 -159
  132. package/dist/lib/edge-workers/index.js +68 -85
  133. package/dist/lib/edge-workers/location.js +26 -26
  134. package/dist/lib/edge-workers/output.js +14 -15
  135. package/dist/lib/edge-workers/project.js +123 -132
  136. package/dist/lib/edge-workers/toolchains/assemblyscript/constants.js +6 -8
  137. package/dist/lib/edge-workers/toolchains/assemblyscript/index.js +100 -101
  138. package/dist/lib/edge-workers/toolchains/assemblyscript/templates.js +31 -33
  139. package/dist/lib/edge-workers/toolchains/index.js +15 -15
  140. package/dist/lib/edge-workers/types.js +10 -38
  141. package/dist/lib/edge-workers/validation.js +161 -150
  142. package/dist/lib/env.js +16 -17
  143. package/dist/lib/envvar/api-delete.js +16 -18
  144. package/dist/lib/envvar/api-get-all.js +15 -19
  145. package/dist/lib/envvar/api-get.js +8 -9
  146. package/dist/lib/envvar/api-list.js +16 -21
  147. package/dist/lib/envvar/api-set.js +20 -19
  148. package/dist/lib/envvar/api.js +34 -29
  149. package/dist/lib/envvar/input.js +29 -34
  150. package/dist/lib/envvar/logging.js +9 -11
  151. package/dist/lib/envvar/read-file.js +6 -7
  152. package/dist/lib/http/download-file.js +76 -44
  153. package/dist/lib/http/proxy-agent.js +37 -40
  154. package/dist/lib/http/proxy-dispatcher.js +69 -71
  155. package/dist/lib/keychain/insecure.js +40 -36
  156. package/dist/lib/keychain/keychain.js +2 -1
  157. package/dist/lib/keychain/secure.js +16 -15
  158. package/dist/lib/keychain.js +22 -22
  159. package/dist/lib/live-backup-copy.js +117 -115
  160. package/dist/lib/logout.js +17 -19
  161. package/dist/lib/media-import/config.js +15 -14
  162. package/dist/lib/media-import/media-file-import.js +9 -13
  163. package/dist/lib/media-import/progress.js +53 -65
  164. package/dist/lib/media-import/status.js +241 -256
  165. package/dist/lib/media-import/utils.js +15 -15
  166. package/dist/lib/node-version-check.js +16 -16
  167. package/dist/lib/promise.js +16 -17
  168. package/dist/lib/read-file.js +48 -16
  169. package/dist/lib/rechallenge/client.js +37 -43
  170. package/dist/lib/rechallenge/errors.js +38 -37
  171. package/dist/lib/rechallenge/flow.js +148 -123
  172. package/dist/lib/rechallenge/index.js +23 -24
  173. package/dist/lib/rechallenge/link.js +153 -151
  174. package/dist/lib/rechallenge/open-browser.js +14 -17
  175. package/dist/lib/rechallenge/token-cache.js +83 -86
  176. package/dist/lib/rechallenge/types.js +5 -14
  177. package/dist/lib/retry.js +93 -129
  178. package/dist/lib/search-and-replace.js +164 -148
  179. package/dist/lib/site-import/db-file-import.js +12 -16
  180. package/dist/lib/site-import/status.js +291 -291
  181. package/dist/lib/token.js +86 -87
  182. package/dist/lib/tracker.js +51 -62
  183. package/dist/lib/types/graphql/rate-limit-exceeded-error.js +2 -1
  184. package/dist/lib/types.js +2 -1
  185. package/dist/lib/user-error.js +6 -8
  186. package/dist/lib/utils.js +81 -87
  187. package/dist/lib/validations/custom-deploy.js +218 -186
  188. package/dist/lib/validations/is-multi-site-sql-dump.js +6 -6
  189. package/dist/lib/validations/is-multi-site.js +83 -50
  190. package/dist/lib/validations/is-multisite-domain-mapped.js +92 -62
  191. package/dist/lib/validations/line-by-line.js +78 -46
  192. package/dist/lib/validations/site-type.js +59 -63
  193. package/dist/lib/validations/sql-insert-parser.js +415 -0
  194. package/dist/lib/validations/sql.js +551 -431
  195. package/dist/lib/validations/utils.js +27 -29
  196. package/dist/lib/vip-import-validate-files.js +481 -490
  197. package/dist/lib/wp/helpers.js +41 -45
  198. package/dist/lib/wp/readline.js +21 -57
  199. package/dist/lib/xdg-data.js +11 -12
  200. package/helpers/mark-cli-executable.js +9 -0
  201. package/node_modules/@apollo/client/CHANGELOG.md +10 -0
  202. package/node_modules/@apollo/client/__cjs/cache/inmemory/helpers.cjs +5 -0
  203. package/node_modules/@apollo/client/__cjs/cache/inmemory/helpers.cjs.map +1 -1
  204. package/node_modules/@apollo/client/__cjs/cache/inmemory/inMemoryCache.cjs +2 -1
  205. package/node_modules/@apollo/client/__cjs/cache/inmemory/inMemoryCache.cjs.map +1 -1
  206. package/node_modules/@apollo/client/__cjs/cache/inmemory/key-extractor.cjs +14 -2
  207. package/node_modules/@apollo/client/__cjs/cache/inmemory/key-extractor.cjs.map +1 -1
  208. package/node_modules/@apollo/client/__cjs/cache/inmemory/policies.cjs +16 -0
  209. package/node_modules/@apollo/client/__cjs/cache/inmemory/policies.cjs.map +1 -1
  210. package/node_modules/@apollo/client/__cjs/cache/inmemory/policies.d.cts +2 -0
  211. package/node_modules/@apollo/client/__cjs/cache/inmemory/writeToStore.cjs +3 -2
  212. package/node_modules/@apollo/client/__cjs/cache/inmemory/writeToStore.cjs.map +1 -1
  213. package/node_modules/@apollo/client/__cjs/core/QueryInfo.cjs +9 -1
  214. package/node_modules/@apollo/client/__cjs/core/QueryInfo.cjs.map +1 -1
  215. package/node_modules/@apollo/client/__cjs/core/QueryInfo.d.cts +1 -1
  216. package/node_modules/@apollo/client/__cjs/core/QueryManager.cjs +10 -3
  217. package/node_modules/@apollo/client/__cjs/core/QueryManager.cjs.map +1 -1
  218. package/node_modules/@apollo/client/__cjs/react/hooks/useFragment.cjs.map +1 -1
  219. package/node_modules/@apollo/client/__cjs/react/hooks/useFragment.d.cts +42 -43
  220. package/node_modules/@apollo/client/__cjs/version.cjs +1 -1
  221. package/node_modules/@apollo/client/cache/inmemory/helpers.js +5 -0
  222. package/node_modules/@apollo/client/cache/inmemory/helpers.js.map +1 -1
  223. package/node_modules/@apollo/client/cache/inmemory/inMemoryCache.js +2 -1
  224. package/node_modules/@apollo/client/cache/inmemory/inMemoryCache.js.map +1 -1
  225. package/node_modules/@apollo/client/cache/inmemory/key-extractor.js +14 -2
  226. package/node_modules/@apollo/client/cache/inmemory/key-extractor.js.map +1 -1
  227. package/node_modules/@apollo/client/cache/inmemory/policies.d.ts +2 -0
  228. package/node_modules/@apollo/client/cache/inmemory/policies.js +17 -1
  229. package/node_modules/@apollo/client/cache/inmemory/policies.js.map +1 -1
  230. package/node_modules/@apollo/client/cache/inmemory/writeToStore.js +3 -2
  231. package/node_modules/@apollo/client/cache/inmemory/writeToStore.js.map +1 -1
  232. package/node_modules/@apollo/client/core/QueryInfo.d.ts +1 -1
  233. package/node_modules/@apollo/client/core/QueryInfo.js +10 -2
  234. package/node_modules/@apollo/client/core/QueryInfo.js.map +1 -1
  235. package/node_modules/@apollo/client/core/QueryManager.js +10 -3
  236. package/node_modules/@apollo/client/core/QueryManager.js.map +1 -1
  237. package/node_modules/@apollo/client/package.json +1 -1
  238. package/node_modules/@apollo/client/react/hooks/useFragment.d.ts +42 -43
  239. package/node_modules/@apollo/client/react/hooks/useFragment.js.map +1 -1
  240. package/node_modules/@apollo/client/react/hooks-compiled/useFragment.d.ts +42 -43
  241. package/node_modules/@apollo/client/react/hooks-compiled/useFragment.js.map +1 -1
  242. package/node_modules/@apollo/client/version.js +1 -1
  243. package/node_modules/@automattic/vip-search-replace/README.md +6 -1
  244. package/node_modules/@automattic/vip-search-replace/lib/index.js +46 -14
  245. package/node_modules/@automattic/vip-search-replace/package.json +1 -1
  246. package/node_modules/@types/node/README.md +1 -1
  247. package/node_modules/@types/node/package.json +2 -2
  248. package/node_modules/@types/node/zlib.d.ts +752 -0
  249. package/node_modules/check-disk-space/README.md +92 -32
  250. package/node_modules/check-disk-space/dist/check-disk-space.d.mts +58 -0
  251. package/node_modules/check-disk-space/dist/check-disk-space.mjs +170 -190
  252. package/node_modules/check-disk-space/package.json +43 -71
  253. package/node_modules/cpu-features/build/Makefile +2 -2
  254. package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/filesystem.o.d +1 -1
  255. 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
  256. 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
  257. package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_aarch64_windows.o.d +1 -1
  258. 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
  259. 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
  260. package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_ppc_linux.o.d +1 -1
  261. package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_freebsd.o.d +1 -1
  262. 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
  263. package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_macos.o.d +1 -1
  264. package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/impl_x86_windows.o.d +1 -1
  265. package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/stack_line_reader.o.d +1 -1
  266. package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpu_features/deps/cpu_features/src/string_view.o.d +1 -1
  267. package/node_modules/cpu-features/build/Release/.deps/Release/obj.target/cpufeatures/src/binding.o.d +157 -145
  268. package/node_modules/cpu-features/build/Release/cpufeatures.node +0 -0
  269. package/node_modules/cpu-features/build/Release/obj.target/cpufeatures/src/binding.o +0 -0
  270. package/node_modules/cpu-features/build/Release/obj.target/cpufeatures.node +0 -0
  271. package/node_modules/cpu-features/build/config.gypi +100 -31
  272. package/node_modules/cpu-features/build/cpufeatures.target.mk +14 -14
  273. package/node_modules/cpu-features/build/deps/cpu_features/cpu_features.target.mk +14 -14
  274. package/node_modules/ssh2/lib/protocol/crypto/build/Makefile +2 -2
  275. package/node_modules/ssh2/lib/protocol/crypto/build/Release/.deps/Release/obj.target/sshcrypto/src/binding.o.d.raw +136 -0
  276. package/node_modules/ssh2/lib/protocol/crypto/build/sshcrypto.target.mk +14 -14
  277. package/node_modules/undici/docs/docs/api/Interceptors.md +15 -2
  278. package/node_modules/undici/lib/dispatcher/client-h2.js +78 -3
  279. package/node_modules/undici/lib/dispatcher/pool-base.js +20 -3
  280. package/node_modules/undici/package.json +3 -3
  281. package/node_modules/undici/types/api.d.ts +1 -1
  282. package/node_modules/undici/types/utility.d.ts +4 -4
  283. package/package.json +44 -13
  284. package/dist/lib/analytics/clients/client.js +0 -1
  285. package/dist/lib/analytics/clients/pendo.js +0 -78
  286. package/helpers/check-version.js +0 -16
  287. package/node_modules/check-disk-space/dist/check-disk-space.cjs +0 -210
  288. package/node_modules/check-disk-space/dist/check-disk-space.d.ts +0 -53
  289. package/node_modules/fetch-retry/.eslintignore +0 -1
  290. package/node_modules/fetch-retry/.eslintrc.yml +0 -20
  291. package/node_modules/fetch-retry/.github/workflows/node.js.yml +0 -32
  292. package/node_modules/fetch-retry/.husky/pre-commit +0 -6
  293. package/node_modules/fetch-retry/.nycrc.json +0 -24
  294. package/node_modules/fetch-retry/.travis.yml +0 -3
  295. package/node_modules/fetch-retry/LICENSE +0 -21
  296. package/node_modules/fetch-retry/README.md +0 -128
  297. package/node_modules/fetch-retry/dist/fetch-retry.umd.js +0 -151
  298. package/node_modules/fetch-retry/index.d.ts +0 -29
  299. package/node_modules/fetch-retry/index.js +0 -143
  300. package/node_modules/fetch-retry/package.json +0 -41
  301. package/node_modules/fetch-retry/rollup.config.js +0 -12
  302. package/node_modules/fetch-retry/test/.eslintrc.yml +0 -7
  303. package/node_modules/fetch-retry/test/integration/index.js +0 -212
  304. package/node_modules/fetch-retry/test/integration/mock-api/index.js +0 -42
  305. package/node_modules/fetch-retry/test/unit/index.js +0 -1169
  306. package/node_modules/ssh2/lib/protocol/crypto/build/Release/.deps/Release/obj.target/sshcrypto/src/binding.o.d +0 -265
  307. package/node_modules/ssh2/lib/protocol/crypto/build/Release/.deps/Release/obj.target/sshcrypto.node.d +0 -1
  308. package/node_modules/ssh2/lib/protocol/crypto/build/Release/.deps/Release/sshcrypto.node.d +0 -1
  309. package/node_modules/ssh2/lib/protocol/crypto/build/Release/obj.target/sshcrypto/src/binding.o +0 -0
  310. package/node_modules/ssh2/lib/protocol/crypto/build/Release/obj.target/sshcrypto.node +0 -0
  311. package/node_modules/ssh2/lib/protocol/crypto/build/Release/sshcrypto.node +0 -0
@@ -1,40 +1,329 @@
1
1
  "use strict";
2
-
3
- exports.__esModule = true;
4
- exports.containsAppEnvArgument = containsAppEnvArgument;
5
- exports.default = _default;
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
- var _chalk = _interopRequireDefault(require("chalk"));
8
- var _commander = require("commander");
9
- var _debug = _interopRequireDefault(require("debug"));
10
- var _enquirer = require("enquirer");
11
- var _graphqlTag = _interopRequireDefault(require("graphql-tag"));
12
- var _nodeChild_process = require("node:child_process");
13
- var _nodeFs = _interopRequireDefault(require("node:fs"));
14
- var _nodePath = _interopRequireDefault(require("node:path"));
15
- var _envAlias = require("./envAlias");
16
- var exit = _interopRequireWildcard(require("./exit"));
17
- var _format = require("./format");
18
- var _prompt = require("./prompt");
19
- var _package = _interopRequireDefault(require("../../../package.json"));
20
- var _api = _interopRequireDefault(require("../../lib/api"));
21
- var _app = _interopRequireDefault(require("../../lib/api/app"));
22
- var _tracker = require("../../lib/tracker");
23
- var _utils = require("../../lib/utils");
24
- var _userError = _interopRequireDefault(require("../user-error"));
25
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
26
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
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
- // Error raised when trying to write to an already closed stream
29
- if (err.code === 'EPIPE') {
30
- return;
31
- }
32
- if (err instanceof _userError.default) {
33
- exit.withError(err);
34
- }
35
- console.log(_chalk.default.red('✕'), 'Please contact VIP Support with the following information:');
36
- console.log(_chalk.default.dim(err.stack));
37
- exit.withError('Unexpected error');
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
- if (!usage) {
46
- return;
47
- }
48
- const [rootCommand, ...rest] = usage.trim().split(/\s+/);
49
- if (rootCommand) {
50
- program.name(rootCommand);
51
- }
52
- if (rest.length) {
53
- const usageString = rest.join(' ');
54
- program.usage(usageString.includes('[options]') ? usageString : `${usageString} [options]`);
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
- const isArray = Array.isArray(name);
59
- const shortName = isArray ? name[0] : null;
60
- const longName = isArray ? name[1] : name;
61
- const normalizedLongName = String(longName).trim().replace(/^--?/, '');
62
- const explicitShortName = shortName ? String(shortName).trim().replace(/^-/, '') : null;
63
- let normalizedShortName = explicitShortName;
64
- if (!normalizedShortName) {
65
- const autoShortName = normalizedLongName.charAt(0);
66
- const canUseAutoShortName = autoShortName && !RESERVED_AUTO_SHORT_ALIASES.has(autoShortName) && !usedShortNames.has(autoShortName);
67
- if (canUseAutoShortName) {
68
- normalizedShortName = autoShortName;
69
- }
70
- }
71
- if (normalizedShortName) {
72
- usedShortNames.add(normalizedShortName);
73
- }
74
- const isBooleanOption = typeof defaultValue === 'boolean';
75
- const usesOptionalValue = !isBooleanOption;
76
- const parseOptionValue = value => {
77
- if (parseFn) {
78
- return parseFn(value);
79
- }
80
- return value;
81
- };
82
- let parser;
83
- if (usesOptionalValue) {
84
- parser = (value, previousValue) => {
85
- const parsedValue = parseOptionValue(value);
86
- if (previousValue === undefined) {
87
- return parsedValue;
88
- }
89
- if (Array.isArray(previousValue)) {
90
- return [...previousValue, parsedValue];
91
- }
92
- return [previousValue, parsedValue];
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
- return arg !== '-' && arg.startsWith('-');
402
+ return arg !== '-' && arg.startsWith('-');
112
403
  }
113
404
  class CommanderArgsCompat {
114
- constructor(opts) {
115
- this.details = {
116
- commands: []
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
- if (!isOptionToken(arg)) {
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
- const nextArg = argv[index + 1];
267
- const optionHasInlineValue = arg.includes('=');
268
- const nextArgCouldBeOptionValue = nextArg && !isOptionToken(nextArg) && !this.isDefined(nextArg, 'commands');
269
- if (!optionHasInlineValue && nextArgCouldBeOptionValue) {
270
- index++;
271
- }
272
- }
273
- if (dashDashIndex > -1 && this.isDefined(argv[dashDashIndex + 1], 'commands')) {
274
- return {
275
- index: dashDashIndex + 1,
276
- name: argv[dashDashIndex + 1]
277
- };
278
- }
279
- return null;
280
- }
281
- findUnknownOption(argv) {
282
- const dashDashIndex = argv.indexOf('--', 2);
283
- const searchEnd = dashDashIndex === -1 ? argv.length : dashDashIndex;
284
- for (let index = 2; index < searchEnd; index++) {
285
- const arg = argv[index];
286
- if (!isOptionToken(arg)) {
287
- continue;
288
- }
289
- if (arg.startsWith('--')) {
290
- const [tokenName] = arg.slice(2).split('=');
291
- if (!this.knownLongOptions.has(tokenName)) {
292
- return tokenName;
293
- }
294
- const hasInlineValue = arg.includes('=');
295
- const nextArg = argv[index + 1];
296
- if (this.longOptionsExpectingValue.has(tokenName) && !hasInlineValue && nextArg && !isOptionToken(nextArg)) {
297
- index++;
298
- }
299
- continue;
300
- }
301
- const shortEqualsMatch = /^-([A-Za-z0-9])=(.*)$/.exec(arg);
302
- if (shortEqualsMatch) {
303
- const shortName = shortEqualsMatch[1];
304
- if (!this.knownShortOptions.has(shortName)) {
305
- return shortName;
306
- }
307
- continue;
308
- }
309
- const shortMatch = /^-([A-Za-z0-9])$/.exec(arg);
310
- if (shortMatch) {
311
- const shortName = shortMatch[1];
312
- if (!this.knownShortOptions.has(shortName)) {
313
- return shortName;
314
- }
315
- const nextArg = argv[index + 1];
316
- if (this.shortOptionsExpectingValue.has(shortName) && nextArg && !isOptionToken(nextArg)) {
317
- index++;
318
- }
319
- continue;
320
- }
321
- return arg.replace(/^-+/, '');
322
- }
323
- return null;
324
- }
325
- hasWpCommandPayload(subcommandArgs) {
326
- const wpFlagsWithoutValue = new Set(['--help', '-h', '--version', '-v', '--yes', '-y']);
327
- let expectOptionValue = false;
328
- for (const arg of subcommandArgs) {
329
- if (expectOptionValue) {
330
- if (!isOptionToken(arg)) {
331
- expectOptionValue = false;
332
- continue;
333
- }
334
- expectOptionValue = false;
335
- }
336
- if (!isOptionToken(arg)) {
337
- return true;
338
- }
339
- if (arg.startsWith('--')) {
340
- if (arg.includes('=') || wpFlagsWithoutValue.has(arg)) {
341
- continue;
342
- }
343
- expectOptionValue = true;
344
- continue;
345
- }
346
- if (/^-[A-Za-z0-9]$/.test(arg)) {
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
- if (process.execArgv.includes('--inspect') && !alreadyConfirmedDebugAttachment) {
407
- await (0, _enquirer.prompt)({
408
- type: 'confirm',
409
- name: 'confirm',
410
- message: "\nAttach the debugger, once you see 'Debugger attached' above hit 'y' to continue"
411
- });
412
- alreadyConfirmedDebugAttachment = true;
413
- }
414
- const parsedAlias = (0, _envAlias.parseEnvAliasFromArgv)(argv);
415
- const options = this.parse(parsedAlias.argv);
416
-
417
- // If there's a sub-command, run that instead
418
- const dispatchSubcommand = this.findSubcommand(parsedAlias.argv);
419
- if (dispatchSubcommand) {
420
- await this.executeSubcommand(argv, parsedAlias, dispatchSubcommand);
421
- return {};
422
- }
423
- if (!_opts.wildcardCommand) {
424
- const unknownOption = this.findUnknownOption(parsedAlias.argv);
425
- if (unknownOption) {
426
- await (0, _tracker.trackEvent)('command_validation_error', {
427
- error: `Unknown option: ${unknownOption}`
428
- });
429
- 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.`);
430
- }
431
- }
432
- if (_opts.format && !options.format) {
433
- options.format = 'table';
434
- }
435
- if (options.h || options.help) {
436
- this.showHelp();
437
- }
438
- if (options.v || options.version) {
439
- this.showVersion();
440
- }
441
- if (options.debug || options.d) {
442
- _debug.default.enable(options.debug === true ? '*' : options.debug);
443
- }
444
-
445
- // If we have both an --app/--env and an alias, we need to give a warning
446
- if (parsedAlias.app && (options.app || options.env)) {
447
- exit.withError('Please only use an environment alias, or the --app and --env parameters, but not both');
448
- }
449
-
450
- // If there is an alias, use it to populate the app/env options
451
- if (parsedAlias.app) {
452
- options.app = parsedAlias.app;
453
- options.env = parsedAlias.env; // Can be undefined
454
- }
455
- const validationError = validateOpts(options);
456
- if (validationError) {
457
- const error = validationError.toString();
458
- await (0, _tracker.trackEvent)('command_validation_error', {
459
- error
460
- });
461
- exit.withError(error);
462
- }
463
- if (process.env.NODE_ENV !== 'test') {
464
- const {
465
- default: updateNotifier
466
- } = await import('update-notifier');
467
- updateNotifier({
468
- pkg: _package.default,
469
- updateCheckInterval: 1000 * 60 * 60 * 24
470
- }).notify({
471
- isGlobal: true
472
- });
473
- }
474
- const customCommands = this.details.commands;
475
-
476
- // Show help if no args passed
477
- if (Boolean(customCommands.length) && !this.sub.length) {
478
- await (0, _tracker.trackEvent)('command_help_view');
479
- this.showHelp();
480
- return {};
481
- }
482
-
483
- // Show help if required arg is missing
484
- if (_opts.requiredArgs > this.sub.length) {
485
- await (0, _tracker.trackEvent)('command_validation_error', {
486
- error: 'Missing required arg'
487
- });
488
- this.showHelp();
489
- return {};
490
- }
491
-
492
- // Show help if subcommand is invalid
493
- const subCommands = this.details.commands.map(cmd => cmd.usage);
494
- if (!_opts.wildcardCommand && this.sub[_opts.requiredArgs] && subCommands.length && 0 > subCommands.indexOf(this.sub[_opts.requiredArgs])) {
495
- const subcommand = this.sub.join(' ');
496
- await (0, _tracker.trackEvent)('command_validation_error', {
497
- error: `Invalid subcommand: ${subcommand}`
498
- });
499
- exit.withError(`\`${subcommand}\` is not a valid subcommand. See \`vip --help\``);
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
- variables: {
522
- first: 100,
523
- after: null // TODO make dynamic?
524
- }
525
- });
526
- } catch (err) {
527
- const message = err.toString();
528
- await (0, _tracker.trackEvent)('command_appcontext_list_fetch_error', {
529
- error: message
530
- });
531
- exit.withError(`Failed to get app (${_opts.appQuery}) details: ${message}`);
532
- }
533
- if (!res.data?.apps?.edges?.length) {
534
- await (0, _tracker.trackEvent)('command_appcontext_list_fetch_error', {
535
- error: 'No apps found'
536
- });
537
- exit.withError("Couldn't find any apps");
538
- }
539
- const appNames = res.data.apps.edges.map(cur => cur.name);
540
- let appSelection;
541
- try {
542
- appSelection = await (0, _enquirer.prompt)({
543
- type: 'autocomplete',
544
- name: 'app',
545
- message: 'Which app?',
546
- limit: 10,
547
- choices: appNames
548
- });
549
- } catch (err) {
550
- if (!err) {
551
- process.exit();
552
- }
553
- exit.withError(err.message || err);
554
- }
555
-
556
- // Copy all app information
557
- appSelection.app = res.data.apps.edges.find(cur => cur.name === appSelection.app);
558
- if (!appSelection.app?.id) {
559
- await (0, _tracker.trackEvent)('command_appcontext_list_select_error', {
560
- error: 'Invalid app selected'
561
- });
562
- exit.withError(`App ${_chalk.default.blueBright(appSelection.app.name)} could not be located`);
563
- }
564
- await (0, _tracker.trackEvent)('command_appcontext_list_select_success');
565
- options.app = {
566
- ...appSelection.app
567
- };
568
- } else {
569
- let appLookup;
570
- try {
571
- appLookup = await (0, _app.default)(options.app, _opts.appQuery, _opts.appQueryFragments);
572
- } catch (err) {
573
- await (0, _tracker.trackEvent)('command_appcontext_param_error', {
574
- error: 'App lookup failed'
575
- });
576
-
577
- // Get error message, if available.
578
- const apiErrorMsg = (0, _utils.parseApiError)(err);
579
- let errorMsg = `Unable to find app ${_chalk.default.blueBright(options.app)}: `;
580
- if (apiErrorMsg) {
581
- errorMsg += apiErrorMsg;
582
- } else {
583
- // Should happen rarely, if ever. Let's include stack trace for debugging.
584
- errorMsg += 'Unknown error. If this persists, please contact VIP support.\n' + err.stack;
585
- }
586
- exit.withError(errorMsg);
587
- }
588
- if (!appLookup?.id) {
589
- await (0, _tracker.trackEvent)('command_appcontext_param_error', {
590
- error: 'Invalid app specified'
591
- });
592
- exit.withError(`App ${_chalk.default.blueBright(options.app)} does not exist`);
593
- }
594
- await (0, _tracker.trackEvent)('command_appcontext_param_select');
595
- options.app = {
596
- ...appLookup
597
- };
598
- }
599
- if (_opts.childEnvContext) {
600
- options.app.environments = options.app.environments.filter(cur => cur.id !== options.app.id);
601
- }
602
- }
603
- if ((_opts.envContext || _opts.childEnvContext) && options.app) {
604
- if (options.env) {
605
- if (_opts.childEnvContext && options.env.toLowerCase() === 'production') {
606
- await (0, _tracker.trackEvent)('command_childcontext_param_error', {
607
- error: 'Cannot use `production`'
608
- });
609
- exit.withError('Environment production is not allowed for this command');
610
- }
611
- const env = options.app.environments.find(cur => getEnvIdentifier(cur).toLowerCase() === options.env.toLowerCase());
612
- if (!env) {
613
- await (0, _tracker.trackEvent)('command_childcontext_param_error', {
614
- error: `Invalid child environment (${options.env}) specified`
615
- });
616
- exit.withError(`Environment ${_chalk.default.blueBright(options.env)} for app ${_chalk.default.blueBright(options.app.name)} does not exist`);
617
- }
618
- options.env = env;
619
- } else if (!options.app?.environments?.length) {
620
- console.log('To set up a new development environment, please contact VIP Support.');
621
- await (0, _tracker.trackEvent)('command_childcontext_fetch_error', {
622
- error: 'No child environments found'
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
- // Show S-R params if the `search-replace` flag is set
725
- const searchReplace = options.searchReplace;
726
- const assignSRValues = (from, to) => {
727
- const pairs = {
728
- From: `${from}`,
729
- To: `${to}`
730
- };
731
- return pairs;
732
- };
733
- if (searchReplace) {
734
- const searchReplaceValues = (0, _format.formatSearchReplaceValues)(searchReplace, assignSRValues);
735
-
736
- // Format data into a user-friendly table
737
- info.push({
738
- key: 'Replacements',
739
- value: '\n' + (0, _format.formatData)(searchReplaceValues, 'table')
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
- break;
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
- info.push({
776
- key: 'Replacements',
777
- value: '\n' + (0, _format.formatData)(replacements, 'table')
778
- });
779
- break;
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
- if (opts.app) {
860
- if (typeof opts.app !== 'string' && typeof opts.app !== 'number') {
861
- return new Error('Invalid --app');
862
- }
863
- if (opts.app.length < 1) {
864
- return new Error('Invalid --app');
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.length < 1) {
872
- return new Error('Invalid --env');
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 _default(opts) {
881
- _opts = {
882
- appContext: false,
883
- appQuery: 'id,name',
884
- childEnvContext: false,
885
- envContext: false,
886
- format: false,
887
- requireConfirm: false,
888
- requiredArgs: 0,
889
- wildcardCommand: false,
890
- ...opts
891
- };
892
- const args = new CommanderArgsCompat(_opts);
893
- if (_opts.appContext || _opts.requireConfirm) {
894
- args.option('app', 'Target an application. Accepts a string value for the application name or an integer for the application ID.');
895
- }
896
- if (_opts.envContext || _opts.childEnvContext) {
897
- args.option('env', 'Target an environment. Accepts a string value for the environment type.');
898
- }
899
- if (_opts.requireConfirm) {
900
- args.option('force', 'Skip confirmation.', false);
901
- }
902
- if (_opts.format) {
903
- args.option('format', 'Render output in a particular format. Accepts “table“ (default), “csv“, and “json“.');
904
- }
905
-
906
- // Add help and version to all subcommands
907
- args.option(['h', 'help'], 'Retrieve a description, examples, and available options for a (sub)command.', false);
908
- args.option(['v', 'version'], 'Retrieve the version number of VIP-CLI currently installed on the local machine.', false);
909
- args.option(['d', 'debug'], 'Generate verbose output during command execution to help identify or fix errors or bugs.');
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
- let identifier = env.type;
914
-
915
- // If the env has a unique name (happens when site has multiple envs of a type), add on name
916
- // for disambiguation. Only on non-main-env
917
- if (env.name !== env.type && env.name && env.appId !== env.id) {
918
- identifier = `${identifier}.${env.name}`;
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
- const parsedAlias = (0, _envAlias.parseEnvAliasFromArgv)(argv);
924
- return Boolean(parsedAlias.app || parsedAlias.env || argv.includes('--app') || argv.includes('--env'));
925
- }
1170
+ const parsedAlias = (0, envAlias_1.parseEnvAliasFromArgv)(argv);
1171
+ return Boolean(parsedAlias.app || parsedAlias.env || argv.includes('--app') || argv.includes('--env'));
1172
+ }