diff --git a/.github/workflows/native-dependency-build.yml b/.github/workflows/native-dependency-build.yml new file mode 100644 index 0000000000000..9820075060b8f --- /dev/null +++ b/.github/workflows/native-dependency-build.yml @@ -0,0 +1,28 @@ +name: Build-Native-Dependencies + +on: workflow_dispatch + +jobs: + build: + + runs-on: ${{ matrix.os }} + + strategy: + matrix: + node-version: [16.x] + os: ['ubuntu-latest', 'windows-latest', 'macos-latest'] + + steps: + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + - run: npm ci + - run: yarn prebuild:native-dependencies + - name: Upload Artifacts + uses: actions/upload-artifact@v3 + with: + name: native-dependencies + path: ./prebuild-native-dependencies/*.zip diff --git a/.gitignore b/.gitignore index 8fcd5853d2451..f7dd8f62ce79a 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,4 @@ dependency-check-summary.txt* *-trace.json .tours /performance-result.json +prebuild-native-dependencies diff --git a/doc/Publishing.md b/doc/Publishing.md index 72e8cb14fa21f..312caa849f3f4 100644 --- a/doc/Publishing.md +++ b/doc/Publishing.md @@ -3,16 +3,21 @@ ## Release Procedure -- [**Yarn Upgrade**](#yarn-upgrade) -- [**Announce Release**](#announce-release) -- [**Pre-Publishing Steps**](#pre-publishing-steps) -- [**Login to NPM Registry**](#login-to-npm-registry) -- [**Publish Packages**](#publish-packages) -- [**Commit Updated Versions**](#commit-updated-version) -- [**Create Release**](#create-release) -- [**Update Eclipse Release Page**](#update-eclipse-release-page) -- [**Post-Release**](#post-release) +- [Publishing](#publishing) + - [Release Procedure](#release-procedure) + - [Yarn Upgrade](#yarn-upgrade) + - [Announce Release](#announce-release) + - [Pre-Release Steps](#pre-release-steps) + - [Pre-Publishing Steps](#pre-publishing-steps) + - [Login to NPM Registry](#login-to-npm-registry) + - [Publish Packages](#publish-packages) + - [Commit Updated Version](#commit-updated-version) + - [Create Release](#create-release) + - [Update Eclipse Release Page](#update-eclipse-release-page) + - [Post Release](#post-release) - [Announce Release is Completed](#announce-release-is-completed) + - [Update Milestones](#update-milestones) + - [Update Roadmap](#update-roadmap) ## Yarn Upgrade @@ -150,6 +155,11 @@ Login to [Eclipse Foundation Theia project page]( https://projects.eclipse.org/p ## Post Release +Upload prebuild native dependencies to the release: +- Execute the `Build-Native-Dependencies` Github Action +- Download the `native-dependencies` artifact from the Job +- Upload the contents of the artifact as release assets to the theia release + ### Announce Release is Completed - Update the forum release post to announce that the release has completed. diff --git a/examples/browser/package.json b/examples/browser/package.json index ee948adc12e3d..bc02d36761c64 100644 --- a/examples/browser/package.json +++ b/examples/browser/package.json @@ -44,6 +44,7 @@ "@theia/preview": "1.38.0", "@theia/process": "1.38.0", "@theia/property-view": "1.38.0", + "@theia/remote": "1.38.0", "@theia/scm": "1.38.0", "@theia/scm-extra": "1.38.0", "@theia/search-in-workspace": "1.38.0", diff --git a/examples/browser/tsconfig.json b/examples/browser/tsconfig.json index d4bcfc14426b9..c69904961fe84 100644 --- a/examples/browser/tsconfig.json +++ b/examples/browser/tsconfig.json @@ -95,6 +95,9 @@ { "path": "../../packages/property-view" }, + { + "path": "../../packages/remote" + }, { "path": "../../packages/scm" }, diff --git a/examples/electron/package.json b/examples/electron/package.json index c25f70b2e9b97..0c13768ba72d1 100644 --- a/examples/electron/package.json +++ b/examples/electron/package.json @@ -45,6 +45,7 @@ "@theia/preview": "1.38.0", "@theia/process": "1.38.0", "@theia/property-view": "1.38.0", + "@theia/remote": "1.38.0", "@theia/scm": "1.38.0", "@theia/scm-extra": "1.38.0", "@theia/search-in-workspace": "1.38.0", diff --git a/examples/electron/tsconfig.json b/examples/electron/tsconfig.json index ccd4b9fbd4d34..edac6071a7d07 100644 --- a/examples/electron/tsconfig.json +++ b/examples/electron/tsconfig.json @@ -98,6 +98,9 @@ { "path": "../../packages/property-view" }, + { + "path": "../../packages/remote" + }, { "path": "../../packages/scm" }, diff --git a/package.json b/package.json index e60d22d59a095..25c126bd363cb 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@typescript-eslint/eslint-plugin": "^4.8.1", "@typescript-eslint/eslint-plugin-tslint": "^4.8.1", "@typescript-eslint/parser": "^4.8.1", + "archiver": "5.3.1", "chai": "4.3.4", "chai-spies": "1.0.0", "chai-string": "^1.4.0", @@ -78,6 +79,7 @@ "lint:oneshot": "node --max-old-space-size=4096 node_modules/eslint/bin/eslint.js --cache=true \"{dev-packages,packages,examples}/**/*.{ts,tsx}\"", "preinstall": "node-gyp install", "prepare": "yarn -s compile:references && lerna run prepare && yarn -s compile", + "prebuild:native-dependencies": "node scripts/build-native-dependencies", "publish:latest": "lerna publish --exact --yes --no-push && yarn -s publish:check", "publish:next": "lerna publish preminor --exact --canary --preid next --dist-tag next --no-git-reset --no-git-tag-version --no-push --yes && yarn -s publish:check", "publish:check": "node scripts/check-publish.js", diff --git a/packages/core/src/node/backend-application-module.ts b/packages/core/src/node/backend-application-module.ts index 40dff58c0b1d5..0293a1e394424 100644 --- a/packages/core/src/node/backend-application-module.ts +++ b/packages/core/src/node/backend-application-module.ts @@ -41,6 +41,8 @@ import { bindNodeStopwatch, bindBackendStopwatchServer } from './performance'; import { OSBackendApplicationContribution } from './os-backend-application-contribution'; import { BackendRequestFacade } from './request/backend-request-facade'; import { FileSystemLocking, FileSystemLockingImpl } from './filesystem-locking'; +import { DependencyDownloadContribution, DependencyDownloadService, DummyDependencyDownloader } from './dependency-download'; +import { DrivelistDependencyDownload, keytarDependencyDownload, NSFWDependencyDownload } from './native-dependency-download-contributions'; decorate(injectable(), ApplicationPackage); @@ -131,4 +133,10 @@ export const backendApplicationModule = new ContainerModule(bind => { bindBackendStopwatchServer(bind); bind(FileSystemLocking).to(FileSystemLockingImpl).inSingletonScope(); + bind(DependencyDownloadService).to(DummyDependencyDownloader); + bindContributionProvider(bind, DependencyDownloadContribution.Contribution); + + bind(DependencyDownloadContribution.Contribution).to(keytarDependencyDownload); + bind(DependencyDownloadContribution.Contribution).to(DrivelistDependencyDownload); + bind(DependencyDownloadContribution.Contribution).to(NSFWDependencyDownload); }); diff --git a/packages/core/src/node/dependency-download.ts b/packages/core/src/node/dependency-download.ts new file mode 100644 index 0000000000000..0c49302dc4214 --- /dev/null +++ b/packages/core/src/node/dependency-download.ts @@ -0,0 +1,87 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { NodeRequestOptions } from '@theia/request/lib/node-request-service'; +import { MaybePromise } from 'src/common'; +export interface FileDependencyResult { + targetFile: string; + /** Some files needs to be made executable on the target system */ + chmod?: number; +} + +export interface FileDependencyDownload { + /** Defaults to `true` */ + unzip?: boolean; + file: FileDependencyResult + downloadHandler: string | Buffer | (() => Promise) +} + +// Directories are expected to be in a zipped format anyway +// We always unzip them and call `files` on each contained file +export interface DirectoryDependencyDownload { + files: (path: string) => FileDependencyResult; + downloadHandler: string | Buffer | (() => Promise) +} + +export interface DownloadOptions { + remoteOS: string; + theiaVersion: string; + /** + * These are the `NodeRequestOptions` for the `NodeRequestService` + * returns undefined when url from requestInfo has been downloaded previously + */ + download: (requestInfo: string | NodeRequestOptions) => Promise +} + +/** + * contribution used for downloading prebuild nativ dependency when connecting to a remote machine with a different system + */ +export interface DependencyDownloadContribution { + // used to filter out multiple contributions downloading the same package + dependencyId: string; + + download(options: DownloadOptions): MaybePromise; +} + +export namespace DependencyDownloadContribution { + export const Contribution = Symbol('dependencyDownloadContribution'); + + const DEFAULT_DEPENDENCY_DOWNLOAD_URL = 'https://github.com/eclipse-theia/theia/releases'; + + export function getDefaultURLForFile(dependencyName: string, remoteSystem: string, theiaVersion: string): string { + return `${DEFAULT_DEPENDENCY_DOWNLOAD_URL}/${theiaVersion ? `tag/v${theiaVersion}` : 'latest'}/${dependencyName}-${remoteSystem}.zip`; + } + +} + +export const DependencyDownloadService = Symbol('dependencyDownloadService'); +/** + * used by the "@theia/remote" package to donwload nativ dependencies for the remote system; + */ +export interface DependencyDownloadService { + + /** + * downloads natvie dependencies for copying on a remote machine + * @param remoteSystem the operating system of the remote machine in format "{platform}-{architecure}"" e.g. "win32-x64" + */ + downloadDependencies(remoteSystem: string): MaybePromise>; +} + +export class DummyDependencyDownloader implements DependencyDownloadService { + downloadDependencies(remoteSystem: string): Array { + return []; + } +} diff --git a/packages/core/src/node/native-dependency-download-contributions.ts b/packages/core/src/node/native-dependency-download-contributions.ts new file mode 100644 index 0000000000000..bb4b81c3f33da --- /dev/null +++ b/packages/core/src/node/native-dependency-download-contributions.ts @@ -0,0 +1,93 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { injectable } from 'inversify'; +import { DependencyDownloadContribution, DirectoryDependencyDownload, DownloadOptions, FileDependencyDownload } from './dependency-download'; + +@injectable() +export class DrivelistDependencyDownload implements DependencyDownloadContribution { + dependencyId = 'drivelist'; + + async download(options: DownloadOptions): Promise { + return { + file: { + targetFile: 'lib/backend/native/drivelist.node' + }, + unzip: true, + downloadHandler: await options.download(DependencyDownloadContribution.getDefaultURLForFile('drivelist', options.remoteOS, options.theiaVersion)) + }; + } +} + +@injectable() +export class keytarDependencyDownload implements DependencyDownloadContribution { + dependencyId = 'keytar'; + + async download(options: DownloadOptions): Promise { + return { + file: { + targetFile: 'lib/backend/native/keytar.node' + }, + unzip: true, + downloadHandler: await options.download(DependencyDownloadContribution.getDefaultURLForFile('keytar', options.remoteOS, options.theiaVersion)) + }; + } +} + +@injectable() +export class NSFWDependencyDownload implements DependencyDownloadContribution { + dependencyId = 'nsfw'; + + async download(options: DownloadOptions): Promise { + return { + file: { + targetFile: 'lib/backend/native/nsfw.node' + }, + unzip: true, + downloadHandler: await options.download(DependencyDownloadContribution.getDefaultURLForFile('nsfw', options.remoteOS, options.theiaVersion)) + }; + } +} + +const BASE_URL = 'https://github.com/microsoft/ripgrep-prebuilt/releases/download/v13.0.0-8/ripgrep-v13.0.0-8'; +@injectable() +export class RigrepDependencyDownload implements DependencyDownloadContribution { + dependencyId = 'rigrep'; + async download(options: DownloadOptions): Promise { + return { + file: { + targetFile: `lib/backend/native/rg${options.remoteOS.startsWith('win32') ? '.exe' : ''}` + }, + unzip: true, + downloadHandler: await options.download(this.getDownloadUrl(options.remoteOS)) + }; + } + + getDownloadUrl(remoteOS: string): string { + const [platform, architecure] = remoteOS.split('-'); + + let transformedPlatform: string; + if (remoteOS.includes('darwin')) { + transformedPlatform = 'apple-darwin'; + } else if (remoteOS.includes('win')) { + transformedPlatform = 'pc-windows-msvc'; + } else { + transformedPlatform = 'unkown-linux-gnu'; + } + + return `${BASE_URL}-${architecure === 'x64' ? 'x86_64' : architecure}-${transformedPlatform}.${platform.includes('win') ? 'zip' : 'tar.gz'}`; + } +} diff --git a/packages/file-search/src/node/file-search-backend-module.ts b/packages/file-search/src/node/file-search-backend-module.ts index 3a3b48fb71e34..2c5e0c812390d 100644 --- a/packages/file-search/src/node/file-search-backend-module.ts +++ b/packages/file-search/src/node/file-search-backend-module.ts @@ -18,6 +18,8 @@ import { ContainerModule } from '@theia/core/shared/inversify'; import { ConnectionHandler, JsonRpcConnectionHandler } from '@theia/core/lib/common'; import { FileSearchServiceImpl } from './file-search-service-impl'; import { fileSearchServicePath, FileSearchService } from '../common/file-search-service'; +import { DependencyDownloadContribution } from '@theia/core/lib/node/dependency-download'; +import { RigrepDependencyDownload } from '@theia/core/lib/node/native-dependency-download-contributions'; export default new ContainerModule(bind => { @@ -27,4 +29,6 @@ export default new ContainerModule(bind => { ctx.container.get(FileSearchService) ) ).inSingletonScope(); + + bind(DependencyDownloadContribution.Contribution).to(RigrepDependencyDownload); }); diff --git a/packages/git/src/node/git-backend-module.ts b/packages/git/src/node/git-backend-module.ts index 6850379d66534..bae817ed9b247 100644 --- a/packages/git/src/node/git-backend-module.ts +++ b/packages/git/src/node/git-backend-module.ts @@ -30,6 +30,8 @@ import { GitPromptServer, GitPromptClient, GitPrompt } from '../common/git-promp import { DugiteGitPromptServer } from './dugite-git-prompt'; import { ConnectionContainerModule } from '@theia/core/lib/node/messaging/connection-container-module'; import { DefaultGitInit, GitInit } from './init/git-init'; +import { DependencyDownloadContribution } from '@theia/core/lib/node/dependency-download'; +import { FindGitRepositoriesDependencyDownload } from './nativ-dependencies/find-git-repositories-download-contribution'; const SINGLE_THREADED = process.argv.indexOf('--no-cluster') !== -1; @@ -77,6 +79,7 @@ export function bindGit(bind: interfaces.Bind, bindingOptions: GitBindingOptions bind(DefaultGitInit).toSelf(); bind(GitInit).toService(DefaultGitInit); bind(ConnectionContainerModule).toConstantValue(gitConnectionModule); + bind(DependencyDownloadContribution.Contribution).to(FindGitRepositoriesDependencyDownload); } const gitConnectionModule = ConnectionContainerModule.create(({ bind, bindBackendService }) => { diff --git a/packages/git/src/node/nativ-dependencies/find-git-repositories-download-contribution.ts b/packages/git/src/node/nativ-dependencies/find-git-repositories-download-contribution.ts new file mode 100644 index 0000000000000..4fed07d04699f --- /dev/null +++ b/packages/git/src/node/nativ-dependencies/find-git-repositories-download-contribution.ts @@ -0,0 +1,33 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { DependencyDownloadContribution, DirectoryDependencyDownload, DownloadOptions, FileDependencyDownload } from '@theia/core/lib/node/dependency-download'; +import { injectable } from '@theia/core/shared/inversify'; + +@injectable() +export class FindGitRepositoriesDependencyDownload implements DependencyDownloadContribution { + dependencyId = 'find-git-repositories'; + + async download(options: DownloadOptions): Promise { + return { + file: { + targetFile: 'lib/backend/native/findGitRepos.node' + }, + unzip: true, + downloadHandler: await options.download(DependencyDownloadContribution.getDefaultURLForFile('findGitRepos', options.remoteOS, options.theiaVersion)) + }; + } +} diff --git a/packages/process/src/node/node-pty-download-contribution.ts b/packages/process/src/node/node-pty-download-contribution.ts new file mode 100644 index 0000000000000..d99f1e82306a6 --- /dev/null +++ b/packages/process/src/node/node-pty-download-contribution.ts @@ -0,0 +1,33 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { DependencyDownloadContribution, DirectoryDependencyDownload, DownloadOptions, FileDependencyDownload } from '@theia/core/lib/node/dependency-download'; +import { injectable } from '@theia/core/shared/inversify'; +import path = require('path'); + +@injectable() +export class NodePtyDependencyDownload implements DependencyDownloadContribution { + dependencyId = 'node-pty'; + + async download(options: DownloadOptions): Promise { + return { + files: filePath => ({ + targetFile: filePath.endsWith('pty.node') ? 'lib/backend/native/pty.node' : `lib/build/Release/${path.basename(filePath)}` + }), + downloadHandler: await options.download(DependencyDownloadContribution.getDefaultURLForFile('node-pty', options.remoteOS, options.theiaVersion)) + }; + } +} diff --git a/packages/process/src/node/process-backend-module.ts b/packages/process/src/node/process-backend-module.ts index 9d7cb826655e2..c6e9f0f998aa9 100644 --- a/packages/process/src/node/process-backend-module.ts +++ b/packages/process/src/node/process-backend-module.ts @@ -22,6 +22,8 @@ import { BackendApplicationContribution } from '@theia/core/lib/node'; import { ProcessManager } from './process-manager'; import { ILogger } from '@theia/core/lib/common'; import { MultiRingBuffer, MultiRingBufferOptions } from './multi-ring-buffer'; +import { DependencyDownloadContribution } from '@theia/core/lib/node/dependency-download'; +import { NodePtyDependencyDownload } from './node-pty-download-contribution'; export default new ContainerModule(bind => { bind(RawProcess).toSelf().inTransientScope(); @@ -64,4 +66,6 @@ export default new ContainerModule(bind => { bind(MultiRingBuffer).toSelf().inTransientScope(); /* 1MB size, TODO should be a user preference. */ bind(MultiRingBufferOptions).toConstantValue({ size: 1048576 }); + + bind(DependencyDownloadContribution.Contribution).to(NodePtyDependencyDownload); }); diff --git a/packages/remote/.eslintrc.js b/packages/remote/.eslintrc.js new file mode 100644 index 0000000000000..13089943582b6 --- /dev/null +++ b/packages/remote/.eslintrc.js @@ -0,0 +1,10 @@ +/** @type {import('eslint').Linter.Config} */ +module.exports = { + extends: [ + '../../configs/build.eslintrc.json' + ], + parserOptions: { + tsconfigRootDir: __dirname, + project: 'tsconfig.json' + } +}; diff --git a/packages/remote/README.md b/packages/remote/README.md new file mode 100644 index 0000000000000..cda0962619ac0 --- /dev/null +++ b/packages/remote/README.md @@ -0,0 +1,29 @@ +
+ +
+ +theia-ext-logo + +

ECLIPSE THEIA - REMOTE EXTENSION

+ +
+ +
+ +## Description + + +## Additional Information + +- [API documentation for] +- [Theia - GitHub](https://github.com/eclipse-theia/theia) +- [Theia - Website](https://theia-ide.org/) + +## License + +- [Eclipse Public License 2.0](http://www.eclipse.org/legal/epl-2.0/) +- [δΈ€ (Secondary) GNU General Public License, version 2 with the GNU Classpath Exception](https://projects.eclipse.org/license/secondary-gpl-2.0-cp) + +## Trademark +"Theia" is a trademark of the Eclipse Foundation +https://www.eclipse.org/theia diff --git a/packages/remote/package.json b/packages/remote/package.json new file mode 100644 index 0000000000000..2bfaae522c36f --- /dev/null +++ b/packages/remote/package.json @@ -0,0 +1,50 @@ +{ + "name": "@theia/remote", + "version": "1.38.0", + "description": "Theia - Remote", + "dependencies": { + "@theia/core": "1.38.0", + "decompress": "^4.2.1", + "ssh2": "1.13.0" + }, + "publishConfig": { + "access": "public" + }, + "theiaExtensions": [ + { + "backend": "lib/node/remote-backend-module" + } + ], + "keywords": [ + "theia-extension" + ], + "license": "EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0", + "repository": { + "type": "git", + "url": "https://github.com/theia-ide/theia.git" + }, + "bugs": { + "url": "https://github.com/theia-ide/theia/issues" + }, + "homepage": "https://github.com/theia-ide/theia", + "files": [ + "lib", + "src" + ], + "scripts": { + "build": "theiaext build", + "clean": "theiaext clean", + "compile": "theiaext compile", + "lint": "theiaext lint", + "test": "theiaext test", + "watch": "theiaext watch" + }, + "devDependencies": { + "@theia/ext-scripts": "1.38.0", + "@types/express-http-proxy": "^1.6.3", + "@types/ssh2": "^1.11.11" + }, + "nyc": { + "extends": "../../configs/nyc.json" + } +} diff --git a/packages/remote/src/node/native-dependency-download/native-dependency-download-service.ts b/packages/remote/src/node/native-dependency-download/native-dependency-download-service.ts new file mode 100644 index 0000000000000..194455de1c03f --- /dev/null +++ b/packages/remote/src/node/native-dependency-download/native-dependency-download-service.ts @@ -0,0 +1,67 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { ContributionProvider } from '@theia/core'; +import { inject, injectable, named } from '@theia/core/shared/inversify'; +import { ApplicationPackage } from '@theia/core/shared/@theia/application-package'; +import { DependencyDownloadContribution, DependencyDownloadService, DirectoryDependencyDownload, FileDependencyDownload } from '@theia/core/lib/node/dependency-download'; +import { NodeRequestOptions, NodeRequestService } from '@theia/core/shared/@theia/request/lib/node-request-service'; + +const DEFAULT_HTTP_OPTIONS = { + method: 'GET', + headers: { + Accept: 'application/octet-stream' + }, +}; + +@injectable() +export class NativeDependencyDownloadService implements DependencyDownloadService { + + @inject(ContributionProvider) @named(DependencyDownloadContribution.Contribution) + protected dependencyDownloadContributions: ContributionProvider; + + @inject(ApplicationPackage) + protected applicationPackage: ApplicationPackage; + + @inject(NodeRequestService) + protected nodeRequestService: NodeRequestService; + + async downloadDependencies(remoteOS: string): Promise> { + if (!this.applicationPackage.pck.version) { + throw new Error('No Theia version found. Can\'t download dependencies'); + } + return Promise.all(this.dependencyDownloadContributions.getContributions() + .filter((contribution, index) => this.dependencyDownloadContributions.getContributions().findIndex(c => c.dependencyId === contribution.dependencyId) !== index) + .map(async contribution => + contribution.download({ + remoteOS, + theiaVersion: this.applicationPackage.pck.version!, + download: (requestInfo: string | NodeRequestOptions) => this.downloadDependency(requestInfo) + }) + )); + } + + protected async downloadDependency(downloadURI: string | NodeRequestOptions): Promise { + const req = await this.nodeRequestService.request(typeof downloadURI === 'string' ? { url: downloadURI, ...DEFAULT_HTTP_OPTIONS } : downloadURI); + if (!req.res.statusCode || req.res.statusCode >= 400) { + throw new Error('Server error while downloading nativ dependency'); + } else if (req.res.statusCode >= 300 && req.res.statusCode < 400) { + return this.downloadDependency(req.res.headers.location!); + } else { + return Buffer.from(req.buffer); + } + } +} diff --git a/packages/remote/src/node/remote-backend-module.ts b/packages/remote/src/node/remote-backend-module.ts new file mode 100644 index 0000000000000..1cf3c690bdac7 --- /dev/null +++ b/packages/remote/src/node/remote-backend-module.ts @@ -0,0 +1,24 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { ContainerModule } from '@theia/core/shared/inversify'; +import { DependencyDownloadService } from '@theia/core/lib/node/dependency-download'; +import { NativeDependencyDownloadService } from './native-dependency-download/native-dependency-download-service'; + +export default new ContainerModule((bind, unbind, isBound, rebind) => { + rebind(DependencyDownloadService).to(NativeDependencyDownloadService); +}); + diff --git a/packages/remote/src/package.spec.ts b/packages/remote/src/package.spec.ts new file mode 100644 index 0000000000000..5adcd925367c9 --- /dev/null +++ b/packages/remote/src/package.spec.ts @@ -0,0 +1,28 @@ +// ***************************************************************************** +// Copyright (C) 2023 Typefox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 +// ***************************************************************************** + +/* note: this bogus test file is required so that + we are able to run mocha unit tests on this + package, without having any actual unit tests in it. + This way a coverage report will be generated, + showing 0% coverage, instead of no report. + This file can be removed once we have real unit + tests in place. */ + +describe('remote package', () => { + + it('support code coverage statistics', () => true); +}); diff --git a/packages/remote/tsconfig.json b/packages/remote/tsconfig.json new file mode 100644 index 0000000000000..b623c1e105ac7 --- /dev/null +++ b/packages/remote/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../configs/base.tsconfig", + "compilerOptions": { + "composite": true, + "rootDir": "src", + "outDir": "lib" + }, + "include": [ + "src" + ], + "references": [ + { + "path": "../core" + } + ] +} diff --git a/packages/search-in-workspace/src/node/search-in-workspace-backend-module.ts b/packages/search-in-workspace/src/node/search-in-workspace-backend-module.ts index 5ac59a99031f5..3b450098f618d 100644 --- a/packages/search-in-workspace/src/node/search-in-workspace-backend-module.ts +++ b/packages/search-in-workspace/src/node/search-in-workspace-backend-module.ts @@ -19,6 +19,8 @@ import { ConnectionHandler, JsonRpcConnectionHandler } from '@theia/core/lib/com import { SearchInWorkspaceServer, SearchInWorkspaceClient, SIW_WS_PATH } from '../common/search-in-workspace-interface'; import { RipgrepSearchInWorkspaceServer, RgPath } from './ripgrep-search-in-workspace-server'; import { rgPath } from '@vscode/ripgrep'; +import { DependencyDownloadContribution } from '@theia/core/lib/node/dependency-download'; +import { RigrepDependencyDownload } from '@theia/core/lib/node/native-dependency-download-contributions'; export default new ContainerModule(bind => { bind(SearchInWorkspaceServer).to(RipgrepSearchInWorkspaceServer); @@ -30,4 +32,5 @@ export default new ContainerModule(bind => { return server; })); bind(RgPath).toConstantValue(rgPath); + bind(DependencyDownloadContribution.Contribution).to(RigrepDependencyDownload); }); diff --git a/scripts/build-native-dependencies.js b/scripts/build-native-dependencies.js new file mode 100644 index 0000000000000..a28aca69328be --- /dev/null +++ b/scripts/build-native-dependencies.js @@ -0,0 +1,56 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 +// ***************************************************************************** + +const execSync = require('child_process').execSync; +const path = require('path'); +const fs = require('fs'); +const archiver = require('archiver'); + +const modulesToBuild = [ + { name: "cpu-features", files: ['build/Release/cpufeatures.node'] }, + { name: "drivelist", files: ['build/Release/drivelist.node'] }, + { name: "find-git-repositories", files: ['build/Release/findGitRepos.node'] }, + { name: "keytar", files: ['build/Release/keytar.node'] }, + { name: "nsfw", files: ['build/Release/nsfw.node'] }, + { name: "node-pty", files: ['build/Release/pty.node', 'build/Release/spawn-helper', 'build/Release/winpty-agent.exe', 'build/Release/winpty.dll'] }, +] + +const artifactsPath = path.join(process.cwd(), 'artifacts'); + +if (fs.existsSync(artifactsPath)) { + fs.rmSync(artifactsPath, { recursive: true }); +} + +for (let module of modulesToBuild) { + const modulePath = path.join(process.cwd(), 'node_modules', module.name); + console.log(modulePath) + execSync('node-gyp rebuild', { cwd: modulePath, stdio: 'inherit' }); + const dstDir = path.join(artifactsPath, module.name); + for (let file of module.files) { + if (!fs.existsSync(dstDir)) { + fs.mkdirSync(dstDir, { recursive: true }); + } + const fileToCopy = path.join(modulePath.toString(), file) + if (fs.existsSync(fileToCopy)) { + fs.copyFileSync(fileToCopy, path.join(dstDir, path.basename(file))); + } + } + const archive = archiver('zip'); + const output = fs.createWriteStream(path.join(artifactsPath, `${module.name}-${process.platform}-${process.arch}.zip`), { flags: "w" }); + archive.pipe(output); + archive.directory(dstDir, false); + archive.finalize(); +} diff --git a/tsconfig.json b/tsconfig.json index bcdceef63de0c..5ee8291b90440 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -138,6 +138,9 @@ { "path": "packages/property-view" }, + { + "path": "packages/remote" + }, { "path": "packages/scm" }, diff --git a/yarn.lock b/yarn.lock index e9238875ce7ec..5e36f9952c4a2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1830,6 +1830,13 @@ resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== +"@types/express-http-proxy@^1.6.3": + version "1.6.3" + resolved "https://registry.yarnpkg.com/@types/express-http-proxy/-/express-http-proxy-1.6.3.tgz#35fc0fb32e7741bc50619869de381ef759621fd0" + integrity sha512-dX3+Cb0HNPtqhC5JUWzzuODHRlgJRZx7KvwKVVwkOvm+8vOtpsh3qy8+qLv5X1hs4vdVHWKyXf86DwJot5H8pg== + dependencies: + "@types/express" "*" + "@types/express-serve-static-core@^4.17.33": version "4.17.33" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz#de35d30a9d637dc1450ad18dd583d75d5733d543" @@ -2030,7 +2037,7 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*", "@types/node@16", "@types/node@>=10.0.0", "@types/node@^10.14.22", "@types/node@^16.11.26": +"@types/node@*", "@types/node@16", "@types/node@>=10.0.0", "@types/node@^10.14.22", "@types/node@^16.11.26", "@types/node@^18.11.18": version "16.18.12" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.12.tgz#e3bfea80e31523fde4292a6118f19ffa24fd6f65" integrity sha512-vzLe5NaNMjIE3mcddFVGlAXN1LEWueUsMsOJWaT6wWMJGyljHAWHznqfnKUQWGzu7TLPrGvWdNAsvQYW+C0xtw== @@ -2155,6 +2162,13 @@ resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz#bf2e02a3dbd4aecaf95942ecd99b7402e03fad5e" integrity sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA== +"@types/ssh2@^1.11.11": + version "1.11.11" + resolved "https://registry.yarnpkg.com/@types/ssh2/-/ssh2-1.11.11.tgz#02fb707d821890a655fd27c2d842b0c7114078fb" + integrity sha512-LdnE7UBpvHCgUznvn2fwLt2hkaENcKPFqOyXGkvyTLfxCXBN6roc1RmECNYuzzbHePzD3PaAov5rri9hehzx9Q== + dependencies: + "@types/node" "^18.11.18" + "@types/tar-fs@^1.16.1": version "1.16.3" resolved "https://registry.yarnpkg.com/@types/tar-fs/-/tar-fs-1.16.3.tgz#425b2b817c405d13d051f36ec6ec6ebd25e31069" @@ -2777,6 +2791,35 @@ aproba@^1.0.3: resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== +archiver-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2" + integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw== + dependencies: + glob "^7.1.4" + graceful-fs "^4.2.0" + lazystream "^1.0.0" + lodash.defaults "^4.2.0" + lodash.difference "^4.5.0" + lodash.flatten "^4.4.0" + lodash.isplainobject "^4.0.6" + lodash.union "^4.6.0" + normalize-path "^3.0.0" + readable-stream "^2.0.0" + +archiver@5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-5.3.1.tgz#21e92811d6f09ecfce649fbefefe8c79e57cbbb6" + integrity sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w== + dependencies: + archiver-utils "^2.1.0" + async "^3.2.3" + buffer-crc32 "^0.2.1" + readable-stream "^3.6.0" + readdir-glob "^1.0.0" + tar-stream "^2.2.0" + zip-stream "^4.1.0" + archy@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" @@ -2899,6 +2942,13 @@ asap@^2.0.0: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== +asn1@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" @@ -3053,6 +3103,13 @@ base64id@2.0.0, base64id@~2.0.0: resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== +bcrypt-pbkdf@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + before-after-hook@^2.2.0: version "2.2.3" resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" @@ -3209,7 +3266,7 @@ buffer-alloc@^1.2.0: buffer-alloc-unsafe "^1.1.0" buffer-fill "^1.0.0" -buffer-crc32@~0.2.3: +buffer-crc32@^0.2.1, buffer-crc32@^0.2.13, buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== @@ -3250,6 +3307,11 @@ buffers@~0.1.1: resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" integrity sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ== +buildcheck@~0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/buildcheck/-/buildcheck-0.0.6.tgz#89aa6e417cfd1e2196e3f8fe915eb709d2fe4238" + integrity sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A== + builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -3689,6 +3751,16 @@ compare-func@^2.0.0: array-ify "^1.0.0" dot-prop "^5.1.0" +compress-commons@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.1.1.tgz#df2a09a7ed17447642bad10a85cc9a19e5c42a7d" + integrity sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ== + dependencies: + buffer-crc32 "^0.2.13" + crc32-stream "^4.0.2" + normalize-path "^3.0.0" + readable-stream "^3.6.0" + compression-webpack-plugin@^9.0.0: version "9.2.0" resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-9.2.0.tgz#57fd539d17c5907eebdeb4e83dcfe2d7eceb9ef6" @@ -3951,6 +4023,27 @@ cosmiconfig@8.0.0: parse-json "^5.0.0" path-type "^4.0.0" +cpu-features@~0.0.7: + version "0.0.8" + resolved "https://registry.yarnpkg.com/cpu-features/-/cpu-features-0.0.8.tgz#a2d464b023b8ad09004c8cdca23b33f192f63546" + integrity sha512-BbHBvtYhUhksqTjr6bhNOjGgMnhwhGTQmOoZGD+K7BCaQDCuZl/Ve1ZxUSMRwVC4D/rkCPQ2MAIeYzrWyK7eEg== + dependencies: + buildcheck "~0.0.6" + nan "^2.17.0" + +crc-32@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + +crc32-stream@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.2.tgz#c922ad22b38395abe9d3870f02fa8134ed709007" + integrity sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w== + dependencies: + crc-32 "^1.2.0" + readable-stream "^3.4.0" + cross-fetch@3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" @@ -6738,6 +6831,13 @@ kind-of@^6.0.2, kind-of@^6.0.3: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +lazystream@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638" + integrity sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw== + dependencies: + readable-stream "^2.0.5" + lerna@^6.0.1: version "6.5.1" resolved "https://registry.yarnpkg.com/lerna/-/lerna-6.5.1.tgz#eb89698e5b2891f5681f39d980f63d0519fc464f" @@ -6992,6 +7092,21 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.defaults@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ== + +lodash.difference@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" + integrity sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA== + +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== + lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" @@ -7007,6 +7122,11 @@ lodash.ismatch@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" integrity sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g== +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -7022,6 +7142,11 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== +lodash.union@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" + integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw== + lodash@^4.17.15, lodash@^4.17.21, lodash@^4.5.1: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -7616,7 +7741,7 @@ mute-stream@0.0.8, mute-stream@~0.0.4: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -nan@^2.14.0: +nan@^2.14.0, nan@^2.17.0: version "2.17.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== @@ -9149,6 +9274,19 @@ readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stre string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@^2.0.0, readable-stream@^2.0.5: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -9162,6 +9300,13 @@ readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" +readdir-glob@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.3.tgz#c3d831f51f5e7bfa62fa2ffbe4b508c640f09584" + integrity sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA== + dependencies: + minimatch "^5.1.0" + readdir-scoped-modules@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" @@ -9461,7 +9606,7 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.2: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.2, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -9910,6 +10055,17 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +ssh2@1.13.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-1.13.0.tgz#9b53a07534fa72283ada471b82395a3b3c875934" + integrity sha512-CIZBFRRY1y9mAZSqBGFE4EB4dNJad2ysT2PqO8OpkiI3UTB/gUZwE5EaN16qVyQ6s/M7EgC/iaV/MnjdlvnuzA== + dependencies: + asn1 "^0.2.6" + bcrypt-pbkdf "^1.0.2" + optionalDependencies: + cpu-features "~0.0.7" + nan "^2.17.0" + ssri@9.0.1, ssri@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" @@ -10187,7 +10343,7 @@ tar-stream@^1.1.2, tar-stream@^1.5.2: to-buffer "^1.1.1" xtend "^4.0.0" -tar-stream@^2.1.4, tar-stream@~2.2.0: +tar-stream@^2.1.4, tar-stream@^2.2.0, tar-stream@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== @@ -10482,6 +10638,11 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" +tweetnacl@^0.14.3: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -11376,3 +11537,12 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zip-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.1.0.tgz#51dd326571544e36aa3f756430b313576dc8fc79" + integrity sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A== + dependencies: + archiver-utils "^2.1.0" + compress-commons "^4.1.0" + readable-stream "^3.6.0"