@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.
- package/dist/bin/vip-app-deploy.js +1 -1
- package/dist/bin/vip-import-media.js +67 -8
- package/dist/bin/vip-import-sql.js +1 -1
- package/dist/bin/vip-wp.js +25 -5
- package/dist/lib/api.js +41 -2
- package/dist/lib/client-file-uploader.js +3 -2
- package/dist/lib/constants/dev-environment.js +4 -0
- package/dist/lib/media-import/utils.js +18 -0
- package/dist/lib/wp/helpers.js +122 -0
- package/docs/vip-wp-line-parse-dfa.dot +31 -0
- package/npm-shrinkwrap.json +150 -105
- package/package.json +2 -2
|
@@ -156,7 +156,7 @@ Processing the file for deployment to your environment...
|
|
|
156
156
|
},
|
|
157
157
|
checksum,
|
|
158
158
|
result
|
|
159
|
-
} = await (0, _clientFileUploader.
|
|
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 [
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
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.
|
|
594
|
+
} = await (0, _clientFileUploader.uploadImportFileToS3)({
|
|
595
595
|
app,
|
|
596
596
|
env,
|
|
597
597
|
fileMeta,
|
package/dist/bin/vip-wp.js
CHANGED
|
@@ -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 (
|
|
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,
|
|
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.
|
|
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
|
|
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
|
+
}
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@automattic/vip",
|
|
3
|
-
"version": "3.
|
|
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.
|
|
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": "^
|
|
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.
|
|
2585
|
-
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.
|
|
2586
|
-
"integrity": "sha512-
|
|
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.
|
|
3061
|
-
"resolved": "https://registry.npmjs.org/glob/-/glob-10.
|
|
3062
|
-
"integrity": "sha512-
|
|
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.
|
|
3920
|
-
"resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.
|
|
3921
|
-
"integrity": "sha512-
|
|
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.
|
|
3993
|
-
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.
|
|
3994
|
-
"integrity": "sha512-
|
|
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
|
|
4029
|
-
"resolved": "https://registry.npmjs.org/glob/-/glob-11.0.
|
|
4030
|
-
"integrity": "sha512-
|
|
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": "
|
|
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.
|
|
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.
|
|
4079
|
-
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.
|
|
4080
|
-
"integrity": "sha512-
|
|
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": "
|
|
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.
|
|
6043
|
-
"resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.
|
|
6044
|
-
"integrity": "sha512-
|
|
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.
|
|
6058
|
-
"resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.
|
|
6059
|
-
"integrity": "sha512-
|
|
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.
|
|
9406
|
-
"resolved": "https://registry.npmjs.org/glob/-/glob-10.
|
|
9407
|
-
"integrity": "sha512-
|
|
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.
|
|
10339
|
-
"resolved": "https://registry.npmjs.org/glob/-/glob-10.
|
|
10340
|
-
"integrity": "sha512-
|
|
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.
|
|
10917
|
-
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.
|
|
10918
|
-
"integrity": "sha512-
|
|
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.
|
|
11138
|
-
"resolved": "https://registry.npmjs.org/glob/-/glob-10.
|
|
11139
|
-
"integrity": "sha512-
|
|
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": "
|
|
11838
|
-
"resolved": "https://registry.npmjs.org/open/-/open-
|
|
11839
|
-
"integrity": "sha512-
|
|
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.
|
|
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
|
-
"
|
|
11862
|
+
"powershell-utils": "^0.1.0",
|
|
11863
|
+
"wsl-utils": "^0.3.0"
|
|
11846
11864
|
},
|
|
11847
11865
|
"engines": {
|
|
11848
|
-
"node": ">=
|
|
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.
|
|
12575
|
-
"resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.
|
|
12576
|
-
"integrity": "sha512-
|
|
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.
|
|
14296
|
-
"resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.
|
|
14297
|
-
"integrity": "sha512-
|
|
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": ">=
|
|
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.
|
|
16040
|
-
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.
|
|
16041
|
-
"integrity": "sha512-
|
|
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.
|
|
16372
|
-
"resolved": "https://registry.npmjs.org/glob/-/glob-10.
|
|
16373
|
-
"integrity": "sha512-
|
|
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.
|
|
17047
|
-
"resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.
|
|
17048
|
-
"integrity": "sha512-
|
|
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.
|
|
17116
|
-
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.
|
|
17117
|
-
"integrity": "sha512-
|
|
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
|
|
17149
|
-
"resolved": "https://registry.npmjs.org/glob/-/glob-11.0.
|
|
17150
|
-
"integrity": "sha512-
|
|
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.
|
|
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.
|
|
17178
|
-
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.
|
|
17179
|
-
"integrity": "sha512-
|
|
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.
|
|
18496
|
-
"resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.
|
|
18497
|
-
"integrity": "sha512-
|
|
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.
|
|
18505
|
-
"resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.
|
|
18506
|
-
"integrity": "sha512-
|
|
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.
|
|
20796
|
-
"resolved": "https://registry.npmjs.org/glob/-/glob-10.
|
|
20797
|
-
"integrity": "sha512-
|
|
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.
|
|
21449
|
-
"resolved": "https://registry.npmjs.org/glob/-/glob-10.
|
|
21450
|
-
"integrity": "sha512-
|
|
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.
|
|
21849
|
-
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.
|
|
21850
|
-
"integrity": "sha512-
|
|
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.
|
|
22007
|
-
"resolved": "https://registry.npmjs.org/glob/-/glob-10.
|
|
22008
|
-
"integrity": "sha512-
|
|
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": "
|
|
22513
|
-
"resolved": "https://registry.npmjs.org/open/-/open-
|
|
22514
|
-
"integrity": "sha512-
|
|
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.
|
|
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
|
-
"
|
|
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.
|
|
23023
|
-
"resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.
|
|
23024
|
-
"integrity": "sha512-
|
|
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.
|
|
24230
|
-
"resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.
|
|
24231
|
-
"integrity": "sha512-
|
|
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.
|
|
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": "^
|
|
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",
|