@automattic/vip 2.36.0-dev.0 → 2.36.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/CHANGELOG.md +23 -0
- package/dist/bin/vip-app-list.js +1 -8
- package/dist/bin/vip-app.js +3 -10
- package/dist/bin/vip-backup-db.js +1 -9
- package/dist/bin/vip-backup.js +0 -8
- package/dist/bin/vip-cache-purge-url.js +6 -16
- package/dist/bin/vip-cache.js +0 -8
- package/dist/bin/vip-config-envvar-delete.js +2 -11
- package/dist/bin/vip-config-envvar-get-all.js +1 -10
- package/dist/bin/vip-config-envvar-get.js +1 -10
- package/dist/bin/vip-config-envvar-list.js +1 -10
- package/dist/bin/vip-config-envvar-set.js +3 -12
- package/dist/bin/vip-config-envvar.js +0 -8
- package/dist/bin/vip-config-software-get.js +3 -12
- package/dist/bin/vip-config-software-update.js +6 -13
- package/dist/bin/vip-config-software.js +0 -8
- package/dist/bin/vip-config.js +0 -8
- package/dist/bin/vip-dev-env-create.js +6 -13
- package/dist/bin/vip-dev-env-destroy.js +3 -10
- package/dist/bin/vip-dev-env-exec.js +2 -6
- package/dist/bin/vip-dev-env-import-media.js +2 -10
- package/dist/bin/vip-dev-env-import-sql.js +3 -11
- package/dist/bin/vip-dev-env-import.js +0 -8
- package/dist/bin/vip-dev-env-info.js +4 -11
- package/dist/bin/vip-dev-env-list.js +3 -11
- package/dist/bin/vip-dev-env-logs.js +3 -10
- package/dist/bin/vip-dev-env-shell.js +3 -10
- package/dist/bin/vip-dev-env-start.js +6 -13
- package/dist/bin/vip-dev-env-stop.js +4 -11
- package/dist/bin/vip-dev-env-sync-sql.js +4 -12
- package/dist/bin/vip-dev-env-sync.js +0 -8
- package/dist/bin/vip-dev-env-update.js +5 -12
- package/dist/bin/vip-dev-env.js +0 -8
- package/dist/bin/vip-export-sql.js +1 -9
- package/dist/bin/vip-export.js +0 -8
- package/dist/bin/vip-import-media-abort.js +7 -13
- package/dist/bin/vip-import-media-status.js +4 -11
- package/dist/bin/vip-import-media.js +5 -11
- package/dist/bin/vip-import-sql-status.js +5 -12
- package/dist/bin/vip-import-sql.js +46 -48
- package/dist/bin/vip-import-validate-files.js +3 -10
- package/dist/bin/vip-import-validate-sql.js +2 -10
- package/dist/bin/vip-import.js +0 -8
- package/dist/bin/vip-logout.js +0 -8
- package/dist/bin/vip-logs.js +10 -22
- package/dist/bin/vip-search-replace.js +2 -9
- package/dist/bin/vip-slowlogs.js +6 -16
- package/dist/bin/vip-sync.js +0 -7
- package/dist/bin/vip-validate-preflight.js +13 -24
- package/dist/bin/vip-validate.js +0 -8
- package/dist/bin/vip-whoami.js +4 -14
- package/dist/bin/vip-wp.js +8 -17
- package/dist/bin/vip.js +11 -19
- package/dist/commands/backup-db.js +15 -31
- package/dist/commands/dev-env-import-sql.js +23 -12
- package/dist/commands/dev-env-sync-sql.js +34 -35
- package/dist/commands/export-sql.js +27 -39
- package/dist/lib/analytics/clients/pendo.js +1 -11
- package/dist/lib/analytics/clients/tracks.js +2 -12
- package/dist/lib/analytics/index.js +1 -11
- package/dist/lib/api/app.js +3 -14
- package/dist/lib/api/cache-purge.js +3 -17
- package/dist/lib/api/feature-flags.js +1 -11
- package/dist/lib/api/http.js +4 -14
- package/dist/lib/api/user.js +1 -13
- package/dist/lib/api.js +8 -23
- package/dist/lib/app-logs/app-logs.js +4 -18
- package/dist/lib/app-slowlogs/app-slowlogs.js +4 -18
- package/dist/lib/app.js +1 -11
- package/dist/lib/backup-storage-availability/backup-storage-availability.js +8 -11
- package/dist/lib/backup-storage-availability/docker-machine-not-found-error.js +1 -3
- package/dist/lib/cli/apiConfig.js +6 -20
- package/dist/lib/cli/command.js +26 -33
- package/dist/lib/cli/config.js +4 -11
- package/dist/lib/cli/envAlias.js +1 -7
- package/dist/lib/cli/exit.js +1 -13
- package/dist/lib/cli/format.js +4 -13
- package/dist/lib/cli/progress.js +2 -13
- package/dist/lib/cli/prompt.js +1 -11
- package/dist/lib/client-file-uploader.js +22 -24
- package/dist/lib/config/software.js +11 -25
- package/dist/lib/constants/dev-environment.js +35 -33
- package/dist/lib/constants/file-size.js +5 -11
- package/dist/lib/constants/vipgo.js +10 -21
- package/dist/lib/dev-environment/dev-environment-cli.js +46 -49
- package/dist/lib/dev-environment/dev-environment-configuration-file.js +14 -26
- package/dist/lib/dev-environment/dev-environment-core.js +30 -43
- package/dist/lib/dev-environment/dev-environment-lando.js +19 -30
- package/dist/lib/dev-environment/docker-utils.js +1 -6
- package/dist/lib/env.js +2 -13
- package/dist/lib/envvar/api-delete.js +1 -11
- package/dist/lib/envvar/api-get-all.js +2 -13
- package/dist/lib/envvar/api-get.js +2 -12
- package/dist/lib/envvar/api-list.js +3 -14
- package/dist/lib/envvar/api-set.js +1 -11
- package/dist/lib/envvar/api.js +8 -46
- package/dist/lib/envvar/input.js +2 -14
- package/dist/lib/envvar/logging.js +3 -13
- package/dist/lib/envvar/read-file.js +1 -13
- package/dist/lib/http/proxy-agent.js +3 -12
- package/dist/lib/keychain/insecure.js +1 -11
- package/dist/lib/keychain/secure.js +1 -11
- package/dist/lib/keychain.js +3 -14
- package/dist/lib/logout.js +2 -7
- package/dist/lib/media-import/media-file-import.js +4 -12
- package/dist/lib/media-import/progress.js +2 -12
- package/dist/lib/media-import/status.js +15 -30
- package/dist/lib/read-file.js +3 -15
- package/dist/lib/search-and-replace.js +9 -21
- package/dist/lib/site-import/db-file-import.js +6 -18
- package/dist/lib/site-import/status.js +19 -36
- package/dist/lib/token.js +5 -16
- package/dist/lib/tracker.js +5 -15
- package/dist/lib/user-error.js +1 -3
- package/dist/lib/utils.js +4 -15
- package/dist/lib/validations/is-multi-site-sql-dump.js +1 -3
- package/dist/lib/validations/is-multi-site.js +6 -17
- package/dist/lib/validations/is-multisite-domain-mapped.js +9 -21
- package/dist/lib/validations/line-by-line.js +5 -15
- package/dist/lib/validations/site-type.js +4 -15
- package/dist/lib/validations/sql.js +33 -15
- package/dist/lib/validations/utils.js +1 -3
- package/dist/lib/vip-import-validate-files.js +2 -9
- package/helpers/check-version.js +1 -0
- package/helpers/prepublishOnly.js +2 -1
- package/npm-shrinkwrap.json +2586 -2999
- package/package.json +30 -34
- package/dist/bin/vip-phpmyadmin.js +0 -53
- package/dist/commands/phpmyadmin.js +0 -91
|
@@ -1,37 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
3
|
+
exports.__esModule = true;
|
|
6
4
|
exports.DB_BACKUP_JOB_STATUS_QUERY = exports.CREATE_DB_BACKUP_JOB_MUTATION = exports.BackupDBCommand = void 0;
|
|
7
5
|
var _chalk = _interopRequireDefault(require("chalk"));
|
|
8
6
|
var _graphqlTag = _interopRequireDefault(require("graphql-tag"));
|
|
9
7
|
var _api = _interopRequireWildcard(require("../lib/api"));
|
|
10
8
|
var exit = _interopRequireWildcard(require("../lib/cli/exit"));
|
|
11
|
-
var _utils = require("../lib/utils");
|
|
12
|
-
var _progress = require("../lib/cli/progress");
|
|
13
9
|
var _format = require("../lib/cli/format");
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
var _progress = require("../lib/cli/progress");
|
|
11
|
+
var _utils = require("../lib/utils");
|
|
12
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
13
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
16
14
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
-
/**
|
|
18
|
-
* External dependencies
|
|
19
|
-
*/
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Internal dependencies
|
|
23
|
-
*/
|
|
24
|
-
|
|
25
15
|
const DB_BACKUP_PROGRESS_POLL_INTERVAL = 1000;
|
|
26
|
-
const CREATE_DB_BACKUP_JOB_MUTATION = (0, _graphqlTag.default)`
|
|
16
|
+
const CREATE_DB_BACKUP_JOB_MUTATION = exports.CREATE_DB_BACKUP_JOB_MUTATION = (0, _graphqlTag.default)`
|
|
27
17
|
mutation TriggerDatabaseBackup($input: AppEnvironmentTriggerDBBackupInput) {
|
|
28
18
|
triggerDatabaseBackup(input: $input) {
|
|
29
19
|
success
|
|
30
20
|
}
|
|
31
21
|
}
|
|
32
22
|
`;
|
|
33
|
-
exports.
|
|
34
|
-
const DB_BACKUP_JOB_STATUS_QUERY = (0, _graphqlTag.default)`
|
|
23
|
+
const DB_BACKUP_JOB_STATUS_QUERY = exports.DB_BACKUP_JOB_STATUS_QUERY = (0, _graphqlTag.default)`
|
|
35
24
|
query AppBackupJobStatus($appId: Int!, $envId: Int!) {
|
|
36
25
|
app(id: $appId) {
|
|
37
26
|
id
|
|
@@ -55,9 +44,7 @@ const DB_BACKUP_JOB_STATUS_QUERY = (0, _graphqlTag.default)`
|
|
|
55
44
|
}
|
|
56
45
|
}
|
|
57
46
|
`;
|
|
58
|
-
exports.DB_BACKUP_JOB_STATUS_QUERY = DB_BACKUP_JOB_STATUS_QUERY;
|
|
59
47
|
async function getBackupJob(appId, envId) {
|
|
60
|
-
var _app$environments;
|
|
61
48
|
const api = await (0, _api.default)();
|
|
62
49
|
const response = await api.query({
|
|
63
50
|
query: DB_BACKUP_JOB_STATUS_QUERY,
|
|
@@ -72,7 +59,7 @@ async function getBackupJob(appId, envId) {
|
|
|
72
59
|
app
|
|
73
60
|
}
|
|
74
61
|
} = response;
|
|
75
|
-
return app
|
|
62
|
+
return app?.environments?.[0]?.jobs?.[0];
|
|
76
63
|
}
|
|
77
64
|
async function createBackupJob(appId, envId) {
|
|
78
65
|
// Disable global error handling so that we can handle errors ourselves
|
|
@@ -126,7 +113,7 @@ class BackupDBCommand {
|
|
|
126
113
|
console.log(msg);
|
|
127
114
|
}
|
|
128
115
|
isDone(job) {
|
|
129
|
-
return !
|
|
116
|
+
return !job?.inProgressLock;
|
|
130
117
|
}
|
|
131
118
|
|
|
132
119
|
/**
|
|
@@ -139,11 +126,10 @@ class BackupDBCommand {
|
|
|
139
126
|
this.progressTracker.stopPrinting();
|
|
140
127
|
}
|
|
141
128
|
async loadBackupJob() {
|
|
142
|
-
var _this$job, _this$job2, _this$job3;
|
|
143
129
|
this.job = await getBackupJob(this.app.id ?? 0, this.env.id ?? 0);
|
|
144
|
-
this.backupName =
|
|
145
|
-
this.jobStatus =
|
|
146
|
-
if (
|
|
130
|
+
this.backupName = this.job?.metadata?.find(meta => meta?.name === 'backupName')?.value ?? 'Unknown';
|
|
131
|
+
this.jobStatus = this.job?.progress?.status ?? undefined;
|
|
132
|
+
if (this.job?.completedAt) {
|
|
147
133
|
this.jobAge = (new Date().getTime() - new Date(this.job.completedAt).getTime()) / 1000 / 60;
|
|
148
134
|
} else {
|
|
149
135
|
this.jobAge = undefined;
|
|
@@ -151,10 +137,9 @@ class BackupDBCommand {
|
|
|
151
137
|
return this.job;
|
|
152
138
|
}
|
|
153
139
|
async run(silent = false) {
|
|
154
|
-
var _this$job4;
|
|
155
140
|
this.silent = silent;
|
|
156
141
|
await this.loadBackupJob();
|
|
157
|
-
if (
|
|
142
|
+
if (this.job?.inProgressLock) {
|
|
158
143
|
this.log('Database backup already in progress...');
|
|
159
144
|
} else {
|
|
160
145
|
try {
|
|
@@ -163,12 +148,11 @@ class BackupDBCommand {
|
|
|
163
148
|
this.progressTracker.startPrinting();
|
|
164
149
|
await createBackupJob(this.app.id ?? 0, this.env.id ?? 0);
|
|
165
150
|
} catch (err) {
|
|
166
|
-
var _error$graphQLErrors, _graphQLError$extensi;
|
|
167
151
|
const error = err;
|
|
168
|
-
const graphQLError =
|
|
152
|
+
const graphQLError = error.graphQLErrors?.[0];
|
|
169
153
|
this.progressTracker.stepFailed(this.steps.PREPARE);
|
|
170
154
|
this.stopProgressTracker();
|
|
171
|
-
if (
|
|
155
|
+
if (graphQLError?.extensions?.errorHttpCode === 429) {
|
|
172
156
|
const retryAfter = graphQLError.extensions.retryAfter;
|
|
173
157
|
await this.track('error', {
|
|
174
158
|
error_type: 'rate_limit_exceeded',
|
|
@@ -1,25 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
3
|
+
exports.__esModule = true;
|
|
6
4
|
exports.DevEnvImportSQLCommand = void 0;
|
|
7
|
-
var _fs = _interopRequireDefault(require("fs"));
|
|
8
5
|
var _chalk = _interopRequireDefault(require("chalk"));
|
|
6
|
+
var _fs = _interopRequireDefault(require("fs"));
|
|
7
|
+
var exit = _interopRequireWildcard(require("../lib/cli/exit"));
|
|
8
|
+
var _clientFileUploader = require("../lib/client-file-uploader");
|
|
9
9
|
var _devEnvironmentCli = require("../lib/dev-environment/dev-environment-cli");
|
|
10
10
|
var _devEnvironmentCore = require("../lib/dev-environment/dev-environment-core");
|
|
11
11
|
var _devEnvironmentLando = require("../lib/dev-environment/dev-environment-lando");
|
|
12
12
|
var _userError = _interopRequireDefault(require("../lib/user-error"));
|
|
13
|
+
var _utils = require("../lib/utils");
|
|
13
14
|
var _sql = require("../lib/validations/sql");
|
|
15
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
16
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
14
17
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
-
/**
|
|
16
|
-
* External dependencies
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Internal dependencies
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
18
|
class DevEnvImportSQLCommand {
|
|
24
19
|
fileName;
|
|
25
20
|
options;
|
|
@@ -33,6 +28,22 @@ class DevEnvImportSQLCommand {
|
|
|
33
28
|
async run(silent = false) {
|
|
34
29
|
const lando = await (0, _devEnvironmentLando.bootstrapLando)();
|
|
35
30
|
await (0, _devEnvironmentCli.validateDependencies)(lando, this.slug, silent);
|
|
31
|
+
(0, _sql.validateImportFileExtension)(this.fileName);
|
|
32
|
+
|
|
33
|
+
// Check if file is compressed and if so, extract the
|
|
34
|
+
const fileMeta = await (0, _clientFileUploader.getFileMeta)(this.fileName);
|
|
35
|
+
if (fileMeta.isCompressed) {
|
|
36
|
+
const tmpDir = (0, _utils.makeTempDir)();
|
|
37
|
+
const sqlFile = `${tmpDir}/sql-import.sql`;
|
|
38
|
+
try {
|
|
39
|
+
console.log(`Extracting the compressed file ${this.fileName}...`);
|
|
40
|
+
await (0, _clientFileUploader.unzipFile)(this.fileName, sqlFile);
|
|
41
|
+
console.log(`${_chalk.default.green('✓')} Extracted to ${sqlFile}`);
|
|
42
|
+
this.fileName = sqlFile;
|
|
43
|
+
} catch (err) {
|
|
44
|
+
exit.withError(`Error extracting the SQL file: ${err.message}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
36
47
|
const {
|
|
37
48
|
searchReplace,
|
|
38
49
|
inPlace
|
|
@@ -1,31 +1,22 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* External dependencies
|
|
5
|
-
*/
|
|
6
2
|
"use strict";
|
|
7
3
|
|
|
8
|
-
|
|
9
|
-
value: true
|
|
10
|
-
});
|
|
4
|
+
exports.__esModule = true;
|
|
11
5
|
exports.DevEnvSyncSQLCommand = void 0;
|
|
12
|
-
var
|
|
6
|
+
var _vipSearchReplace = require("@automattic/vip-search-replace");
|
|
13
7
|
var _chalk = _interopRequireDefault(require("chalk"));
|
|
8
|
+
var _fs = _interopRequireDefault(require("fs"));
|
|
14
9
|
var _url = _interopRequireDefault(require("url"));
|
|
15
|
-
var
|
|
16
|
-
var _clientFileUploader = require("../lib/client-file-uploader");
|
|
10
|
+
var _devEnvImportSql = require("./dev-env-import-sql");
|
|
17
11
|
var _exportSql = require("./export-sql");
|
|
12
|
+
var _backupStorageAvailability = require("../lib/backup-storage-availability/backup-storage-availability");
|
|
13
|
+
var exit = _interopRequireWildcard(require("../lib/cli/exit"));
|
|
14
|
+
var _clientFileUploader = require("../lib/client-file-uploader");
|
|
18
15
|
var _utils = require("../lib/utils");
|
|
19
16
|
var _lineByLine = require("../lib/validations/line-by-line");
|
|
20
|
-
var
|
|
21
|
-
var
|
|
22
|
-
var _backupStorageAvailability = require("../lib/backup-storage-availability/backup-storage-availability");
|
|
23
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
24
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
17
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
18
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
25
19
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
26
|
-
/**
|
|
27
|
-
* Internal dependencies
|
|
28
|
-
*/
|
|
29
20
|
/**
|
|
30
21
|
* Finds the site home url from the SQL line
|
|
31
22
|
*
|
|
@@ -33,9 +24,8 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
33
24
|
* @return {string} Site home url. null if not found
|
|
34
25
|
*/
|
|
35
26
|
function findSiteHomeUrl(sql) {
|
|
36
|
-
var _sql$match;
|
|
37
27
|
const regex = "'(siteurl|home)',\\s?'(.*?)'";
|
|
38
|
-
const url =
|
|
28
|
+
const url = sql.match(regex)?.[2] || '';
|
|
39
29
|
return _url.default.parse(url).hostname || null;
|
|
40
30
|
}
|
|
41
31
|
|
|
@@ -145,9 +135,18 @@ class DevEnvSyncSQLCommand {
|
|
|
145
135
|
if (!site.blogId || site.blogId === 1) continue;
|
|
146
136
|
const url = site.homeUrl.replace(/https?:\/\//, '');
|
|
147
137
|
if (!this.searchReplaceMap[url]) continue;
|
|
148
|
-
this.searchReplaceMap[url] = `${site.blogId}.${this.landoDomain}`;
|
|
138
|
+
this.searchReplaceMap[url] = `${this.slugifyDomain(url)}-${site.blogId}.${this.landoDomain}`;
|
|
149
139
|
}
|
|
150
140
|
}
|
|
141
|
+
slugifyDomain(domain) {
|
|
142
|
+
return String(domain).normalize('NFKD') // split accented characters into their base characters and diacritical marks
|
|
143
|
+
.replace(/[\u0300-\u036f]/g, '') // remove all the accents, which happen to be all in the \u03xx UNICODE block.
|
|
144
|
+
.trim() // trim leading or trailing whitespace
|
|
145
|
+
.toLowerCase() // convert to lowercase
|
|
146
|
+
.replace(/[^a-z0-9 .-]/g, '') // remove non-alphanumeric characters except for spaces, dots, and hyphens
|
|
147
|
+
.replace(/[.\s]+/g, '-') // replace dots and spaces with hyphens
|
|
148
|
+
.replace(/-+/g, '-'); // remove consecutive hyphens
|
|
149
|
+
}
|
|
151
150
|
|
|
152
151
|
/**
|
|
153
152
|
* Runs the SQL import command to import the SQL file
|
|
@@ -179,10 +178,10 @@ class DevEnvSyncSQLCommand {
|
|
|
179
178
|
// the following will not get executed if this.generateExport() calls exit.withError() on all exception
|
|
180
179
|
await this.track('error', {
|
|
181
180
|
error_type: 'export_sql_backup',
|
|
182
|
-
error_message: err
|
|
183
|
-
stack: err
|
|
181
|
+
error_message: err?.message,
|
|
182
|
+
stack: err?.stack
|
|
184
183
|
});
|
|
185
|
-
exit.withError(`Error exporting SQL backup: ${err
|
|
184
|
+
exit.withError(`Error exporting SQL backup: ${err?.message}`);
|
|
186
185
|
}
|
|
187
186
|
try {
|
|
188
187
|
console.log(`Extracting the exported file ${this.gzFile}...`);
|
|
@@ -191,8 +190,8 @@ class DevEnvSyncSQLCommand {
|
|
|
191
190
|
} catch (err) {
|
|
192
191
|
await this.track('error', {
|
|
193
192
|
error_type: 'archive_extraction',
|
|
194
|
-
error_message: err
|
|
195
|
-
stack: err
|
|
193
|
+
error_message: err?.message,
|
|
194
|
+
stack: err?.stack
|
|
196
195
|
});
|
|
197
196
|
exit.withError(`Error extracting the SQL export: ${err.message}`);
|
|
198
197
|
}
|
|
@@ -202,10 +201,10 @@ class DevEnvSyncSQLCommand {
|
|
|
202
201
|
} catch (err) {
|
|
203
202
|
await this.track('error', {
|
|
204
203
|
error_type: 'extract_site_urls',
|
|
205
|
-
error_message: err
|
|
206
|
-
stack: err
|
|
204
|
+
error_message: err?.message,
|
|
205
|
+
stack: err?.stack
|
|
207
206
|
});
|
|
208
|
-
exit.withError(`Error extracting site URLs: ${err
|
|
207
|
+
exit.withError(`Error extracting site URLs: ${err?.message}`);
|
|
209
208
|
}
|
|
210
209
|
console.log('Generating search-replace configuration...');
|
|
211
210
|
this.generateSearchReplaceMap();
|
|
@@ -219,10 +218,10 @@ class DevEnvSyncSQLCommand {
|
|
|
219
218
|
} catch (err) {
|
|
220
219
|
await this.track('error', {
|
|
221
220
|
error_type: 'search_replace',
|
|
222
|
-
error_message: err
|
|
223
|
-
stack: err
|
|
221
|
+
error_message: err?.message,
|
|
222
|
+
stack: err?.stack
|
|
224
223
|
});
|
|
225
|
-
exit.withError(`Error replacing domains: ${err
|
|
224
|
+
exit.withError(`Error replacing domains: ${err?.message}`);
|
|
226
225
|
}
|
|
227
226
|
try {
|
|
228
227
|
console.log('Importing the SQL file...');
|
|
@@ -232,10 +231,10 @@ class DevEnvSyncSQLCommand {
|
|
|
232
231
|
} catch (err) {
|
|
233
232
|
await this.track('error', {
|
|
234
233
|
error_type: 'import_sql_file',
|
|
235
|
-
error_message: err
|
|
236
|
-
stack: err
|
|
234
|
+
error_message: err?.message,
|
|
235
|
+
stack: err?.stack
|
|
237
236
|
});
|
|
238
|
-
exit.withError(`Error importing SQL file: ${err
|
|
237
|
+
exit.withError(`Error importing SQL file: ${err?.message}`);
|
|
239
238
|
}
|
|
240
239
|
}
|
|
241
240
|
}
|
|
@@ -1,32 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
3
|
+
exports.__esModule = true;
|
|
6
4
|
exports.GENERATE_DOWNLOAD_LINK_MUTATION = exports.ExportSQLCommand = exports.CREATE_EXPORT_JOB_MUTATION = void 0;
|
|
7
|
-
var
|
|
5
|
+
var _chalk = _interopRequireDefault(require("chalk"));
|
|
8
6
|
var _fs = _interopRequireDefault(require("fs"));
|
|
7
|
+
var _graphqlTag = _interopRequireDefault(require("graphql-tag"));
|
|
9
8
|
var _https = _interopRequireDefault(require("https"));
|
|
10
9
|
var _path = _interopRequireDefault(require("path"));
|
|
11
|
-
var
|
|
10
|
+
var _backupDb = require("./backup-db");
|
|
12
11
|
var _api = _interopRequireWildcard(require("../lib/api"));
|
|
12
|
+
var _backupStorageAvailability = require("../lib/backup-storage-availability/backup-storage-availability");
|
|
13
|
+
var exit = _interopRequireWildcard(require("../lib/cli/exit"));
|
|
13
14
|
var _format = require("../lib/cli/format");
|
|
14
15
|
var _progress = require("../lib/cli/progress");
|
|
15
|
-
var exit = _interopRequireWildcard(require("../lib/cli/exit"));
|
|
16
16
|
var _utils = require("../lib/utils");
|
|
17
|
-
|
|
18
|
-
var
|
|
19
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
20
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
17
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
18
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
21
19
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
22
|
-
/**
|
|
23
|
-
* External dependencies
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Internal dependencies
|
|
28
|
-
*/
|
|
29
|
-
|
|
30
20
|
const EXPORT_SQL_PROGRESS_POLL_INTERVAL = 1000;
|
|
31
21
|
const BACKUP_AND_JOB_STATUS_QUERY = (0, _graphqlTag.default)`
|
|
32
22
|
query AppBackupAndJobStatus($appId: Int!, $envId: Int!) {
|
|
@@ -67,7 +57,7 @@ const BACKUP_AND_JOB_STATUS_QUERY = (0, _graphqlTag.default)`
|
|
|
67
57
|
`;
|
|
68
58
|
|
|
69
59
|
// Exporting for test purposes
|
|
70
|
-
const GENERATE_DOWNLOAD_LINK_MUTATION = (0, _graphqlTag.default)`
|
|
60
|
+
const GENERATE_DOWNLOAD_LINK_MUTATION = exports.GENERATE_DOWNLOAD_LINK_MUTATION = (0, _graphqlTag.default)`
|
|
71
61
|
mutation GenerateDBBackupCopyUrl($input: AppEnvironmentGenerateDBBackupCopyUrlInput) {
|
|
72
62
|
generateDBBackupCopyUrl(input: $input) {
|
|
73
63
|
url
|
|
@@ -77,8 +67,7 @@ const GENERATE_DOWNLOAD_LINK_MUTATION = (0, _graphqlTag.default)`
|
|
|
77
67
|
`;
|
|
78
68
|
|
|
79
69
|
// Exporting for test purposes
|
|
80
|
-
exports.
|
|
81
|
-
const CREATE_EXPORT_JOB_MUTATION = (0, _graphqlTag.default)`
|
|
70
|
+
const CREATE_EXPORT_JOB_MUTATION = exports.CREATE_EXPORT_JOB_MUTATION = (0, _graphqlTag.default)`
|
|
82
71
|
mutation BackupDBCopy($input: AppEnvironmentStartDBBackupCopyInput) {
|
|
83
72
|
startDBBackupCopy(input: $input) {
|
|
84
73
|
message
|
|
@@ -94,7 +83,6 @@ const CREATE_EXPORT_JOB_MUTATION = (0, _graphqlTag.default)`
|
|
|
94
83
|
* @param {number} envId Environment ID
|
|
95
84
|
* @return {Promise} A promise which resolves to the latest backup and job status
|
|
96
85
|
*/
|
|
97
|
-
exports.CREATE_EXPORT_JOB_MUTATION = CREATE_EXPORT_JOB_MUTATION;
|
|
98
86
|
async function fetchLatestBackupAndJobStatus(appId, envId) {
|
|
99
87
|
const api = await (0, _api.default)();
|
|
100
88
|
const response = await api.query({
|
|
@@ -257,7 +245,7 @@ class ExportSQLCommand {
|
|
|
257
245
|
async getExportedFileName() {
|
|
258
246
|
const job = await this.getExportJob();
|
|
259
247
|
const metadata = job.metadata.find(md => md.name === 'uploadPath');
|
|
260
|
-
return metadata
|
|
248
|
+
return metadata?.value.split('/')[1];
|
|
261
249
|
}
|
|
262
250
|
|
|
263
251
|
/**
|
|
@@ -298,8 +286,8 @@ class ExportSQLCommand {
|
|
|
298
286
|
* @return {boolean} True if the preflight step is successful
|
|
299
287
|
*/
|
|
300
288
|
isPrepared(job) {
|
|
301
|
-
const step = job
|
|
302
|
-
return
|
|
289
|
+
const step = job?.progress.steps.find(st => st.id === 'preflight');
|
|
290
|
+
return step?.status === 'success';
|
|
303
291
|
}
|
|
304
292
|
|
|
305
293
|
/**
|
|
@@ -309,8 +297,8 @@ class ExportSQLCommand {
|
|
|
309
297
|
* @return {boolean} True if the upload step is successful
|
|
310
298
|
*/
|
|
311
299
|
isCreated(job) {
|
|
312
|
-
const step = job
|
|
313
|
-
return
|
|
300
|
+
const step = job?.progress.steps.find(st => st.id === 'upload_backup');
|
|
301
|
+
return step?.status === 'success';
|
|
314
302
|
}
|
|
315
303
|
|
|
316
304
|
/**
|
|
@@ -349,10 +337,10 @@ class ExportSQLCommand {
|
|
|
349
337
|
} catch (err) {
|
|
350
338
|
await this.track('error', {
|
|
351
339
|
error_type: 'cannot_write_to_path',
|
|
352
|
-
error_message: `Cannot write to the specified path: ${err
|
|
353
|
-
stack: err
|
|
340
|
+
error_message: `Cannot write to the specified path: ${err?.message}`,
|
|
341
|
+
stack: err?.stack
|
|
354
342
|
});
|
|
355
|
-
exit.withError(`Cannot write to the specified path: ${err
|
|
343
|
+
exit.withError(`Cannot write to the specified path: ${err?.message}`);
|
|
356
344
|
}
|
|
357
345
|
}
|
|
358
346
|
if (this.generateBackup) {
|
|
@@ -382,21 +370,21 @@ class ExportSQLCommand {
|
|
|
382
370
|
await createExportJob(this.app.id, this.env.id, latestBackup.id);
|
|
383
371
|
} catch (err) {
|
|
384
372
|
// Todo: match error code instead of message substring
|
|
385
|
-
if (err
|
|
373
|
+
if (err?.message.includes('Backup Copy already in progress')) {
|
|
386
374
|
await this.track('error', {
|
|
387
375
|
error_type: 'job_already_running',
|
|
388
|
-
error_message: err
|
|
389
|
-
stack: err
|
|
376
|
+
error_message: err?.message,
|
|
377
|
+
stack: err?.stack
|
|
390
378
|
});
|
|
391
379
|
exit.withError('There is an export job already running for this environment: ' + `https://dashboard.wpvip.com/apps/${this.app.id}/${this.env.uniqueLabel}/data/database/backups\n` + 'Currently, we allow only one export job at a time, per site. Please try again later.');
|
|
392
380
|
} else {
|
|
393
381
|
await this.track('error', {
|
|
394
382
|
error_type: 'create_export_job',
|
|
395
|
-
error_message: err
|
|
396
|
-
stack: err
|
|
383
|
+
error_message: err?.message,
|
|
384
|
+
stack: err?.stack
|
|
397
385
|
});
|
|
398
386
|
}
|
|
399
|
-
exit.withError(`Error creating export job: ${err
|
|
387
|
+
exit.withError(`Error creating export job: ${err?.message}`);
|
|
400
388
|
}
|
|
401
389
|
}
|
|
402
390
|
this.progressTracker.stepRunning(this.steps.PREPARE);
|
|
@@ -429,10 +417,10 @@ class ExportSQLCommand {
|
|
|
429
417
|
this.stopProgressTracker();
|
|
430
418
|
await this.track('error', {
|
|
431
419
|
error_type: 'download_failed',
|
|
432
|
-
error_message: err
|
|
433
|
-
stack: err
|
|
420
|
+
error_message: err?.message,
|
|
421
|
+
stack: err?.stack
|
|
434
422
|
});
|
|
435
|
-
exit.withError(`Error downloading exported file: ${err
|
|
423
|
+
exit.withError(`Error downloading exported file: ${err?.message}`);
|
|
436
424
|
}
|
|
437
425
|
}
|
|
438
426
|
}
|
|
@@ -1,20 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
3
|
+
exports.__esModule = true;
|
|
6
4
|
exports.default = void 0;
|
|
7
5
|
var _debug = _interopRequireDefault(require("debug"));
|
|
8
6
|
var _http = _interopRequireDefault(require("../../../lib/api/http"));
|
|
9
7
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
-
/**
|
|
11
|
-
* External dependencies
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Internal dependencies
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
8
|
const debug = (0, _debug.default)('@automattic/vip:analytics:clients:pendo');
|
|
19
9
|
/**
|
|
20
10
|
* Pendo analytics client.
|
|
@@ -1,22 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
3
|
+
exports.__esModule = true;
|
|
6
4
|
exports.default = void 0;
|
|
5
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
7
6
|
var _nodeFetch = _interopRequireDefault(require("node-fetch"));
|
|
8
7
|
var _querystring = _interopRequireDefault(require("querystring"));
|
|
9
|
-
var _debug = _interopRequireDefault(require("debug"));
|
|
10
8
|
var _apiConfig = require("../../cli/apiConfig");
|
|
11
9
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
12
|
-
/**
|
|
13
|
-
* External dependencies
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Internal dependencies
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
10
|
const debug = (0, _debug.default)('@automattic/vip:analytics:clients:tracks');
|
|
21
11
|
const validEventOrPropNamePattern = /^[a-z_][a-z0-9_]*$/;
|
|
22
12
|
/**
|
|
@@ -1,20 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
3
|
+
exports.__esModule = true;
|
|
6
4
|
exports.default = void 0;
|
|
7
5
|
var _debug = _interopRequireDefault(require("debug"));
|
|
8
6
|
var _env = _interopRequireDefault(require("../env"));
|
|
9
7
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
-
/**
|
|
11
|
-
* External dependencies
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Internal dependencies
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
8
|
const debug = (0, _debug.default)('@automattic/vip:analytics');
|
|
19
9
|
|
|
20
10
|
/* eslint-disable camelcase */
|
package/dist/lib/api/app.js
CHANGED
|
@@ -1,24 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
3
|
+
exports.__esModule = true;
|
|
6
4
|
exports.default = _default;
|
|
7
5
|
var _graphqlTag = _interopRequireDefault(require("graphql-tag"));
|
|
8
6
|
var _api = _interopRequireDefault(require("../../lib/api"));
|
|
9
7
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
-
/**
|
|
11
|
-
* External dependencies
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Internal dependencies
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
8
|
async function _default(app, fields = 'id,name', fragments = '') {
|
|
19
9
|
const api = await (0, _api.default)();
|
|
20
|
-
if (isNaN(
|
|
21
|
-
var _res$data$apps;
|
|
10
|
+
if (isNaN(Number(app))) {
|
|
22
11
|
const res = await api.query({
|
|
23
12
|
query: (0, _graphqlTag.default)`query App( $name: String ) {
|
|
24
13
|
apps( first: 1, name: $name ) {
|
|
@@ -34,7 +23,7 @@ async function _default(app, fields = 'id,name', fragments = '') {
|
|
|
34
23
|
name: app
|
|
35
24
|
}
|
|
36
25
|
});
|
|
37
|
-
if (!
|
|
26
|
+
if (!res.data.apps?.edges?.length) {
|
|
38
27
|
return {};
|
|
39
28
|
}
|
|
40
29
|
return res.data.apps.edges[0];
|
|
@@ -1,23 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
3
|
+
exports.__esModule = true;
|
|
6
4
|
exports.appQuery = void 0;
|
|
7
5
|
exports.purgeCache = purgeCache;
|
|
8
6
|
var _graphqlTag = _interopRequireDefault(require("graphql-tag"));
|
|
9
7
|
var _api = _interopRequireDefault(require("../../lib/api"));
|
|
10
8
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
// @format
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* External dependencies
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Internal dependencies
|
|
19
|
-
*/
|
|
20
|
-
|
|
21
9
|
const mutation = (0, _graphqlTag.default)`
|
|
22
10
|
mutation PurgePageCacheMutation($appId: Int!, $envId: Int!, $urls: [String!]!) {
|
|
23
11
|
purgePageCache(input: { appId: $appId, environmentId: $envId, urls: $urls }) {
|
|
@@ -28,7 +16,7 @@ const mutation = (0, _graphqlTag.default)`
|
|
|
28
16
|
`;
|
|
29
17
|
|
|
30
18
|
// The subquery for environments lets users choose any environment, including production.
|
|
31
|
-
const appQuery = `
|
|
19
|
+
const appQuery = exports.appQuery = `
|
|
32
20
|
id
|
|
33
21
|
name
|
|
34
22
|
environments {
|
|
@@ -41,9 +29,7 @@ const appQuery = `
|
|
|
41
29
|
type
|
|
42
30
|
}
|
|
43
31
|
`;
|
|
44
|
-
exports.appQuery = appQuery;
|
|
45
32
|
async function purgeCache(appId, envId, urls) {
|
|
46
|
-
var _response$data;
|
|
47
33
|
const api = await (0, _api.default)();
|
|
48
34
|
const variables = {
|
|
49
35
|
appId,
|
|
@@ -54,5 +40,5 @@ async function purgeCache(appId, envId, urls) {
|
|
|
54
40
|
mutation,
|
|
55
41
|
variables
|
|
56
42
|
});
|
|
57
|
-
return
|
|
43
|
+
return response.data?.purgePageCache ?? null;
|
|
58
44
|
}
|
|
@@ -1,20 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
3
|
+
exports.__esModule = true;
|
|
6
4
|
exports.get = get;
|
|
7
5
|
var _graphqlTag = _interopRequireDefault(require("graphql-tag"));
|
|
8
6
|
var _api = _interopRequireDefault(require("../../lib/api"));
|
|
9
7
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
-
/**
|
|
11
|
-
* External dependencies
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Internal dependencies
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
8
|
let api;
|
|
19
9
|
|
|
20
10
|
// If Token.get() fails, we may have an unhandled rejection
|