@automattic/vip 3.8.7 → 3.9.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.
@@ -332,7 +332,7 @@ tooling:
332
332
  nocopy: true
333
333
  - type: volume
334
334
  source: clientcode_vipconfig
335
- target: /wp/wp-content/vip-config
335
+ target: /wp/vip-config
336
336
  volume:
337
337
  nocopy: true
338
338
  <% } else { %>
@@ -342,6 +342,6 @@ tooling:
342
342
  - <%= appCode.dir %>/plugins:/wp/wp-content/plugins
343
343
  - <%= appCode.dir %>/private:/wp/wp-content/private
344
344
  - <%= appCode.dir %>/themes:/wp/wp-content/themes
345
- - <%= appCode.dir %>/vip-config:/wp/wp-content/vip-config
345
+ - <%= appCode.dir %>/vip-config:/wp/vip-config
346
346
  <% } %>
347
347
  <% } %>
@@ -339,7 +339,7 @@ void (0, _command.default)({
339
339
  requiredArgs: 1,
340
340
  module: 'import-sql',
341
341
  usage
342
- }).command('status', 'Check the status of a SQL database import currently in progress.').option('skip-validate', 'Do not perform file validation prior to import. If the file contains unsupported entries, the import is likely to fail.').option('search-replace', 'Search for a string in the SQL file and replace it with a new string. Separate the values by a comma only; no spaces (e.g. --search-replace=“from,to”).').option('in-place', 'Perform a search and replace operation on a local SQL file, save the results to the file, then import the updated file.').option('output', 'Create a local copy of the imported file with the completed search and replace operations. Ignored if the command includes --in-place, or excludes a --search-replace operation. Accepts a local file path.').examples(examples).argv(process.argv, async (arg, opts) => {
342
+ }).command('status', 'Check the status of a SQL database import currently in progress.').option('skip-validate', 'Do not perform file validation prior to import. If the file contains unsupported entries, the import is likely to fail.').option('search-replace', 'Search for a string in the SQL file and replace it with a new string. Separate the values by a comma only; no spaces (e.g. --search-replace=“from,to”).').option('in-place', 'Overwrite the local input file with the results of the search and replace operation prior to import.').option('output', 'The local file path to save a copy of the results from the search and replace operation when the --search-replace option is passed. Ignored when used with the --in-place option.').examples(examples).argv(process.argv, async (arg, opts) => {
343
343
  const {
344
344
  app,
345
345
  env
@@ -21,7 +21,7 @@ const LIMIT_MIN = 1;
21
21
  const LIMIT_MAX = 5000;
22
22
  const LIMIT_DEFAULT = 500;
23
23
  const ALLOWED_TYPES = ['app', 'batch'];
24
- const ALLOWED_FORMATS = ['csv', 'json', 'table'];
24
+ const ALLOWED_FORMATS = ['csv', 'json', 'table', 'text'];
25
25
  const DEFAULT_POLLING_DELAY_IN_SECONDS = 30;
26
26
  const MIN_POLLING_DELAY_IN_SECONDS = 5;
27
27
  const MAX_POLLING_DELAY_IN_SECONDS = 300;
@@ -30,6 +30,9 @@ const MAX_POLLING_DELAY_IN_SECONDS = 300;
30
30
  * @param {string[]} arg
31
31
  */
32
32
  async function getLogs(arg, opt) {
33
+ opt.type ??= 'app';
34
+ opt.limit ??= LIMIT_DEFAULT;
35
+ opt.format ??= 'table';
33
36
  validateInputs(opt.type, opt.limit, opt.format);
34
37
  const trackingParams = getBaseTrackingParams(opt);
35
38
  await (0, _tracker.trackEvent)('logs_command_execute', trackingParams);
@@ -140,7 +143,7 @@ function printLogs(logs, format) {
140
143
  };
141
144
  });
142
145
  let output = '';
143
- if (format && 'table' === format) {
146
+ if ('table' === format) {
144
147
  const options = {
145
148
  wordWrap: true,
146
149
  wrapOnWordBoundary: true,
@@ -165,6 +168,15 @@ function printLogs(logs, format) {
165
168
  table.push([timestamp, msg]);
166
169
  }
167
170
  output = table.toString();
171
+ } else if ('text' === format) {
172
+ const rows = [];
173
+ for (const {
174
+ timestamp,
175
+ message
176
+ } of logs) {
177
+ rows.push(`${timestamp} ${message}`);
178
+ output = rows.join('\n');
179
+ }
168
180
  } else {
169
181
  output = (0, _format.formatData)(logs, format);
170
182
  }
@@ -177,9 +189,6 @@ function printLogs(logs, format) {
177
189
  * @param {string} format
178
190
  */
179
191
  function validateInputs(type, limit, format) {
180
- if (limit === undefined) {
181
- limit = LIMIT_DEFAULT;
182
- }
183
192
  if (!ALLOWED_TYPES.includes(type)) {
184
193
  exit.withError(`Invalid type: ${type}. The supported types are: ${ALLOWED_TYPES.join(', ')}.`);
185
194
  }
@@ -187,7 +196,7 @@ function validateInputs(type, limit, format) {
187
196
  exit.withError(`Invalid format: ${format}. The supported formats are: ${ALLOWED_FORMATS.join(', ')}.`);
188
197
  }
189
198
  if (!Number.isInteger(limit) || limit < LIMIT_MIN || limit > logsLib.LIMIT_MAX) {
190
- exit.withError(`Invalid limit: ${limit}. It should be a number between ${LIMIT_MIN} and ${logsLib.LIMIT_MAX}.`);
199
+ exit.withError(`Invalid limit: ${limit}. Set the limit to an integer between ${LIMIT_MIN} and ${logsLib.LIMIT_MAX}.`);
191
200
  }
192
201
  }
193
202
  const appQuery = exports.appQuery = `
@@ -209,21 +218,18 @@ const appQuery = exports.appQuery = `
209
218
  appQuery,
210
219
  envContext: true,
211
220
  module: 'logs'
212
- }).option('type', 'The type of logs to be returned: "app" or "batch"', 'app')
221
+ }).option('type', 'Specify the type of Runtime Logs to retrieve. Accepts "batch" (only valid for WordPress environments).', 'app')
213
222
  // The default limit is set manually in the validateInputs function to address validation issues, avoiding incorrect replacement of the default value.
214
- .option('limit', `The maximum number of log lines (defaults to ${LIMIT_DEFAULT})`).option('follow', 'Keep fetching new logs as they are generated').option('format', 'Output the log lines in CSV or JSON format', 'table').examples([{
215
- usage: 'vip @mysite.production logs',
216
- description: 'Get the most recent app logs'
217
- }, {
218
- usage: 'vip @mysite.production logs --type batch',
219
- description: 'Get the most recent batch logs'
223
+ .option('limit', `The maximum number of entries to return. Accepts an integer value between 1 and 5000 (defaults to ${LIMIT_DEFAULT}).`).option('follow', 'Output new entries as they are generated.').option('format', 'Render output in a particular format. Accepts “csv”, “json”, and “text”.', 'table').examples([{
224
+ usage: 'vip @example-app.production logs',
225
+ description: 'Retrieve up to 500 of the most recent entries of application Runtime Logs from web containers.'
220
226
  }, {
221
- usage: 'vip @mysite.production logs --limit 100',
222
- description: 'Get the most recent 100 log entries'
227
+ usage: 'vip @example-app.production logs --type=batch',
228
+ description: 'Retrieve up to 500 of the most recent entries generated by cron tasks or WP-CLI commands from batch containers.'
223
229
  }, {
224
- usage: 'vip @mysite.production logs --limit 100 --format csv',
225
- description: 'Get the most recent 100 log entries formatted as comma-separated values (CSV)'
230
+ usage: 'vip @example-app.production logs --limit=100',
231
+ description: 'Retrieve up to 100 of the most recent entries of application logs.'
226
232
  }, {
227
- usage: 'vip @mysite.production logs --limit 100 --format json',
228
- description: 'Get the most recent 100 log entries formatted as JSON'
233
+ usage: 'vip @example-app.production logs --type=batch --limit=800 --format=csv',
234
+ description: 'Retrieve up to 800 of the most recent entries of batch logs and output them in CSV format.'
229
235
  }]).argv(process.argv, getLogs);
@@ -14,22 +14,22 @@ const debug = (0, _debug.default)('@automattic/vip:bin:vip-search-replace');
14
14
  const examples = [
15
15
  // `search-replace` flag
16
16
  {
17
- usage: 'vip search-replace <file.sql> --search-replace="from,to"',
18
- description: 'Replace instances of <from> with <to> in the provided <file.sql>\n' + ' * Ensure there are no spaces between your search-replace parameters'
17
+ usage: 'vip search-replace file.sql --search-replace="from,to"',
18
+ description: 'Search for every instance of the value "from" in the local input file named "file.sql" and replace it with the value "to".\n' + ' * Results of the operation output to STDOUT by default.'
19
19
  },
20
20
  // `in-place` flag
21
21
  {
22
- usage: 'vip search-replace <file.sql> --search-replace="from,to" --in-place',
23
- description: 'Perform Search and Replace explicitly on the provided input <file.sql> file'
22
+ usage: 'vip search-replace file.sql --search-replace="from,to" --in-place',
23
+ description: 'Perform the search and replace operation on the local input file "file.sql" and overwrite the file with the results.'
24
24
  },
25
25
  // `output` flag
26
26
  {
27
- usage: 'vip search-replace <file.sql> --search-replace="from,to" --output="<output.sql>"',
28
- description: 'Search and Replace to the specified output <output.sql> file\n' + ' * Has no effect when the `in-place` flag is used'
27
+ usage: 'vip search-replace file.sql --search-replace="from,to" --output=output-file.sql',
28
+ description: 'Perform the search and replace operation and save the results to a local clone of the input file named "output-file.sql".'
29
29
  }];
30
30
  (0, _command.default)({
31
31
  requiredArgs: 1
32
- }).option('search-replace', 'Specify the <from> and <to> pairs to be replaced').option('in-place', 'Perform the search and replace explicitly on the input file').option('output', 'Create a local copy of the file with the completed search and replace operations. Ignored if the command includes --in-place. Accepts a local file path. Defaults to STDOUT.').examples(examples).argv(process.argv, async (arg, opt) => {
32
+ }).option('search-replace', 'A comma-separated pair of strings that specify the values to search for and replace (e.g. --search-replace="from,to").').option('in-place', 'Overwrite the local input file with the results of the search and replace operation.').option('output', 'The local file path used to save a copy of the results from the search and replace operation. Ignored when used with the --in-place option.').examples(examples).argv(process.argv, async (arg, opt) => {
33
33
  // TODO: tracks event for usage of this command stand alone
34
34
  const {
35
35
  searchReplace,
@@ -25,6 +25,7 @@ const MAX_POLLING_DELAY_IN_SECONDS = 300;
25
25
  const exampleUsage = 'vip @example-app.develop slowlogs';
26
26
  const baseUsage = 'vip slowlogs';
27
27
  async function getSlowlogs(arg, opt) {
28
+ opt.format ??= 'table';
28
29
  validateInputs(opt.limit, opt.format);
29
30
  const trackingParams = getBaseTrackingParams(opt);
30
31
  await (0, _tracker.trackEvent)('slowlogs_command_execute', trackingParams);
@@ -147,7 +148,7 @@ function validateInputs(limit, format) {
147
148
  exit.withError(`Invalid format: ${format}. The supported formats are: ${ALLOWED_FORMATS.join(', ')}.`);
148
149
  }
149
150
  if (!Number.isInteger(limit) || limit < LIMIT_MIN || limit > slowlogsLib.LIMIT_MAX) {
150
- exit.withError(`Invalid limit: ${limit}. It should be a number between ${LIMIT_MIN} and ${slowlogsLib.LIMIT_MAX}.`);
151
+ exit.withError(`Invalid limit: ${limit}. Set the limit to an integer between ${LIMIT_MIN} and ${slowlogsLib.LIMIT_MAX}.`);
151
152
  }
152
153
  }
153
154
  const appQuery = exports.appQuery = `
@@ -171,7 +172,7 @@ void (0, _command.default)({
171
172
  format: false,
172
173
  module: 'slowlogs',
173
174
  usage: baseUsage
174
- }).option('limit', 'The maximum number of log entries', 500).option('format', 'Output the log entries in CSV or JSON format', 'table').examples([{
175
+ }).option('limit', 'Set the maximum number of log entries. Accepts an integer value between 1 and 500.', 500).option('format', 'Render output in a particular format. Accepts “csv”, and “json”.', 'table').examples([{
175
176
  description: 'Retrieve up to 500 of the most recent entries from the MySQL slow query logs in the default format.',
176
177
  usage: exampleUsage
177
178
  }, {
package/dist/bin/vip.js CHANGED
@@ -22,7 +22,7 @@ const tokenURL = 'https://dashboard.wpvip.com/me/cli/token';
22
22
  const customDeployToken = process.env.WPVIP_DEPLOY_TOKEN;
23
23
  const runCmd = async function () {
24
24
  const cmd = (0, _command.default)();
25
- cmd.command('logout', 'Log out the current authenticated VIP-CLI user.').command('app', 'Interact with applications that the current authenticated VIP-CLI user has permission to access.').command('backup', 'Generate a backup of an environment.').command('cache', 'Manage page cache for an environment.').command('config', 'Manage environment configurations.').command('dev-env', 'Create and manage VIP Local Development Environments.').command('export', 'Export a copy of data associated with an environment.').command('import', 'Import media or SQL database files to an environment.').command('logs', 'Get logs from your VIP applications').command('search-replace', 'Perform search and replace tasks on files').command('slowlogs', 'Retrieve MySQL slow query logs from an environment.').command('db', "Access an environment's database.").command('sync', 'Sync the database from production to a non-production environment.').command('whoami', 'Retrieve details about the current authenticated VIP-CLI user.').command('validate', 'Validate your VIP application and environment').command('wp', 'Execute a WP-CLI command against an environment.');
25
+ cmd.command('logout', 'Log out the current authenticated VIP-CLI user.').command('app', 'Interact with applications that the current authenticated VIP-CLI user has permission to access.').command('backup', 'Generate a backup of an environment.').command('cache', 'Manage page cache for an environment.').command('config', 'Manage environment configurations.').command('dev-env', 'Create and manage VIP Local Development Environments.').command('export', 'Export a copy of data associated with an environment.').command('import', 'Import media or SQL database files to an environment.').command('logs', 'Retrieve Runtime Logs from an environment.').command('search-replace', 'Search for a string in a local SQL file and replace it with a new string.').command('slowlogs', 'Retrieve MySQL slow query logs from an environment.').command('db', "Access an environment's database.").command('sync', 'Sync the database from production to a non-production environment.').command('whoami', 'Retrieve details about the current authenticated VIP-CLI user.').command('validate', 'Validate your VIP application and environment').command('wp', 'Execute a WP-CLI command against an environment.');
26
26
  cmd.argv(process.argv);
27
27
  };
28
28
 
package/dist/lib/api.js CHANGED
@@ -27,6 +27,12 @@ function disableGlobalGraphQLErrorHandling() {
27
27
  function enableGlobalGraphQLErrorHandling() {
28
28
  globalGraphQLErrorHandlingEnabled = true;
29
29
  }
30
+ function isServerError(networkError) {
31
+ if (!networkError) {
32
+ return false;
33
+ }
34
+ return 'result' in networkError;
35
+ }
30
36
  function API({
31
37
  exitOnError = true
32
38
  } = {}) {
@@ -35,7 +41,11 @@ function API({
35
41
  graphQLErrors
36
42
  }) => {
37
43
  if (networkError && 'statusCode' in networkError && networkError.statusCode === 401) {
38
- console.error(_chalk.default.red('Unauthorized:'), 'You are unauthorized to perform this request, please logout with `vip logout` then try again.');
44
+ let message = 'You are not authorized to perform this request; please logout with `vip logout`, then try again.';
45
+ if (isServerError(networkError) && networkError.result?.code === 'token-disabled-inactivity') {
46
+ message = 'Your token has been disabled due to inactivity; please log out with `vip logout`, then try again.';
47
+ }
48
+ console.error(_chalk.default.red('Unauthorized:'), message);
39
49
  process.exit(1);
40
50
  }
41
51
  if (graphQLErrors?.length && globalGraphQLErrorHandlingEnabled) {
@@ -534,7 +534,7 @@ function _default(opts) {
534
534
  _args.default.option('force', 'Skip confirmation.', false);
535
535
  }
536
536
  if (_opts.format) {
537
- _args.default.option('format', 'Render output in a particular format. Accepts "table" (default), "csv", and "json".');
537
+ _args.default.option('format', 'Render output in a particular format. Accepts csv”, and json”.', 'table');
538
538
  }
539
539
 
540
540
  // Add help and version to all subcommands
@@ -25,6 +25,10 @@ const DEV_ENVIRONMENT_PHP_VERSIONS = exports.DEV_ENVIRONMENT_PHP_VERSIONS = {
25
25
  8.3: {
26
26
  image: 'ghcr.io/automattic/vip-container-images/php-fpm:8.3',
27
27
  label: '8.3'
28
+ },
29
+ 8.4: {
30
+ image: 'ghcr.io/automattic/vip-container-images/php-fpm:8.4',
31
+ label: '8.4 (experimental)'
28
32
  }
29
33
  };
30
34
  const DEV_ENVIRONMENT_DEFAULTS = exports.DEV_ENVIRONMENT_DEFAULTS = {
@@ -32,4 +36,4 @@ const DEV_ENVIRONMENT_DEFAULTS = exports.DEV_ENVIRONMENT_DEFAULTS = {
32
36
  multisite: false,
33
37
  phpVersion: Object.keys(DEV_ENVIRONMENT_PHP_VERSIONS)[0]
34
38
  };
35
- const DEV_ENVIRONMENT_VERSION = exports.DEV_ENVIRONMENT_VERSION = '2.1.1';
39
+ const DEV_ENVIRONMENT_VERSION = exports.DEV_ENVIRONMENT_VERSION = '2.1.2';
package/docs/CHANGELOG.md CHANGED
@@ -1,18 +1,40 @@
1
1
  ## Changelog
2
2
 
3
- ## 3.8.7
3
+ ### 3.9.0
4
+
5
+ * feat(dev-env): add support for PHP 8.4
6
+ * Provide dedicated error message for when a token is marked as disabled due to inactivity
7
+ * Set the mount path for vip-config to ABSPATH/vip-config to match production
8
+ * Add --format="text" option to vip logs
9
+ * build(deps-dev): bump typescript from 5.6.3 to 5.7.2
10
+ * build(deps-dev): bump @types/node from 22.9.1 to 22.10.0
11
+
12
+ **Full Changelog**: https://github.com/Automattic/vip-cli/compare/3.8.8...3.9.0
13
+
14
+ ### 3.8.8
15
+
16
+ * build(deps-dev): bump @types/dockerode from 3.3.31 to 3.3.32
17
+ * Update the `search-replace` command to follow the VIP-CLI style guide
18
+ * Update the`vip logs` command to follow the VIP-CLI style guide
19
+ * build(deps-dev): bump @types/node from 22.9.0 to 22.9.1
20
+ * build(deps): bump actions/dependency-review-action from 4.4.0 to 4.5.0
21
+ * build(deps): bump step-security/harden-runner from 2.10.1 to 2.10.2
22
+
23
+ **Full Changelog**: https://github.com/Automattic/vip-cli/compare/3.8.7...3.8.8
24
+
25
+ ### 3.8.7
4
26
 
5
27
  * fix(dev-env): SQL sync for single sites
6
28
 
7
29
  **Full Changelog**: https://github.com/Automattic/vip-cli/compare/3.8.6...3.8.7
8
30
 
9
- ## 3.8.6
31
+ ### 3.8.6
10
32
 
11
33
  * Updating Node.js versions and standardize the format
12
34
 
13
35
  **Full Changelog**: https://github.com/Automattic/vip-cli/compare/3.8.5...3.8.6
14
36
 
15
- ## 3.8.5
37
+ ### 3.8.5
16
38
 
17
39
  * build(deps-dev): bump the babel group with 4 updates
18
40
  * build(deps-dev): bump typescript from 5.6.2 to 5.6.3
@@ -43,7 +65,7 @@
43
65
  * build(deps): bump uuid from 11.0.2 to 11.0.3
44
66
  * Update socket error handler
45
67
  * Fix --limit arg handling in vip logs command
46
- * New package release: v3.9.0 by
68
+ * New package release: v3.9.0 by
47
69
  * Revert "New package release: v3.9.0"
48
70
  * chore(deps): update Lando to 6ca2668
49
71
  * fix: `table` format output
@@ -52,7 +74,7 @@
52
74
 
53
75
  **Full Changelog**: https://github.com/Automattic/vip-cli/compare/3.8.4...3.8.5
54
76
 
55
- ## 3.8.4
77
+ ### 3.8.4
56
78
 
57
79
  * build(deps): bump step-security/harden-runner from 2.9.1 to 2.10.1
58
80
  * build(deps-dev): bump @types/jest from 29.5.12 to 29.5.13 in the testing group
@@ -66,7 +88,7 @@
66
88
 
67
89
  **Full Changelog**: https://github.com/Automattic/vip-cli/compare/3.8.3...3.8.4
68
90
 
69
- ## 3.8.3
91
+ ### 3.8.3
70
92
 
71
93
  * build(deps): bump adm-zip from 0.5.15 to 0.5.16
72
94
  * build(deps): bump debug from 4.3.6 to 4.3.7
@@ -78,7 +100,7 @@
78
100
 
79
101
  **Full Changelog**: https://github.com/Automattic/vip-cli/compare/3.8.2...3.8.3
80
102
 
81
- ## 3.8.2
103
+ ### 3.8.2
82
104
 
83
105
  * chore(deps): make `node-fetch` 2.x depend on `whatwg-url` 14.x to address deprecations
84
106
  * build(deps-dev): bump nock from 13.5.4 to 13.5.5
@@ -93,14 +115,14 @@
93
115
 
94
116
  **Full Changelog**: https://github.com/Automattic/vip-cli/compare/3.8.1...3.8.2
95
117
 
96
- ## 3.8.1
118
+ ### 3.8.1
97
119
 
98
120
  * fix(dev-env): clean up data after `vip dev-env sync sql`
99
121
  * security: fix high severity CVE-2024-39338 in `axios`
100
122
 
101
123
  **Full Changelog**: https://github.com/Automattic/vip-cli/compare/3.8.0...3.8.1
102
124
 
103
- ## 3.8.0
125
+ ### 3.8.0
104
126
 
105
127
  * build(deps-dev): bump @babel/preset-env from 7.24.8 to 7.25.0 in the babel group
106
128
  * build(deps): bump debug from 4.3.5 to 4.3.6
@@ -115,7 +137,7 @@
115
137
 
116
138
  **Full Changelog**: https://github.com/Automattic/vip-cli/compare/3.7.1...3.8.0
117
139
 
118
- ## 3.7.1
140
+ ### 3.7.1
119
141
 
120
142
  * build(deps): bump step-security/harden-runner from 2.8.1 to 2.9.0
121
143
  * build(deps): bump semver from 7.6.2 to 7.6.3
@@ -131,7 +153,7 @@
131
153
 
132
154
  **Full Changelog**: https://github.com/Automattic/vip-cli/compare/3.7.0...3.7.1
133
155
 
134
- ## 3.7.0
156
+ ### 3.7.0
135
157
 
136
158
  * build(deps-dev): bump @automattic/eslint-plugin-wpvip from 0.12.0 to 0.13.0
137
159
  * build(deps-dev): bump the babel group with 3 updates
@@ -140,17 +162,17 @@
140
162
  * build(deps-dev): bump @babel/core from 7.24.8 to 7.24.9 in the babel group
141
163
  * build(deps-dev): bump @types/dockerode from 3.3.29 to 3.3.30
142
164
  * update: media import validate-files
143
-
165
+
144
166
  **Full Changelog**: https://github.com/Automattic/vip-cli/compare/3.6.0...3.7.0
145
167
 
146
- ## 3.6.0
168
+ ### 3.6.0
147
169
 
148
170
  * build(deps-dev): bump rimraf from 5.0.7 to 5.0.8
149
171
  * feat(dev-env): add DNS check to health check to ensure domains resolve correctly
150
172
 
151
173
  **Full Changelog**: https://github.com/Automattic/vip-cli/compare/3.5.1...3.6.0
152
174
 
153
- ## 3.5.1
175
+ ### 3.5.1
154
176
 
155
177
  * fix(dev-env): display cron status in `vip dev-env info --extended`
156
178
  * build(deps-dev): bump typescript from 5.5.2 to 5.5.3
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@automattic/vip",
3
- "version": "3.8.7",
3
+ "version": "3.9.0",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@automattic/vip",
9
- "version": "3.8.7",
9
+ "version": "3.9.0",
10
10
  "hasInstallScript": true,
11
11
  "license": "MIT",
12
12
  "dependencies": {
@@ -3526,9 +3526,9 @@
3526
3526
  }
3527
3527
  },
3528
3528
  "node_modules/@types/dockerode": {
3529
- "version": "3.3.31",
3530
- "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.31.tgz",
3531
- "integrity": "sha512-42R9eoVqJDSvVspV89g7RwRqfNExgievLNWoHkg7NoWIqAmavIbgQBb4oc0qRtHkxE+I3Xxvqv7qVXFABKPBTg==",
3529
+ "version": "3.3.32",
3530
+ "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.32.tgz",
3531
+ "integrity": "sha512-xxcG0g5AWKtNyh7I7wswLdFvym4Mlqks5ZlKzxEUrGHS0r0PUOfxm2T0mspwu10mHQqu3Ck3MI3V2HqvLWE1fg==",
3532
3532
  "dev": true,
3533
3533
  "dependencies": {
3534
3534
  "@types/docker-modem": "*",
@@ -3618,11 +3618,11 @@
3618
3618
  "dev": true
3619
3619
  },
3620
3620
  "node_modules/@types/node": {
3621
- "version": "22.9.0",
3622
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz",
3623
- "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==",
3621
+ "version": "22.10.0",
3622
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.0.tgz",
3623
+ "integrity": "sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA==",
3624
3624
  "dependencies": {
3625
- "undici-types": "~6.19.8"
3625
+ "undici-types": "~6.20.0"
3626
3626
  }
3627
3627
  },
3628
3628
  "node_modules/@types/node-fetch": {
@@ -12278,9 +12278,9 @@
12278
12278
  }
12279
12279
  },
12280
12280
  "node_modules/typescript": {
12281
- "version": "5.6.3",
12282
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
12283
- "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
12281
+ "version": "5.7.2",
12282
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz",
12283
+ "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==",
12284
12284
  "dev": true,
12285
12285
  "bin": {
12286
12286
  "tsc": "bin/tsc",
@@ -12314,9 +12314,9 @@
12314
12314
  }
12315
12315
  },
12316
12316
  "node_modules/undici-types": {
12317
- "version": "6.19.8",
12318
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
12319
- "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="
12317
+ "version": "6.20.0",
12318
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
12319
+ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="
12320
12320
  },
12321
12321
  "node_modules/unicode-canonical-property-names-ecmascript": {
12322
12322
  "version": "2.0.1",
@@ -15786,9 +15786,9 @@
15786
15786
  }
15787
15787
  },
15788
15788
  "@types/dockerode": {
15789
- "version": "3.3.31",
15790
- "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.31.tgz",
15791
- "integrity": "sha512-42R9eoVqJDSvVspV89g7RwRqfNExgievLNWoHkg7NoWIqAmavIbgQBb4oc0qRtHkxE+I3Xxvqv7qVXFABKPBTg==",
15789
+ "version": "3.3.32",
15790
+ "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.32.tgz",
15791
+ "integrity": "sha512-xxcG0g5AWKtNyh7I7wswLdFvym4Mlqks5ZlKzxEUrGHS0r0PUOfxm2T0mspwu10mHQqu3Ck3MI3V2HqvLWE1fg==",
15792
15792
  "dev": true,
15793
15793
  "requires": {
15794
15794
  "@types/docker-modem": "*",
@@ -15878,11 +15878,11 @@
15878
15878
  "dev": true
15879
15879
  },
15880
15880
  "@types/node": {
15881
- "version": "22.9.0",
15882
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz",
15883
- "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==",
15881
+ "version": "22.10.0",
15882
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.0.tgz",
15883
+ "integrity": "sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA==",
15884
15884
  "requires": {
15885
- "undici-types": "~6.19.8"
15885
+ "undici-types": "~6.20.0"
15886
15886
  }
15887
15887
  },
15888
15888
  "@types/node-fetch": {
@@ -22169,9 +22169,9 @@
22169
22169
  }
22170
22170
  },
22171
22171
  "typescript": {
22172
- "version": "5.6.3",
22173
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
22174
- "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
22172
+ "version": "5.7.2",
22173
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz",
22174
+ "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==",
22175
22175
  "dev": true
22176
22176
  },
22177
22177
  "typical": {
@@ -22192,9 +22192,9 @@
22192
22192
  }
22193
22193
  },
22194
22194
  "undici-types": {
22195
- "version": "6.19.8",
22196
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
22197
- "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="
22195
+ "version": "6.20.0",
22196
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
22197
+ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="
22198
22198
  },
22199
22199
  "unicode-canonical-property-names-ecmascript": {
22200
22200
  "version": "2.0.1",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@automattic/vip",
3
- "version": "3.8.7",
3
+ "version": "3.9.0",
4
4
  "description": "The VIP Javascript library & CLI",
5
5
  "main": "index.js",
6
6
  "bin": {