@automattic/vip 3.21.2 → 3.22.0

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.
@@ -156,7 +156,7 @@ Processing the file for deployment to your environment...
156
156
  },
157
157
  checksum,
158
158
  result
159
- } = await (0, _clientFileUploader.uploadImportSqlFileToS3)(uploadParams);
159
+ } = await (0, _clientFileUploader.uploadImportFileToS3)(uploadParams);
160
160
  startDeployVariables.input = {
161
161
  id: appId,
162
162
  environmentId: envId,
@@ -7,8 +7,10 @@ var _graphqlTag = _interopRequireDefault(require("graphql-tag"));
7
7
  var _api = _interopRequireDefault(require("../lib/api"));
8
8
  var _command = _interopRequireDefault(require("../lib/cli/command"));
9
9
  var _format = require("../lib/cli/format");
10
+ var _clientFileUploader = require("../lib/client-file-uploader");
10
11
  var _progress = require("../lib/media-import/progress");
11
12
  var _status = require("../lib/media-import/status");
13
+ var _utils = require("../lib/media-import/utils");
12
14
  var _tracker = require("../lib/tracker");
13
15
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
16
  // eslint-disable-next-line no-duplicate-imports
@@ -43,10 +45,18 @@ const START_IMPORT_MUTATION = (0, _graphqlTag.default)`
43
45
  const usage = 'vip import media';
44
46
  const debug = (0, _debug.default)('vip:vip-import-media');
45
47
 
48
+ // Support legacy direct invocation: when users run the built binary directly
49
+ // like `node ./dist/bin/vip-import-media.js @1234.production /path/to/archive.tar.gz --flag`
50
+ // inject the `import media` subcommand into process.argv so the command parser
51
+ // sees the same shape as the full CLI: `vip import media ...`.
52
+
46
53
  // Command examples for the `vip import media` help prompt
47
54
  const examples = [{
48
55
  usage: 'vip @example-app.production import media https://example.com/uploads.tar.gz',
49
56
  description: 'Import the archived file "uploads.tar.gz" from a publicly accessible URL to a production environment.'
57
+ }, {
58
+ usage: 'vip @example-app.production import media /path/to/uploads.tar.gz',
59
+ description: 'Import a local archive file (e.g. .tar.gz, .tgz, .zip) from your machine into a production environment. The file will be uploaded temporarily and then imported.'
50
60
  },
51
61
  // Format error logs
52
62
  {
@@ -95,13 +105,58 @@ Are you sure you want to import the contents of the URL?
95
105
  overwriteExistingFiles,
96
106
  importIntermediateImages
97
107
  } = opts;
98
- const [url] = args;
99
- if (!isSupportedUrl(url)) {
100
- console.log(_chalk.default.red(`
101
- Error:
102
- Invalid URL provided: ${url}
103
- Please make sure that it is a publicly accessible web URL containing an archive of the media files to import.`));
104
- return;
108
+ const [fileNameOrURL] = args;
109
+ let url = '';
110
+ let sourceIsLocal = false;
111
+ if (String(fileNameOrURL).startsWith('http://') || String(fileNameOrURL).startsWith('https://')) {
112
+ url = fileNameOrURL;
113
+ // validate supported URL
114
+ if (!isSupportedUrl(url)) {
115
+ console.log(_chalk.default.red(`
116
+ Error:
117
+ Invalid URL provided: ${url}
118
+ Please make sure that it is a publicly accessible web URL containing an archive of the media files to import.`));
119
+ return;
120
+ }
121
+ } else {
122
+ // treat as local archive path
123
+ if (!(await (0, _utils.isLocalArchive)(fileNameOrURL))) {
124
+ console.log(_chalk.default.red(`
125
+ Error:
126
+ Invalid local archive provided: ${fileNameOrURL}
127
+ Please make sure the file exists and is one of: .tar.gz, .tgz, .zip`));
128
+ return;
129
+ }
130
+
131
+ // upload archive to S3 and get presigned URL for import
132
+ sourceIsLocal = true;
133
+ const fileMeta = await (0, _clientFileUploader.getFileMeta)(fileNameOrURL);
134
+ fileMeta.fileName = fileNameOrURL;
135
+ const {
136
+ fileMeta: {
137
+ basename
138
+ },
139
+ checksum: uploadedMD5,
140
+ result
141
+ } = await (0, _clientFileUploader.uploadImportFileToS3)({
142
+ app,
143
+ env,
144
+ fileMeta,
145
+ progressCallback: percentage => console.log(`Upload progress: ${percentage}%`)
146
+ });
147
+
148
+ // small debug info to keep variables used
149
+ debug('Uploaded file basename:', basename);
150
+ debug('Uploaded checksum:', uploadedMD5);
151
+ debug('Upload result:', result && typeof result === 'object' ? Object.keys(result) : result);
152
+ ({
153
+ url
154
+ } = await (0, _clientFileUploader.getSignedUploadRequestData)({
155
+ appId: app.id,
156
+ envId: env.id,
157
+ basename,
158
+ action: 'GetObject'
159
+ }));
105
160
  }
106
161
  const track = _tracker.trackEventWithEnv.bind(null, app.id, env.id);
107
162
  const api = (0, _api.default)();
@@ -114,7 +169,11 @@ Error:
114
169
  Importing Media into your App...
115
170
  `;
116
171
  console.log();
117
- console.log(`Importing archive from: ${url}`);
172
+ if (sourceIsLocal) {
173
+ console.log(`Importing local archive: ${fileNameOrURL} (uploaded to temporary URL)`);
174
+ } else {
175
+ console.log(`Importing archive from: ${url}`);
176
+ }
118
177
  console.log(`to: ${env.primaryDomain.name} (${(0, _format.formatEnvironment)(env.type)})`);
119
178
  try {
120
179
  await api.mutate({
@@ -591,7 +591,7 @@ Processing the SQL import for your environment...
591
591
  },
592
592
  checksum: uploadedMD5,
593
593
  result
594
- } = await (0, _clientFileUploader.uploadImportSqlFileToS3)({
594
+ } = await (0, _clientFileUploader.uploadImportFileToS3)({
595
595
  app,
596
596
  env,
597
597
  fileMeta,
@@ -18,6 +18,7 @@ var _prompt = require("../lib/cli/prompt");
18
18
  var _proxyAgent = require("../lib/http/proxy-agent");
19
19
  var _token = _interopRequireDefault(require("../lib/token"));
20
20
  var _tracker = require("../lib/tracker");
21
+ var _helpers = require("../lib/wp/helpers");
21
22
  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); }
22
23
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
23
24
  const debug = (0, _debug.default)('@automattic/vip:wp');
@@ -390,6 +391,8 @@ const examples = [{
390
391
  subShellSettings.prompt = _chalk.default.bold.yellowBright(`${promptIdentifier}:`) + _chalk.default.blue('~') + '$ ';
391
392
  subShellSettings.historySize = 200;
392
393
  }
394
+ const commandState = (0, _helpers.initState)();
395
+ let seenWP = false;
393
396
  const subShellRl = _readline.default.createInterface(subShellSettings);
394
397
  subShellRl.on('line', async line => {
395
398
  if (commandRunning) {
@@ -403,22 +406,39 @@ const examples = [{
403
406
  }
404
407
 
405
408
  // Check for exit, like SSH (handles both `exit` and `exit;`)
406
- if (line.startsWith('exit')) {
409
+ if (!seenWP && line.startsWith('exit')) {
407
410
  subShellRl.close();
408
411
  process.exit();
409
412
  }
410
- const startsWithWp = line.trim().startsWith('wp ');
411
- const empty = 0 === line.length;
412
413
  const userCmdCancelled = line === cancelCommandChar;
413
- if ((empty || !startsWithWp) && !userCmdCancelled) {
414
+ if (userCmdCancelled) {
415
+ seenWP = false;
416
+ (0, _helpers.resetState)(commandState);
417
+ subShellRl.prompt();
418
+ return;
419
+ }
420
+ if (!seenWP && line.trimStart().startsWith('wp ')) {
421
+ seenWP = true;
422
+ (0, _helpers.resetState)(commandState);
423
+ }
424
+ if (seenWP) {
425
+ (0, _helpers.stateMachine)(commandState, line);
426
+ if (!commandState.done) {
427
+ return;
428
+ }
429
+ } else {
430
+ (0, _helpers.resetState)(commandState);
414
431
  console.log(_chalk.default.red('Error:'), 'invalid command, please pass a valid WP-CLI command.');
415
432
  subShellRl.prompt();
416
433
  return;
417
434
  }
418
435
  subShellRl.pause();
419
436
  let result;
437
+ const wpCliCmd = commandState.command.replace(/^wp\s+/, '');
438
+ seenWP = false;
439
+ (0, _helpers.resetState)(commandState);
420
440
  try {
421
- result = await getTokenForCommand(appId, envId, line.replace('wp ', ''));
441
+ result = await getTokenForCommand(appId, envId, wpCliCmd);
422
442
  } catch (error) {
423
443
  // If this was a GraphQL error, print that to the message to the line
424
444
  if (error.graphQLErrors) {
package/dist/lib/api.js CHANGED
@@ -5,11 +5,15 @@ exports.PRODUCTION_API_HOST = exports.API_URL = exports.API_HOST = void 0;
5
5
  exports.default = API;
6
6
  exports.disableGlobalGraphQLErrorHandling = disableGlobalGraphQLErrorHandling;
7
7
  exports.enableGlobalGraphQLErrorHandling = enableGlobalGraphQLErrorHandling;
8
+ exports.shouldRetryRequest = shouldRetryRequest;
8
9
  var _core = require("@apollo/client/core");
9
10
  var _context = require("@apollo/client/link/context");
10
11
  var _core2 = require("@apollo/client/link/core");
11
12
  var _error = require("@apollo/client/link/error");
13
+ var _retry = require("@apollo/client/link/retry");
12
14
  var _chalk = _interopRequireDefault(require("chalk"));
15
+ var _debug = _interopRequireDefault(require("debug"));
16
+ var _nodeFetch = require("node-fetch");
13
17
  var _http = _interopRequireDefault(require("./api/http"));
14
18
  var _env = _interopRequireDefault(require("./env"));
15
19
  var _token = _interopRequireDefault(require("./token"));
@@ -21,12 +25,39 @@ const PRODUCTION_API_HOST = exports.PRODUCTION_API_HOST = 'https://api.wpvip.com
21
25
  const API_HOST = exports.API_HOST = process.env.API_HOST || PRODUCTION_API_HOST; // NOSONAR
22
26
  const API_URL = exports.API_URL = `${API_HOST}/graphql`;
23
27
  let globalGraphQLErrorHandlingEnabled = true;
28
+ const RETRY_LINK_MAX_ATTEMPTS = 5;
29
+ const RETRY_LINK_INITIAL_DELAY_MS = 1000; // 1 second
30
+ const RETRY_LINK_MAX_DELAY_MS = 5000; // 5 seconds
31
+
32
+ const debug = (0, _debug.default)('@automattic/vip:http:graphql');
24
33
  function disableGlobalGraphQLErrorHandling() {
25
34
  globalGraphQLErrorHandlingEnabled = false;
26
35
  }
27
36
  function enableGlobalGraphQLErrorHandling() {
28
37
  globalGraphQLErrorHandlingEnabled = true;
29
38
  }
39
+ function shouldRetryRequest(attempt, operation, error) {
40
+ const debugSuffix = `Operation: ${operation.operationName}. Attempt: ${attempt}.`;
41
+ if (!error || operation.query.definitions.some(def => def.kind === 'OperationDefinition' && def.operation !== 'query')) {
42
+ debug(`Request failed. ${debugSuffix}`);
43
+ return false;
44
+ }
45
+ if (attempt > RETRY_LINK_MAX_ATTEMPTS) {
46
+ debug(`Request failed and max retry attempts reached. ${debugSuffix}`, error);
47
+ return false;
48
+ }
49
+ if (error instanceof _nodeFetch.FetchError && error.code === 'ECONNREFUSED') {
50
+ debug(`Request failed. Retrying request due to connection refused error. ${debugSuffix}`);
51
+ return true;
52
+ }
53
+ const statusCode = error?.statusCode;
54
+ if (statusCode && statusCode !== 429 && statusCode < 500) {
55
+ debug(`Request failed. Status code: ${statusCode}. ${debugSuffix}`, error);
56
+ return false;
57
+ }
58
+ debug(`Request failed. Retrying request due to server error. ${debugSuffix}`, error);
59
+ return true;
60
+ }
30
61
  function isServerError(networkError) {
31
62
  if (!networkError) {
32
63
  return false;
@@ -35,7 +66,8 @@ function isServerError(networkError) {
35
66
  }
36
67
  function API({
37
68
  exitOnError = true,
38
- silenceAuthErrors = false
69
+ silenceAuthErrors = false,
70
+ customRetryLink
39
71
  } = {}) {
40
72
  const errorLink = (0, _error.onError)(({
41
73
  networkError,
@@ -90,8 +122,15 @@ function API({
90
122
  agent: proxyAgent
91
123
  }
92
124
  });
125
+ const retryLink = new _retry.RetryLink({
126
+ delay: {
127
+ initial: RETRY_LINK_INITIAL_DELAY_MS,
128
+ max: RETRY_LINK_MAX_DELAY_MS
129
+ },
130
+ attempts: shouldRetryRequest
131
+ });
93
132
  return new _core.ApolloClient({
94
- link: _core2.ApolloLink.from([withToken, errorLink, authLink, httpLink]),
133
+ link: _core2.ApolloLink.from([withToken, errorLink, customRetryLink ? customRetryLink : retryLink, authLink, httpLink]),
95
134
  cache: new _core.InMemoryCache({
96
135
  typePolicies: {
97
136
  WPSite: {
@@ -8,9 +8,10 @@ exports.getFileHash = void 0;
8
8
  exports.getFileMeta = getFileMeta;
9
9
  exports.getFileSize = getFileSize;
10
10
  exports.getPartBoundaries = getPartBoundaries;
11
+ exports.getSignedUploadRequestData = getSignedUploadRequestData;
11
12
  exports.isFile = isFile;
12
13
  exports.unzipFile = void 0;
13
- exports.uploadImportSqlFileToS3 = uploadImportSqlFileToS3;
14
+ exports.uploadImportFileToS3 = uploadImportFileToS3;
14
15
  exports.uploadParts = uploadParts;
15
16
  var _chalk = _interopRequireDefault(require("chalk"));
16
17
  var _crypto = require("crypto");
@@ -121,7 +122,7 @@ async function getFileMeta(fileName) {
121
122
  isCompressed
122
123
  };
123
124
  }
124
- async function uploadImportSqlFileToS3({
125
+ async function uploadImportFileToS3({
125
126
  app,
126
127
  env,
127
128
  fileMeta,
@@ -29,6 +29,10 @@ const DEV_ENVIRONMENT_PHP_VERSIONS = exports.DEV_ENVIRONMENT_PHP_VERSIONS = {
29
29
  8.4: {
30
30
  image: 'ghcr.io/automattic/vip-container-images/php-fpm:8.4',
31
31
  label: '8.4'
32
+ },
33
+ 8.5: {
34
+ image: 'ghcr.io/automattic/vip-container-images/php-fpm:8.5',
35
+ label: '8.5 (experimental)'
32
36
  }
33
37
  };
34
38
  const DEV_ENVIRONMENT_DEFAULTS = exports.DEV_ENVIRONMENT_DEFAULTS = {
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.isLocalArchive = isLocalArchive;
5
+ var _promises = require("node:fs/promises");
6
+ async function isLocalArchive(filePath) {
7
+ const lower = filePath.toLowerCase();
8
+ const isArchive = lower.endsWith('.tar.gz') || lower.endsWith('.tgz') || lower.endsWith('.zip');
9
+ if (!isArchive) {
10
+ return false;
11
+ }
12
+ try {
13
+ const fileStat = await (0, _promises.stat)(filePath);
14
+ return fileStat.isFile();
15
+ } catch {
16
+ return false;
17
+ }
18
+ }
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.initState = initState;
5
+ exports.resetState = resetState;
6
+ exports.stateMachine = stateMachine;
7
+ /**
8
+ * DFA parser for WP-CLI commands.
9
+ *
10
+ * This file implements a small deterministic finite automaton (DFA) that
11
+ * accumulates a full WP-CLI command across one or more physical input lines.
12
+ * It preserves quoted multiline values and does not perform shell-like
13
+ * unescaping. Call `stateMachine(state, line)` repeatedly with the same
14
+ * `CmdState` until `state.done === true`; the reconstructed command will be
15
+ * available in `state.command`.
16
+ *
17
+ * Quick example:
18
+ *
19
+ * ```ts
20
+ * const state = initState();
21
+ * stateMachine(state, 'wp option set mykey "first line');
22
+ * // still inside double quotes -> state.done === false
23
+ * stateMachine(state, 'second line"');
24
+ * // quotes closed and trailing newline finalizes -> state.done === true
25
+ * console.log(state.command);
26
+ * // => wp option set mykey "first line\nsecond line"
27
+ * ```
28
+ *
29
+ * Key points:
30
+ * - Newline outside quotes ends the command; newlines inside quotes are kept.
31
+ * - Backslashes are preserved literally; they are NOT shell escapes.
32
+ * - A backslash followed by a newline is NOT treated as a continuation.
33
+ */
34
+
35
+ function resetState(state) {
36
+ state.state = 'S0';
37
+ state.command = '';
38
+ state.done = false;
39
+ }
40
+ function initState() {
41
+ const state = {};
42
+ resetState(state);
43
+ return state;
44
+ }
45
+
46
+ /**
47
+ * State machine table for parsing WP-CLI commands. This is a matrix of next-states keyed by current state (row) and character class (column).
48
+ *
49
+ * ```mermaid
50
+ * stateDiagram
51
+ * direction LR
52
+ * [*] --> S0: "wp "
53
+ * S0 --> S1: backslash
54
+ * S0 --> S2: double-quote
55
+ * S0 --> S4: single-quote
56
+ * S0 --> [*]: newline
57
+ * S0 --> S0: [other]
58
+ * S1 --> [*]: newline
59
+ * S1 --> S0: [other]
60
+ * S2 --> S3: backslash
61
+ * S2 --> S0: double-quote
62
+ * S2 --> S2: [other]
63
+ * S3 --> S2: [any]
64
+ * S4 --> S0: single-quote
65
+ * S4 --> S4: [other]
66
+ * ```
67
+ */
68
+ const stateTable = {
69
+ /* \ " ' \n other */
70
+ S0: ['S1', 'S2', 'S4', 'FF', 'S0'],
71
+ S1: ['S0', 'S0', 'S0', 'FF', 'S0'],
72
+ S2: ['S3', 'S0', 'S2', 'S2', 'S2'],
73
+ S3: ['S2', 'S2', 'S2', 'S2', 'S2'],
74
+ S4: ['S4', 'S4', 'S0', 'S4', 'S4'],
75
+ FF: ['FF', 'FF', 'FF', 'FF', 'FF']
76
+ };
77
+ const charMap = {
78
+ '\\': 0,
79
+ '"': 1,
80
+ "'": 2,
81
+ '\n': 3,
82
+ other: 4
83
+ };
84
+ const stateToAction = {
85
+ S0: 'continue',
86
+ S1: 'continue',
87
+ S2: 'continue',
88
+ S3: 'continue',
89
+ S4: 'continue',
90
+ FF: 'done'
91
+ };
92
+
93
+ /**
94
+ * Parses a line of WP-CLI command input using a state machine.
95
+ *
96
+ * Supports quoted strings, allowing for multiline commands.
97
+ * The state machine transitions are defined by the `stateTable` above.
98
+ * Multiline input is handled by appending a newline to the input.
99
+ *
100
+ * Due to the limitations of the internal command runner infrastructure,
101
+ * the syntax is NOT shell-like:
102
+ * - escape sequences are not interpreted (e.g., `\n` is treated as two characters, not a newline)
103
+ * - backslash preceding a newline is not treated as a line continuation
104
+ *
105
+ * @param state The mutable command state object tracking parsing progress.
106
+ * @param line The input line to parse (will be treated as a single line, with a newline appended).
107
+ */
108
+ function stateMachine(state, line) {
109
+ line += '\n';
110
+ for (const char of line) {
111
+ const charType = charMap[char] ?? charMap.other;
112
+ state.state = stateTable[state.state][charType];
113
+ switch (stateToAction[state.state]) {
114
+ case 'done':
115
+ state.done = true;
116
+ return;
117
+ case 'continue':
118
+ state.command += char;
119
+ continue;
120
+ }
121
+ }
122
+ }
@@ -0,0 +1,31 @@
1
+ digraph state_diagram {
2
+ rankdir=LR;
3
+
4
+ start [shape=doublecircle, label="S"];
5
+ S0 [shape=circle, label="S0"];
6
+ S1 [shape=circle, label="S1"];
7
+ S2 [shape=circle, label="S2"];
8
+ S3 [shape=circle, label="S3"];
9
+ S4 [shape=circle, label="S4"];
10
+ end [shape=doublecircle, label="F"];
11
+
12
+ start -> S0 [label="wp "];
13
+
14
+ S0 -> S1 [label="backslash"];
15
+ S0 -> S2 [label="double-quote"];
16
+ S0 -> end [label="newline"];
17
+ S0 -> S4 [label="single-quote"];
18
+ S0 -> S0 [label="[other]"];
19
+
20
+ S1 -> end [label="newline"];
21
+ S1 -> S0 [label="[other]"];
22
+
23
+ S2 -> S3 [label="backslash"];
24
+ S2 -> S0 [label="double-quote"];
25
+ S2 -> S2 [label="[other]"];
26
+
27
+ S3 -> S2 [label="[any]"];
28
+
29
+ S4 -> S0 [label="single-quote"];
30
+ S4 -> S4 [label="[other]"];
31
+ }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@automattic/vip",
3
- "version": "3.21.2",
3
+ "version": "3.22.0",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@automattic/vip",
9
- "version": "3.21.2",
9
+ "version": "3.22.0",
10
10
  "hasInstallScript": true,
11
11
  "license": "MIT",
12
12
  "dependencies": {
@@ -32,7 +32,7 @@
32
32
  "lando": "github:automattic/lando-cli#63669a4a2e16ab9a9683aaa3bcc5bcb2b775d831",
33
33
  "node-fetch": "^3.3.2",
34
34
  "node-stream-zip": "1.15.0",
35
- "open": "^10.0.0",
35
+ "open": "^11.0.0",
36
36
  "proxy-from-env": "^1.1.0",
37
37
  "semver": "7.7.3",
38
38
  "shelljs": "^0.10.0",
@@ -2581,9 +2581,9 @@
2581
2581
  }
2582
2582
  },
2583
2583
  "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
2584
- "version": "3.14.1",
2585
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
2586
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
2584
+ "version": "3.14.2",
2585
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
2586
+ "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
2587
2587
  "dev": true,
2588
2588
  "license": "MIT",
2589
2589
  "dependencies": {
@@ -3057,9 +3057,9 @@
3057
3057
  "license": "MIT"
3058
3058
  },
3059
3059
  "node_modules/@jest/reporters/node_modules/glob": {
3060
- "version": "10.4.5",
3061
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
3062
- "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
3060
+ "version": "10.5.0",
3061
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
3062
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
3063
3063
  "dev": true,
3064
3064
  "license": "ISC",
3065
3065
  "dependencies": {
@@ -3916,9 +3916,9 @@
3916
3916
  }
3917
3917
  },
3918
3918
  "node_modules/@types/dockerode": {
3919
- "version": "3.3.45",
3920
- "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.45.tgz",
3921
- "integrity": "sha512-iYpZF+xr5QLpIICejLdUF2r5gh8IXY1Gw3WLmt41dUbS3Vn/3hVgL+6lJBVbmrhYBWfbWPPstdr6+A0s95DTWA==",
3919
+ "version": "3.3.47",
3920
+ "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.47.tgz",
3921
+ "integrity": "sha512-ShM1mz7rCjdssXt7Xz0u1/R2BJC7piWa3SJpUBiVjCf2A3XNn4cP6pUVaD8bLanpPVVn4IKzJuw3dOvkJ8IbYw==",
3922
3922
  "dev": true,
3923
3923
  "license": "MIT",
3924
3924
  "dependencies": {
@@ -3989,9 +3989,9 @@
3989
3989
  "dev": true
3990
3990
  },
3991
3991
  "node_modules/@types/node": {
3992
- "version": "24.10.0",
3993
- "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz",
3994
- "integrity": "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==",
3992
+ "version": "24.10.1",
3993
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz",
3994
+ "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==",
3995
3995
  "license": "MIT",
3996
3996
  "dependencies": {
3997
3997
  "undici-types": "~7.16.0"
@@ -4025,15 +4025,15 @@
4025
4025
  }
4026
4026
  },
4027
4027
  "node_modules/@types/shelljs/node_modules/glob": {
4028
- "version": "11.0.3",
4029
- "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz",
4030
- "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==",
4028
+ "version": "11.1.0",
4029
+ "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz",
4030
+ "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==",
4031
4031
  "dev": true,
4032
- "license": "ISC",
4032
+ "license": "BlueOak-1.0.0",
4033
4033
  "dependencies": {
4034
4034
  "foreground-child": "^3.3.1",
4035
4035
  "jackspeak": "^4.1.1",
4036
- "minimatch": "^10.0.3",
4036
+ "minimatch": "^10.1.1",
4037
4037
  "minipass": "^7.1.2",
4038
4038
  "package-json-from-dist": "^1.0.0",
4039
4039
  "path-scurry": "^2.0.0"
@@ -4075,11 +4075,11 @@
4075
4075
  }
4076
4076
  },
4077
4077
  "node_modules/@types/shelljs/node_modules/minimatch": {
4078
- "version": "10.0.3",
4079
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz",
4080
- "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==",
4078
+ "version": "10.1.1",
4079
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
4080
+ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
4081
4081
  "dev": true,
4082
- "license": "ISC",
4082
+ "license": "BlueOak-1.0.0",
4083
4083
  "dependencies": {
4084
4084
  "@isaacs/brace-expansion": "^5.0.0"
4085
4085
  },
@@ -5518,6 +5518,7 @@
5518
5518
  "version": "4.1.0",
5519
5519
  "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
5520
5520
  "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
5521
+ "license": "MIT",
5521
5522
  "dependencies": {
5522
5523
  "run-applescript": "^7.0.0"
5523
5524
  },
@@ -6039,9 +6040,10 @@
6039
6040
  }
6040
6041
  },
6041
6042
  "node_modules/default-browser": {
6042
- "version": "5.2.1",
6043
- "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz",
6044
- "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==",
6043
+ "version": "5.4.0",
6044
+ "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz",
6045
+ "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==",
6046
+ "license": "MIT",
6045
6047
  "dependencies": {
6046
6048
  "bundle-name": "^4.1.0",
6047
6049
  "default-browser-id": "^5.0.0"
@@ -6054,9 +6056,10 @@
6054
6056
  }
6055
6057
  },
6056
6058
  "node_modules/default-browser-id": {
6057
- "version": "5.0.0",
6058
- "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz",
6059
- "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==",
6059
+ "version": "5.0.1",
6060
+ "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz",
6061
+ "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==",
6062
+ "license": "MIT",
6060
6063
  "engines": {
6061
6064
  "node": ">=18"
6062
6065
  },
@@ -8552,6 +8555,18 @@
8552
8555
  "url": "https://github.com/sponsors/sindresorhus"
8553
8556
  }
8554
8557
  },
8558
+ "node_modules/is-in-ssh": {
8559
+ "version": "1.0.0",
8560
+ "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz",
8561
+ "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==",
8562
+ "license": "MIT",
8563
+ "engines": {
8564
+ "node": ">=20"
8565
+ },
8566
+ "funding": {
8567
+ "url": "https://github.com/sponsors/sindresorhus"
8568
+ }
8569
+ },
8555
8570
  "node_modules/is-inside-container": {
8556
8571
  "version": "1.0.0",
8557
8572
  "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
@@ -9402,9 +9417,9 @@
9402
9417
  "license": "MIT"
9403
9418
  },
9404
9419
  "node_modules/jest-config/node_modules/glob": {
9405
- "version": "10.4.5",
9406
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
9407
- "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
9420
+ "version": "10.5.0",
9421
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
9422
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
9408
9423
  "dev": true,
9409
9424
  "license": "ISC",
9410
9425
  "dependencies": {
@@ -10335,9 +10350,9 @@
10335
10350
  "license": "MIT"
10336
10351
  },
10337
10352
  "node_modules/jest-runtime/node_modules/glob": {
10338
- "version": "10.4.5",
10339
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
10340
- "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
10353
+ "version": "10.5.0",
10354
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
10355
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
10341
10356
  "dev": true,
10342
10357
  "license": "ISC",
10343
10358
  "dependencies": {
@@ -10913,9 +10928,10 @@
10913
10928
  "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
10914
10929
  },
10915
10930
  "node_modules/js-yaml": {
10916
- "version": "4.1.0",
10917
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
10918
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
10931
+ "version": "4.1.1",
10932
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
10933
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
10934
+ "license": "MIT",
10919
10935
  "dependencies": {
10920
10936
  "argparse": "^2.0.1"
10921
10937
  },
@@ -11134,9 +11150,9 @@
11134
11150
  "license": "MIT"
11135
11151
  },
11136
11152
  "node_modules/lando/node_modules/glob": {
11137
- "version": "10.4.5",
11138
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
11139
- "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
11153
+ "version": "10.5.0",
11154
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
11155
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
11140
11156
  "license": "ISC",
11141
11157
  "dependencies": {
11142
11158
  "foreground-child": "^3.1.0",
@@ -11834,18 +11850,20 @@
11834
11850
  }
11835
11851
  },
11836
11852
  "node_modules/open": {
11837
- "version": "10.2.0",
11838
- "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz",
11839
- "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==",
11853
+ "version": "11.0.0",
11854
+ "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz",
11855
+ "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==",
11840
11856
  "license": "MIT",
11841
11857
  "dependencies": {
11842
- "default-browser": "^5.2.1",
11858
+ "default-browser": "^5.4.0",
11843
11859
  "define-lazy-prop": "^3.0.0",
11860
+ "is-in-ssh": "^1.0.0",
11844
11861
  "is-inside-container": "^1.0.0",
11845
- "wsl-utils": "^0.1.0"
11862
+ "powershell-utils": "^0.1.0",
11863
+ "wsl-utils": "^0.3.0"
11846
11864
  },
11847
11865
  "engines": {
11848
- "node": ">=18"
11866
+ "node": ">=20"
11849
11867
  },
11850
11868
  "funding": {
11851
11869
  "url": "https://github.com/sponsors/sindresorhus"
@@ -12095,6 +12113,18 @@
12095
12113
  "node": ">=8"
12096
12114
  }
12097
12115
  },
12116
+ "node_modules/powershell-utils": {
12117
+ "version": "0.1.0",
12118
+ "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz",
12119
+ "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==",
12120
+ "license": "MIT",
12121
+ "engines": {
12122
+ "node": ">=20"
12123
+ },
12124
+ "funding": {
12125
+ "url": "https://github.com/sponsors/sindresorhus"
12126
+ }
12127
+ },
12098
12128
  "node_modules/prebuild-install": {
12099
12129
  "version": "7.1.1",
12100
12130
  "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz",
@@ -12571,9 +12601,10 @@
12571
12601
  }
12572
12602
  },
12573
12603
  "node_modules/run-applescript": {
12574
- "version": "7.0.0",
12575
- "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz",
12576
- "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==",
12604
+ "version": "7.1.0",
12605
+ "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz",
12606
+ "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==",
12607
+ "license": "MIT",
12577
12608
  "engines": {
12578
12609
  "node": ">=18"
12579
12610
  },
@@ -14292,15 +14323,16 @@
14292
14323
  }
14293
14324
  },
14294
14325
  "node_modules/wsl-utils": {
14295
- "version": "0.1.0",
14296
- "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz",
14297
- "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==",
14326
+ "version": "0.3.0",
14327
+ "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.0.tgz",
14328
+ "integrity": "sha512-3sFIGLiaDP7rTO4xh3g+b3AzhYDIUGGywE/WsmqzJWDxus5aJXVnPTNC/6L+r2WzrwXqVOdD262OaO+cEyPMSQ==",
14298
14329
  "license": "MIT",
14299
14330
  "dependencies": {
14300
- "is-wsl": "^3.1.0"
14331
+ "is-wsl": "^3.1.0",
14332
+ "powershell-utils": "^0.1.0"
14301
14333
  },
14302
14334
  "engines": {
14303
- "node": ">=18"
14335
+ "node": ">=20"
14304
14336
  },
14305
14337
  "funding": {
14306
14338
  "url": "https://github.com/sponsors/sindresorhus"
@@ -16036,9 +16068,9 @@
16036
16068
  "dev": true
16037
16069
  },
16038
16070
  "js-yaml": {
16039
- "version": "3.14.1",
16040
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
16041
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
16071
+ "version": "3.14.2",
16072
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
16073
+ "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
16042
16074
  "dev": true,
16043
16075
  "requires": {
16044
16076
  "argparse": "^1.0.7",
@@ -16368,9 +16400,9 @@
16368
16400
  "dev": true
16369
16401
  },
16370
16402
  "glob": {
16371
- "version": "10.4.5",
16372
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
16373
- "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
16403
+ "version": "10.5.0",
16404
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
16405
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
16374
16406
  "dev": true,
16375
16407
  "requires": {
16376
16408
  "foreground-child": "^3.1.0",
@@ -17043,9 +17075,9 @@
17043
17075
  }
17044
17076
  },
17045
17077
  "@types/dockerode": {
17046
- "version": "3.3.45",
17047
- "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.45.tgz",
17048
- "integrity": "sha512-iYpZF+xr5QLpIICejLdUF2r5gh8IXY1Gw3WLmt41dUbS3Vn/3hVgL+6lJBVbmrhYBWfbWPPstdr6+A0s95DTWA==",
17078
+ "version": "3.3.47",
17079
+ "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.47.tgz",
17080
+ "integrity": "sha512-ShM1mz7rCjdssXt7Xz0u1/R2BJC7piWa3SJpUBiVjCf2A3XNn4cP6pUVaD8bLanpPVVn4IKzJuw3dOvkJ8IbYw==",
17049
17081
  "dev": true,
17050
17082
  "requires": {
17051
17083
  "@types/docker-modem": "*",
@@ -17112,9 +17144,9 @@
17112
17144
  "dev": true
17113
17145
  },
17114
17146
  "@types/node": {
17115
- "version": "24.10.0",
17116
- "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz",
17117
- "integrity": "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==",
17147
+ "version": "24.10.1",
17148
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz",
17149
+ "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==",
17118
17150
  "requires": {
17119
17151
  "undici-types": "~7.16.0"
17120
17152
  }
@@ -17145,14 +17177,14 @@
17145
17177
  },
17146
17178
  "dependencies": {
17147
17179
  "glob": {
17148
- "version": "11.0.3",
17149
- "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz",
17150
- "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==",
17180
+ "version": "11.1.0",
17181
+ "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz",
17182
+ "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==",
17151
17183
  "dev": true,
17152
17184
  "requires": {
17153
17185
  "foreground-child": "^3.3.1",
17154
17186
  "jackspeak": "^4.1.1",
17155
- "minimatch": "^10.0.3",
17187
+ "minimatch": "^10.1.1",
17156
17188
  "minipass": "^7.1.2",
17157
17189
  "package-json-from-dist": "^1.0.0",
17158
17190
  "path-scurry": "^2.0.0"
@@ -17174,9 +17206,9 @@
17174
17206
  "dev": true
17175
17207
  },
17176
17208
  "minimatch": {
17177
- "version": "10.0.3",
17178
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz",
17179
- "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==",
17209
+ "version": "10.1.1",
17210
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
17211
+ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
17180
17212
  "dev": true,
17181
17213
  "requires": {
17182
17214
  "@isaacs/brace-expansion": "^5.0.0"
@@ -18492,18 +18524,18 @@
18492
18524
  "dev": true
18493
18525
  },
18494
18526
  "default-browser": {
18495
- "version": "5.2.1",
18496
- "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz",
18497
- "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==",
18527
+ "version": "5.4.0",
18528
+ "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz",
18529
+ "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==",
18498
18530
  "requires": {
18499
18531
  "bundle-name": "^4.1.0",
18500
18532
  "default-browser-id": "^5.0.0"
18501
18533
  }
18502
18534
  },
18503
18535
  "default-browser-id": {
18504
- "version": "5.0.0",
18505
- "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz",
18506
- "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA=="
18536
+ "version": "5.0.1",
18537
+ "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz",
18538
+ "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="
18507
18539
  },
18508
18540
  "define-data-property": {
18509
18541
  "version": "1.1.1",
@@ -20235,6 +20267,11 @@
20235
20267
  "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-1.0.0.tgz",
20236
20268
  "integrity": "sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg=="
20237
20269
  },
20270
+ "is-in-ssh": {
20271
+ "version": "1.0.0",
20272
+ "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz",
20273
+ "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw=="
20274
+ },
20238
20275
  "is-inside-container": {
20239
20276
  "version": "1.0.0",
20240
20277
  "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
@@ -20792,9 +20829,9 @@
20792
20829
  "dev": true
20793
20830
  },
20794
20831
  "glob": {
20795
- "version": "10.4.5",
20796
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
20797
- "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
20832
+ "version": "10.5.0",
20833
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
20834
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
20798
20835
  "dev": true,
20799
20836
  "requires": {
20800
20837
  "foreground-child": "^3.1.0",
@@ -21445,9 +21482,9 @@
21445
21482
  "dev": true
21446
21483
  },
21447
21484
  "glob": {
21448
- "version": "10.4.5",
21449
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
21450
- "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
21485
+ "version": "10.5.0",
21486
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
21487
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
21451
21488
  "dev": true,
21452
21489
  "requires": {
21453
21490
  "foreground-child": "^3.1.0",
@@ -21845,9 +21882,9 @@
21845
21882
  "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
21846
21883
  },
21847
21884
  "js-yaml": {
21848
- "version": "4.1.0",
21849
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
21850
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
21885
+ "version": "4.1.1",
21886
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
21887
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
21851
21888
  "requires": {
21852
21889
  "argparse": "^2.0.1"
21853
21890
  }
@@ -22003,9 +22040,9 @@
22003
22040
  "integrity": "sha512-Q4+qBFnN4bwGwvtXXzbp4P/4iNk0MaiGAzvQ8OiMtlLjkIKjmNN689uVzShSM0908q7GoFHXIPx4zi75ocoaHw=="
22004
22041
  },
22005
22042
  "glob": {
22006
- "version": "10.4.5",
22007
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
22008
- "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
22043
+ "version": "10.5.0",
22044
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
22045
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
22009
22046
  "requires": {
22010
22047
  "foreground-child": "^3.1.0",
22011
22048
  "jackspeak": "^3.1.2",
@@ -22509,14 +22546,16 @@
22509
22546
  }
22510
22547
  },
22511
22548
  "open": {
22512
- "version": "10.2.0",
22513
- "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz",
22514
- "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==",
22549
+ "version": "11.0.0",
22550
+ "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz",
22551
+ "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==",
22515
22552
  "requires": {
22516
- "default-browser": "^5.2.1",
22553
+ "default-browser": "^5.4.0",
22517
22554
  "define-lazy-prop": "^3.0.0",
22555
+ "is-in-ssh": "^1.0.0",
22518
22556
  "is-inside-container": "^1.0.0",
22519
- "wsl-utils": "^0.1.0"
22557
+ "powershell-utils": "^0.1.0",
22558
+ "wsl-utils": "^0.3.0"
22520
22559
  }
22521
22560
  },
22522
22561
  "optimism": {
@@ -22690,6 +22729,11 @@
22690
22729
  "find-up": "^4.0.0"
22691
22730
  }
22692
22731
  },
22732
+ "powershell-utils": {
22733
+ "version": "0.1.0",
22734
+ "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz",
22735
+ "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="
22736
+ },
22693
22737
  "prebuild-install": {
22694
22738
  "version": "7.1.1",
22695
22739
  "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz",
@@ -23019,9 +23063,9 @@
23019
23063
  "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
23020
23064
  },
23021
23065
  "run-applescript": {
23022
- "version": "7.0.0",
23023
- "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz",
23024
- "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A=="
23066
+ "version": "7.1.0",
23067
+ "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz",
23068
+ "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="
23025
23069
  },
23026
23070
  "run-parallel": {
23027
23071
  "version": "1.2.0",
@@ -24226,11 +24270,12 @@
24226
24270
  "requires": {}
24227
24271
  },
24228
24272
  "wsl-utils": {
24229
- "version": "0.1.0",
24230
- "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz",
24231
- "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==",
24273
+ "version": "0.3.0",
24274
+ "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.0.tgz",
24275
+ "integrity": "sha512-3sFIGLiaDP7rTO4xh3g+b3AzhYDIUGGywE/WsmqzJWDxus5aJXVnPTNC/6L+r2WzrwXqVOdD262OaO+cEyPMSQ==",
24232
24276
  "requires": {
24233
- "is-wsl": "^3.1.0"
24277
+ "is-wsl": "^3.1.0",
24278
+ "powershell-utils": "^0.1.0"
24234
24279
  }
24235
24280
  },
24236
24281
  "xdg-basedir": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@automattic/vip",
3
- "version": "3.21.2",
3
+ "version": "3.22.0",
4
4
  "description": "The VIP Javascript library & CLI",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -161,7 +161,7 @@
161
161
  "lando": "github:automattic/lando-cli#63669a4a2e16ab9a9683aaa3bcc5bcb2b775d831",
162
162
  "node-fetch": "^3.3.2",
163
163
  "node-stream-zip": "1.15.0",
164
- "open": "^10.0.0",
164
+ "open": "^11.0.0",
165
165
  "proxy-from-env": "^1.1.0",
166
166
  "semver": "7.7.3",
167
167
  "shelljs": "^0.10.0",