diff --git a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts index 436dd8e86..e71627f4e 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -462,6 +462,13 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { }) .inSingletonScope() .whenTargetNamed('store'); + bind(ILogger) + .toDynamicValue((ctx) => { + const parentLogger = ctx.container.get(ILogger); + return parentLogger.child('compiler-errors'); + }) + .inSingletonScope() + .whenTargetNamed('compiler-errors'); // Boards auto-installer bind(BoardsAutoInstaller).toSelf().inSingletonScope(); diff --git a/arduino-ide-extension/src/browser/contributions/compiler-errors.ts b/arduino-ide-extension/src/browser/contributions/compiler-errors.ts index a689ea3df..08c4fb63b 100644 --- a/arduino-ide-extension/src/browser/contributions/compiler-errors.ts +++ b/arduino-ide-extension/src/browser/contributions/compiler-errors.ts @@ -4,16 +4,19 @@ import { Disposable, DisposableCollection, Emitter, + ILogger, MaybeArray, MaybePromise, nls, notEmpty, } from '@theia/core'; -import { ApplicationShell, FrontendApplication } from '@theia/core/lib/browser'; -import { ITextModel } from '@theia/monaco-editor-core/esm/vs/editor/common/model'; +import type { + ApplicationShell, + FrontendApplication, +} from '@theia/core/lib/browser'; import URI from '@theia/core/lib/common/uri'; -import { inject, injectable } from '@theia/core/shared/inversify'; -import { +import { inject, injectable, named } from '@theia/core/shared/inversify'; +import type { Location, Range, } from '@theia/core/shared/vscode-languageserver-protocol'; @@ -27,7 +30,9 @@ import { } from '@theia/editor/lib/browser/decorations/editor-decoration'; import { EditorManager } from '@theia/editor/lib/browser/editor-manager'; import * as monaco from '@theia/monaco-editor-core'; +import type { ITextModel } from '@theia/monaco-editor-core/esm/vs/editor/common/model'; import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor'; +import { MonacoEditorModel } from '@theia/monaco/lib/browser/monaco-editor-model'; import { MonacoToProtocolConverter } from '@theia/monaco/lib/browser/monaco-to-protocol-converter'; import { ProtocolToMonacoConverter } from '@theia/monaco/lib/browser/protocol-to-monaco-converter'; import { OutputUri } from '@theia/output/lib/common/output-uri'; @@ -36,7 +41,6 @@ import { ErrorRevealStrategy } from '../arduino-preferences'; import { ArduinoOutputSelector, InoSelector } from '../selectors'; import { Contribution } from './contribution'; import { CoreErrorHandler } from './core-error-handler'; -import { MonacoEditorModel } from '@theia/monaco/lib/browser/monaco-editor-model'; interface ErrorDecorationRef { /** @@ -132,15 +136,15 @@ export class CompilerErrors extends Contribution implements monaco.languages.CodeLensProvider, monaco.languages.LinkProvider { + @inject(ILogger) + @named('compiler-errors') + private readonly errorLogger: ILogger; @inject(EditorManager) private readonly editorManager: EditorManager; - @inject(ProtocolToMonacoConverter) private readonly p2m: ProtocolToMonacoConverter; - @inject(MonacoToProtocolConverter) private readonly m2p: MonacoToProtocolConverter; - @inject(CoreErrorHandler) private readonly coreErrorHandler: CoreErrorHandler; @@ -408,11 +412,16 @@ export class CompilerErrors private async handleCompilerErrorsDidChange( errors: CoreError.ErrorLocation[] ): Promise { - this.toDisposeOnCompilerErrorDidChange.dispose(); + this.errorLogger.info( + `Handling new compiler error locations: ${JSON.stringify(errors)}` + ); const groupedErrors = this.groupBy( errors, (error: CoreError.ErrorLocation) => error.location.uri ); + this.errorLogger.info( + `Grouped error locations: ${JSON.stringify([...groupedErrors.entries()])}` + ); const decorations = await this.decorateEditors(groupedErrors); this.errors.push(...decorations.errors); this.toDisposeOnCompilerErrorDidChange.pushAll([ diff --git a/arduino-ide-extension/src/browser/contributions/core-error-handler.ts b/arduino-ide-extension/src/browser/contributions/core-error-handler.ts index 82aba4c00..1d4b0602a 100644 --- a/arduino-ide-extension/src/browser/contributions/core-error-handler.ts +++ b/arduino-ide-extension/src/browser/contributions/core-error-handler.ts @@ -1,25 +1,39 @@ -import { Emitter, Event } from '@theia/core'; -import { injectable } from '@theia/core/shared/inversify'; +import { Emitter, Event, ILogger } from '@theia/core'; +import { inject, injectable, named } from '@theia/core/shared/inversify'; import { CoreError } from '../../common/protocol/core-service'; @injectable() export class CoreErrorHandler { + @inject(ILogger) + @named('compiler-errors') + private readonly errorsLogger: ILogger; + private readonly errors: CoreError.ErrorLocation[] = []; private readonly compilerErrorsDidChangeEmitter = new Emitter< CoreError.ErrorLocation[] >(); tryHandle(error: unknown): void { - if (CoreError.is(error)) { - this.errors.length = 0; - this.errors.push(...error.data); - this.fireCompilerErrorsDidChange(); + this.errorsLogger.info('Handling compiler errors...'); + if (!CoreError.is(error)) { + this.errorsLogger.info( + `Handling compiler errors. Skipped. Unknown errors: ${JSON.stringify( + error + )}` + ); + return; } + this.errors.length = 0; + this.errors.push(...error.data); + this.fireCompilerErrorsDidChange(); + this.errorsLogger.info('Handling compiler errors. Done.'); } reset(): void { + this.errorsLogger.info('Invalidating errors...'); this.errors.length = 0; this.fireCompilerErrorsDidChange(); + this.errorsLogger.info('Invalidating errors. Done.'); } get onCompilerErrorsDidChange(): Event { diff --git a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts index 02d534044..154ba2f01 100644 --- a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts +++ b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts @@ -345,6 +345,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { 'discovery-log', // Boards discovery 'config', // Logger for the CLI config reading and manipulation 'sketches-service', // For creating, loading, and cloning sketches + 'compiler-errors', // For parsing compilation errors and highlighting the error locations in the editors MonitorManagerName, // Logger for the monitor manager and its services MonitorServiceName, ].forEach((name) => bindChildLogger(bind, name)); diff --git a/arduino-ide-extension/src/node/cli-error-parser.ts b/arduino-ide-extension/src/node/cli-error-parser.ts index d60ecb88e..522bd9f36 100644 --- a/arduino-ide-extension/src/node/cli-error-parser.ts +++ b/arduino-ide-extension/src/node/cli-error-parser.ts @@ -1,9 +1,10 @@ -import { notEmpty } from '@theia/core/lib/common/objects'; +import { ILogger } from '@theia/core/lib/common/logger'; import { nls } from '@theia/core/lib/common/nls'; +import { notEmpty } from '@theia/core/lib/common/objects'; import { FileUri } from '@theia/core/lib/node/file-uri'; import { - Range, Position, + Range, } from '@theia/core/shared/vscode-languageserver-protocol'; import { CoreError } from '../common/protocol'; import { Sketch } from '../common/protocol/sketches-service'; @@ -11,6 +12,7 @@ import { Sketch } from '../common/protocol/sketches-service'; export interface OutputSource { readonly content: string | ReadonlyArray; readonly sketch?: Sketch; + readonly logger?: ILogger; } export namespace OutputSource { export function content(source: OutputSource): string { @@ -22,26 +24,33 @@ export namespace OutputSource { } export function tryParseError(source: OutputSource): CoreError.ErrorLocation[] { - const { sketch } = source; - const content = OutputSource.content(source); - if (sketch) { - return tryParse(content) - .map(remapErrorMessages) - .filter(isLocationInSketch(sketch)) - .map(toErrorInfo) - .reduce((acc, curr) => { - const existingRef = acc.find((candidate) => - CoreError.ErrorLocationRef.equals(candidate, curr) - ); - if (existingRef) { - existingRef.rangesInOutput.push(...curr.rangesInOutput); - } else { - acc.push(curr); - } - return acc; - }, [] as CoreError.ErrorLocation[]); + const { sketch, logger } = source; + if (!sketch) { + logger?.info('Could not parse the compiler errors. Sketch not found.'); + return []; } - return []; + const content = OutputSource.content(source); + logger?.info(`Parsing compiler errors. Sketch: ${sketch.uri.toString()}`); + logger?.info('----START----'); + logger?.info(content); + logger?.info('----END----'); + const locations = tryParse({ content, logger }) + .map(remapErrorMessages) + .filter(isLocationInSketch(sketch)) + .map(toErrorInfo) + .reduce((acc, curr) => { + const existingRef = acc.find((candidate) => + CoreError.ErrorLocationRef.equals(candidate, curr) + ); + if (existingRef) { + existingRef.rangesInOutput.push(...curr.rangesInOutput); + } else { + acc.push(curr); + } + return acc; + }, [] as CoreError.ErrorLocation[]); + logger?.info(`Parsed error locations: ${JSON.stringify(locations)}`); + return locations; } interface ParseResult { @@ -105,7 +114,13 @@ function range(line: number, column?: number): Range { }; } -function tryParse(content: string): ParseResult[] { +function tryParse({ + content, + logger, +}: { + content: string; + logger?: ILogger; +}): ParseResult[] { // Shamelessly stolen from the Java IDE: https://github.com/arduino/Arduino/blob/43b0818f7fa8073301db1b80ac832b7b7596b828/arduino-core/src/cc/arduino/Compiler.java#L137 const re = new RegExp( '(.+\\.\\w+):(\\d+)(:\\d+)*:\\s*((fatal)?\\s*error:\\s*)(.*)\\s*', @@ -113,13 +128,13 @@ function tryParse(content: string): ParseResult[] { ); return Array.from(content.matchAll(re) ?? []) .map((match) => { - const { index: start } = match; + const { index: startIndex } = match; const [, path, rawLine, rawColumn, errorPrefix, , error] = match.map( (match) => (match ? match.trim() : match) ); const line = Number.parseInt(rawLine, 10); if (!Number.isInteger(line)) { - console.warn( + logger?.warn( `Could not parse line number. Raw input: <${rawLine}>, parsed integer: <${line}>.` ); return undefined; @@ -129,16 +144,17 @@ function tryParse(content: string): ParseResult[] { const normalizedRawColumn = rawColumn.slice(-1); // trims the leading colon => `:3` will be `3` column = Number.parseInt(normalizedRawColumn, 10); if (!Number.isInteger(column)) { - console.warn( + logger?.warn( `Could not parse column number. Raw input: <${normalizedRawColumn}>, parsed integer: <${column}>.` ); } } - const rangeInOutput = findRangeInOutput( - start, - { path, rawLine, rawColumn }, - content - ); + const rangeInOutput = findRangeInOutput({ + startIndex, + groups: { path, rawLine, rawColumn }, + content, + logger, + }); return { path, line, @@ -182,13 +198,16 @@ const KnownErrors: Record = { ), }, }; - -function findRangeInOutput( - startIndex: number | undefined, - groups: { path: string; rawLine: string; rawColumn: string | null }, - content: string // TODO? lines: string[]? can this code break line on `\n`? const lines = content.split(/\r?\n/) ?? []; -): Range | undefined { +interface FindRangeInOutputParams { + readonly startIndex: number | undefined; + readonly groups: { path: string; rawLine: string; rawColumn: string | null }; + readonly content: string; // TODO? lines: string[]? can this code break line on `\n`? const lines = content.split(/\r?\n/) ?? []; + readonly logger?: ILogger; +} +function findRangeInOutput(params: FindRangeInOutputParams): Range | undefined { + const { startIndex, groups, content, logger } = params; if (startIndex === undefined) { + logger?.warn("No 'startIndex'. Skipping"); return undefined; } // /path/to/location/Sketch/Sketch.ino:36:42 @@ -199,10 +218,18 @@ function findRangeInOutput( (groups.rawColumn ? groups.rawColumn.length : 0); const start = toPosition(startIndex, content); if (!start) { + logger?.warn( + `Could not resolve 'start'. Skipping. 'startIndex': ${startIndex}, 'content': ${content}` + ); return undefined; } const end = toPosition(startIndex + offset, content); if (!end) { + logger?.warn( + `Could not resolve 'end'. Skipping. 'startIndex': ${startIndex}, 'offset': ${ + startIndex + offset + }, 'content': ${content}` + ); return undefined; } return { start, end }; diff --git a/arduino-ide-extension/src/node/core-service-impl.ts b/arduino-ide-extension/src/node/core-service-impl.ts index a8dfab98b..b878a39ca 100644 --- a/arduino-ide-extension/src/node/core-service-impl.ts +++ b/arduino-ide-extension/src/node/core-service-impl.ts @@ -1,5 +1,5 @@ import { FileUri } from '@theia/core/lib/node/file-uri'; -import { inject, injectable } from '@theia/core/shared/inversify'; +import { inject, injectable, named } from '@theia/core/shared/inversify'; import { relative } from 'node:path'; import * as jspb from 'google-protobuf'; import { BoolValue } from 'google-protobuf/google/protobuf/wrappers_pb'; @@ -35,7 +35,13 @@ import { } from '../common/protocol'; import { ArduinoCoreServiceClient } from './cli-protocol/cc/arduino/cli/commands/v1/commands_grpc_pb'; import { Port as RpcPort } from './cli-protocol/cc/arduino/cli/commands/v1/port_pb'; -import { ApplicationError, CommandService, Disposable, nls } from '@theia/core'; +import { + ApplicationError, + CommandService, + Disposable, + ILogger, + nls, +} from '@theia/core'; import { MonitorManager } from './monitor-manager'; import { AutoFlushingBuffer } from './utils/buffers'; import { tryParseError } from './cli-error-parser'; @@ -63,6 +69,9 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { private readonly commandService: CommandService; @inject(BoardDiscovery) private readonly boardDiscovery: BoardDiscovery; + @inject(ILogger) + @named('compiler-errors') + private readonly errorsLogger: ILogger; async compile(options: CoreService.Options.Compile): Promise { const coreClient = await this.coreClient; @@ -91,6 +100,7 @@ export class CoreServiceImpl extends CoreClientAware implements CoreService { const compilerErrors = tryParseError({ content: handler.content, sketch: options.sketch, + logger: this.errorsLogger, }); const message = nls.localize( 'arduino/compile/error', diff --git a/yarn.lock b/yarn.lock index a5841435c..d18210f68 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4313,6 +4313,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" + assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" @@ -4530,6 +4537,13 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" +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" @@ -4567,7 +4581,7 @@ binary@~0.3.0: buffers "~0.1.1" chainsaw "~0.1.0" -bindings@^1.3.0: +bindings@^1.3.0, bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== @@ -4766,6 +4780,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== + builder-util-runtime@8.9.2: version "8.9.2" resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.9.2.tgz#a9669ae5b5dcabfe411ded26678e7ae997246c28" @@ -5689,6 +5708,14 @@ cp-file@^10.0.0: nested-error-stacks "^2.1.1" p-event "^5.0.1" +cpu-features@*, cpu-features@~0.0.8: + version "0.0.9" + resolved "https://registry.yarnpkg.com/cpu-features/-/cpu-features-0.0.9.tgz#5226b92f0f1c63122b0a3eb84cb8335a4de499fc" + integrity sha512-AKjgn2rP2yJyfbepsmLfiYcmtNn/2eUvocUyM/09yB0YDiz39HteK/5/T4Onf0pmdYDMgkBoGvRLvEguzyL7wQ== + dependencies: + buildcheck "~0.0.6" + nan "^2.17.0" + cpy@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/cpy/-/cpy-10.1.0.tgz#85517387036b9be480f6424e54089261fc6f4bab" @@ -6289,6 +6316,16 @@ dotenv@~16.3.1: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== +drivelist@*: + version "11.1.0" + resolved "https://registry.yarnpkg.com/drivelist/-/drivelist-11.1.0.tgz#39b17b78bf7d717e666ad57f006ffaf9ee344ac7" + integrity sha512-DT328SbKqB78y+HUeuazwj4+Enh5ormv9OgTIMB0/OP2VxKLFDOrKhejJxjP9ytmJok8W/nzR8gSWdpiaJi1XA== + dependencies: + bindings "^1.5.0" + debug "^4.3.4" + node-addon-api "^5.0.0" + prebuild-install "^7.1.1" + drivelist@^9.0.2, drivelist@^9.2.4: version "9.2.4" resolved "https://registry.yarnpkg.com/drivelist/-/drivelist-9.2.4.tgz#f89d2233d86c9fcdbc0daacae257d7b27a658d20" @@ -7360,6 +7397,13 @@ find-cache-dir@^3.3.1: make-dir "^3.0.2" pkg-dir "^4.1.0" +find-git-repositories@*: + version "0.2.1" + resolved "https://registry.yarnpkg.com/find-git-repositories/-/find-git-repositories-0.2.1.tgz#a77c5675fa98eed35d0281640697e13a7e7a1916" + integrity sha512-+D2Ou5AelHekoHFCqRaQTKfYh6pj1p69SYOKHMqSKxANN0viGsH1jbXnnYVeK6tmrljWgSoJ5BDmWX36eo72Jg== + dependencies: + node-addon-api "*" + find-root@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" @@ -9466,6 +9510,14 @@ jwt-decode@^3.1.2: resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== +keytar@*: + version "7.9.0" + resolved "https://registry.yarnpkg.com/keytar/-/keytar-7.9.0.tgz#4c6225708f51b50cbf77c5aae81721964c2918cb" + integrity sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ== + dependencies: + node-addon-api "^4.3.0" + prebuild-install "^7.0.1" + keytar@7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/keytar/-/keytar-7.2.0.tgz#4db2bec4f9700743ffd9eda22eebb658965c8440" @@ -10889,6 +10941,11 @@ nan@^2.14.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== +nan@^2.17.0: + version "2.18.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" + integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== + nano@^9.0.5: version "9.0.5" resolved "https://registry.yarnpkg.com/nano/-/nano-9.0.5.tgz#2b767819f612907a3ac09b21f2929d4097407262" @@ -10932,6 +10989,11 @@ napi-build-utils@^1.0.1: resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== +native-keymap@*: + version "3.3.4" + resolved "https://registry.yarnpkg.com/native-keymap/-/native-keymap-3.3.4.tgz#593f176f89442218286624b7754e1bdcb4660982" + integrity sha512-dFxL5bzWDsnPT6dZbtq9OXuETdgNMio5o0IeUTGXvwH9WqMMR/1Aytt/zz+e281qEko8iFmt98saOX7EN7BRPg== + native-keymap@^2.2.1: version "2.5.0" resolved "https://registry.yarnpkg.com/native-keymap/-/native-keymap-2.5.0.tgz#4d567497efb0d2efbfd53048f14093f25984c2b4" @@ -11006,6 +11068,18 @@ node-abi@^2.21.0, node-abi@^2.7.0: dependencies: semver "^5.4.1" +node-abi@^3.3.0: + version "3.50.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.50.0.tgz#bbee6943c8812d20e241539854d7b8003404d917" + integrity sha512-2Gxu7Eq7vnBIRfYSmqPruEllMM14FjOQFJSoqdGWthVn+tmwEXzmdPpya6cvvwf0uZA3F5N1fMFr9mijZBplFA== + dependencies: + semver "^7.3.5" + +node-addon-api@*: + version "7.0.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.0.0.tgz#8136add2f510997b3b94814f4af1cce0b0e3962e" + integrity sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA== + node-addon-api@^1.6.3: version "1.7.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" @@ -11016,6 +11090,11 @@ node-addon-api@^3.0.0, node-addon-api@^3.0.2, node-addon-api@^3.1.0, node-addon- resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== +node-addon-api@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f" + integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== + node-addon-api@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" @@ -11112,6 +11191,13 @@ node-machine-id@1.1.12: resolved "https://registry.yarnpkg.com/node-machine-id/-/node-machine-id-1.1.12.tgz#37904eee1e59b320bb9c5d6c0a59f3b469cb6267" integrity sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ== +node-pty@*: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-1.0.0.tgz#7daafc0aca1c4ca3de15c61330373af4af5861fd" + integrity sha512-wtBMWWS7dFZm/VgqElrTvtfMq4GzJ6+edFI0Y0zyzygUSZMgZdraDUMUhCIvkjhJjme15qWmbyJbtAx4ot4uZA== + dependencies: + nan "^2.17.0" + node-pty@0.11.0-beta17: version "0.11.0-beta17" resolved "https://registry.yarnpkg.com/node-pty/-/node-pty-0.11.0-beta17.tgz#7df6a60dced6bf7a3a282b65cf51980c68954af6" @@ -11336,7 +11422,7 @@ npmlog@^6.0.0, npmlog@^6.0.2: gauge "^4.0.3" set-blocking "^2.0.0" -nsfw@^2.2.4: +nsfw@*, nsfw@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/nsfw/-/nsfw-2.2.4.tgz#4ed94544a63fc843b7e3ccff6668dce13d27a33a" integrity sha512-sTRNa7VYAiy5ARP8etIBfkIfxU0METW40UinDnv0epQMe1pzj285HdXKRKkdrV3rRzMNcuNZn2foTNszV0x+OA== @@ -12157,6 +12243,24 @@ prebuild-install@^6.0.0: tar-fs "^2.0.0" tunnel-agent "^0.6.0" +prebuild-install@^7.0.1, prebuild-install@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" + integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^1.0.1" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -13117,7 +13221,7 @@ safe-stable-stringify@^2.4.3: resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== -"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== @@ -13415,6 +13519,15 @@ simple-get@^3.0.3: once "^1.3.1" simple-concat "^1.0.0" +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + simple-update-notifier@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" @@ -13710,6 +13823,17 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +ssh2@*: + version "1.14.0" + resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-1.14.0.tgz#8f68440e1b768b66942c9e4e4620b2725b3555bb" + integrity sha512-AqzD1UCqit8tbOKoj6ztDDi1ffJZ2rV2SwlgrVVrHPkV5vWqGJOVp5pmtj18PunkPJAuKQsnInyKV+/Nb2bUnA== + dependencies: + asn1 "^0.2.6" + bcrypt-pbkdf "^1.0.2" + optionalDependencies: + cpu-features "~0.0.8" + nan "^2.17.0" + ssri@^10.0.0, ssri@^10.0.1: version "10.0.5" resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.5.tgz#e49efcd6e36385196cb515d3a2ad6c3f0265ef8c" @@ -14510,6 +14634,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"