diff --git a/.github/linters/.cspell.json b/.github/linters/.cspell.json index 340194a..e3cf1c8 100644 --- a/.github/linters/.cspell.json +++ b/.github/linters/.cspell.json @@ -24,6 +24,7 @@ "EDITORCONFIG", "Eqoehef", "FILEIO", + "GRYPE", "HADOLINT", "Hardis", "IVMA", @@ -44,6 +45,7 @@ "WIPO", "activateinvalid", "allowpurgefailure", + "anthonygiuliano", "apexlog", "apiversion", "bestpractices", diff --git a/.github/workflows/mega-linter.yml b/.github/workflows/mega-linter.yml index 21d096e..4060631 100644 --- a/.github/workflows/mega-linter.yml +++ b/.github/workflows/mega-linter.yml @@ -40,11 +40,11 @@ jobs: - name: Mega-Linter id: ml # You can override Mega-Linter flavor used to have faster performances - # More info at https://megalinter.io/flavors/ + # More info at https://megalinter.io/latest/flavors/ uses: oxsecurity/megalinter/flavors/javascript@v7 env: # All available variables are described in documentation - # https://megalinter.io/configuration/ + # https://megalinter.io/latest/config-file/ VALIDATE_ALL_CODEBASE: true # Set ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} to validate only diff with main branch GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # ADD YOUR CUSTOM ENV VARIABLES HERE TO OVERRIDE VALUES OF .mega-linter.yml AT THE ROOT OF YOUR REPOSITORY diff --git a/.mega-linter.yml b/.mega-linter.yml index 6825700..59c6d01 100644 --- a/.mega-linter.yml +++ b/.mega-linter.yml @@ -1,5 +1,5 @@ # Configuration file for Mega-Linter -# See all available variables at https://megalinter.io/configuration/ and in linters documentation +# See all available variables at https://megalinter.io/latest/config-file/ and in linters documentation APPLY_FIXES: all # all, none, or list of linter keys DEFAULT_BRANCH: main # Usually master or main @@ -8,6 +8,7 @@ DEFAULT_BRANCH: main # Usually master or main DISABLE_LINTERS: - TYPESCRIPT_STANDARD DISABLE_ERRORS_LINTERS: + - REPOSITORY_GRYPE - REPOSITORY_TRIVY TYPESCRIPT_DEFAULT_STYLE: prettier FILTER_REGEX_EXCLUDE: (\.vscode) diff --git a/CHANGELOG.md b/CHANGELOG.md index 665387c..73183fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,16 @@ ## [Unreleased] +## [2.0.0] 2023-08-18 + +**BREAKING CHANGE**: Only for some CI scripts, please read [sfdx-hardis v4.0.0 release notes](https://github.com/hardisgroupcom/sfdx-hardis/releases/tag/v4.0.0) + +- Automatically **uninstall sfdx-cli** then **install @salesforce/cli** to follow [Salesforce recommendations](https://developer.salesforce.com/docs/atlas.en-us.sfdx_setup.meta/sfdx_setup/sfdx_setup_move_to_sf_v2.htm) +- Add @salesforce/plugin-packaging in default plugins +- Fix false positive error when nvm has been used to install @salesforce/cli (thanks @anthonygiuliano :)) +- Upgrade npm dependencies +- Upgrade MegaLinter + ## [1.33.1] 2023-07-10 - Fix issue when sfdx is installed in nodejs folder diff --git a/src/commands.ts b/src/commands.ts index 2fae984..7d2738c 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -22,7 +22,7 @@ export class Commands { hardisCommandsProvider: HardisCommandsProvider, hardisStatusProvider: HardisStatusProvider, hardisPluginsProvider: HardisPluginsProvider, - reporter: TelemetryReporter + reporter: TelemetryReporter, ) { this.hardisCommandsProvider = hardisCommandsProvider; this.hardisStatusProvider = hardisStatusProvider; @@ -59,7 +59,7 @@ export class Commands { if (this.terminalIsRunning) { vscode.window.showErrorMessage( "🦙 Wait for the current command to be completed before running a new one :)", - "Close" + "Close", ); return; } @@ -111,8 +111,8 @@ export class Commands { this.terminalStack = this.terminalStack.filter( (terminal) => vscode.window.terminals.filter( - (vsTerminal) => vsTerminal.processId === terminal.processId - ).length > 0 + (vsTerminal) => vsTerminal.processId === terminal.processId, + ).length > 0, ); // Create new terminal if necessary if ( @@ -132,25 +132,25 @@ export class Commands { vscode.workspace.getConfiguration("vsCodeSfdxHardis"); if (config.get("disableGitBashCheck") !== true) { vscode.commands.executeCommand( - "workbench.action.terminal.selectDefaultShell" + "workbench.action.terminal.selectDefaultShell", ); vscode.window .showWarningMessage( "🦙 It is recommended to use Git Bash as default terminal shell (do it in the opened dialog at the top of the screen)", "Download Git Bash", "Ignore", - "Don't ask again" + "Don't ask again", ) .then((selection) => { if (selection === "Download Git Bash") { vscode.env.openExternal( - vscode.Uri.parse("https://git-scm.com/downloads") + vscode.Uri.parse("https://git-scm.com/downloads"), ); } else if (selection === "Don't ask again") { config.update("disableGitBashCheck", true); } else { vscode.window.showInformationMessage( - "🦙 If you do not want to see this message anymore, set VsCode setting vsCodeSfdxHardis.disableGitBashCheck to true, or click on Don't ask again" + "🦙 If you do not want to see this message anymore, set VsCode setting vsCodeSfdxHardis.disableGitBashCheck to true, or click on Don't ask again", ); } }); @@ -166,7 +166,7 @@ export class Commands { //const newTerminal = vscode.window.createTerminal(terminalOptions); vscode.commands.executeCommand( "workbench.action.terminal.newInActiveWorkspace", - "SFDX Hardis" + "SFDX Hardis", ); new Promise((resolve) => setTimeout(resolve, 4000)).then(() => { /* vscode.commands.executeCommand( @@ -181,7 +181,7 @@ export class Commands { // Run command in active terminal this.runCommandInTerminal(sfdxHardisCommand); } - } + }, ); this.disposables.push(disposable); } @@ -196,12 +196,12 @@ export class Commands { const toReload = vscode.extensions.all.filter( (extension) => extension.id === "salesforce.salesforcedx-vscode-core" && - extension.isActive === false + extension.isActive === false, ); if (toReload.length > 0) { vscode.commands.executeCommand("workbench.action.reloadWindow"); } - } + }, ); this.disposables.push(disposable); } @@ -209,7 +209,7 @@ export class Commands { registerRefreshStatusView() { const disposable = vscode.commands.registerCommand( "vscode-sfdx-hardis.refreshStatusView", - () => this.hardisStatusProvider?.refresh() + () => this.hardisStatusProvider?.refresh(), ); this.disposables.push(disposable); } @@ -217,7 +217,7 @@ export class Commands { registerRefreshPluginsView() { const disposable = vscode.commands.registerCommand( "vscode-sfdx-hardis.refreshPluginsView", - () => this.hardisPluginsProvider?.refresh() + () => this.hardisPluginsProvider?.refresh(), ); this.disposables.push(disposable); } @@ -229,14 +229,14 @@ export class Commands { () => { vscode.commands.executeCommand( "workbench.action.terminal.newInActiveWorkspace", - "SFDX Hardis" + "SFDX Hardis", ); new Promise((resolve) => setTimeout(resolve, 4000)).then(() => { const newTerminal = vscode.window.terminals[vscode.window.terminals.length - 1]; this.terminalStack.push(newTerminal); }); - } + }, ); this.disposables.push(disposable); } @@ -245,7 +245,7 @@ export class Commands { // Open external command const disposable = vscode.commands.registerCommand( "vscode-sfdx-hardis.openExternal", - (url) => vscode.env.openExternal(url) + (url) => vscode.env.openExternal(url), ); this.disposables.push(disposable); } @@ -266,22 +266,22 @@ export class Commands { .showInformationMessage( `🦙 ${commandDetail}`, { modal: true }, - ...messageButtons + ...messageButtons, ) .then((selection) => { if (selection === "Run command") { vscode.commands.executeCommand( "vscode-sfdx-hardis.execute-command", - item.hardisCommand + item.hardisCommand, ); } else if (selection === "Open Online Help") { vscode.commands.executeCommand( "vscode-sfdx-hardis.openCommandHelp", - item + item, ); } }); - } + }, ); this.disposables.push(disposable); } @@ -295,10 +295,10 @@ export class Commands { vscode.env.openExternal(item.options.helpUrl); } else { vscode.window.showInformationMessage( - "🦙 No help url has been defined for this command" + "🦙 No help url has been defined for this command", ); } - } + }, ); this.disposables.push(disposable); } @@ -307,7 +307,7 @@ export class Commands { // Open external command const disposable = vscode.commands.registerCommand( "vscode-sfdx-hardis.openPluginHelp", - (item) => vscode.env.openExternal(item.options.helpUrl) + (item) => vscode.env.openExternal(item.options.helpUrl), ); this.disposables.push(disposable); } @@ -322,7 +322,7 @@ export class Commands { } else { vscode.window.showInformationMessage(msg); } - } + }, ); this.disposables.push(disposable); } @@ -344,15 +344,15 @@ export class Commands { if (decodedUrl !== "") { vscode.commands.executeCommand( "vscode-sfdx-hardis.openExternal", - decodedUrl + decodedUrl, ); } else { vscode.window.showErrorMessage( "🦙 This URL is not a valid Outlook validation link", - "Close" + "Close", ); } - } + }, ); this.disposables.push(disposable); } @@ -393,7 +393,7 @@ export class Commands { (quickpick.canSelectMany = false); quickpick.items = keyFileList .filter((choice: any) => - fs.existsSync(currentWorkspaceFolderUri + path.sep + choice.file) + fs.existsSync(currentWorkspaceFolderUri + path.sep + choice.file), ) .map((choice: any) => { const quickPickItem: vscode.QuickPickItem = { @@ -419,13 +419,13 @@ export class Commands { quickpick.dispose(); if (value) { var openPath = vscode.Uri.parse( - "file:///" + currentWorkspaceFolderUri + "/" + value + "file:///" + currentWorkspaceFolderUri + "/" + value, ); vscode.workspace.openTextDocument(openPath).then((doc) => { vscode.window.showTextDocument(doc); }); } - } + }, ); } } diff --git a/src/extension.ts b/src/extension.ts index a15618a..1db1b56 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -43,31 +43,31 @@ export function activate(context: vscode.ExtensionContext) { // Register Commands tree data provider const hardisCommandsProvider = new HardisCommandsProvider( - currentWorkspaceFolderUri + currentWorkspaceFolderUri, ); const disposableTreeCommands = vscode.window.registerTreeDataProvider( "sfdx-hardis-commands", - hardisCommandsProvider + hardisCommandsProvider, ); context.subscriptions.push(disposableTreeCommands); // Register Status TreeView const hardisStatusProvider = new HardisStatusProvider( - currentWorkspaceFolderUri + currentWorkspaceFolderUri, ); const disposableTreeInfo = vscode.window.registerTreeDataProvider( "sfdx-hardis-status", - hardisStatusProvider + hardisStatusProvider, ); context.subscriptions.push(disposableTreeInfo); // Register Status TreeView const hardisPluginsProvider = new HardisPluginsProvider( - currentWorkspaceFolderUri + currentWorkspaceFolderUri, ); const disposableTreePlugins = vscode.window.registerTreeDataProvider( "sfdx-hardis-plugins", - hardisPluginsProvider + hardisPluginsProvider, ); context.subscriptions.push(disposableTreePlugins); @@ -76,7 +76,7 @@ export function activate(context: vscode.ExtensionContext) { hardisCommandsProvider, hardisStatusProvider, hardisPluginsProvider, - reporter + reporter, ); context.subscriptions.push(...commands.disposables); @@ -152,7 +152,7 @@ export function activate(context: vscode.ExtensionContext) { vscode.workspace.onDidRenameFiles((event) => { if ( event.files.filter((rename) => - rename.newUri.fsPath.includes("sfdx-project.json") + rename.newUri.fsPath.includes("sfdx-project.json"), ) ) { vscode.commands.executeCommand("vscode-sfdx-hardis.refreshCommandsView"); diff --git a/src/hardis-colors.ts b/src/hardis-colors.ts index 6c69fdb..0f7a219 100644 --- a/src/hardis-colors.ts +++ b/src/hardis-colors.ts @@ -56,7 +56,7 @@ export class HardisColors { for (const sfdxConfigPath of this.sfdxConfigPaths) { const sfdxConfigFullPath = path.join( vscode.workspace.workspaceFolders[0].uri.fsPath, - sfdxConfigPath + sfdxConfigPath, ); if (fs.existsSync(sfdxConfigFullPath)) { await this.manageColor(sfdxConfigFullPath); @@ -73,8 +73,8 @@ export class HardisColors { const watcher = vscode.workspace.createFileSystemWatcher( new vscode.RelativePattern( vscode.workspace.workspaceFolders[0], - `**/${sfdxConfigPath}` - ) + `**/${sfdxConfigPath}`, + ), ); watcher.onDidCreate((uri) => this.manageColor(uri.fsPath)); watcher.onDidChange((uri) => this.manageColor(uri.fsPath)); @@ -101,10 +101,10 @@ export class HardisColors { } else { vscode.window.showWarningMessage( "🦙 You need to select a default org to define a color for it :)", - "Close" + "Close", ); } - } + }, ); this.disposables.push(disposable); } @@ -138,7 +138,7 @@ export class HardisColors { if (fileDefaultOrg !== this.currentDefaultOrg) { this.currentDefaultOrg = fileDefaultOrg; this.currentDefaultOrgDomain = await getUsernameInstanceUrl( - this.currentDefaultOrg || "" + this.currentDefaultOrg || "", ); const orgColor = await this.getCurrentDefaultOrgColor(); this.applyColor(orgColor); @@ -165,19 +165,19 @@ export class HardisColors { { fail: false, output: true, - } + }, ); if (orgRes?.result?.records?.length === 1) { const org = orgRes.result.records[0]; if (org.IsSandbox === true) { // We are in a dev sandbox or scratch org ! const isMajorOrg = await this.isMajorOrg( - this.currentDefaultOrgDomain || "" + this.currentDefaultOrgDomain || "", ); if (isMajorOrg) { vscode.window.showWarningMessage( "🦙 Your default org is a MAJOR org, be careful because the CI/CD Server is supposed to deploy here, not you :)", - "Close" + "Close", ); return forcedColor || "#a66004"; // orange ! } @@ -186,7 +186,7 @@ export class HardisColors { // We are in production !! vscode.window.showWarningMessage( "🦙 Your default org is a PRODUCTION org, be careful what you do :)", - "Close" + "Close", ); return forcedColor || "#8c1004"; // red ! } @@ -202,14 +202,14 @@ export class HardisColors { if (vscode.workspace.workspaceFolders) { const config = vscode.workspace.getConfiguration(); const colorCustomization: any = config.get( - "workbench.colorCustomizations" + "workbench.colorCustomizations", ); colorCustomization["statusBar.background"] = color || undefined; colorCustomization["activityBar.background"] = color || undefined; config.update( "workbench.colorCustomizations", colorCustomization, - vscode.ConfigurationTarget.Workspace + vscode.ConfigurationTarget.Workspace, ); } } @@ -232,10 +232,10 @@ export class HardisColors { if (vscode.workspace.workspaceFolders) { const sfdxHardisConfigFilesPattern = new vscode.RelativePattern( vscode.workspace.workspaceFolders[0], - `**/.sfdx-hardis*.yml` + `**/.sfdx-hardis*.yml`, ); const fileUris = await vscode.workspace.findFiles( - sfdxHardisConfigFilesPattern + sfdxHardisConfigFilesPattern, ); const orgInstanceUrls = []; for (const fileUri of fileUris) { diff --git a/src/hardis-commands-provider.ts b/src/hardis-commands-provider.ts index 2fb81ea..d612dad 100644 --- a/src/hardis-commands-provider.ts +++ b/src/hardis-commands-provider.ts @@ -20,7 +20,7 @@ export class HardisCommandsProvider getChildren(element?: CommandTreeItem): Thenable { if (!this.workspaceRoot) { vscode.window.showInformationMessage( - "🦙 No commands available until you open a folder" + "🦙 No commands available until you open a folder", ); return Promise.resolve([]); } @@ -38,7 +38,7 @@ export class HardisCommandsProvider private getTopicCommands(topic: any): CommandTreeItem[] { const items: CommandTreeItem[] = []; const matchingTopic = this.getAllTopicsAndCommands().filter( - (topicItem: CommandTreeItem) => topicItem.id === topic.id + (topicItem: CommandTreeItem) => topicItem.id === topic.id, )[0]; for (const item of matchingTopic.commands) { const options: any = {}; @@ -63,8 +63,8 @@ export class HardisCommandsProvider item.id, item.command, vscode.TreeItemCollapsibleState.None, - options - ) + options, + ), ); } return items; @@ -123,12 +123,12 @@ export class HardisCommandsProvider item.id, item.command, vscode.TreeItemCollapsibleState.None, - options - ) + options, + ), ); } else { items.push( - new CommandTreeItem(item.label, item.id, "", expanded, options) + new CommandTreeItem(item.label, item.id, "", expanded, options), ); } } @@ -769,7 +769,7 @@ export class HardisCommandsProvider label: "Post an issue / question", icon: "help.svg", command: `vscode-sfdx-hardis.openExternal ${vscode.Uri.parse( - "https://github.com/hardisgroupcom/sfdx-hardis/issues" + "https://github.com/hardisgroupcom/sfdx-hardis/issues", )}`, }, { @@ -777,7 +777,7 @@ export class HardisCommandsProvider label: "All sfdx-hardis commands", icon: "help.svg", command: `vscode-sfdx-hardis.openExternal ${vscode.Uri.parse( - "https://hardisgroupcom.github.io/sfdx-hardis/commands/" + "https://hardisgroupcom.github.io/sfdx-hardis/commands/", )}`, }, { @@ -785,7 +785,7 @@ export class HardisCommandsProvider label: "Cloudity Website", icon: "help.svg", command: `vscode-sfdx-hardis.openExternal ${vscode.Uri.parse( - "https://www.cloudity.com?ref=sfdxhardis" + "https://www.cloudity.com?ref=sfdxhardis", )}`, }, ], @@ -806,7 +806,7 @@ export class HardisCommandsProvider hardisCommands = this.addCommands( projectConfig.customCommands, customCommandsPosition, - hardisCommands + hardisCommands, ); } // Commands defined in remote config file .sfdx-hardis.yml @@ -818,7 +818,7 @@ export class HardisCommandsProvider hardisCommands = this.addCommands( remoteConfig.customCommands, customCommandsPosition, - hardisCommands + hardisCommands, ); } return hardisCommands; @@ -827,7 +827,7 @@ export class HardisCommandsProvider private addCommands( customCommands: Array, customCommandsPosition: string, - hardisCommands: Array + hardisCommands: Array, ) { if (customCommandsPosition === "last") { // Last position @@ -855,7 +855,7 @@ class CommandTreeItem extends vscode.TreeItem { tooltip: "", requiresProject: false, helpUrl: "", - } + }, ) { super(label, collapsibleState); this.id = id; @@ -887,14 +887,14 @@ class CommandTreeItem extends vscode.TreeItem { "..", "..", "resources", - this.iconPath.light.toString() + this.iconPath.light.toString(), ); this.iconPath.dark = path.join( __filename, "..", "..", "resources", - this.iconPath.dark.toString() + this.iconPath.dark.toString(), ); } } diff --git a/src/hardis-debugger.ts b/src/hardis-debugger.ts index 8c60d1d..cbfbb53 100644 --- a/src/hardis-debugger.ts +++ b/src/hardis-debugger.ts @@ -15,34 +15,34 @@ export class HardisDebugger { "vscode-sfdx-hardis.debug.activate", () => { this.activateDebugger(); - } + }, ); const cmdDeactivate = vscode.commands.registerCommand( "vscode-sfdx-hardis.debug.deactivate", () => { this.deactivateDebugger(); - } + }, ); const cmdLaunch = vscode.commands.registerCommand( "vscode-sfdx-hardis.debug.launch", () => { this.launchDebugger(); - } + }, ); const cmdLogTail = vscode.commands.registerCommand( "vscode-sfdx-hardis.debug.logtail", () => { this.launchLogTail(); - } + }, ); const cmdToggleCheckpoint = vscode.commands.registerCommand( "vscode-sfdx-hardis.toggleCheckpoint", () => { this.toggleCheckpoint(); - } + }, ); this.disposables.push( - ...[cmdActivate, cmdDeactivate, cmdLaunch, cmdToggleCheckpoint] + ...[cmdActivate, cmdDeactivate, cmdLaunch, cmdToggleCheckpoint], ); } @@ -66,7 +66,7 @@ export class HardisDebugger { if (requiresCheckpointUpload === true) { await this.runSfdxExtensionCommand("sfdx.create.checkpoints"); } - } + }, ); this.disposables.push(breakpointsHandler); } @@ -153,7 +153,7 @@ export class HardisDebugger { } vscode.commands.executeCommand( "vscode-sfdx-hardis.execute-command", - logTailCommand + logTailCommand, ); } @@ -171,13 +171,13 @@ export class HardisDebugger { vscode.window .showWarningMessage( "🦙 No local apex sources found. Click to retrieve them :)", - "Retrieve Apex sources from org" + "Retrieve Apex sources from org", ) .then((selection) => { if (selection === "Retrieve Apex sources from org") { vscode.commands.executeCommand( "vscode-sfdx-hardis.execute-command", - "sfdx hardis:org:retrieve:sources:dx -k ApexClass,ApexTrigger,ApexPage" + "sfdx hardis:org:retrieve:sources:dx -k ApexClass,ApexTrigger,ApexPage", ); } }); @@ -185,7 +185,7 @@ export class HardisDebugger { // Salesforce extension command not found vscode.window.showWarningMessage( `🦙 Salesforce Extension pack command not found. If it is installed, just wait for it to be initialized :)`, - "Close" + "Close", ); } return null; diff --git a/src/hardis-plugins-provider.ts b/src/hardis-plugins-provider.ts index 2de2b11..26973ec 100644 --- a/src/hardis-plugins-provider.ts +++ b/src/hardis-plugins-provider.ts @@ -25,7 +25,7 @@ export class HardisPluginsProvider getChildren(element?: StatusTreeItem): Thenable { if (!this.workspaceRoot) { vscode.window.showInformationMessage( - "🦙 No info available until you open a Salesforce project" + "🦙 No info available until you open a Salesforce project", ); return Promise.resolve([]); } @@ -74,8 +74,8 @@ export class HardisPluginsProvider item.id, item.command || null, vscode.TreeItemCollapsibleState.None, - options - ) + options, + ), ); } return items; @@ -107,17 +107,17 @@ export class HardisPluginsProvider nodeItem.icon = "missing.svg"; nodeItem.tooltip = "Node.js is missing"; (nodeItem.command = `vscode-sfdx-hardis.openExternal ${vscode.Uri.parse( - "https://nodejs.org/en/" + "https://nodejs.org/en/", )}`), vscode.window .showWarningMessage( "🦙 You need Node.js installed on your computer. Please download and install it (version 14 minimum), then restart VsCode", - "Download and install Node.js LTS" + "Download and install Node.js LTS", ) .then((selection) => { if (selection === "Download and install Node.js LTS") { vscode.env.openExternal( - vscode.Uri.parse("https://nodejs.org/en/") + vscode.Uri.parse("https://nodejs.org/en/"), ); } }); @@ -126,17 +126,17 @@ export class HardisPluginsProvider nodeItem.icon = "warning.svg"; nodeItem.tooltip = "Node.js is outdated"; (nodeItem.command = `vscode-sfdx-hardis.openExternal ${vscode.Uri.parse( - "https://nodejs.org/en/" + "https://nodejs.org/en/", )}`), vscode.window .showWarningMessage( `🦙 You have a too old version (${nodeVersionMatch[1]}) of Node.js installed on your computer. Please download and install it (version 16 minimum), then restart VsCode`, - "Download and install Node.js LTS" + "Download and install Node.js LTS", ) .then((selection) => { if (selection === "Download and install Node.js LTS") { vscode.env.openExternal( - vscode.Uri.parse("https://nodejs.org/en/") + vscode.Uri.parse("https://nodejs.org/en/"), ); } }); @@ -166,23 +166,23 @@ export class HardisPluginsProvider }) ).stdout || "error"; const gitVersionMatch = /git version ([0-9]+)\.(.*)/gm.exec( - gitVersionStdOut + gitVersionStdOut, ); if (!gitVersionMatch) { gitItem.icon = "missing.svg"; gitItem.tooltip = "Git is missing"; (gitItem.command = `vscode-sfdx-hardis.openExternal ${vscode.Uri.parse( - "https://git-scm.com/downloads" + "https://git-scm.com/downloads", )}`), vscode.window .showWarningMessage( "🦙 You need Git installed on your computer. Please download and install it (select GIT BASH in options), then restart VsCode", - "Download and install Git" + "Download and install Git", ) .then((selection) => { if (selection === "Download and install Git") { vscode.env.openExternal( - vscode.Uri.parse("https://git-scm.com/downloads") + vscode.Uri.parse("https://git-scm.com/downloads"), ); } }); @@ -210,6 +210,10 @@ export class HardisPluginsProvider // Check sfdx related installs const plugins = [ + { + name: "@salesforce/plugin-packaging", + helpUrl: "https://www.npmjs.com/package/@salesforce/plugin-packaging", + }, { name: "sfdx-hardis", helpUrl: "https://hardisgroupcom.github.io/sfdx-hardis/", @@ -240,14 +244,23 @@ export class HardisPluginsProvider const sfdxCliVersionStdOut: string = ( await execCommand("sfdx --version", this, { output: true, fail: false }) ).stdout; - const sfdxCliVersionMatch = /sfdx-cli\/([^\s]+)/gm.exec( - sfdxCliVersionStdOut - ); + let sfdxCliVersionMatch = /sfdx-cli\/([^\s]+)/gm.exec(sfdxCliVersionStdOut); let sfdxCliVersion = "(missing)"; + let legacySfdx = false; if (sfdxCliVersionMatch) { sfdxCliVersion = sfdxCliVersionMatch[1]; + legacySfdx = true; + } else { + sfdxCliVersionMatch = /@salesforce\/cli\/([^\s]+)/gm.exec( + sfdxCliVersionStdOut, + ); + if (sfdxCliVersionMatch) { + sfdxCliVersion = sfdxCliVersionMatch[1]; + } } - const latestSfdxCliVersion = await this.getNpmRepoLatestVersion("sfdx-cli"); + const latestSfdxCliVersion = await this.getNpmRepoLatestVersion( + "@salesforce/cli", + ); const config = vscode.workspace.getConfiguration("vsCodeSfdxHardis"); const recommendedSfdxCliVersion = config.get("ignoreSfdxCliRecommendedVersion") === true @@ -255,9 +268,9 @@ export class HardisPluginsProvider : RECOMMENDED_SFDX_CLI_VERSION || latestSfdxCliVersion; const sfdxCliItem = { id: `sfdx-cli-info`, - label: `sfdx-cli v${sfdxCliVersion}`, + label: `@salesforce/cli v${sfdxCliVersion}`, command: `echo "Nothing to do here :)"`, - tooltip: `Recommended version of sfdx-cli is installed`, + tooltip: `Recommended version of @salesforce/cli is installed`, icon: "ok.svg", helpUrl: "https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference.htm", @@ -271,9 +284,15 @@ export class HardisPluginsProvider } catch (_e) { sfdxPath = "missing"; } - if ( + if (legacySfdx) { + sfdxCliItem.label = "Upgrade to @salesforce/cli"; + sfdxCliItem.command = `npm uninstall sfdx-cli --global && npm install @salesforce/cli --global`; + sfdxCliItem.tooltip = `sfdx is now located in sf CLI, please click to make the upgrade`; + sfdxCliItem.icon = "error.svg"; + } else if ( !sfdxPath.includes("npm") && !sfdxPath.includes("nodejs") && + !sfdxPath.includes("nvm") && sfdxPath !== "missing" ) { sfdxCliItem.label = sfdxCliItem.label + " (WRONGLY INSTALLED)"; @@ -288,8 +307,8 @@ export class HardisPluginsProvider !sfdxCliItem.label.includes("(link)") ? sfdxCliItem.label : sfdxCliItem.label + " (upgrade available)"; - sfdxCliItem.command = `npm install sfdx-cli@${recommendedSfdxCliVersion} -g`; - sfdxCliItem.tooltip = `Click to upgrade sfdx-cli to ${recommendedSfdxCliVersion}`; + sfdxCliItem.command = `npm install @salesforce/cli@${recommendedSfdxCliVersion} -g`; + sfdxCliItem.tooltip = `Click to upgrade @salesforce/cli to ${recommendedSfdxCliVersion}`; sfdxCliItem.icon = "warning.svg"; } } @@ -352,21 +371,27 @@ export class HardisPluginsProvider vscode.window .showWarningMessage( "🦙 Some plugins are not up to date, please click to upgrade, then wait for the process to be completed before performing actions", - "Upgrade plugins" + "Upgrade plugins", ) .then((selection) => { if (selection === "Upgrade plugins") { let command = outdated .map((plugin) => `echo y|sfdx plugins:install ${plugin.name}`) .join(" && "); - if (sfdxCliOutdated === true) { - command = "npm install sfdx-cli -g && " + command; + if (legacySfdx) { + command = + "npm uninstall sfdx-cli --global && npm install @salesforce/cli --global && " + + plugins + .map((plugin) => `echo y|sfdx plugins:install ${plugin.name}`) + .join(" && "); + } else if (sfdxCliOutdated === true) { + command = "npm install @salesforce/cli -g && " + command; } command = command + ` && sfdx hardis:work:ws --event refreshPlugins`; vscode.commands.executeCommand( "vscode-sfdx-hardis.execute-command", - command + command, ); } }); @@ -399,13 +424,13 @@ export class HardisPluginsProvider vscode.window .showWarningMessage( `🦙 VsCode extension ${extension.label} is missing, click to install it`, - `Install ${extension.label}` + `Install ${extension.label}`, ) .then((selection) => { if (selection === `Install ${extension.label}`) { vscode.commands.executeCommand( "vscode-sfdx-hardis.execute-command", - extensionItem.command + extensionItem.command, ); } }); @@ -444,7 +469,7 @@ export class HardisPluginsProvider ? vscode.TreeItemCollapsibleState.Expanded : vscode.TreeItemCollapsibleState.Collapsed; items.push( - new StatusTreeItem(item.label, item.id, "", expanded, options) + new StatusTreeItem(item.label, item.id, "", expanded, options), ); } return items; @@ -501,7 +526,7 @@ class StatusTreeItem extends vscode.TreeItem { description: "", tooltip: "", helpUrl: "", - } + }, ) { super(label, collapsibleState); this.id = id; @@ -534,14 +559,14 @@ class StatusTreeItem extends vscode.TreeItem { "..", "..", "resources", - this.iconPath.light.toString() + this.iconPath.light.toString(), ); this.iconPath.dark = path.join( __filename, "..", "..", "resources", - this.iconPath.dark.toString() + this.iconPath.dark.toString(), ); } } diff --git a/src/hardis-status-provider.ts b/src/hardis-status-provider.ts index eb19c1b..e5f0954 100644 --- a/src/hardis-status-provider.ts +++ b/src/hardis-status-provider.ts @@ -23,7 +23,7 @@ export class HardisStatusProvider getChildren(element?: StatusTreeItem): Thenable { if (!this.workspaceRoot) { vscode.window.showInformationMessage( - "🦙 No info available until you open a Salesforce project" + "🦙 No info available until you open a Salesforce project", ); return Promise.resolve([]); } @@ -69,8 +69,8 @@ export class HardisStatusProvider item.id, item.command || null, vscode.TreeItemCollapsibleState.None, - options - ) + options, + ), ); } return items; @@ -165,21 +165,21 @@ export class HardisStatusProvider orgDetailItem.tooltip = `You org expired on ${orgInfo.expirationDate}. You need to create a new one.`; vscode.window.showErrorMessage( `🦙 ${orgDetailItem.tooltip}`, - "Close" + "Close", ); } else if (daysBeforeExpiration < 3) { orgDetailItem.icon = "warning-red.svg"; orgDetailItem.tooltip = `You scratch org will expire in ${daysBeforeExpiration} days !!! Save your scratch org content and create a new one or your work will be lost !!!`; vscode.window.showErrorMessage( `🦙 ${orgDetailItem.tooltip}`, - "Close" + "Close", ); } else if (daysBeforeExpiration < 7) { orgDetailItem.icon = "warning.svg"; orgDetailItem.tooltip = `Your scratch org will expire in ${daysBeforeExpiration} days. You should soon create a new scratch org to avoid loosing your work`; vscode.window.showWarningMessage( `🦙 ${orgDetailItem.tooltip}`, - "Close" + "Close", ); } } @@ -195,7 +195,7 @@ export class HardisStatusProvider const poolViewRes = await execSfdxJson( "sfdx hardis:scratch:pool:view", this, - { output: false, fail: false } + { output: false, fail: false }, ); if ( poolViewRes?.status === 0 && @@ -253,7 +253,7 @@ export class HardisStatusProvider try { const gitRemotes = await git.getRemotes(true); gitRemotesOrigins = gitRemotes.filter( - (remote) => remote.name === "origin" + (remote) => remote.name === "origin", ); } catch (e) { console.warn("[vscode-sfdx-hardis] No git repository found"); @@ -269,10 +269,10 @@ export class HardisStatusProvider id: "git-info-repo", label: `Repo: ${(httpGitUrl.split("/").pop() || "").replace( ".git", - "" + "", )}`, command: `vscode-sfdx-hardis.openExternal ${vscode.Uri.parse( - httpGitUrl + httpGitUrl, )}`, icon: "git.svg", tooltip: "Click to open git repo in browser - " + httpGitUrl, @@ -302,7 +302,7 @@ export class HardisStatusProvider const mergeRequestRes = await execSfdxJson( "sfdx hardis:config:get --level user", this, - { fail: false, output: true } + { fail: false, output: true }, ); if (mergeRequestRes?.result?.config?.mergeRequests) { const mergeRequests = @@ -310,7 +310,7 @@ export class HardisStatusProvider (mr: any) => mr !== null && mr.branch === currentBranch && - (mr.url !== null || mr.urlCreate !== null) + (mr.url !== null || mr.urlCreate !== null), ); // Existing merge request if (mergeRequests[0] && mergeRequests[0].url) { @@ -322,7 +322,7 @@ export class HardisStatusProvider "Click to open merge request in browser\n" + mergeRequests[0].url, command: `vscode-sfdx-hardis.openExternal ${vscode.Uri.parse( - mergeRequests[0].url + mergeRequests[0].url, )}`, }); } @@ -336,7 +336,7 @@ export class HardisStatusProvider "Click to create merge request in browser\n" + mergeRequests[0].urlCreate, command: `vscode-sfdx-hardis.openExternal ${vscode.Uri.parse( - mergeRequests[0].urlCreate + mergeRequests[0].urlCreate, )}`, }); } @@ -370,7 +370,7 @@ export class HardisStatusProvider ? vscode.TreeItemCollapsibleState.Expanded : vscode.TreeItemCollapsibleState.Collapsed; items.push( - new StatusTreeItem(item.label, item.id, "", expanded, options) + new StatusTreeItem(item.label, item.id, "", expanded, options), ); } return items; @@ -426,7 +426,7 @@ class StatusTreeItem extends vscode.TreeItem { icon: { light: "salesforce.svg", dark: "salesforce.svg" }, description: "", tooltip: "", - } + }, ) { super(label, collapsibleState); this.id = id; @@ -459,14 +459,14 @@ class StatusTreeItem extends vscode.TreeItem { "..", "..", "resources", - this.iconPath.light.toString() + this.iconPath.light.toString(), ); this.iconPath.dark = path.join( __filename, "..", "..", "resources", - this.iconPath.dark.toString() + this.iconPath.dark.toString(), ); } } diff --git a/src/hardis-websocket-server.ts b/src/hardis-websocket-server.ts index 17338ad..725636b 100644 --- a/src/hardis-websocket-server.ts +++ b/src/hardis-websocket-server.ts @@ -82,7 +82,7 @@ export class WebSocketServer { else if (data.event === "openFile") { const currentWorkspaceFolderUri = getWorkspaceRoot(); var openPath = vscode.Uri.parse( - "file:///" + currentWorkspaceFolderUri + "/" + data.file + "file:///" + currentWorkspaceFolderUri + "/" + data.file, ); vscode.workspace.openTextDocument(openPath).then((doc) => { vscode.window.showTextDocument(doc); @@ -145,7 +145,7 @@ export class WebSocketServer { quickpick.items = prompt.choices.map((choice: any) => { const quickPickItem: vscode.QuickPickItem = { label: stripAnsi( - choice.title + choice.title, ) /*+ ((choice.selected === true && prompt.type === "select" && !choice.title.includes('(default)')) ? ' (default) ' : '')*/, detail: stripAnsi(choice.description || ""), picked: choice.selected === true, diff --git a/src/utils.ts b/src/utils.ts index 5b2a4df..fee8a14 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -111,7 +111,7 @@ export async function execCommand( output: false, debug: false, spinner: true, - } + }, ): Promise { let commandResult = null; // Call command (disable color before for json parsing) @@ -126,7 +126,7 @@ export async function execCommand( if (COMMANDS_RESULTS[command]) { // use cache Logger.log( - `[vscode-sfdx-hardis][command] Waiting for promise already started for command ${command}` + `[vscode-sfdx-hardis][command] Waiting for promise already started for command ${command}`, ); commandResult = COMMANDS_RESULTS[command].result ?? @@ -175,12 +175,12 @@ export async function execCommand( const parsedResult = JSON.parse(commandResult.stdout.toString()); if (options.fail && parsedResult.status && parsedResult.status > 0) { throw new Error( - c.red(`[sfdx-hardis][ERROR] Command failed: ${commandResult}`) + c.red(`[sfdx-hardis][ERROR] Command failed: ${commandResult}`), ); } if (commandResult.stderr && commandResult.stderr.length > 2) { Logger.log( - "[sfdx-hardis][WARNING] stderr: " + c.yellow(commandResult.stderr) + "[sfdx-hardis][WARNING] stderr: " + c.yellow(commandResult.stderr), ); } return parsedResult; @@ -189,7 +189,7 @@ export async function execCommand( return { status: 1, errorMessage: c.red( - `[sfdx-hardis][ERROR] Error parsing JSON in command result: ${e.message}\n${commandResult.stdout}\n${commandResult.stderr})` + `[sfdx-hardis][ERROR] Error parsing JSON in command result: ${e.message}\n${commandResult.stdout}\n${commandResult.stderr})`, ), }; } @@ -203,7 +203,7 @@ export async function execSfdxJson( fail: false, output: false, debug: false, - } + }, ): Promise { if (!command.includes("--json")) { command += " --json"; @@ -228,11 +228,11 @@ export function getWorkspaceRoot() { let sfdxProjectJsonFound: boolean | null = null; export function hasSfdxProjectJson( - options: { recalc: boolean } = { recalc: false } + options: { recalc: boolean } = { recalc: false }, ) { if (sfdxProjectJsonFound === null || options.recalc === true) { sfdxProjectJsonFound = fs.existsSync( - path.join(getWorkspaceRoot(), "sfdx-project.json") + path.join(getWorkspaceRoot(), "sfdx-project.json"), ); } return sfdxProjectJsonFound; @@ -266,7 +266,7 @@ export function findInOrgCache(orgCriteria: any) { } export async function getUsernameInstanceUrl( - username: string + username: string, ): Promise { // username - instances cache if (USER_INSTANCE_URL_CACHE[username]) { @@ -284,7 +284,7 @@ export async function getUsernameInstanceUrl( { fail: false, output: false, - } + }, ); if (orgInfoResult.result) { const orgInfo = orgInfoResult.result || orgInfoResult; @@ -304,7 +304,7 @@ export async function loadProjectSfdxHardisConfig() { const configRes = await execSfdxJson( "sfdx hardis:config:get --level project", null, - { fail: false, output: true } + { fail: false, output: true }, ); PROJECT_CONFIG = configRes?.result?.config || {}; return PROJECT_CONFIG; @@ -335,7 +335,7 @@ async function loadFromRemoteConfigFile(url: string) { "[sfdx-hardis] Unable to read remote configuration file at " + url + "\n" + - JSON.stringify(remoteConfigResp) + JSON.stringify(remoteConfigResp), ); } const remoteConfig = yaml.load(remoteConfigResp.data); @@ -347,7 +347,7 @@ export async function readSfdxHardisConfig(): Promise { if (vscode.workspace.workspaceFolders) { const configFile = path.join( vscode.workspace.workspaceFolders[0].uri.fsPath, - `config/.sfdx-hardis.yml` + `config/.sfdx-hardis.yml`, ); if (fs.existsSync(configFile)) { return await loadFromLocalConfigFile(configFile); @@ -358,12 +358,12 @@ export async function readSfdxHardisConfig(): Promise { export async function writeSfdxHardisConfig( key: string, - value: any + value: any, ): Promise { if (vscode.workspace.workspaceFolders) { const configFile = path.join( vscode.workspace.workspaceFolders[0].uri.fsPath, - `config/.sfdx-hardis.yml` + `config/.sfdx-hardis.yml`, ); await fs.ensureDir(path.dirname(configFile)); const config = await readSfdxHardisConfig(); diff --git a/src/webviews/welcome.ts b/src/webviews/welcome.ts index 8c11114..7e4bb56 100644 --- a/src/webviews/welcome.ts +++ b/src/webviews/welcome.ts @@ -15,7 +15,7 @@ export class WelcomePanel { registerWelcomeCommand() { const disposable = vscode.commands.registerCommand( "vscode-sfdx-hardis.welcome", - () => this.displayWelcomePanel() + () => this.displayWelcomePanel(), ); this.disposables.push(disposable); } @@ -26,7 +26,7 @@ export class WelcomePanel { "sfdxHardisWelcome", "SFDX Hardis: Welcome", vscode.ViewColumn.One, - {} + {}, ); // And set its HTML content diff --git a/src/worker.ts b/src/worker.ts index 53f539b..8fb38dc 100644 --- a/src/worker.ts +++ b/src/worker.ts @@ -16,6 +16,6 @@ if (workerData.cliCommand) { parentPort.postMessage({ stdout: stdout, stderr: stderr }); } } - } + }, ); } diff --git a/yarn.lock b/yarn.lock index 14a583f..67e5a3d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -616,9 +616,9 @@ ansi-colors@4.1.1, ansi-colors@^4.1.1: integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz" - integrity "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= sha512-wFUFA5bg5dviipbQQ32yOQhl6gcJaJXiHE7dvR8VYPG97+J/GNC5FKGepKdEDUFeXRzDxPF1X/Btc8L+v7oqIQ==" + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== ansi-regex@^5.0.0: version "5.0.1" @@ -1013,9 +1013,9 @@ decamelize@^4.0.0: integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz" - integrity "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==" + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== deep-is@^0.1.3: version "0.1.3" @@ -1810,13 +1810,20 @@ mime@^1.3.4: resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4: +minimatch@3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" +minimatch@^3.0.3, minimatch@^3.0.4: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + minimist@^1.2.5: version "1.2.6" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" @@ -2094,9 +2101,9 @@ punycode@^2.1.0: integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== qs@^6.9.4: - version "6.10.1" - resolved "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz" - integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity "sha1-ZL6lHxLB9dobwBSW9I/8/3xp19k= sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==" dependencies: side-channel "^1.0.4" @@ -2224,9 +2231,9 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== semver@^5.1.0, semver@^5.3.0, semver@^5.4.1: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity "sha1-SNVdtzfDKHzUg14X+hP+rOHEHvg= sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" semver@^7.2.1, semver@^7.3.2: version "7.3.4" @@ -2575,9 +2582,9 @@ wide-align@1.1.3: string-width "^1.0.2 || 2" word-wrap@^1.2.3: - version "1.2.3" - resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== workerpool@6.1.0: version "6.1.0"