From b8a27934158a23a58a6169c9e387337fde00624f Mon Sep 17 00:00:00 2001 From: Shane Dell <32347414+Shanedell@users.noreply.github.com> Date: Fri, 18 Feb 2022 10:53:44 -0500 Subject: [PATCH] gRPC demo client --- .gitignore | 2 + package.json | 28 +++- src/adapter/activateDaffodilDebug.ts | 2 + src/omegaEdit/demoClient.ts | 204 +++++++++++++++++++++++++++ src/omegaEdit/omegaUtils.ts | 148 +++++++++++++++++++ src/omegaEdit/server.ts | 174 +++++++++++++++++++++++ yarn.lock | 123 +++++++++++++++- 7 files changed, 677 insertions(+), 4 deletions(-) create mode 100644 src/omegaEdit/demoClient.ts create mode 100644 src/omegaEdit/omegaUtils.ts create mode 100644 src/omegaEdit/server.ts diff --git a/.gitignore b/.gitignore index 22e605168..6ae2b9139 100644 --- a/.gitignore +++ b/.gitignore @@ -45,3 +45,5 @@ src/version.ts # either /tmp or XDG or ... datafile-hex npm-debug.log + +src/omegaEdit/client diff --git a/package.json b/package.json index 1329f9409..3d3e8d083 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,9 @@ "name": "apache-daffodil-vscode", "displayName": "Apache Daffodil VS Code Extension", "description": "VS Code extension for Apache Daffodil DFDL schema debugging", - "version": "1.0.0", + "version": "1.2.0", "daffodilVersion": "3.2.1", + "omegaVersion": "0.8.1", "publisher": "asf", "author": "Apache Daffodil", "license": "Apache-2.0", @@ -40,9 +41,13 @@ "post-build": "rm -rf NOTICE LICENSE && mv tmp.LICENSE LICENSE && mv tmp.NOTICE NOTICE" }, "dependencies": { + "@grpc/grpc-js": "^1.5.4", "await-notify": "1.0.1", "child_process": "^1.0.2", + "google-protobuf": "^3.19.4", "hexy": "^0.3.1", + "minimist": "^1.2.5", + "omega-edit": "0.8.1", "unzip-stream": "^0.3.1", "vscode-debugadapter": "^1.46.0", "xdg-app-paths": "^7.3.0" @@ -63,7 +68,6 @@ "webpack-cli": "^3.3.12" }, "main": "./dist/ext/extension.js", - "browser": "./dist/web/extension.js", "activationEvents": [ "onDebugResolve:dfdl", "onDebugDynamicConfigurations:dfdl", @@ -71,7 +75,9 @@ "onCommand:extension.dfdl-debug.getDataName", "onCommand:extension.dfdl-debug.runEditorContents", "onCommand:extension.dfdl-debug.debugEditorContents", - "onCommand:launch.config" + "onCommand:launch.config", + "onCommand:omega.grpc", + "onCommand:omega.version" ], "workspaceTrust": { "request": "never" @@ -123,6 +129,12 @@ { "command": "extension.dfdl-debug.runEditorContents", "when": "resourceLangId == xml" + }, + { + "command": "omega.grpc" + }, + { + "command": "omega.version" } ], "debug/variables/context": [ @@ -186,6 +198,16 @@ "category": "Daffodil Debug", "enablement": "!inDebugMode", "icon": "$(debug-configure)" + }, + { + "command": "omega.version", + "title": "Omega Edit Ω Version Info", + "category": "Omega" + }, + { + "command": "omega.grpc", + "title": "Omega Edit Ω gRPC Demo", + "category": "Omega" } ], "breakpoints": [ diff --git a/src/adapter/activateDaffodilDebug.ts b/src/adapter/activateDaffodilDebug.ts index ca243c150..1e9b256bd 100644 --- a/src/adapter/activateDaffodilDebug.ts +++ b/src/adapter/activateDaffodilDebug.ts @@ -21,6 +21,7 @@ import * as fs from 'fs' import * as infoset from '../infoset' import { getConfig, setCurrentConfig } from '../utils' import * as launchWizard from '../launchWizard/launchWizard' +import * as omegaClient from '../omegaEdit/demoClient' // Function for setting up the commands for Run and Debug file function createDebugRunFileConfigs(resource: vscode.Uri, runOrDebug: String) { @@ -264,6 +265,7 @@ export function activateDaffodilDebug( infoset.activate(context) launchWizard.activate(context) + omegaClient.activate(context) } class DaffodilConfigurationProvider diff --git a/src/omegaEdit/demoClient.ts b/src/omegaEdit/demoClient.ts new file mode 100644 index 000000000..7be2fe3ba --- /dev/null +++ b/src/omegaEdit/demoClient.ts @@ -0,0 +1,204 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as vscode from 'vscode' +import { + ChangeKind, + ChangeRequest, + ViewportDataRequest, +} from 'omega-edit/omega_edit_pb' +import { + client, + getVersion, + newSession, + newViewport, + deleteSession, + // deleteViewport, + randomId, + // uri, + viewportSubscribe, +} from './omegaUtils' +import { startServer, stopServer } from './server' + +let serverRunning = false + +async function cleanupViewportSession( + sessionId: string, + viewportIds: Array +) { + // viewportIds.forEach(async (vId) => { + // await deleteViewport(vId) + // }) + + await deleteSession(sessionId) +} + +export function activate(ctx: vscode.ExtensionContext) { + ctx.subscriptions.push( + vscode.commands.registerCommand('omega.version', async () => { + if (!serverRunning) { + await startServer(ctx) + serverRunning = true + } + let v = await getVersion() + vscode.window.showInformationMessage(v) + }) + ) + + ctx.subscriptions.push( + vscode.commands.registerCommand('omega.grpc', async () => { + if (!serverRunning) { + await startServer(ctx) + serverRunning = true + } + + let panel = vscode.window.createWebviewPanel( + 'viewport', + 'Ω Edit gRPC', + vscode.ViewColumn.One, + { + enableScripts: true, + } + ) + + // panel.webview.html = getWebviewContent(uri) + panel.webview.html = getWebviewContent() + + let fileToEdit = await vscode.window + .showOpenDialog({ + canSelectMany: false, + openLabel: 'Select', + canSelectFiles: true, + canSelectFolders: false, + }) + .then((fileUri) => { + if (fileUri && fileUri[0]) { + return fileUri[0].fsPath + } + }) + + let s = await newSession(fileToEdit) + // panel.webview.postMessage({ command: 'session', text: s }) + + let vpin = await newViewport(randomId().toString(), s, 0, 1000) + let vp1 = await newViewport(randomId().toString(), s, 0, 64) + let vp2 = await newViewport(randomId().toString(), s, 64, 64) + let vp3 = await newViewport(randomId().toString(), s, 128, 64) + + let vpdrin = new ViewportDataRequest() + vpdrin.setViewportId(vpin) + client.getViewportData(vpdrin, (err, r) => { + let data = r?.getData_asB64() + if (data) { + let txt = Buffer.from(data, 'base64').toString('binary') + panel.webview.postMessage({ command: 'input', text: txt }) + } + }) + + await viewportSubscribe(panel, vp1, vp1, 'viewport1', 'hex1') + await viewportSubscribe(panel, vp1, vp2, 'viewport2', null) + await viewportSubscribe(panel, vp1, vp3, 'viewport3', 'hex2') + + panel.webview.onDidReceiveMessage( + (message) => { + switch (message.command) { + case 'send': + let b64 = Buffer.from(message.text, 'binary').toString('base64') + let change = new ChangeRequest() + change.setSessionId(s) + change.setKind(ChangeKind.CHANGE_OVERWRITE) + change.setData(b64) + change.setOffset(0) + change.setLength(1000) + client.submitChange(change, (err, r) => { + if (err) console.log(err) + else console.log(r) + }) + } + }, + undefined, + ctx.subscriptions + ) + + panel.onDidDispose( + async () => { + await cleanupViewportSession(s, [vpin, vp1, vp2, vp3]) + panel.dispose() + await stopServer() + }, + undefined, + ctx.subscriptions + ) + }) + ) +} + +function getWebviewContent() { + return ` + + + + + Omega gRPC + + + + + +
+
empty
+
empty
+
empty
+
+
+
+
+ + +` +} diff --git a/src/omegaEdit/omegaUtils.ts b/src/omegaEdit/omegaUtils.ts new file mode 100644 index 000000000..02aef2bb5 --- /dev/null +++ b/src/omegaEdit/omegaUtils.ts @@ -0,0 +1,148 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as vscode from 'vscode' +import * as hexy from 'hexy' +import { EditorClient } from 'omega-edit/omega_edit_grpc_pb' +import { Empty } from 'google-protobuf/google/protobuf/empty_pb' +import * as grpc from '@grpc/grpc-js' +import { + CreateSessionRequest, + CreateViewportRequest, + ObjectId, + ViewportDataRequest, +} from 'omega-edit/omega_edit_pb' + +export const uri = '127.0.0.1:9000' +export const client = new EditorClient(uri, grpc.credentials.createInsecure()) + +export var randomId = () => Math.floor(Math.random() * (1000 - 0 + 1)) + +export function getVersion(): Promise { + return new Promise((resolve, reject) => { + client.getOmegaVersion(new Empty(), (err, v) => { + if (err) { + return reject('getVersion error: ' + err.message) + } + + if (!v) { + return reject('undefined version') + } + + return resolve(`v${v.getMajor()}.${v.getMinor()}.${v.getPatch()}`) + }) + }) +} + +export function newSession(path: string | undefined): Promise { + return new Promise((resolve, reject) => { + let request = new CreateSessionRequest() + if (path) request.setFilePath(path) + client.createSession(request, (err, r) => { + if (err) { + console.log(err.message) + return reject('newSession error: ' + err.message) + } + + let id = r?.getSessionId() + if (!id) { + return reject('undefined version') + } + + return resolve(id) + }) + }) +} + +export function newViewport( + id: string, + sid: string, + offset: number, + capacity: number +): Promise { + return new Promise((resolve, reject) => { + let request = new CreateViewportRequest() + request.setViewportIdDesired(id) + request.setSessionId(sid) + request.setOffset(offset) + request.setCapacity(capacity) + client.createViewport(request, (err, r) => { + if (err) { + console.log(err.message) + return reject('newViewport error: ' + err.message) + } + + let id = r?.getViewportId() + if (!id) { + return reject('undefined version') + } + + return resolve(id) + }) + }) +} + +export function deleteSession(id: string): Promise { + return new Promise((resolve, reject) => { + client.destroySession(new ObjectId().setId(id), (err, r) => { + if (err) { + return reject('deleteSession error: ' + err.message) + } + + return resolve(r) + }) + }) +} + +export function deleteViewport(id: string): Promise { + return new Promise((resolve, reject) => { + client.destroyViewport(new ObjectId().setId(id), (err, r) => { + if (err) { + return reject('deleteViewport error: ' + err.message) + } + + return resolve(r) + }) + }) +} + +export function viewportSubscribe( + panel: vscode.WebviewPanel, + vp1: string, + vp2: string, + commandViewport: string, + commandHex: string | null +) { + client.subscribeToViewportEvents(new ObjectId().setId(vp1)).on('data', () => { + client.getViewportData( + new ViewportDataRequest().setViewportId(vp2), + (err, r) => { + let data = r?.getData_asB64() + + if (data) { + let txt = Buffer.from(data, 'base64').toString('binary') + panel.webview.postMessage({ command: commandViewport, text: txt }) + + if (commandHex) { + let hxt = hexy.hexy(txt) + panel.webview.postMessage({ command: commandHex, text: hxt }) + } + } + } + ) + }) +} diff --git a/src/omegaEdit/server.ts b/src/omegaEdit/server.ts new file mode 100644 index 000000000..f82e8774f --- /dev/null +++ b/src/omegaEdit/server.ts @@ -0,0 +1,174 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as vscode from 'vscode' +import * as fs from 'fs' +import * as unzip from 'unzip-stream' +import * as os from 'os' +import * as child_process from 'child_process' +import { HttpClient } from 'typed-rest-client/HttpClient' +import XDGAppPaths from 'xdg-app-paths' + +const xdgAppPaths = XDGAppPaths({ name: 'omega_edit' }) + +class Backend { + constructor(readonly owner: string, readonly repo: string) {} +} + +class Artifact { + constructor(readonly omegaVersion: string) {} + + name = `omega-edit-scala-server-${this.omegaVersion}` + archive = `${this.name}.zip` + archiveUrl = (backend: Backend) => + `https://github.com/${backend.owner}/${backend.repo}/releases/download/v${this.omegaVersion}/${this.archive}` + + scriptName = os.platform().toLowerCase().startsWith('win32') + ? 'example-grpc-server.bat' + : './example-grpc-server' + + getOsFolder() { + if (os.platform().toLowerCase().startsWith('win')) { + return 'windows' + } else if (os.platform().toLowerCase().startsWith('darwin')) { + return 'macos' + } else { + return 'linux' + } + } +} + +// Method to get omegaVersion from a JSON file +export function getOmegaVersion(filePath: fs.PathLike) { + return JSON.parse(fs.readFileSync(filePath).toString())['omegaVersion'] +} + +export async function startServer(ctx: vscode.ExtensionContext) { + // Get omegaVersion + const omegaVersion = getOmegaVersion(ctx.asAbsolutePath('./package.json')) + const artifact = new Artifact(omegaVersion) + const backend = new Backend('ctc-oss', 'omega-edit') + const delay = (ms: number) => new Promise((res) => setTimeout(res, ms)) + + if (vscode.workspace.workspaceFolders) { + let rootPath = xdgAppPaths.data() + + // If data and app directories for holding omega server script do not exist create them + if (!fs.existsSync(rootPath)) { + fs.mkdirSync(rootPath, { recursive: true }) + } + + // Download and setup omega-edit server files + if (!fs.existsSync(`${rootPath}/${artifact.name}`)) { + // Get omega-edit server of version entered using http client + vscode.window.showInformationMessage('Ωedit server downloading...') + const client = new HttpClient('client') + const artifactUrl = artifact.archiveUrl(backend) + const response = await client.get(artifactUrl) + + if (response.message.statusCode !== 200) { + const err: Error = new Error( + `Couldn't download the OmegaEdit sever backend from ${artifactUrl}.` + ) + err['httpStatusCode'] = response.message.statusCode + throw err + } + + // Create zip from rest call + const filePath = `${rootPath}/${artifact.archive}` + const file = fs.createWriteStream(filePath) + + await new Promise((resolve, reject) => { + file.on( + 'error', + (err) => + function () { + throw err + } + ) + const stream = response.message.pipe(file) + stream.on('close', () => { + try { + resolve(filePath) + } catch (err) { + reject(err) + } + }) + }) + vscode.window.showInformationMessage('Ωedit server downloaded!') + + // Unzip file and remove zip + await new Promise((resolve, reject) => { + let stream = fs + .createReadStream(filePath) + .pipe(unzip.Extract({ path: `${rootPath}` })) + stream.on('close', () => { + try { + resolve(filePath) + } catch (err) { + reject(err) + } + }) + }) + fs.unlinkSync(filePath) + } + + let scriptPath = `${artifact.name}/${artifact.getOsFolder()}` + + if (!os.platform().toLowerCase().startsWith('win')) { + child_process.execSync( + `chmod +x ${rootPath.replace( + ' ', + '\\ ' + )}/${scriptPath}/bin/${artifact.scriptName.replace('./', '')}` + ) + } + + // Start server in terminal based on scriptName + let terminal = vscode.window.createTerminal({ + name: artifact.scriptName, + cwd: `${rootPath}/${scriptPath}/bin`, + hideFromUser: false, + shellPath: artifact.scriptName, + }) + terminal.show() + + // Wait for 5000ms to make sure server is running before client tries to connect + await delay(5000) + } +} + +// Function for stopping debugging +export async function stopServer() { + const action = await vscode.window.showInformationMessage( + 'Stop Ωedit server?', + 'Yes', + 'No' + ) + + if (action === 'Yes') { + vscode.window.activeTerminal?.processId.then((id) => { + if (id) { + if (os.platform() === 'win32') { + child_process.exec(`taskkill /F /PID ${id}`) + } else { + child_process.exec(`kill -9 ${id}`) + } + } + }) + } +} diff --git a/yarn.lock b/yarn.lock index 332648bd8..c4465b93d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,78 @@ # yarn lockfile v1 +"@grpc/grpc-js@^1.5.4": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.5.4.tgz#dd0237ad7df80a7a24766fe516d7e4a22cb4855e" + integrity sha512-+nJTOsqpFAXnfFrMZ7Too4XXZ/J9O+8jYvSoaunupoC7I7b9H4iex1BRsbTdOmiowfPGJrWit7jUPmbENSUSpw== + dependencies: + "@grpc/proto-loader" "^0.6.4" + "@types/node" ">=12.12.47" + +"@grpc/proto-loader@^0.6.4": + version "0.6.9" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.6.9.tgz#4014eef366da733f8e04a9ddd7376fe8a58547b7" + integrity sha512-UlcCS8VbsU9d3XTXGiEVFonN7hXk+oMXZtoHHG2oSA1/GcDP1q6OUgs20PzHDGizzyi8ufGSUDlk3O2NyY7leg== + dependencies: + "@types/long" "^4.0.1" + lodash.camelcase "^4.3.0" + long "^4.0.0" + protobufjs "^6.10.0" + yargs "^16.2.0" + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78= + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A= + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU= + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E= + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik= + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0= + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q= + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= + "@types/glob@^7.1.3": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" @@ -10,6 +82,11 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/long@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" + integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== + "@types/minimatch@*": version "3.0.5" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" @@ -25,6 +102,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.1.tgz#88d501e84b6185f6489ecee4ba9e8fcec7f29bb2" integrity sha512-NXKvBVUzIbs6ylBwmOwHFkZS2EXCcjnqr8ZCRNaXBkHAf+3mn/rPcJxwrzuc6movh8fxQAsUUfYklJ/EG+hZqQ== +"@types/node@>=12.12.47", "@types/node@>=13.7.0": + version "17.0.17" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.17.tgz#a8ddf6e0c2341718d74ee3dc413a13a042c45a0c" + integrity sha512-e8PUNQy1HgJGV3iU/Bp2+D/DXh3PYeyli8LgIwsQcs1Ar1LoaWHSIT6Rw+H2rNJmiq6SNWiDytfx8+gYj7wDHw== + "@types/node@^14.14.37": version "14.18.1" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.1.tgz#459886b51f52aa923dc06b9ea81cb8b1d733e9d3" @@ -1563,6 +1645,11 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" +google-protobuf@^3.19.4: + version "3.19.4" + resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.19.4.tgz#8d32c3e34be9250956f28c0fb90955d13f311888" + integrity sha512-OIPNCxsG2lkIvf+P5FNfJ/Km95CsXOBecS9ZcAU6m2Rq3svc0Apl9nB3GMDNKfQ9asNv4KjyAqGwPQFrVle3Yg== + graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: version "4.2.8" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" @@ -2039,6 +2126,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + lodash@^4.17.15: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -2051,6 +2143,11 @@ log-symbols@4.0.0: dependencies: chalk "^4.0.0" +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -2447,6 +2544,11 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" +omega-edit@0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/omega-edit/-/omega-edit-0.8.1.tgz#7bcf2be381f8bf58b672d21bfb0e9e6c75c2c215" + integrity sha512-sOLRLqRNPHOXeJvTjgjKbl1kRbqQIa/xyCuQalQxUqMpdXYAWx2zqXOMWnMsyWbpGJ2y616mhkcCqSq/z8fqug== + once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -2676,6 +2778,25 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= +protobufjs@^6.10.0: + version "6.11.2" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.2.tgz#de39fabd4ed32beaa08e9bb1e30d08544c1edf8b" + integrity sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.1" + "@types/node" ">=13.7.0" + long "^4.0.0" + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -3841,7 +3962,7 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@16.2.0: +yargs@16.2.0, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==