From 8f212f62714daecf2ff669fd4aa14b9ae0b6ef38 Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Tue, 4 Aug 2026 13:32:07 -0230 Subject: [PATCH] chore: remove unused action The action `publish-slack-release-testing-status` is no longer used. The action and associated script have been deleted, along with other related references and dependencies. --- .../action.yml | 72 --- .github/scripts/slack-release-testing.mjs | 467 ------------------ README.md | 2 - package.json | 2 - yarn.lock | 124 +---- 5 files changed, 5 insertions(+), 662 deletions(-) delete mode 100644 .github/actions/publish-slack-release-testing-status/action.yml delete mode 100644 .github/scripts/slack-release-testing.mjs diff --git a/.github/actions/publish-slack-release-testing-status/action.yml b/.github/actions/publish-slack-release-testing-status/action.yml deleted file mode 100644 index a5fa3cd5..00000000 --- a/.github/actions/publish-slack-release-testing-status/action.yml +++ /dev/null @@ -1,72 +0,0 @@ -name: Publish Slack Release Testing Status -description: 'Publish the release testing status to Slack channels based on a Google Document.' - -inputs: - platform: - description: 'The platform for which the release testing status is being published (e.g., mobile, extension).' - required: true - google-document-id: - description: 'The ID of the Google Document containing the release testing status.' - required: true - test-only: - description: 'If set to true, the action will only run in test mode and not publish to production Slack channels.' - required: false - default: 'false' - slack-api-key: - description: 'The API key for Slack to post the release testing status.' - required: true - github-token: - description: 'The GitHub token for authentication.' - required: true - google-application-creds-base64: - description: 'Base64 encoded Google application credentials for accessing Google Docs.' - required: true - github-tools-repository: - description: 'The GitHub repository containing the GitHub tools. Defaults to the GitHub tools action repositor, and usually does not need to be changed.' - required: false - default: ${{ github.action_repository }} - github-tools-ref: - description: 'The SHA of the action to use. Defaults to the current action ref, and usually does not need to be changed.' - required: false - default: ${{ github.action_ref }} - -runs: - using: composite - steps: - - name: Checkout GitHub tools repository - uses: actions/checkout@v6 - with: - repository: ${{ inputs.github-tools-repository }} - ref: ${{ inputs.github-tools-ref }} - path: ./github-tools - - - name: Set up Node.js - uses: actions/setup-node@v6 - with: - node-version-file: ./github-tools/.nvmrc - cache-dependency-path: ./github-tools/yarn.lock - cache: yarn - - - name: Enable Corepack - run: corepack enable - shell: bash - working-directory: ./github-tools - - - name: Install dependencies - run: yarn --immutable - shell: bash - working-directory: ./github-tools - - - name: Publish Slack Release Testing Status - id: publish-slack-release-testing-status - shell: bash - env: - GITHUB_TOKEN: ${{ inputs.github-token }} - SLACK_API_KEY: ${{ inputs.slack-api-key }} - GOOG_DOCUMENT_ID: ${{ inputs.google-document-id }} - GOOGLE_APPLICATION_CREDENTIALS_BASE64: ${{ inputs.google-application-creds-base64 }} - TEST_ONLY: ${{ inputs.test-only }} - PLATFORM: ${{ inputs.platform }} - working-directory: ./github-tools - run: | - yarn run slack:release-testing diff --git a/.github/scripts/slack-release-testing.mjs b/.github/scripts/slack-release-testing.mjs deleted file mode 100644 index 7c91f476..00000000 --- a/.github/scripts/slack-release-testing.mjs +++ /dev/null @@ -1,467 +0,0 @@ -import { google } from 'googleapis'; -import { WebClient } from '@slack/web-api'; -import { Octokit } from '@octokit/rest'; - -// Clients -const sheets = google.sheets('v4'); -const token = process.env.SLACK_API_KEY; -const githubToken = process.env.GITHUB_TOKEN; -const slackClient = new WebClient(token); -const octokit = new Octokit({ - auth: githubToken, -}); - -let slackTeamsMap = null; // This will store the mapping of slack team names to IDs - -/** - * Retrieves and returns a Google authentication client. - * - * This function initializes a GoogleAuth object with a specific key file - * and predefined scopes necessary for accessing Google Sheets API. It - * returns a client instance that can be used to authenticate API requests. - * - * @returns {Promise} Returns a promise that resolves - * to an instance of OAuth2Client which can be used to authenticate - * Google API requests. - */ -async function getGoogleAuth() { - // Decode base64 string from the environment variable - const credentialsJson = Buffer.from( - process.env.GOOGLE_APPLICATION_CREDENTIALS_BASE64, - 'base64', - ).toString('utf8'); - - // Parse the JSON string to an object - const credentials = JSON.parse(credentialsJson); - - // Initialize GoogleAuth with credentials object directly - const auth = new google.auth.GoogleAuth({ - credentials: credentials, - scopes: ['https://www.googleapis.com/auth/spreadsheets'], - }); - - return auth.getClient(); -} - -/** - * Initializes the group map by fetching user groups from Slack and mapping their names to IDs. - */ -async function initializeSlackTeams() { - try { - const response = await slackClient.usergroups.list({ - include_disabled: false, - }); - - if (response.ok && response.usergroups) { - slackTeamsMap = response.usergroups.reduce((map, group) => { - map[group.handle] = group.id; - return map; - }, {}); - } else { - throw new Error(`Failed to load user groups: ${response.error}`); - } - } catch (error) { - console.error('Error initializing group map:', error); - throw error; - } - - console.log( - 'Slack Teams initialized with size of', - Object.keys(slackTeamsMap).length, - ); -} - -/** - * Parses release update data from a structured text input into a structured JSON array. - * The expected line format is: - * Emoji: *Team Name* - @SlackHandle There are X total changes. *Pending validation:* Y. *Status:* Z - * - * @param {string} data Multiline string containing release update information for multiple teams. - * @returns {Array} An array of objects, each representing the parsed data of a team's release update. - * Each object includes properties for emoji, team name, Slack handle, changes, pending validations, - * and status, all extracted and converted from the string data. - */ -function parseReleaseUpdates(data) { - const lines = data.split('\n'); - const result = []; - - const regex = - /(.*?):\s+\*(.*?)\*\s+-\s+@(.*?)\s+There (?:is|are) (\d+) .*? changes\. \*Pending validation:\* (\d+)\. \*Status:\* (.*)/; - - lines.forEach((line) => { - const match = line.match(regex); - if (match) { - const [_, emoji, team, slackHandle, changes, pendingValidations, status] = - match; - result.push({ - emoji: emoji.trim(), - team: team.trim(), - slackHandle: slackHandle.trim(), - changes: parseInt(changes), - pendingValidations: parseInt(pendingValidations), - status: status.trim(), - }); - } - }); - - return result; -} - -/** - * Retrieves the URL of the first pull request for a given branch in a specified GitHub repository. - * - * @param {string} owner - The GitHub username or organization name that owns the repository. - * @param {string} repo - The name of the repository. - * @param {string} branchName - The name of the branch for which to find pull requests. - * @returns {Promise} A promise that resolves to the URL of the first pull request matching the branch name. - * @throws {Error} Throws an error if no pull requests are found for the branch or if there is a problem fetching pull requests. - */ -async function findPullRequestUrlByBranch(owner, repo, branchName) { - try { - // Fetch pull requests that match the branch name - const { data } = await octokit.pulls.list({ - owner, - repo, - head: `${owner}:${branchName}`, // Ensure to include the owner prefix if needed - state: 'all', - }); - - // Check if there are any pull requests returned - if (data.length > 0) { - // Assuming you want the first PR that matches - return data[0].html_url; // Return the URL of the first matching PR - } else { - throw new Error(`No pull requests found for branch ${branchName}`); - } - } catch (error) { - console.error('Error fetching pull requests:', error); - throw error; - } -} - -/** - * retrieves a list of active releases from a Google Sheets document. - * Each sheet in the document represents a different release. Only sheets with visible - * titles containing a semantic version and optionally a platform within parentheses - * are considered. Each active release is identified by parsing the sheet's title - * for semantic versioning and platform details. - * - * @param {string} documentId - The ID of the Google Sheets document to query. - * @returns {Promise} A promise that resolves to an array of objects, each representing - * an active release with properties for the document ID, semantic version, platform, - * sheet ID, and the testing status. - * @throws {Error} Throws an error if there is an issue retrieving data from the spreadsheet. - * - */ -async function getActiveReleases(documentId) { - const authClient = await getGoogleAuth(); - - try { - const response = await sheets.spreadsheets.get({ - spreadsheetId: documentId, - auth: authClient, - fields: 'sheets(properties(title,sheetId,hidden))', - }); - - const sheetsData = response.data.sheets; - if (!sheetsData) { - console.log('No sheets found in the spreadsheet.'); - return []; - } - - // Create a list of promises for each sheet using map - const promises = sheetsData - .filter((sheet) => !sheet.properties.hidden) - .map(async (sheet) => { - const { title } = sheet.properties; - const versionMatch = title.match(/v(\d+\.\d+\.\d+)/); - const platformMatch = title.match(/\(([^)]+)\)/); - - if (!versionMatch) { - console.log(`Skipping sheet: ${title} - Semantic version not found.`); - return null; // Skip this sheet because we couldn't determine the semantic version - } - - // Await inside async map callback - const testingStatusData = await readSheetData( - documentId, - title, - 'L1:L1', - ); - - return { - DocumentId: documentId, - SemanticVersion: versionMatch[1], - Platform: platformMatch ? platformMatch[1] : 'extension', - sheetId: sheet.properties.sheetId, - testingStatus: testingStatusData - ? testingStatusData[0][0] - : 'Unknown', - }; - }); - - // Filter out null values (sheets that were skipped) and resolve all promises - const results = await Promise.all(promises); - return results.filter((result) => result !== null); - } catch (err) { - console.error('Failed to retrieve spreadsheet data:', err); - throw err; - } -} - -/** - * Reads data from a specified cell or range in a single sheet within a Google Spreadsheet. - * @param {string} spreadsheetId - The ID of the Google Spreadsheet. - * @param {string} sheetName - The name of the sheet within the spreadsheet. - * @param {string} cellRange - The A1 notation of the range to read (e.g., 'A1', 'A1:B2'). - * @returns {Promise} The data read from the specified range, or undefined if no data. - */ -async function readSheetData(spreadsheetId, sheetName, cellRange) { - const authClient = await getGoogleAuth(); - - try { - const range = `${sheetName}!${cellRange}`; - const result = await sheets.spreadsheets.values.get({ - spreadsheetId, - range, - auth: authClient, - }); - - return result.data.values; - } catch (err) { - console.error('Failed to read data from the sheet:', err); - throw err; - } -} - -/** - * fetches the count and details of GitHub issues marked as release blockers - * for a specific version and team. This function queries GitHub issues that are tagged with - * specific labels related to the release version, team, and a "release-blocker" label. - * - * @param {Object} release - An object representing the release - * @param{Object} team - An object representing the team - * @returns {Promise} A promise that resolves to an object containing the count of open release-blocking issues, - * a URL to view these issues on GitHub, and optionally an array of issue objects. - * @throws {Error} Throws an error if the GitHub API call fails. - * - */ -async function getReleaseBlockers(release, team) { - const versionLabel = `regression-RC-${release.SemanticVersion}`; - - const teamLabel = `team-${team}`.toLowerCase(); - const owner = 'MetaMask'; // Replace with the GitHub owner - const repo = `metamask-${release.Platform}`; - - const labels = `${versionLabel},${teamLabel},release-blocker`; - try { - const { data } = await octokit.rest.issues.listForRepo({ - owner, - repo, - labels: labels, - state: 'open', // Optionally, filter by state (open, closed, all) - }); - - const issuesCount = data.length; - const issuesUrl = `https://github.com/${owner}/${repo}/issues?q=is:issue+is:open+label:${encodeURIComponent( - versionLabel, - )}+label:${encodeURIComponent(teamLabel)}+label:release-blocker`; - - return { - count: issuesCount, - url: issuesUrl, - issues: data, // Optionally include this if you want the issue data - }; - } catch (error) { - console.error('Failed to fetch issues:', error); - return error; - } -} - -/** - * Determine the Slack channel name to publish to based on the release - * @param {*} release - */ -async function getPublishChannelName(release) { - // convert the version to a format that can be used in a channel name - const formattedVersion = release.SemanticVersion.replace(/\./g, '-'); - - const channel = `#release-${release.Platform}-${formattedVersion}`; - - // Allows for local testing without publishing actual release channels - if (testOnly()) { - return `${channel}-testonly`; - } else { - return channel; - } -} - -async function fmtSlackHandle(team) { - // Notify if they have pending validations or have not completed signoff - const shouldNotify = - team.pendingValidations > 0 || - team.status.trim().toLowerCase() !== 'completed'; - - // Don't notify teams when in testOnly mode - if (testOnly()) { - return shouldNotify ? ` - @${team.slackHandle}` : ''; - } - - // Lookup Slack Team Id for real notifications - const slackTeamId = slackTeamsMap[`${team.slackHandle}`]; - - // Check if slackTeamId is not found in the map - if (!slackTeamId) { - console.log( - `Slack team ID not found for handle: ${team.slackHandle}`, - ); - return ''; - } - - return shouldNotify ? ` - ` : ''; -} - - -/** - * Publishes the testing status for a release to the appropriate Slack channel - * @param {Object} release represents a release - */ -async function publishReleaseTestingStatus(release) { - const fmtPlatform = formatTitle(release.Platform); - const teamResults = parseReleaseUpdates(release.testingStatus); - const releasePrUrl = await findPullRequestUrlByBranch( - 'MetaMask', // repo owner - `metamask-${release.Platform}`, // repo name - `release/${release.SemanticVersion}`, // release branch name - ); - const channel = await getPublishChannelName(release); - - console.log( - `Publishing testing status for release ${release.SemanticVersion} on platform ${release.Platform} to channel ${channel}`, - ); - - var header = - `:blablablocker:* [${fmtPlatform}] - ${release.SemanticVersion} Release Validation.*\n` + - `_*Testing Plan and Progress Tracker Summary*_ ():`; - - var body = `*Teams Sign Off ${release.SemanticVersion} Release on <${releasePrUrl}|GH>:*\n`; - - const hasPendingSignoffs = teamResults.some( - (team) => team.status !== 'Completed', - ); - - let releaseBlockerCount = 0; - - for (const team of teamResults) { - let slackHandlePart = await fmtSlackHandle(team); - //Grab RCs for a specific team/release - const releaseBlockers = await getReleaseBlockers(release, team.team); - //Accumulate the total release blocker count - releaseBlockerCount += releaseBlockers.count; - let releaseBlockerParts = - releaseBlockers.count > 0 - ? ` - <${releaseBlockers.url}|${releaseBlockers.count} Release Blockers>` - : ''; - - body += `${team.emoji}: *${team.team}*${slackHandlePart}${releaseBlockerParts}\n`; - } - - if (hasPendingSignoffs) { - header += `\n:bell: *Status Update*: Several Release Signs Offs are still Pending. There are ${releaseBlockerCount} open Release Blockers.\n`; - } - - const footer = `*Important Reminder:*\nPlease be aware of the importance of starting your testing immediately to ensure there is sufficient time to address any unexpected defects. This proactive approach will help prevent release delays and minimize the impact on other teams’ deliveries.`; - - const slackMessage = `${header}\n${body}\n${footer}`; - - try { - await slackClient.chat.postMessage({ - channel: channel, - text: slackMessage, - unfurl_links: false, - unfurl_media: false, - }); - - console.log( - `Message successfully sent to channel ${channel} for release ${release.SemanticVersion} on platform ${release.Platform}.`, - ); - } catch (error) { - console.error('API error:', error); - throw error; - } -} - -/** - * publishes the testing status for a list of releases. - * - * @param {Object[]} releases - An array of release objects. Each release object should be suitable - * for use with the `publishReleaseTestingStatus` function. - * @throws {Error} Throws an error if the publishing process fails for one or more releases. - * - */ -async function publishReleasesTestingStatus(releases) { - console.log('Publishing testing status for all active releases...'); - - try { - const promises = releases.map((release) => - publishReleaseTestingStatus(release), - ); - await Promise.all(promises); - } catch (error) { - console.error('An error occurred:', error); - throw error; - } -} - -async function main() { - const documentId = process.env.GOOG_DOCUMENT_ID; - - if (!documentId) { - console.error( - 'Document ID is not set. Please set the GOOG_DOCUMENT_ID environment variable.', - ); - return; - } - - const platform = process.env.PLATFORM; - - if (!platform) { - console.error( - 'Platform is not set. Please set the PLATFORM environment variable.', - ); - return; - } - - await initializeSlackTeams(); - - const activeReleases = await getActiveReleases(documentId); - - // Filter active releases based on the platform - const filteredReleases = activeReleases.filter( - (release) => release.Platform === platform, - ); - - filteredReleases.forEach((release) => { - console.log( - `Version: ${release.SemanticVersion}, Platform: ${release.Platform}, Sheet ID: ${release.sheetId}`, - ); - }); - - await publishReleasesTestingStatus(filteredReleases); -} - -//Entrypoint -main(); - -// Helper functions -function formatTitle(val) { - return String(val).charAt(0).toUpperCase() + String(val).slice(1); -} - -function testOnly() { - return process.env.TEST_ONLY === 'true'; -} - -function createSheetUrl(documentId, sheetId) { - return `https://docs.google.com/spreadsheets/d/${documentId}/edit#gid=${sheetId}`; -} diff --git a/README.md b/README.md index 4c8c4ead..03d82dc4 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,6 @@ This repository holds a collection of scripts which are intended to be run local - `yarn get-review-metrics`: Gets the PR load of the extension platform team. - `yarn count-references-to-contributor-docs`: Counts the number of references to the `contributor-docs` repo in pull request comments. -- `yarn run slack:release-testing`: Publishes a notification to slack for active releases regarding the release testing statuses. - ### Authentication Some scripts require a GitHub token in order to run fully. diff --git a/package.json b/package.json index 7ee3e9e9..881a0fc9 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,6 @@ "lint:fix": "yarn lint:eslint --fix && yarn lint:constraints --fix && yarn lint:misc --write && yarn lint:dependencies", "lint:misc": "prettier '**/*.json' '**/*.md' '**/*.yml' '!.yarnrc.yml' --ignore-path .gitignore --no-error-on-unmatched-pattern", "lint:tsc": "tsc", - "slack:release-testing": "node .github/scripts/slack-release-testing.mjs", "test": "jest && jest-it-up", "test:watch": "jest --watch", "update-release-sheet": "node .github/scripts/update-release-sheet.mjs" @@ -31,7 +30,6 @@ "@octokit/graphql": "^7.0.1", "@octokit/request": "^8.1.1", "@octokit/rest": "^19.0.13", - "@slack/web-api": "^6.0.0", "@slack/webhook": "^7.0.6", "@types/luxon": "^3.3.0", "axios": "^0.24.0", diff --git a/yarn.lock b/yarn.lock index b892f28a..7e2d8ed2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1023,7 +1023,6 @@ __metadata: "@octokit/graphql": "npm:^7.0.1" "@octokit/request": "npm:^8.1.1" "@octokit/rest": "npm:^19.0.13" - "@slack/web-api": "npm:^6.0.0" "@slack/webhook": "npm:^7.0.6" "@swc/cli": "npm:^0.1.62" "@swc/core": "npm:^1.3.80" @@ -1542,41 +1541,13 @@ __metadata: languageName: node linkType: hard -"@slack/logger@npm:^3.0.0": - version: 3.0.0 - resolution: "@slack/logger@npm:3.0.0" - dependencies: - "@types/node": "npm:>=12.0.0" - checksum: 10/6512d0e9e4be47ea465705ab9b6e6901f36fa981da0d4a657fde649d452b567b351002049b5ee0a22569b5119bf6c2f61befd5b8022d878addb7a99c91b03389 - languageName: node - linkType: hard - -"@slack/types@npm:^2.11.0, @slack/types@npm:^2.9.0": +"@slack/types@npm:^2.9.0": version: 2.16.0 resolution: "@slack/types@npm:2.16.0" checksum: 10/e18b568a47d94e9e7234dfd06f789224d6804edae4a2f31068b3f388ce4c482a6dbc6c035dc3dec63e5723f211f92c7694ee40b2ec83d4ac90d46bb35fa46eb5 languageName: node linkType: hard -"@slack/web-api@npm:^6.0.0": - version: 6.13.0 - resolution: "@slack/web-api@npm:6.13.0" - dependencies: - "@slack/logger": "npm:^3.0.0" - "@slack/types": "npm:^2.11.0" - "@types/is-stream": "npm:^1.1.0" - "@types/node": "npm:>=12.0.0" - axios: "npm:^1.7.4" - eventemitter3: "npm:^3.1.0" - form-data: "npm:^2.5.0" - is-electron: "npm:2.2.2" - is-stream: "npm:^1.1.0" - p-queue: "npm:^6.6.1" - p-retry: "npm:^4.0.0" - checksum: 10/f98ccfcab1e82473f14bfbbcd886d52d93c20cc01871bb4a77e49712e1d2e2e686a93bd96a853f7e99d9a6dc6bd8b408ee922b57b1954a49490364c8697357ed - languageName: node - linkType: hard - "@slack/webhook@npm:^7.0.6": version: 7.0.6 resolution: "@slack/webhook@npm:7.0.6" @@ -1870,15 +1841,6 @@ __metadata: languageName: node linkType: hard -"@types/is-stream@npm:^1.1.0": - version: 1.1.0 - resolution: "@types/is-stream@npm:1.1.0" - dependencies: - "@types/node": "npm:*" - checksum: 10/03ca9635bdea282da17135d297085c325e965af09fecaa0678bb9c5302b9ffa61d089a5056ad4980b6b1871dfd9e6420f0d35da9729fcffeee6bd6348e7c9010 - languageName: node - linkType: hard - "@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": version: 2.0.3 resolution: "@types/istanbul-lib-coverage@npm:2.0.3" @@ -1958,7 +1920,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>=12.0.0, @types/node@npm:>=18.0.0": +"@types/node@npm:*, @types/node@npm:>=18.0.0": version: 24.3.0 resolution: "@types/node@npm:24.3.0" dependencies: @@ -1997,13 +1959,6 @@ __metadata: languageName: node linkType: hard -"@types/retry@npm:0.12.0": - version: 0.12.0 - resolution: "@types/retry@npm:0.12.0" - checksum: 10/bbd0b88f4b3eba7b7acfc55ed09c65ef6f2e1bcb4ec9b4dca82c66566934351534317d294a770a7cc6c0468d5573c5350abab6e37c65f8ef254443e1b028e44d - languageName: node - linkType: hard - "@types/semver@npm:^7, @types/semver@npm:^7.3.12": version: 7.7.0 resolution: "@types/semver@npm:7.7.0" @@ -2540,7 +2495,7 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.11.0, axios@npm:^1.7.4": +"axios@npm:^1.11.0": version: 1.11.0 resolution: "axios@npm:1.11.0" dependencies: @@ -3122,7 +3077,7 @@ __metadata: languageName: node linkType: hard -"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8": +"combined-stream@npm:^1.0.8": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" dependencies: @@ -4044,20 +3999,6 @@ __metadata: languageName: node linkType: hard -"eventemitter3@npm:^3.1.0": - version: 3.1.2 - resolution: "eventemitter3@npm:3.1.2" - checksum: 10/e2886001beb52cd2fe47d2470fd6266b7c70bd3ac356c0041a7e64336ed57bb1fc9b07bc9043d34b39913488a8d81bfcde62d3af597974980aa01b50844d869b - languageName: node - linkType: hard - -"eventemitter3@npm:^4.0.4": - version: 4.0.7 - resolution: "eventemitter3@npm:4.0.7" - checksum: 10/8030029382404942c01d0037079f1b1bc8fed524b5849c237b80549b01e2fc49709e1d0c557fa65ca4498fc9e24cff1475ef7b855121fcc15f9d61f93e282346 - languageName: node - linkType: hard - "execa@npm:^0.7.0": version: 0.7.0 resolution: "execa@npm:0.7.0" @@ -4357,18 +4298,6 @@ __metadata: languageName: node linkType: hard -"form-data@npm:^2.5.0": - version: 2.5.2 - resolution: "form-data@npm:2.5.2" - dependencies: - asynckit: "npm:^0.4.0" - combined-stream: "npm:^1.0.6" - mime-types: "npm:^2.1.12" - safe-buffer: "npm:^5.2.1" - checksum: 10/ef602e52f0bfcc8f8c346b8783f6dbd2fb271596788d42cf929dddaa50bd61e97da21f01464b4524e77872682264765e53c75ac1ab1466ea23f5c96de585faff - languageName: node - linkType: hard - "form-data@npm:^4.0.4": version: 4.0.4 resolution: "form-data@npm:4.0.4" @@ -5114,13 +5043,6 @@ __metadata: languageName: node linkType: hard -"is-electron@npm:2.2.2": - version: 2.2.2 - resolution: "is-electron@npm:2.2.2" - checksum: 10/de5aa8bd8d72c96675b8d0f93fab4cc21f62be5440f65bc05c61338ca27bd851a64200f31f1bf9facbaa01b3dbfed7997b2186741d84b93b63e0aff1db6a9494 - languageName: node - linkType: hard - "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -6742,35 +6664,6 @@ __metadata: languageName: node linkType: hard -"p-queue@npm:^6.6.1": - version: 6.6.2 - resolution: "p-queue@npm:6.6.2" - dependencies: - eventemitter3: "npm:^4.0.4" - p-timeout: "npm:^3.2.0" - checksum: 10/60fe227ffce59fbc5b1b081305b61a2f283ff145005853702b7d4d3f99a0176bd21bb126c99a962e51fe1e01cb8aa10f0488b7bbe73b5dc2e84b5cc650b8ffd2 - languageName: node - linkType: hard - -"p-retry@npm:^4.0.0": - version: 4.6.2 - resolution: "p-retry@npm:4.6.2" - dependencies: - "@types/retry": "npm:0.12.0" - retry: "npm:^0.13.1" - checksum: 10/45c270bfddaffb4a895cea16cb760dcc72bdecb6cb45fef1971fa6ea2e91ddeafddefe01e444ac73e33b1b3d5d29fb0dd18a7effb294262437221ddc03ce0f2e - languageName: node - linkType: hard - -"p-timeout@npm:^3.2.0": - version: 3.2.0 - resolution: "p-timeout@npm:3.2.0" - dependencies: - p-finally: "npm:^1.0.0" - checksum: 10/3dd0eaa048780a6f23e5855df3dd45c7beacff1f820476c1d0d1bcd6648e3298752ba2c877aa1c92f6453c7dd23faaf13d9f5149fc14c0598a142e2c5e8d649c - languageName: node - linkType: hard - "p-try@npm:^2.0.0": version: 2.2.0 resolution: "p-try@npm:2.2.0" @@ -7281,13 +7174,6 @@ __metadata: languageName: node linkType: hard -"retry@npm:^0.13.1": - version: 0.13.1 - resolution: "retry@npm:0.13.1" - checksum: 10/6125ec2e06d6e47e9201539c887defba4e47f63471db304c59e4b82fc63c8e89ca06a77e9d34939a9a42a76f00774b2f46c0d4a4cbb3e287268bd018ed69426d - languageName: node - linkType: hard - "reusify@npm:^1.0.4": version: 1.0.4 resolution: "reusify@npm:1.0.4" @@ -7334,7 +7220,7 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.2.1, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: 10/32872cd0ff68a3ddade7a7617b8f4c2ae8764d8b7d884c651b74457967a9e0e886267d3ecc781220629c44a865167b61c375d2da6c720c840ecd73f45d5d9451