Remove fs-extra-promise and fs-extra (#17226)

* Remove fs-extra-promise

* const

* Remove one more

* Update comment
This commit is contained in:
Charles Gagnon 2022-01-31 13:21:09 -08:00 коммит произвёл GitHub
Родитель b4f9c74403
Коммит c3017781cc
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
7 изменённых файлов: 86 добавлений и 131 удалений

Просмотреть файл

@ -124,7 +124,6 @@
"error-ex": "^1.3.0", "error-ex": "^1.3.0",
"figures": "^1.4.0", "figures": "^1.4.0",
"find-remove": "1.2.1", "find-remove": "1.2.1",
"fs-extra-promise": "^0.3.1",
"getmac": "1.2.1", "getmac": "1.2.1",
"http-proxy-agent": "^2.1.0", "http-proxy-agent": "^2.1.0",
"https-proxy-agent": "^2.2.1", "https-proxy-agent": "^2.2.1",

Просмотреть файл

@ -7,7 +7,7 @@ import * as path from 'path';
import { Runtime } from '../models/platform'; import { Runtime } from '../models/platform';
import ServiceDownloadProvider from './serviceDownloadProvider'; import ServiceDownloadProvider from './serviceDownloadProvider';
import { IConfig, IStatusView } from './interfaces'; import { IConfig, IStatusView } from './interfaces';
import * as fs from 'fs-extra-promise'; import * as fs from 'fs/promises';
/* /*
@ -23,29 +23,29 @@ export default class ServerProvider {
/** /**
* Given a file path, returns the path to the SQL Tools service file. * Given a file path, returns the path to the SQL Tools service file.
*/ */
public findServerPath(filePath: string): Promise<string> { public async findServerPath(filePath: string): Promise<string | undefined> {
return fs.lstatAsync(filePath).then(stats => { const stats = await fs.lstat(filePath);
// If a file path was passed, assume its the launch file. // If a file path was passed, assume its the launch file.
if (stats.isFile()) { if (stats.isFile()) {
return filePath; return filePath;
} }
// Otherwise, search the specified folder. // Otherwise, search the specified folder.
let candidate: string; if (this._config !== undefined) {
let executableFiles: string[] = this._config.getSqlToolsExecutableFiles();
if (this._config !== undefined) { for (const executableFile of executableFiles) {
let executableFiles: string[] = this._config.getSqlToolsExecutableFiles(); const executablePath = path.join(filePath, executableFile);
executableFiles.forEach(element => { try {
let executableFile = path.join(filePath, element); if (await fs.stat(executablePath)) {
if (candidate === undefined && fs.existsSync(executableFile)) { return executablePath;
candidate = executableFile;
return candidate;
} }
}); } catch (err) {
// no-op, the exe files list has all possible options and so depending on the platform we expect some
// to always fail
}
} }
}
return candidate; return undefined;
});
} }
/** /**
@ -75,25 +75,22 @@ export default class ServerProvider {
/** /**
* Returns the path of the installed service * Returns the path of the installed service
*/ */
public getServerPath(runtime: Runtime): Promise<string> { public async getServerPath(runtime: Runtime): Promise<string> {
const installDirectory = this._downloadProvider.getInstallDirectory(runtime); const installDirectory = await this._downloadProvider.getOrMakeInstallDirectory(runtime);
return this.findServerPath(installDirectory); return this.findServerPath(installDirectory);
} }
/** /**
* Downloads the service and returns the path of the installed service * Downloads the service and returns the path of the installed service
*/ */
public downloadServerFiles(runtime: Runtime): Promise<string> { public async downloadServerFiles(runtime: Runtime): Promise<string> {
return new Promise<string>((resolve, reject) => { const installDirectory = await this._downloadProvider.getOrMakeInstallDirectory(runtime);
const installDirectory = this._downloadProvider.getInstallDirectory(runtime); try {
return this._downloadProvider.installSQLToolsService(runtime).then(_ => { await this._downloadProvider.installSQLToolsService(runtime);
return this.findServerPath(installDirectory).then(result => { return this.findServerPath(installDirectory);
return resolve(result); } catch (err) {
}); this._statusView.serviceInstallationFailed();
}).catch(err => { throw err;
this._statusView.serviceInstallationFailed(); }
reject(err);
});
});
} }
} }

Просмотреть файл

@ -9,7 +9,7 @@ import { Runtime, getRuntimeDisplayName } from '../models/platform';
import { IConfig, IStatusView, IPackage, PackageError, IHttpClient, IDecompressProvider } from './interfaces'; import { IConfig, IStatusView, IPackage, PackageError, IHttpClient, IDecompressProvider } from './interfaces';
import { ILogger } from '../models/interfaces'; import { ILogger } from '../models/interfaces';
import * as Constants from '../constants/constants'; import * as Constants from '../constants/constants';
import * as fse from 'fs-extra'; import * as fs from 'fs/promises';
/* /*
* Service Download Provider class which handles downloading the SQL Tools service. * Service Download Provider class which handles downloading the SQL Tools service.
@ -45,16 +45,19 @@ export default class ServiceDownloadProvider {
/** /**
* Returns SQL tools service installed folder. * Returns SQL tools service installed folder, creating it if it doesn't exist.
*/ */
public getInstallDirectory(platform: Runtime): string { public async getOrMakeInstallDirectory(platform: Runtime): Promise<string> {
let basePath = this.getInstallDirectoryRoot(); let basePath = this.getInstallDirectoryRoot();
let versionFromConfig = this._config.getSqlToolsPackageVersion(); let versionFromConfig = this._config.getSqlToolsPackageVersion();
basePath = basePath.replace('{#version#}', versionFromConfig); basePath = basePath.replace('{#version#}', versionFromConfig);
basePath = basePath.replace('{#platform#}', getRuntimeDisplayName(platform)); basePath = basePath.replace('{#platform#}', getRuntimeDisplayName(platform));
if (!fse.existsSync(basePath)) { try {
fse.mkdirsSync(basePath); await fs.mkdir(basePath, { recursive: true });
} catch {
// Best effort to make the folder, if it already exists (expected scenario) or something else happens
// then just carry on
} }
return basePath; return basePath;
} }
@ -85,45 +88,39 @@ export default class ServiceDownloadProvider {
/** /**
* Downloads the SQL tools service and decompress it in the install folder. * Downloads the SQL tools service and decompress it in the install folder.
*/ */
public installSQLToolsService(platform: Runtime): Promise<boolean> { public async installSQLToolsService(platform: Runtime): Promise<boolean> {
const proxy = <string>this._config.getWorkspaceConfig('http.proxy'); const proxy = <string>this._config.getWorkspaceConfig('http.proxy');
const strictSSL = this._config.getWorkspaceConfig('http.proxyStrictSSL', true); const strictSSL = this._config.getWorkspaceConfig('http.proxyStrictSSL', true);
const authorization = this._config.getWorkspaceConfig('http.proxyAuthorization'); const authorization = this._config.getWorkspaceConfig('http.proxyAuthorization');
return new Promise<boolean>((resolve, reject) => { const fileName = this.getDownloadFileName(platform);
const fileName = this.getDownloadFileName(platform); const installDirectory = await this.getOrMakeInstallDirectory(platform);
const installDirectory = this.getInstallDirectory(platform);
this._logger.appendLine(`${Constants.serviceInstallingTo} ${installDirectory}.`); this._logger.appendLine(`${Constants.serviceInstallingTo} ${installDirectory}.`);
const urlString = this.getGetDownloadUrl(fileName); const urlString = this.getGetDownloadUrl(fileName);
const isZipFile: boolean = path.extname(fileName) === '.zip'; const isZipFile: boolean = path.extname(fileName) === '.zip';
this._logger.appendLine(`${Constants.serviceDownloading} ${urlString}`); this._logger.appendLine(`${Constants.serviceDownloading} ${urlString}`);
let pkg: IPackage = { let pkg: IPackage = {
installPath: installDirectory, installPath: installDirectory,
url: urlString, url: urlString,
tmpFile: undefined, tmpFile: undefined,
isZipFile: isZipFile isZipFile: isZipFile
}; };
this.createTempFile(pkg).then(tmpResult => { const tmpResult = await this.createTempFile(pkg);
pkg.tmpFile = tmpResult; pkg.tmpFile = tmpResult;
this._httpClient.downloadFile(pkg.url, pkg, this._logger, this._statusView, proxy, strictSSL, authorization).then(_ => { try {
await this._httpClient.downloadFile(pkg.url, pkg, this._logger, this._statusView, proxy, strictSSL, authorization);
this._logger.logDebug(`Downloaded to ${pkg.tmpFile.name}...`); this._logger.logDebug(`Downloaded to ${pkg.tmpFile.name}...`);
this._logger.appendLine(' Done!'); this._logger.appendLine(' Done!');
this.install(pkg).then(result => { await this.install(pkg);
resolve(true); } catch (err) {
}).catch(installError => { this._logger.appendLine(`[ERROR] ${err}`);
reject(installError); throw err;
}); }
}).catch(downloadError => { return true;
this._logger.appendLine(`[ERROR] ${downloadError}`);
reject(downloadError);
});
});
});
} }
private createTempFile(pkg: IPackage): Promise<tmp.SynchrounousResult> { private createTempFile(pkg: IPackage): Promise<tmp.SynchrounousResult> {

Просмотреть файл

@ -83,7 +83,7 @@ export function getServiceInstallDirectory(runtime: Runtime): Promise<string> {
if (runtime === undefined) { if (runtime === undefined) {
PlatformInformation.getCurrent().then(platformInfo => { PlatformInformation.getCurrent().then(platformInfo => {
if (platformInfo.isValidRuntime) { if (platformInfo.isValidRuntime) {
resolve(downloadProvider.getInstallDirectory(platformInfo.runtimeId)); resolve(downloadProvider.getOrMakeInstallDirectory(platformInfo.runtimeId));
} else { } else {
reject('unsupported runtime'); reject('unsupported runtime');
} }
@ -91,7 +91,7 @@ export function getServiceInstallDirectory(runtime: Runtime): Promise<string> {
reject(error); reject(error);
}); });
} else { } else {
resolve(downloadProvider.getInstallDirectory(runtime)); resolve(downloadProvider.getOrMakeInstallDirectory(runtime));
} }
}); });

Просмотреть файл

@ -14,7 +14,7 @@ import { Runtime } from '../src/models/platform';
import * as path from 'path'; import * as path from 'path';
import { ILogger } from '../src/models/interfaces'; import { ILogger } from '../src/models/interfaces';
import { Logger } from '../src/models/logger'; import { Logger } from '../src/models/logger';
import * as fse from 'fs-extra'; import * as fs from 'fs/promises';
interface IFixture { interface IFixture {
downloadUrl: string; downloadUrl: string;
@ -47,7 +47,7 @@ suite('ServiceDownloadProvider Tests', () => {
config.setup(x => x.getSqlToolsPackageVersion()).returns(() => expectedVersionFromConfig); config.setup(x => x.getSqlToolsPackageVersion()).returns(() => expectedVersionFromConfig);
let downloadProvider = new ServiceDownloadProvider(config.object, undefined, testStatusView.object, let downloadProvider = new ServiceDownloadProvider(config.object, undefined, testStatusView.object,
testHttpClient.object, testDecompressProvider.object); testHttpClient.object, testDecompressProvider.object);
let actual = downloadProvider.getInstallDirectory(Runtime.OSX_10_11_64); let actual = downloadProvider.getOrMakeInstallDirectory(Runtime.OSX_10_11_64);
assert.equal(expected, actual); assert.equal(expected, actual);
done(); done();
}); });
@ -62,7 +62,7 @@ suite('ServiceDownloadProvider Tests', () => {
config.setup(x => x.getSqlToolsPackageVersion()).returns(() => expectedVersionFromConfig); config.setup(x => x.getSqlToolsPackageVersion()).returns(() => expectedVersionFromConfig);
let downloadProvider = new ServiceDownloadProvider(config.object, undefined, testStatusView.object, let downloadProvider = new ServiceDownloadProvider(config.object, undefined, testStatusView.object,
testHttpClient.object, testDecompressProvider.object); testHttpClient.object, testDecompressProvider.object);
let actual = downloadProvider.getInstallDirectory(Runtime.OSX_10_11_64); let actual = downloadProvider.getOrMakeInstallDirectory(Runtime.OSX_10_11_64);
assert.equal(expected, actual); assert.equal(expected, actual);
done(); done();
}); });
@ -77,7 +77,7 @@ suite('ServiceDownloadProvider Tests', () => {
config.setup(x => x.getSqlToolsPackageVersion()).returns(() => expectedVersionFromConfig); config.setup(x => x.getSqlToolsPackageVersion()).returns(() => expectedVersionFromConfig);
let downloadProvider = new ServiceDownloadProvider(config.object, undefined, testStatusView.object, let downloadProvider = new ServiceDownloadProvider(config.object, undefined, testStatusView.object,
testHttpClient.object, testDecompressProvider.object); testHttpClient.object, testDecompressProvider.object);
let actual = downloadProvider.getInstallDirectory(Runtime.OSX_10_11_64); let actual = downloadProvider.getOrMakeInstallDirectory(Runtime.OSX_10_11_64);
assert.equal(expected, actual); assert.equal(expected, actual);
done(); done();
}); });
@ -92,7 +92,7 @@ suite('ServiceDownloadProvider Tests', () => {
config.setup(x => x.getSqlToolsPackageVersion()).returns(() => expectedVersionFromConfig); config.setup(x => x.getSqlToolsPackageVersion()).returns(() => expectedVersionFromConfig);
let downloadProvider = new ServiceDownloadProvider(config.object, undefined, testStatusView.object, let downloadProvider = new ServiceDownloadProvider(config.object, undefined, testStatusView.object,
testHttpClient.object, testDecompressProvider.object); testHttpClient.object, testDecompressProvider.object);
let actual = downloadProvider.getInstallDirectory(Runtime.OSX_10_11_64); let actual = downloadProvider.getOrMakeInstallDirectory(Runtime.OSX_10_11_64);
assert.equal(expected, actual); assert.equal(expected, actual);
done(); done();
}); });
@ -114,18 +114,18 @@ suite('ServiceDownloadProvider Tests', () => {
}); });
}); });
function createDownloadProvider(fixture: IFixture): IFixture { async function createDownloadProvider(fixture: IFixture): Promise<IFixture> {
let fileName = 'fileName'; let fileName = 'fileName';
let baseDownloadUrl = 'baseDownloadUrl/{#version#}/{#fileName#}'; let baseDownloadUrl = 'baseDownloadUrl/{#version#}/{#fileName#}';
let version = '1.0.0'; let version = '1.0.0';
let installFolder = path.join(__dirname, 'testService'); let installFolder = path.join(__dirname, 'testService');
let fileNamesJson = { Windows_7_64: `${fileName}` }; let fileNamesJson = { Windows_7_64: `${fileName}` };
let downloadUrl = 'baseDownloadUrl/1.0.0/fileName'; let downloadUrl = 'baseDownloadUrl/1.0.0/fileName';
fse.remove(installFolder, function (err): void { try {
if (err) { await fs.rmdir(installFolder);
return console.error(err); } catch (err) {
} console.error(err);
}); }
config.setup(x => x.getSqlToolsInstallDirectory()).returns(() => installFolder); config.setup(x => x.getSqlToolsInstallDirectory()).returns(() => installFolder);
config.setup(x => x.getSqlToolsConfigValue('downloadFileNames')).returns(() => fileNamesJson); config.setup(x => x.getSqlToolsConfigValue('downloadFileNames')).returns(() => fileNamesJson);
@ -151,7 +151,7 @@ suite('ServiceDownloadProvider Tests', () => {
return fixture; return fixture;
} }
test('installSQLToolsService should download and decompress the service and update the status', () => { test('installSQLToolsService should download and decompress the service and update the status', async () => {
let fixture: IFixture = { let fixture: IFixture = {
downloadUrl: undefined, downloadUrl: undefined,
downloadProvider: undefined, downloadProvider: undefined,
@ -159,7 +159,7 @@ suite('ServiceDownloadProvider Tests', () => {
decompressResult: Promise.resolve() decompressResult: Promise.resolve()
}; };
fixture = createDownloadProvider(fixture); fixture = await createDownloadProvider(fixture);
return fixture.downloadProvider.installSQLToolsService(Runtime.Windows_7_64).then(_ => { return fixture.downloadProvider.installSQLToolsService(Runtime.Windows_7_64).then(_ => {
testHttpClient.verify(x => x.downloadFile(fixture.downloadUrl, TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny(), testHttpClient.verify(x => x.downloadFile(fixture.downloadUrl, TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny(),
TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny()), TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny()),
@ -172,7 +172,7 @@ suite('ServiceDownloadProvider Tests', () => {
}); });
// @cssuh 10/22 - commented this test because it was throwing some random undefined errors // @cssuh 10/22 - commented this test because it was throwing some random undefined errors
test.skip('installSQLToolsService should not call decompress if download fails', () => { test.skip('installSQLToolsService should not call decompress if download fails', async () => {
let fixture: IFixture = { let fixture: IFixture = {
downloadUrl: undefined, downloadUrl: undefined,
downloadProvider: undefined, downloadProvider: undefined,
@ -180,7 +180,7 @@ suite('ServiceDownloadProvider Tests', () => {
decompressResult: Promise.resolve() decompressResult: Promise.resolve()
}; };
fixture = createDownloadProvider(fixture); fixture = await createDownloadProvider(fixture);
return fixture.downloadProvider.installSQLToolsService(Runtime.Windows_7_64).catch(_ => { return fixture.downloadProvider.installSQLToolsService(Runtime.Windows_7_64).catch(_ => {
testHttpClient.verify(x => x.downloadFile(fixture.downloadUrl, TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny(), testHttpClient.verify(x => x.downloadFile(fixture.downloadUrl, TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny(),
TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny()), TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny()),
@ -192,7 +192,7 @@ suite('ServiceDownloadProvider Tests', () => {
}); });
}); });
test.skip('installSQLToolsService should not update status to installed decompress fails', () => { test.skip('installSQLToolsService should not update status to installed decompress fails', async () => {
let fixture: IFixture = { let fixture: IFixture = {
downloadUrl: undefined, downloadUrl: undefined,
downloadProvider: undefined, downloadProvider: undefined,
@ -200,7 +200,7 @@ suite('ServiceDownloadProvider Tests', () => {
decompressResult: Promise.reject('download failed') decompressResult: Promise.reject('download failed')
}; };
fixture = createDownloadProvider(fixture); fixture = await createDownloadProvider(fixture);
return fixture.downloadProvider.installSQLToolsService(Runtime.Windows_7_64).catch(_ => { return fixture.downloadProvider.installSQLToolsService(Runtime.Windows_7_64).catch(_ => {
testHttpClient.verify(x => x.downloadFile(fixture.downloadUrl, TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny(), testHttpClient.verify(x => x.downloadFile(fixture.downloadUrl, TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny(),
TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny()), TypeMoq.It.isAny(), TypeMoq.It.isAny(), TypeMoq.It.isAny()),

Просмотреть файл

@ -33,7 +33,7 @@ suite('Server tests', () => {
function setupMocks(fixture: IFixture): void { function setupMocks(fixture: IFixture): void {
testConfig.setup(x => x.getSqlToolsExecutableFiles()).returns(() => fixture.executablesFromConfig); testConfig.setup(x => x.getSqlToolsExecutableFiles()).returns(() => fixture.executablesFromConfig);
testDownloadProvider.setup(x => x.getInstallDirectory(fixture.runtime)).returns(() => fixture.installDir); testDownloadProvider.setup(x => x.getOrMakeInstallDirectory(fixture.runtime)).returns(() => Promise.resolve(fixture.installDir));
testDownloadProvider.setup(x => x.installSQLToolsService(fixture.runtime)).callback(() => { testDownloadProvider.setup(x => x.installSQLToolsService(fixture.runtime)).callback(() => {
fixture.executablesFromConfig = [fixture.executableFileName.replace(fixture.installDir, '')]; fixture.executablesFromConfig = [fixture.executableFileName.replace(fixture.installDir, '')];
}).returns(() => { return Promise.resolve(true); }); }).returns(() => { return Promise.resolve(true); });

Просмотреть файл

@ -780,11 +780,6 @@ bl@^4.0.3:
inherits "^2.0.4" inherits "^2.0.4"
readable-stream "^3.4.0" readable-stream "^3.4.0"
bluebird@^2.10.1:
version "2.11.0"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1"
integrity sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=
bluebird@^3.3.4: bluebird@^3.3.4:
version "3.7.2" version "3.7.2"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
@ -2163,25 +2158,6 @@ fs-constants@^1.0.0:
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
fs-extra-promise@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/fs-extra-promise/-/fs-extra-promise-0.3.1.tgz#dd49b1e2135524f519ed8e9f5f4e03913c8e414b"
integrity sha1-3Umx4hNVJPUZ7Y6fX04DkTyOQUs=
dependencies:
bluebird "^2.10.1"
fs-extra "^0.26.2"
fs-extra@^0.26.2:
version "0.26.7"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9"
integrity sha1-muH92UiXeY7at20JGM9C0MMYT6k=
dependencies:
graceful-fs "^4.1.2"
jsonfile "^2.1.0"
klaw "^1.0.0"
path-is-absolute "^1.0.0"
rimraf "^2.2.8"
fs-minipass@^2.0.0: fs-minipass@^2.0.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
@ -2414,7 +2390,7 @@ glogg@^1.0.0:
dependencies: dependencies:
sparkles "^1.0.0" sparkles "^1.0.0"
graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.2: graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.2:
version "4.2.8" version "4.2.8"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
@ -3270,13 +3246,6 @@ json5@^0.5.1:
resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
jsonfile@^2.1.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug=
optionalDependencies:
graceful-fs "^4.1.6"
jsprim@^1.2.2: jsprim@^1.2.2:
version "1.4.1" version "1.4.1"
resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
@ -3324,13 +3293,6 @@ kind-of@^6.0.0, kind-of@^6.0.2:
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
klaw@^1.0.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk=
optionalDependencies:
graceful-fs "^4.1.9"
last-run@^1.1.0: last-run@^1.1.0:
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/last-run/-/last-run-1.1.1.tgz#45b96942c17b1c79c772198259ba943bebf8ca5b" resolved "https://registry.yarnpkg.com/last-run/-/last-run-1.1.1.tgz#45b96942c17b1c79c772198259ba943bebf8ca5b"