From 05285f8f49c245a32bdc7d207c172df790844c6d Mon Sep 17 00:00:00 2001 From: Victor Rubezhny Date: Thu, 5 Jun 2025 00:30:52 +0200 Subject: [PATCH] Enable using the ESM dependencies where possible Issue: #5086 Signed-off-by: Victor Rubezhny --- .vscode/tasks.json | 37 +- .vscodeignore | 2 + build/bundle-tools.cjs | 61 + build/bundle-tools.ts | 49 - build/esbuild.build.cjs | 99 + build/esbuild.mjs | 255 --- build/esbuild.plugins.cjs | 175 ++ build/esbuild.settings.cjs | 37 + build/esbuild.transform-esm.cjs | 29 + build/esbuild.webviews.cjs | 119 + .../{install-vscode.ts => install-vscode.cjs} | 30 +- build/{run-tests.ts => run-tests.cjs} | 14 +- build/verify-tools.cjs | 66 + build/verify-tools.ts | 80 - package-lock.json | 1977 ++++++----------- package.json | 42 +- src/deployment.ts | 4 +- src/downloadUtil/archive.ts | 2 +- src/downloadUtil/download.ts | 5 +- src/explorer.ts | 18 +- src/extension.ts | 9 + src/k8s/console.ts | 6 +- src/openshift/cluster.ts | 47 +- src/openshift/component.ts | 2 +- src/openshift/project.ts | 46 +- src/util/async.ts | 6 + src/util/childProcessUtil.ts | 2 +- src/util/kubeUtils.ts | 12 +- src/util/utils.ts | 30 +- src/util/watch.ts | 2 +- src/vscommand.ts | 4 +- src/webview/cluster/app/index.html | 13 + src/webview/cluster/clusterViewLoader.ts | 6 +- src/webview/create-component/app/index.html | 15 +- src/webview/create-deployment/app/index.html | 13 + src/webview/create-route/app/index.html | 13 + src/webview/create-service/app/index.html | 13 + src/webview/devfile-registry/app/index.html | 15 +- src/webview/feedback/app/index.html | 13 + src/webview/helm-chart/app/index.html | 13 + .../helm-manage-repository/app/index.html | 13 + .../invoke-serverless-function/app/index.html | 13 + src/webview/openshift-terminal/app/index.html | 15 +- .../serverless-function/app/index.html | 13 + .../app/index.html | 13 + src/webview/tsconfig.json | 3 +- src/webview/welcome/app/index.html | 13 + test/bootstrap.js | 17 + .../openshiftTerminalWebviewView.ts | 4 +- test/unit/activation.ts | 12 + test/unit/extension.test.ts | 23 +- test/unit/index.ts | 1 - test/unit/k8s/console.test.ts | 12 +- test/unit/openshift/component.test.ts | 8 +- test/unit/openshift/project.test.ts | 2 - test/unit/util/archive.test.ts | 2 +- test/unit/util/childProcessUtil.test.ts | 2 +- test/unit/util/download.test.ts | 35 +- test/unit/util/watch.test.ts | 2 +- tsconfig.json | 86 +- 60 files changed, 1714 insertions(+), 1956 deletions(-) create mode 100644 build/bundle-tools.cjs delete mode 100644 build/bundle-tools.ts create mode 100644 build/esbuild.build.cjs delete mode 100644 build/esbuild.mjs create mode 100644 build/esbuild.plugins.cjs create mode 100644 build/esbuild.settings.cjs create mode 100644 build/esbuild.transform-esm.cjs create mode 100644 build/esbuild.webviews.cjs rename build/{install-vscode.ts => install-vscode.cjs} (64%) rename build/{run-tests.ts => run-tests.cjs} (85%) mode change 100644 => 100755 create mode 100644 build/verify-tools.cjs delete mode 100644 build/verify-tools.ts create mode 100644 test/bootstrap.js diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 94b0be177..6dc8b1049 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -4,21 +4,36 @@ "version": "2.0.0", "tasks": [ { - "label": "watch", + "label": "watch:extension", "type": "npm", - "script": "watch", + "script": "watch:extension", + "isBackground": true, + "problemMatcher": "$tsc-watch" + }, + { + "label": "watch:webviews", + "type": "npm", + "script": "watch:webviews", "isBackground": true, "problemMatcher": { - "background": { - "beginsPattern": "\\[[^\\]]+\\] File change detected. Compiling...", - "endsPattern": "\\[[^\\]]+\\] Compilation complete. Found (?:no|some) errors. Watching for file changes.", - "activeOnStart": false, + "owner": "custom", + "pattern": { + "regexp": "." }, - "base": "$tsc-watch", - }, - "presentation": { - "reveal": "never", - }, + "background": { + "activeOnStart": true, + "beginsPattern": ".*Building the webviews\\.\\.\\.", + "endsPattern": ".*Watching the webviews\\.\\.\\." + } + } + }, + { + "label": "watch", + "dependsOn": [ + "watch:extension", + "watch:webviews" + ], + "dependsOrder": "parallel" }, { "label": "compile", diff --git a/.vscodeignore b/.vscodeignore index 0c96e86c2..94bccfea0 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -18,6 +18,8 @@ out/build** out/build/** out/coverage/** out/**/*.map +out/esm/** +out/shared/** out/src-orig/** out/test/** out/test-resources/** diff --git a/build/bundle-tools.cjs b/build/bundle-tools.cjs new file mode 100644 index 000000000..56f15e7db --- /dev/null +++ b/build/bundle-tools.cjs @@ -0,0 +1,61 @@ +/*----------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. + * Licensed under the MIT License. See LICENSE file in the project root for license information. + *-----------------------------------------------------------------------------------------------*/ + +/* eslint-disable guard-for-in */ +/* eslint-disable no-console */ + +const fs = require('fs'); +const path = require('path'); +const { exit } = require('process'); +const { esmAliasPlugin } = require('./esbuild.plugins.cjs'); + +require('esbuild').build({ + entryPoints: [path.resolve(__dirname, '..', 'src/downloadUtil/downloadBinaries.ts')], + platform: 'node', + target: 'node18', + format: 'cjs', + outfile: path.resolve(__dirname, '..', 'out/shared/downloadUtil.js'), + bundle: true, + plugins: [ esmAliasPlugin() ] +}).then(() => { + const { downloadFileAndCreateSha256 } = require(path.resolve(__dirname, '..', 'out/shared/downloadUtil.js')); + const configData = require('../src/tools.json'); + + async function bundleTools() { + if (process.env.REMOTE_CONTAINERS === 'true') { + return; + } + const outFolder = path.resolve('.', 'out'); + const toolsCacheFolder = path.join(outFolder, 'tools-cache'); + let currentPlatform = process.env.TARGET; + if (!currentPlatform) { + currentPlatform = process.argv.find((arg) => arg === '--platform') + ? process.platform + : 'all'; + } + console.info(`Download tools to '${toolsCacheFolder}'`); + for (const key in configData) { + const tool = configData[key]; + for (const OS in tool.platform) { + if (currentPlatform === 'all' || OS === currentPlatform) { + console.log(`Bundle '${tool.description}' for ${OS}`); + const osSpecificLocation = path.join(outFolder, 'tools', OS); + // eslint-disable-next-line no-await-in-loop + await downloadFileAndCreateSha256(toolsCacheFolder, osSpecificLocation, tool.platform[OS]); + fs.chmodSync(path.join(osSpecificLocation, tool.platform[OS].cmdFileName), 0o765); + } + } + } + } + + bundleTools().catch((error) => { + console.log(error); + exit(1); + }); + +}).catch(err => { + console.error(err); + exit(1); +}); \ No newline at end of file diff --git a/build/bundle-tools.ts b/build/bundle-tools.ts deleted file mode 100644 index ebfe20088..000000000 --- a/build/bundle-tools.ts +++ /dev/null @@ -1,49 +0,0 @@ -/*----------------------------------------------------------------------------------------------- - * Copyright (c) Red Hat, Inc. All rights reserved. - * Licensed under the MIT License. See LICENSE file in the project root for license information. - *-----------------------------------------------------------------------------------------------*/ -/* eslint-disable guard-for-in */ -/* eslint-disable no-console */ - -import * as fs from 'fs'; -import * as path from 'path'; -import { exit } from 'process'; -import { downloadFileAndCreateSha256 } from '../src/downloadUtil/downloadBinaries'; -import * as configData from '../src/tools.json'; - -async function bundleTools(): Promise { - if (process.env.REMOTE_CONTAINERS === 'true') { - return; - } - const outFolder = path.resolve('.', 'out'); - const toolsCacheFolder = path.join(outFolder, 'tools-cache'); - let currentPlatform = process.env.TARGET; - if (!currentPlatform) { - currentPlatform = process.argv.find((arg) => arg === '--platform') - ? process.platform - : 'all'; - } - console.log(currentPlatform); - console.info(`Download tools to '${toolsCacheFolder}'`); - for (const key in configData) { - const tool = configData[key]; - for (const OS in tool.platform) { - if (currentPlatform === 'all' || OS === currentPlatform) { - console.log(`Bundle '${tool.description}' for ${OS}`); - const osSpecificLocation = path.join(outFolder, 'tools', OS); - // eslint-disable-next-line no-await-in-loop - await downloadFileAndCreateSha256( - toolsCacheFolder, - osSpecificLocation, - tool.platform[OS], - ); - fs.chmodSync(path.join(osSpecificLocation, tool.platform[OS].cmdFileName), 0o765); - } - } - } -} - -bundleTools().catch((error) => { - console.log(error); - exit(1); -}); diff --git a/build/esbuild.build.cjs b/build/esbuild.build.cjs new file mode 100644 index 000000000..be3d08887 --- /dev/null +++ b/build/esbuild.build.cjs @@ -0,0 +1,99 @@ +/*----------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. + * Licensed under the MIT License. See LICENSE file in the project root for license information. + *-----------------------------------------------------------------------------------------------*/ + +const { execSync } = require('child_process'); +const esbuild = require('esbuild'); +const { esmAliasPlugin, esbuildProblemMatcherPlugin, nativeNodeModulesPlugin, svgrPlugin, verbosePlugin } = require('./esbuild.plugins.cjs'); +const { webviews, srcDir, outDir } = require('./esbuild.settings.cjs'); +const { sassPlugin } = require('esbuild-sass-plugin'); +const { cp, mkdir, stat } = require('node:fs/promises'); +const path = require('path'); +const { sync } = require('fast-glob'); +const { buildWebviews } = require('./esbuild.webviews.cjs'); + +const production = process.argv.includes('--production'); + +// eslint-disable no-console + +// Run type-checking + +/// Verify the extension +try { + // execSync('tsc --noEmit', { stdio: 'inherit' }); + execSync('tsc --noEmit -p tsconfig.json', { stdio: 'inherit' }); +} catch (err) { + console.error('❌ TypeScript type-checking failed.'); + process.exit(1); +} + +console.log(`esbuild: building for production: ${production ? 'Yes' : 'No'}`); + +const baseConfig = { + bundle: true, + target: 'chrome108', + minify: production, + sourcemap: !production, + logLevel: 'warning', +}; + +async function buildExtension() { + console.log(`📦 Building the extension for ${ production ? 'Production' : 'Development'}...`); + + if (production) { + // Build the extension.js + const extConfig = { + ...baseConfig, + platform: 'node', + format: 'cjs', + entryPoints: [`./${srcDir}/extension.ts`], + outfile: `${outDir}/${srcDir}/extension.js`, + external: [ 'vscode', 'shelljs', 'jsonc-parser' ], + plugins: [ + nativeNodeModulesPlugin(), + esbuildProblemMatcherPlugin(production) // this one is to be added to the end of plugins array + ] + }; + await esbuild.build(extConfig); + console.log('✅ Extension build completed'); + } else { + // Build the Extension for development + const srcFiles = sync(`${srcDir}/**/*.{js,ts}`, { absolute: false }); + const devExtConfig = { + ...baseConfig, + platform: 'node', + format: 'cjs', + entryPoints: srcFiles.map(f => `./${f}`), + outbase: srcDir, + outdir: `${outDir}/${srcDir}`, + external: [ 'vscode', 'shelljs', 'jsonc-parser', '@aws-sdk/client-s3' ], + plugins: [ + // verbosePlugin(), + esmAliasPlugin(), + nativeNodeModulesPlugin(), + esbuildProblemMatcherPlugin(production) // this one is to be added to the end of plugins array + ] + }; + + await esbuild.build(devExtConfig); + + const jsonFiles = sync('src/**/*.json', { absolute: false }); + for (const file of jsonFiles) { + const dest = path.join('out', file); + await cp(file, dest, { recursive: false, force: true }); + } + await cp('package.json', 'out/package.json'); + console.log('✅ Extension build completed'); + } +} + +async function buildAll() { + await buildExtension(); + await buildWebviews(); +} + +buildAll().catch(err => { + console.error('❌ Build failed:', err); + process.exit(1); +}); \ No newline at end of file diff --git a/build/esbuild.mjs b/build/esbuild.mjs deleted file mode 100644 index 2203cdfd0..000000000 --- a/build/esbuild.mjs +++ /dev/null @@ -1,255 +0,0 @@ -/*----------------------------------------------------------------------------------------------- - * Copyright (c) Red Hat, Inc. All rights reserved. - * Licensed under the MIT License. See LICENSE file in the project root for license information. - *-----------------------------------------------------------------------------------------------*/ - -import { transform } from '@svgr/core'; -import * as esbuild from 'esbuild'; -import { sassPlugin } from 'esbuild-sass-plugin'; -import fglob from 'fast-glob'; -import { createRequire } from 'module'; -import { cp, mkdir, readFile, stat } from 'node:fs/promises'; -import * as path from 'path'; -import { fileURLToPath } from 'url'; - -const require = createRequire(import.meta.url); - -const webviews = [ - 'cluster', - 'create-service', - 'create-route', - 'create-component', - 'create-deployment', - 'devfile-registry', - 'helm-chart', - 'helm-manage-repository', - 'invoke-serverless-function', - 'welcome', - 'feedback', - 'serverless-function', - 'serverless-manage-repository', - 'openshift-terminal', -]; - -const production = process.argv.includes('--production'); - -// eslint-disable no-console -console.log(`esbuild: building for production: ${production ? 'Yes' : 'No'}`); - -const __filename = fileURLToPath(import.meta.url); // get the resolved path to the file -const __dirname = path.resolve(path.dirname(__filename), '..'); // get the name of the directory -const srcDir = 'src'; // Input source directory -const outDir = 'out'; // Output dist directory - -function detectGoal(entryPoints) { - if (production) { - const isExtension = entryPoints.filter((ep) => `${ep}`.includes('extension.ts')).length > 0; - const isWebviews = entryPoints.filter((ep) => `${ep}`.includes('.tsx')).length > 0; - return isExtension ? 'Extension' : isWebviews ? 'the Webviews' : ''; - } - return 'Extension and the Webviews for testing/debugging'; -} - -/** - * @type {import('esbuild').Plugin} - */ -const esbuildProblemMatcherPlugin = { - name: 'esbuild-problem-matcher', - - setup(build) { - build.onStart(() => { - const goal = detectGoal(build.initialOptions.entryPoints); - console.log(`[watch] build started${goal ? ' for ' + goal : ''}...` ); - }); - build.onEnd(result => { - result.errors.forEach(({ text, location }) => { - console.error(`✘ [ERROR] ${text}`); - if (location) { - console.error(` ${location.file}:${location.line}:${location.column}:`); - } - }); - const goal = detectGoal(build.initialOptions.entryPoints); - console.log(`[watch] build finished${goal ? ' for ' + goal : ''}`); - }); - } - }; - -const nativeNodeModulesPlugin = { - name: 'native-node-modules', - setup(build) { - try { - // If a ".node" file is imported within a module in the "file" namespace, resolve - // it to an absolute path and put it into the "node-file" virtual namespace. - build.onResolve({ filter: /\.node$/, namespace: 'file' }, args => { - const resolvedId = require.resolve(args.path, { paths: [args.resolveDir] }); - if (resolvedId.endsWith('.node')) { - return { path: resolvedId, namespace: 'node-file' }; - } - return { path: resolvedId }; - }); - - // Files in the "node-file" virtual namespace call "require()" on the - // path from esbuild of the ".node" file in the output directory. - build.onLoad({ filter: /.*/, namespace: 'node-file' }, args => { - return { - contents: ` - import path from ${JSON.stringify(args.path)} - try { module.exports = require(path) } - catch {} - `, - resolveDir: path.dirname(args.path), - }; - }); - - // If a ".node" file is imported within a module in the "node-file" namespace, put - // it in the "file" namespace where esbuild's default loading behavior will handle - // it. It is already an absolute path since we resolved it to one above. - build.onResolve({ filter: /\.node$/, namespace: 'node-file' }, args => ({ - path: args.path, - namespace: 'file', - })); - - // Tell esbuild's default loading behavior to use the "file" loader for - // these ".node" files. - let opts = build.initialOptions - opts.loader = opts.loader || {} - opts.loader['.node'] = 'file' - } catch (err) { - console.error(`native-node-modules: ERROR: ${err}`); - } - }, -}; - -// The following 'svgrPlugin' const have been stolen from 'esbuild-plugin-scgr' due to lack of support of the latest 'esbuild' versions -// by the plugin itself. -// See: https://github.com/kazijawad/esbuild-plugin-svgr/issues/20 -// -const svgrPlugin = (options = { - markExternal: true -}) => ({ - name: 'svgr', - setup(build) { - build.onResolve({ filter: /\.svg$/ }, async (args) => { - switch (args.kind) { - case 'import-statement': - case 'require-call': - case 'dynamic-import': - case 'require-resolve': - return - default: - if (options.markExternal) { - return { - external: true, - } - } - } - }) - - build.onLoad({ filter: /\.svg$/ }, async (args) => { - const svg = await readFile(args.path, { encoding: 'utf8' }) - - if (options.plugins && !options.plugins.includes('@svgr/plugin-jsx')) { - options.plugins.push('@svgr/plugin-jsx') - } else if (!options.plugins) { - options.plugins = ['@svgr/plugin-jsx'] - } - - const contents = await transform(svg, { ...options }, { filePath: args.path }) - - if (args.suffix === '?url') { - return { - contents: args.path, - loader: 'text', - } - } - - return { - contents, - loader: options.typescript ? 'tsx' : 'jsx', - } - }) - }, -}); - -const baseConfig = { - bundle: true, - target: 'chrome108', - format: 'cjs', - minify: production, - sourcemap: !production, - logLevel: 'warning', -}; - -if (production) { - // Build the extension.js - const extConfig = { - ...baseConfig, - platform: 'node', - entryPoints: [`./${srcDir}/extension.ts`], - outfile: `${outDir}/${srcDir}/extension.js`, - external: [ 'vscode', 'shelljs', 'jsonc-parser' ], - plugins: [ - nativeNodeModulesPlugin, - esbuildProblemMatcherPlugin // this one is to be added to the end of plugins array - ] - }; - await esbuild.build(extConfig); - - // Build the Webviews - const webviewsConfig = { - ...baseConfig, - platform: 'browser', - entryPoints: [...webviews.map(webview => `./${srcDir}/webview/${webview}/app/index.tsx`)], - outdir: `${outDir}`, - loader: { - '.png': 'file', - }, - plugins: [ - sassPlugin(), - svgrPlugin({ plugins: ['@svgr/plugin-jsx'] }), - esbuildProblemMatcherPlugin // this one is to be added to the end of plugins array - ] - }; - await esbuild.build(webviewsConfig); -} else { - // Build the Webviews - const devConfig = { - ...baseConfig, - platform: 'browser', - entryPoints: [...webviews.map(webview => `./${srcDir}/webview/${webview}/app/index.tsx`)], - outdir: `${outDir}`, - loader: { - '.png': 'file', - }, - plugins: [ - sassPlugin(), - svgrPlugin({ plugins: ['@svgr/plugin-jsx'] }), - esbuildProblemMatcherPlugin // this one is to be added to the end of plugins array - ] - }; - await esbuild.build(devConfig); -} - -async function dirExists(path) { - try { - if ((await stat(path)).isDirectory()) { - return true; - } - } catch { - // Ignore - } - return false; -} - -// Copy webview's 'index.html's to the output webview dirs -await Promise.all([ - ...webviews.map(async webview => { - const targetDir = path.join(__dirname, `${outDir}/${webview}/app`); - if (!dirExists(targetDir)) { - await mkdir(targetDir, { recursive: true, mode: 0o750} ); - } - fglob.sync([ `${srcDir}/webview/${webview}/app/index.html` ]).map(async srcFile => { - await cp(path.join(__dirname, srcFile), path.join(targetDir, `${path.basename(srcFile)}`)) - }); - }) -]); diff --git a/build/esbuild.plugins.cjs b/build/esbuild.plugins.cjs new file mode 100644 index 000000000..9d5f08650 --- /dev/null +++ b/build/esbuild.plugins.cjs @@ -0,0 +1,175 @@ +/*----------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. + * Licensed under the MIT License. See LICENSE file in the project root for license information. + *-----------------------------------------------------------------------------------------------*/ + +const { transform } = require('@svgr/core'); +const { dirname } = require('path'); +const { readFile } = require('node:fs/promises'); +const { esmImportTargets } = require('./esbuild.settings.cjs'); +const path = require('path'); + +// Helper to escape special chars in module names (e.g. '@') +function escapeRegExp(str) { + return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + +// aliases argument is expected to ba an array of objects like `{ name: string, entry: string, outfile: string }` +function esmAliasPlugin() { + return { + name: 'esm-alias-plugin', + setup(build) { + // One matcher for all targets + const filter = new RegExp(`^(${Object.keys(esmImportTargets).map(escapeRegExp).join('|')})$`); + + build.onResolve({ filter }, args => { + const target = esmImportTargets[args.path]; + const absPath = path.resolve(__dirname, '..', target.outfile); + + console.log(`[esm-alias-plugin] Replacing "${args.path}" with "${absPath}"`); + return { + path: absPath, + namespace: 'file' + }; + }); + } + }; +} + +/** + * @type {import('esbuild').Plugin} + */ +function esbuildProblemMatcherPlugin(production) { + return { + name: 'esbuild-problem-matcher', + setup(build) { + build.onEnd(result => { + result.errors.forEach(({ text, location }) => { + console.error(`✘ [ERROR] ${text}`); + if (location) { + console.error(` ${location.file}:${location.line}:${location.column}:`); + } + }); + }); + } + }; +} + +function nativeNodeModulesPlugin() { + return { + name: 'native-node-modules', + setup(build) { + try { + // If a ".node" file is imported within a module in the "file" namespace, resolve + // it to an absolute path and put it into the "node-file" virtual namespace. + build.onResolve({ filter: /\.node$/, namespace: 'file' }, args => { + const resolvedId = require.resolve(args.path, { paths: [args.resolveDir] }); + if (resolvedId.endsWith('.node')) { + return { path: resolvedId, namespace: 'node-file' }; + } + return { path: resolvedId }; + }); + + // Files in the "node-file" virtual namespace call "require()" on the + // path from esbuild of the ".node" file in the output directory. + build.onLoad({ filter: /.*/, namespace: 'node-file' }, args => { + return { + contents: ` + import path from ${JSON.stringify(args.path)} + try { module.exports = require(path) } + catch {} + `, + resolveDir: dirname(args.path), + }; + }); + + // If a ".node" file is imported within a module in the "node-file" namespace, put + // it in the "file" namespace where esbuild's default loading behavior will handle + // it. It is already an absolute path since we resolved it to one above. + build.onResolve({ filter: /\.node$/, namespace: 'node-file' }, args => ({ + path: args.path, + namespace: 'file', + })); + + // Tell esbuild's default loading behavior to use the "file" loader for + // these ".node" files. + let opts = build.initialOptions + opts.loader = opts.loader || {} + opts.loader['.node'] = 'file' + } catch (err) { + console.error(`[native-node-modules] ERROR: ${err}`); + } + } + }; +} + +// The following 'svgrPlugin' const have been stolen from 'esbuild-plugin-scgr' due to lack of support of the latest 'esbuild' versions +// by the plugin itself. +// See: https://github.com/kazijawad/esbuild-plugin-svgr/issues/20 +// +function svgrPlugin(options = { markExternal: true }) { + return { + name: 'svgr', + setup(build) { + build.onResolve({ filter: /\.svg$/ }, async (args) => { + switch (args.kind) { + case 'import-statement': + case 'require-call': + case 'dynamic-import': + case 'require-resolve': + return + default: + if (options.markExternal) { + return { + external: true, + } + } + } + }) + + build.onLoad({ filter: /\.svg$/ }, async (args) => { + const svg = await readFile(args.path, { encoding: 'utf8' }) + + if (options.plugins && !options.plugins.includes('@svgr/plugin-jsx')) { + options.plugins.push('@svgr/plugin-jsx') + } else if (!options.plugins) { + options.plugins = ['@svgr/plugin-jsx'] + } + + const contents = await transform(svg, { ...options }, { filePath: args.path }) + + if (args.suffix === '?url') { + return { + contents: args.path, + loader: 'text', + } + } + + return { + contents, + loader: options.typescript ? 'tsx' : 'jsx', + } + }) + } + }; +} + +function verbosePlugin() { + return { + name: 'verbose', + setup(build) { + build.onLoad({ filter: /.*/ }, async (args) => { + console.log(`[esbuild] Loading: ${args.path}`); + return null; // let esbuild handle the actual load + }); + } + }; +} + +module.exports = { + esmAliasPlugin, + esbuildProblemMatcherPlugin, + nativeNodeModulesPlugin, + svgrPlugin, + verbosePlugin +}; \ No newline at end of file diff --git a/build/esbuild.settings.cjs b/build/esbuild.settings.cjs new file mode 100644 index 000000000..a8e76ab6d --- /dev/null +++ b/build/esbuild.settings.cjs @@ -0,0 +1,37 @@ +/*----------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. + * Licensed under the MIT License. See LICENSE file in the project root for license information. + *-----------------------------------------------------------------------------------------------*/ + +const webviews = [ + 'cluster', + 'create-service', + 'create-route', + 'create-component', + 'create-deployment', + 'devfile-registry', + 'helm-chart', + 'helm-manage-repository', + 'invoke-serverless-function', + 'welcome', + 'feedback', + 'serverless-function', + 'serverless-manage-repository', + 'openshift-terminal', +]; + +const esmImportTargets = { + 'clipboardy': { entry: 'node_modules/clipboardy/index.js', outfile: 'out/esm/clipboardy.cjs' }, + 'got': { entry: 'node_modules/got/dist/source/index.js', outfile: 'out/esm/got.cjs' }, + '@kubernetes/client-node': { entry: 'node_modules/@kubernetes/client-node/dist/index.js', outfile: 'out/esm/k8s-client-node.cjs' } +}; + +const srcDir = 'src'; // Input source directory +const outDir = 'out'; // Output dist directory + +module.exports = { + webviews, + esmImportTargets, + srcDir, + outDir +}; \ No newline at end of file diff --git a/build/esbuild.transform-esm.cjs b/build/esbuild.transform-esm.cjs new file mode 100644 index 000000000..00c97e5f0 --- /dev/null +++ b/build/esbuild.transform-esm.cjs @@ -0,0 +1,29 @@ +/*----------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. + * Licensed under the MIT License. See LICENSE file in the project root for license information. + *-----------------------------------------------------------------------------------------------*/ + +const { build } = require('esbuild'); + +const { esmImportTargets } = require('./esbuild.settings.cjs'); + +function transformEsmDeps() { + return Promise.all( + Object.entries(esmImportTargets).flatMap( ([id, { entry, outfile }]) => { + console.log(`📦 Bundling ${id} to ${outfile}`); + return build({ + entryPoints: [entry], + outfile, + bundle: true, + format: 'cjs', + platform: 'node', + target: 'node16', + }); + }) + ); +} + +transformEsmDeps().catch((err) => { + console.error('❌ Failed to transform ESM dependencies:', err); + process.exit(1); +}); \ No newline at end of file diff --git a/build/esbuild.webviews.cjs b/build/esbuild.webviews.cjs new file mode 100644 index 000000000..6941b2b85 --- /dev/null +++ b/build/esbuild.webviews.cjs @@ -0,0 +1,119 @@ +/*----------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. + * Licensed under the MIT License. See LICENSE file in the project root for license information. + *-----------------------------------------------------------------------------------------------*/ + +const { execSync } = require('child_process'); +const esbuild = require('esbuild'); +const { esbuildProblemMatcherPlugin, svgrPlugin } = require('./esbuild.plugins.cjs'); +const { webviews, srcDir, outDir } = require('./esbuild.settings.cjs'); +const { sassPlugin } = require('esbuild-sass-plugin'); +const { cp, mkdir, stat } = require('node:fs/promises'); +const path = require('path'); +const { sync } = require('fast-glob'); + +const production = process.argv.includes('--production'); +const isWatch = process.argv.includes('--watch'); + +// eslint-disable no-console + +// Verify the WebViews +try { + execSync('tsc --noEmit -p ./src/webview/tsconfig.json', { stdio: 'inherit' }); +} catch (err) { + console.error('❌ TypeScript type-checking failed.'); + process.exit(1); +} + +const baseConfig = { + bundle: true, + target: 'chrome108', + minify: production, + sourcemap: !production, + logLevel: 'warning', +}; + +async function buildWebviews() { + console.log('📦 Building the webviews...'); + + const devWebViewConfig = { + ...baseConfig, + platform: 'browser', + format: 'esm', + entryPoints: [...webviews.map(webview => `./${srcDir}/webview/${webview}/app/index.tsx`)], + outdir: `${outDir}`, + loader: { + '.png': 'file', + }, + plugins: [ + sassPlugin(), + svgrPlugin({ plugins: ['@svgr/plugin-jsx'] }), + esbuildProblemMatcherPlugin(production) // this one is to be added to the end of plugins array + ] + }; + + if (isWatch) { + const ctx = await esbuild.context({ + ...devWebViewConfig, + plugins: [ + ...devWebViewConfig.plugins, + { + name: 'rebuild-hook', + setup(build) { + build.onEnd(result => { + if (result.errors.length === 0) { + console.log('🔁 Rebuild succeeded'); + copyHtmlFiles().catch(err => + console.error('❌ Failed to copy HTML files after rebuild:', err) + ); + } else { + console.error('❌ Rebuild errors:', result.errors); + } + }); + } + } + ] + }); + await ctx.watch(); + await copyHtmlFiles(); + console.log('👀 Watching the webviews...'); + } else { + await esbuild.build(devWebViewConfig); + await copyHtmlFiles(); + console.log('✅ Webview build completed'); + } +} + +async function copyHtmlFiles() { + await Promise.all( + webviews.map(async webview => { + const targetDir = path.join(__dirname, '..', `${outDir}/${webview}/app`); + if (!await dirExists(targetDir)) { + await mkdir(targetDir, { recursive: true, mode: 0o750 }); + } + + const htmlFiles = sync(path.resolve(__dirname, '..', `${srcDir}/webview/${webview}/app/index.html`)); + await Promise.all( + htmlFiles.map(async srcFile => { + await cp(srcFile, path.join(targetDir, path.basename(srcFile))); + }) + ); + }) + ); +} + +async function dirExists(path) { + try { + if ((await stat(path)).isDirectory()) return true; + } catch { /* Ignore */ } + return false; +} + +if (require.main === module) { + buildWebviews().catch(err => { + console.error('❌ Build failed:', err); + process.exit(1); + }); +} + +module.exports = { buildWebviews }; \ No newline at end of file diff --git a/build/install-vscode.ts b/build/install-vscode.cjs similarity index 64% rename from build/install-vscode.ts rename to build/install-vscode.cjs index 6a7ffff9c..27b5bb7b7 100644 --- a/build/install-vscode.ts +++ b/build/install-vscode.cjs @@ -4,21 +4,19 @@ *-----------------------------------------------------------------------------------------------*/ /* eslint-disable no-console */ -import * as testElectron from '@vscode/test-electron'; -import { platform } from 'os'; +const testElectron = require('@vscode/test-electron'); +const { platform } = require('os'); +const cp = require('child_process'); +const path = require('path'); +const packageJson = require('../package.json'); -import * as cp from 'child_process'; -import * as path from 'path'; -import * as packageJson from '../package.json'; - -void testElectron.downloadAndUnzipVSCode().then((executable: string) => { +void testElectron.downloadAndUnzipVSCode().then((executable) => { // Install extensions that openshift-toolkit depends on const extensionsToInstall = packageJson.extensionDependencies; if (extensionsToInstall) { - let vsCodeExecutable: string; + let vsCodeExecutable; if (platform() === 'darwin') { - console.log(executable); vsCodeExecutable = `'${path.join( executable.substring(0, executable.indexOf('.app') + 4), 'Contents', @@ -31,15 +29,21 @@ void testElectron.downloadAndUnzipVSCode().then((executable: string) => { vsCodeExecutable = path.join(path.dirname(executable), 'bin', 'code'); } - const extensionRootPath = path.resolve(__dirname, '..', '..'); + const extensionRootPath = path.resolve(__dirname, '..'); const vsCodeTest = path.resolve(path.join(extensionRootPath, '.vscode-test')); const userDataDir = path.join(vsCodeTest, 'user-data'); const extDir = path.join(vsCodeTest, 'extensions'); for (const extension of extensionsToInstall) { console.log('Installing extension: ', extension ); - cp.execFileSync(vsCodeExecutable, - ['--install-extension', extension, '--user-data-dir', userDataDir, '--extensions-dir', extDir], - { shell: true }); + try { + cp.execFileSync(vsCodeExecutable, + ['--install-extension', extension, '--user-data-dir', userDataDir, '--extensions-dir', extDir], + { shell: true } + ); + } catch (err) { + console.error(`❌ Failed to install "${extension}" extension: `, err); + process.exit(1); + } } } else { console.log('No extension dependencies found in "package.json"'); diff --git a/build/run-tests.ts b/build/run-tests.cjs old mode 100644 new mode 100755 similarity index 85% rename from build/run-tests.ts rename to build/run-tests.cjs index 10bc49261..afb311fb6 --- a/build/run-tests.ts +++ b/build/run-tests.cjs @@ -3,17 +3,17 @@ * Licensed under the MIT License. See LICENSE file in the project root for license information. *-----------------------------------------------------------------------------------------------*/ -import * as etest from '@vscode/test-electron'; -import * as path from 'path'; +const etest = require('@vscode/test-electron'); +const path = require('path'); /** * Run mocha tests from project's tests folder. * This script expects a subfolder name and extension development path as parameters to * identify what kind of tests to run: unit, integration or ui. */ -async function main(): Promise { +async function main() { const [, , tests, extension = ''] = process.argv; - const extensionRootPath = path.resolve(__dirname, '../../'); + const extensionRootPath = path.resolve(__dirname, '../'); const extensionDevelopmentPath = path.resolve(extensionRootPath, extension); const extensionTestsPath = path.resolve(extensionRootPath, 'out', 'test', tests); const integrationWorkspacePath = path.resolve(extensionRootPath, 'test', 'fixtures', 'components', 'components.code-workspace'); @@ -33,6 +33,10 @@ async function main(): Promise { // const boolPattern = /^(true|1|yes)$/i; const verbose = boolPattern.test(process.env.VERBOSE); + + // Point to bootstrap loader + process.env.NODE_OPTIONS = `--require ${path.resolve(__dirname, '../test/bootstrap.js')}`; + try { await etest.runTests({ extensionDevelopmentPath, @@ -45,7 +49,7 @@ async function main(): Promise { }); } catch (err) { // eslint-disable-next-line no-console - console.error(`Failed to run tests: ${err}`); + console.error(`❌ Failed to run tests: `, err); process.exit(1); } } diff --git a/build/verify-tools.cjs b/build/verify-tools.cjs new file mode 100644 index 000000000..d9d734e5e --- /dev/null +++ b/build/verify-tools.cjs @@ -0,0 +1,66 @@ +/*----------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. + * Licensed under the MIT License. See LICENSE file in the project root for license information. + *-----------------------------------------------------------------------------------------------*/ + +/* eslint-disable no-console */ +/* eslint-disable guard-for-in */ +/* eslint-disable no-restricted-syntax */ +/* eslint-disable no-await-in-loop */ + +const path = require('path'); +const { exit } = require('process'); +const { esmAliasPlugin } = require('./esbuild.plugins.cjs'); +const cp = require('child_process'); +const os = require('os'); + +async function verifyTools() { + const { downloadFileAndCreateSha256 } = require(path.resolve(__dirname, '..', 'out/shared/downloadUtil.js')); + const configData = require('../src/tools.json'); + + for (const key in configData) { + for (const OS in configData[key].platform) { + const targetFolder = path.resolve(os.tmpdir(), OS); + await downloadFileAndCreateSha256( + targetFolder, + configData[key].platform[OS].dlFileName, + configData[key].platform[OS].url, + configData[key].platform[OS].sha256sum, + ); + } + } +} + +require('esbuild').build({ + entryPoints: [path.resolve(__dirname, '..', 'src/downloadUtil/downloadBinaries.ts')], + platform: 'node', + target: 'node18', + format: 'cjs', + outfile: path.resolve(__dirname, '..', 'out/shared/downloadUtil.js'), + bundle: true, + plugins: [ esmAliasPlugin() ] +}).then(() => { + const fileCheckRegex = /\w*tools.json/; + cp.exec('git diff --name-only origin/main -- .', async (error, stdout) => { + if (error) { + throw error; + } + if (fileCheckRegex.test(stdout)) { + console.log('tools.json is changed, starting download verification'); + try { + await verifyTools(); + } catch (error) { + console.log(error); + exit(1); + } + } else { + console.log('tools.json is not changed, skipping download verification'); + } + }); +}).catch(err => { + console.error(err); + exit(1); +}); + + + diff --git a/build/verify-tools.ts b/build/verify-tools.ts deleted file mode 100644 index 47364f30b..000000000 --- a/build/verify-tools.ts +++ /dev/null @@ -1,80 +0,0 @@ -/*----------------------------------------------------------------------------------------------- - * Copyright (c) Red Hat, Inc. All rights reserved. - * Licensed under the MIT License. See LICENSE file in the project root for license information. - *-----------------------------------------------------------------------------------------------*/ - -/* eslint-disable no-console */ -/* eslint-disable guard-for-in */ -/* eslint-disable no-restricted-syntax */ -/* eslint-disable no-await-in-loop */ -/* eslint-disable @typescript-eslint/no-misused-promises */ - -import * as cp from 'child_process'; -import * as fs from 'fs-extra'; -import * as mkdirp from 'mkdirp'; -import * as os from 'os'; -import * as path from 'path'; -import { exit } from 'shelljs'; -import { DownloadUtil } from '../src/downloadUtil/download'; -import * as configData from '../src/tools.json'; -import { hashFile } from '../src/util/utils'; - -/** - * Download reqURL to targetFolder and save it to fileName. Verify the downloaded file sha256 is matching sha256sum - * @param targetFolder - * @param fileName - * @param reqURL - * @param sha256sum - */ -async function downloadFileAndCreateSha256( - targetFolder: string, - fileName: string, - reqURL: string, - sha256sum: string, -): Promise { - if (!fs.existsSync(targetFolder)) { - mkdirp.sync(targetFolder); - } - const currentFile = path.join(targetFolder, fileName); - console.log(`${currentFile} download started from ${reqURL}`); - await DownloadUtil.downloadFile(reqURL, currentFile, (current) => console.log(`${current}%`)); - const currentSHA256 = await hashFile(currentFile); - if (currentSHA256 === sha256sum) { - console.log(`[INFO] ${currentFile} is downloaded and sha256 is correct`); - } else { - throw Error(`${currentFile} is downloaded and sha256 is not correct`); - } -} - -async function verifyTools(): Promise { - for (const key in configData) { - for (const OS in configData[key].platform) { - const targetFolder = path.resolve(os.tmpdir(), OS); - await downloadFileAndCreateSha256( - targetFolder, - configData[key].platform[OS].dlFileName, - configData[key].platform[OS].url, - configData[key].platform[OS].sha256sum, - ); - } - } -} - -const fileCheckRegex = /\w*tools.json/; -cp.exec('git diff --name-only origin/master -- .', async (error, stdout) => { - if (error) { - throw error; - } - console.log('The changed files:'); - console.log(stdout); - if (fileCheckRegex.test(stdout)) { - console.log('tools.json is changed, starting download verification'); - try { - await verifyTools(); - } catch { - exit(1); - } - } else { - console.log('tools.json is not changed, skipping download verification'); - } -}); diff --git a/package-lock.json b/package-lock.json index ee912a7ae..dc1e642dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@apidevtools/json-schema-ref-parser": "^14.1.0", "@codemirror/lang-yaml": "^6.1.2", "@devfile/api": "^2.2.2-1716821574", - "@kubernetes/client-node": "^0.22.3", + "@kubernetes/client-node": "^1.3.0", "@mui/icons-material": "^6.5.0", "@mui/lab": "^6.0.0-dev.240424162023-9968b4889d", "@mui/material": "^6.4.12", @@ -58,7 +58,7 @@ "@vscode/test-electron": "^2.5.2", "chai": "^5.2.1", "chokidar": "^4.0.3", - "clipboardy": "^2.3.0", + "clipboardy": "^4.0.0", "clsx": "^2.1.1", "codemirror": "^6.0.2", "dockerode": "^4.0.7", @@ -76,10 +76,11 @@ "eslint-plugin-json": "^4.0.1", "eslint-plugin-prettier": "^5.5.1", "express": "^5.1.0", + "fast-glob": "^3.3.3", "file-loader": "^6.2.0", "fs-extra": "^11.3.0", "git-up": "^8.1.1", - "got": "^11.8.6", + "got": "^14.4.7", "istanbul": "^0.4.5", "json-schema": "^0.4.0", "json-to-ast": "^2.1.0", @@ -87,6 +88,7 @@ "lodash": "^4.17.21", "mkdirp": "^3.0.1", "mocha": "^11.7.1", + "module-alias": "^2.2.3", "node-yaml-parser": "^0.0.9", "npm-run-all": "^4.1.5", "portfinder": "^1.0.37", @@ -237,18 +239,6 @@ "node": ">=18.0.0" } }, - "node_modules/@azure/core-rest-pipeline/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/@azure/core-rest-pipeline/node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", @@ -373,22 +363,24 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.22.9", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", + "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", "dev": true, "license": "MIT", "engines": { @@ -396,24 +388,26 @@ } }, "node_modules/@babel/core": { - "version": "7.22.9", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", + "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.8", - "@babel/types": "^7.22.5", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.4", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.27.4", + "@babel/types": "^7.27.3", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", + "json5": "^2.2.3", "semver": "^6.3.1" }, "engines": { @@ -424,6 +418,13 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -435,36 +436,37 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.9", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { @@ -477,62 +479,30 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -541,36 +511,10 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "engines": { @@ -578,9 +522,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, "license": "MIT", "engines": { @@ -588,7 +532,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "license": "MIT", "engines": { @@ -596,27 +542,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", - "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10" + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", - "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.10" + "@babel/types": "^7.27.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -639,35 +585,33 @@ } }, "node_modules/@babel/template": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", - "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -675,14 +619,14 @@ } }, "node_modules/@babel/types": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", - "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1904,27 +1848,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "dev": true, - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@isaacs/fs-minipass/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -2030,183 +1953,38 @@ } }, "node_modules/@kubernetes/client-node": { - "version": "0.22.3", - "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.22.3.tgz", - "integrity": "sha512-dG8uah3+HDJLpJEESshLRZlAZ4PgDeV9mZXT0u1g7oy4KMRzdZ7n5g0JEIlL6QhK51/2ztcIqURAnjfjJt6Z+g==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-1.3.0.tgz", + "integrity": "sha512-IE0yrIpOT97YS5fg2QpzmPzm8Wmcdf4ueWMn+FiJSI3jgTTQT1u+LUhoYpdfhdHAVxdrNsaBg2C0UXSnOgMoCQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "byline": "^5.0.0", + "@types/js-yaml": "^4.0.1", + "@types/node": "^22.0.0", + "@types/node-fetch": "^2.6.9", + "@types/stream-buffers": "^3.0.3", + "form-data": "^4.0.0", + "hpagent": "^1.2.0", "isomorphic-ws": "^5.0.0", "js-yaml": "^4.1.0", - "jsonpath-plus": "^10.2.0", - "request": "^2.88.0", + "jsonpath-plus": "^10.3.0", + "node-fetch": "^2.6.9", + "openid-client": "^6.1.3", "rfc4648": "^1.3.0", + "socks-proxy-agent": "^8.0.4", "stream-buffers": "^3.0.2", - "tar": "^7.0.0", - "tslib": "^2.4.1", - "ws": "^8.18.0" - }, - "optionalDependencies": { - "openid-client": "^6.1.3" - } - }, - "node_modules/@kubernetes/client-node/node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "engines": { - "node": ">=18" + "tar-fs": "^3.0.8", + "ws": "^8.18.2" } }, - "node_modules/@kubernetes/client-node/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@kubernetes/client-node/node_modules/glob/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@kubernetes/client-node/node_modules/jackspeak": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.2.tgz", - "integrity": "sha512-qH3nOSj8q/8+Eg8LUPOq3C+6HWkpUioIjDsq1+D4zY91oZvpPttw8GwtF1nReRYKXl+1AORyFqtm2f5Q1SB6/Q==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "14 >=14.21 || 16 >=16.20 || >=18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/@kubernetes/client-node/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/@kubernetes/client-node/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@kubernetes/client-node/node_modules/minizlib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", - "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", - "dev": true, - "dependencies": { - "minipass": "^7.0.4", - "rimraf": "^5.0.5" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@kubernetes/client-node/node_modules/minizlib/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@kubernetes/client-node/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@kubernetes/client-node/node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", - "dev": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@kubernetes/client-node/node_modules/tar": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.0.1.tgz", - "integrity": "sha512-IjMhdQMZFpKsHEQT3woZVxBtCQY+0wk3CVxdRkGXEgyGa0dNS/ehPvOMr2nmfC7x5Zj2N+l6yZUpmICjLGS35w==", + "node_modules/@kubernetes/client-node/node_modules/@types/node": { + "version": "22.15.32", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.32.tgz", + "integrity": "sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA==", "dev": true, + "license": "MIT", "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^5.0.0", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@kubernetes/client-node/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "engines": { - "node": ">=18" + "undici-types": "~6.21.0" } }, "node_modules/@lezer/common": { @@ -2966,175 +2744,6 @@ "typescript": ">=4.6.2" } }, - "node_modules/@redhat-developer/page-objects/node_modules/clipboardy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz", - "integrity": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==", - "dev": true, - "dependencies": { - "execa": "^8.0.1", - "is-wsl": "^3.1.0", - "is64bit": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@redhat-developer/page-objects/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@redhat-developer/page-objects/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@redhat-developer/page-objects/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@redhat-developer/page-objects/node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dev": true, - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@redhat-developer/page-objects/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@redhat-developer/page-objects/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@redhat-developer/page-objects/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@redhat-developer/page-objects/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@redhat-developer/page-objects/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@redhat-developer/page-objects/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@redhat-developer/page-objects/node_modules/type-fest": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.31.0.tgz", - "integrity": "sha512-yCxltHW07Nkhv/1F6wWBr8kz+5BGMfP+RbRSYFnegVb0qV/UMT0G0ElBloPVerqn4M2ZV80Ir1FtCcYv1cT6vQ==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@redhat-developer/vscode-redhat-telemetry": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/@redhat-developer/vscode-redhat-telemetry/-/vscode-redhat-telemetry-0.9.1.tgz", @@ -3299,7 +2908,8 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@segment/analytics-core": { "version": "1.8.0", @@ -3455,13 +3065,13 @@ } }, "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.0.2.tgz", + "integrity": "sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sindresorhus/is?sponsor=1" @@ -3769,16 +3379,16 @@ } }, "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "dev": true, "license": "MIT", "dependencies": { - "defer-to-connect": "^2.0.0" + "defer-to-connect": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=14.16" } }, "node_modules/@tsconfig/node10": { @@ -3829,19 +3439,6 @@ "@types/node": "*" } }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, "node_modules/@types/chai": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", @@ -3947,7 +3544,8 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", @@ -3955,6 +3553,13 @@ "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -3976,16 +3581,6 @@ "@types/node": "*" } }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", @@ -4017,10 +3612,11 @@ } }, "node_modules/@types/node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "form-data": "^4.0.0" @@ -4103,16 +3699,6 @@ "@types/react": "*" } }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/selenium-webdriver": { "version": "4.1.27", "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.27.tgz", @@ -4218,6 +3804,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/stream-buffers": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/stream-buffers/-/stream-buffers-3.0.7.tgz", + "integrity": "sha512-azOCy05sXVXrO+qklf0c/B07H/oHaIuDDAiHPVwlk3A9Ek+ksHyTeMajLZl3r76FxpPpxem//4Te61G1iW3Giw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/tar-fs": { "version": "2.0.1", "dev": true, @@ -4910,18 +4506,6 @@ "node": ">=16" } }, - "node_modules/@vscode/test-electron/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/@vscode/test-electron/node_modules/ansi-regex": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", @@ -5238,6 +4822,46 @@ "node": ">= 6" } }, + "node_modules/@vscode/vsce/node_modules/glob": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vscode/vsce/node_modules/glob/node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", @@ -5517,6 +5141,16 @@ "node": ">=0.4.0" } }, + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -5630,26 +5264,6 @@ "node": ">=0.10.0" } }, - "node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/are-docs-informative": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", @@ -5826,16 +5440,6 @@ "safer-buffer": "~2.1.0" } }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -5896,23 +5500,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "dev": true, - "license": "MIT" - }, "node_modules/azure-devops-node-api": { "version": "12.5.0", "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-12.5.0.tgz", @@ -6086,9 +5673,9 @@ "license": "ISC" }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", + "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", "dev": true, "funding": [ { @@ -6106,10 +5693,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "caniuse-lite": "^1.0.30001718", + "electron-to-chromium": "^1.5.160", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -6203,17 +5790,7 @@ "dev": true, "optional": true, "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "node": ">=10.0.0" } }, "node_modules/bytes": { @@ -6260,59 +5837,62 @@ } }, "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", "dev": true, "license": "MIT", "engines": { - "node": ">=10.6.0" + "node": ">=14.16" } }, "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-12.0.1.tgz", + "integrity": "sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg==", "dev": true, "license": "MIT", "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" + "@types/http-cache-semantics": "^4.0.4", + "get-stream": "^9.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.4", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.1", + "responselike": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" } }, "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", "dev": true, "license": "MIT", "dependencies": { - "pump": "^3.0.0" + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cacheable-request/node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "node_modules/cacheable-request/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "dev": true, "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/call-bind": { @@ -6376,9 +5956,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001653", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz", - "integrity": "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==", + "version": "1.0.30001724", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001724.tgz", + "integrity": "sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==", "dev": true, "funding": [ { @@ -6396,13 +5976,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/chai": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.1.tgz", @@ -6572,17 +6145,171 @@ } }, "node_modules/clipboardy": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", - "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz", + "integrity": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==", "dev": true, + "license": "MIT", "dependencies": { - "arch": "^2.1.1", - "execa": "^1.0.0", - "is-wsl": "^2.1.1" + "execa": "^8.0.1", + "is-wsl": "^3.1.0", + "is64bit": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clipboardy/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/clipboardy/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clipboardy/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clipboardy/node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clipboardy/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clipboardy/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clipboardy/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clipboardy/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clipboardy/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/clipboardy/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cliui": { @@ -6677,19 +6404,6 @@ "node": ">=6" } }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -6849,7 +6563,8 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/cookie": { "version": "1.0.2", @@ -7024,19 +6739,6 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "dev": true }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -7565,15 +7267,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/dpdm/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/dpdm/node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", @@ -7641,17 +7334,6 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -7669,9 +7351,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", - "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", + "version": "1.5.171", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.171.tgz", + "integrity": "sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==", "dev": true, "license": "ISC" }, @@ -8018,9 +7700,9 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", "engines": { @@ -8858,13 +8540,6 @@ "node": ">= 0.6" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" - }, "node_modules/extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", @@ -8879,16 +8554,6 @@ "node": ">=0.10.0" } }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT" - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -8902,15 +8567,16 @@ "license": "Apache-2.0" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -9134,17 +8800,7 @@ "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/form-data": { @@ -9166,6 +8822,7 @@ "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.0.2.tgz", "integrity": "sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 18" } @@ -9210,6 +8867,13 @@ "node": ">=14.14" } }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -9397,16 +9061,6 @@ "async": "^3.2.0" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/git-up": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/git-up/-/git-up-8.1.1.tgz", @@ -9426,24 +9080,22 @@ "optional": true }, "node_modules/glob": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", - "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.0.3", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": "20 || >=22" + "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -9470,31 +9122,6 @@ "license": "BSD-2-Clause", "peer": true }, - "node_modules/glob/node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/globals": { "version": "16.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz", @@ -9570,26 +9197,26 @@ } }, "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "version": "14.4.7", + "resolved": "https://registry.npmjs.org/got/-/got-14.4.7.tgz", + "integrity": "sha512-DI8zV1231tqiGzOiOzQWDhsBmncFW7oQDH6Zgy6pDPrqJuVZMtoSgPLLsBZQj8Jg4JFfwoOsDA8NGtLQLnIx2g==", "dev": true, "license": "MIT", "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", + "@sindresorhus/is": "^7.0.1", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^12.0.1", "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" + "form-data-encoder": "^4.0.2", + "http2-wrapper": "^2.2.1", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^4.0.1", + "responselike": "^3.0.0", + "type-fest": "^4.26.1" }, "engines": { - "node": ">=10.19.0" + "node": ">=20" }, "funding": { "url": "https://github.com/sindresorhus/got?sponsor=1" @@ -9645,30 +9272,6 @@ "node": ">=0.10.0" } }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -9854,9 +9457,9 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "dev": true, "license": "BSD-2-Clause" }, @@ -9877,31 +9480,15 @@ "node": ">= 0.8" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", "dev": true, "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" + "resolve-alpn": "^1.2.0" }, "engines": { "node": ">=10.19.0" @@ -9912,6 +9499,7 @@ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=16.17.0" } @@ -10070,6 +9658,27 @@ "url": "https://github.com/sindresorhus/invert-kv?sponsor=1" } }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -10338,6 +9947,7 @@ "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, + "license": "MIT", "dependencies": { "is-docker": "^3.0.0" }, @@ -10356,6 +9966,7 @@ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -10575,13 +10186,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true, - "license": "MIT" - }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -10700,13 +10304,6 @@ "ws": "*" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true, - "license": "MIT" - }, "node_modules/istanbul": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", @@ -10807,23 +10404,6 @@ "dev": true, "license": "MIT" }, - "node_modules/istanbul/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", - "dev": true, - "license": "ISC", - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, "node_modules/istanbul/node_modules/has-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", @@ -10995,9 +10575,9 @@ } }, "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "dev": true, "license": "MIT" }, @@ -11021,16 +10601,16 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { @@ -11096,13 +10676,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "license": "ISC" - }, "node_modules/json-to-ast": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/json-to-ast/-/json-to-ast-2.1.0.tgz", @@ -11227,22 +10800,6 @@ "safe-buffer": "^5.0.1" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/jss": { "version": "10.10.0", "resolved": "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz", @@ -11874,13 +11431,16 @@ } }, "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lru-cache": { @@ -12102,13 +11662,16 @@ } }, "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/minimatch": { @@ -12146,12 +11709,13 @@ } }, "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, + "license": "ISC", "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/mkdirp": { @@ -12278,15 +11842,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/mocha/node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", @@ -12319,6 +11874,13 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/module-alias": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.3.tgz", + "integrity": "sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==", + "dev": true, + "license": "MIT" + }, "node_modules/module-not-found-error": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", @@ -12453,7 +12015,9 @@ "optional": true }, "node_modules/node-fetch": { - "version": "2.6.9", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, "license": "MIT", "dependencies": { @@ -12490,9 +12054,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true, "license": "MIT" }, @@ -12519,13 +12083,13 @@ } }, "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -12581,22 +12145,11 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, "node_modules/oauth4webapi": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-3.1.2.tgz", "integrity": "sha512-KQZkNU+xn02lWrFu5Vjqg9E81yPtDSxUZorRHlLWVoojD+H/0GFbH59kcnz5Thdjj7c4/mYMBPj/mhvGe/kKXA==", "dev": true, - "optional": true, "funding": { "url": "https://github.com/sponsors/panva" } @@ -12773,7 +12326,6 @@ "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-6.1.3.tgz", "integrity": "sha512-74sc0bR4ptfwCwMheLPaJHTQnds+97Yu6O8eQgoO3MRcd53xkfKyl3gNAsRsYSYoO+AVG3eCgnRMjRkZ6n2RYw==", "dev": true, - "optional": true, "dependencies": { "jose": "^5.9.6", "oauth4webapi": "^3.1.1" @@ -12991,13 +12543,13 @@ } }, "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz", + "integrity": "sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14.16" } }, "node_modules/p-defer": { @@ -13253,6 +12805,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -13265,23 +12818,15 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz", - "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", "dev": true, + "license": "ISC", "engines": { "node": "20 || >=22" } }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/path-to-regexp": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", @@ -13318,13 +12863,6 @@ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "dev": true }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true, - "license": "MIT" - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -14028,73 +13566,6 @@ "node": ">=0.10.0" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -14170,13 +13641,16 @@ } }, "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", "dev": true, "license": "MIT", "dependencies": { - "lowercase-keys": "^2.0.0" + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -14746,9 +14220,14 @@ } }, "node_modules/shell-quote": { - "version": "1.8.0", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "dev": true, "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -15052,6 +14531,17 @@ "node": ">=8" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, "node_modules/snake-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", @@ -15063,6 +14553,36 @@ "tslib": "^2.0.3" } }, + "node_modules/socks": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -15170,32 +14690,6 @@ "nan": "^2.20.0" } }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/stable-hash-x": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.1.1.tgz", @@ -15791,15 +15285,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/test-exclude/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/test-exclude/node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", @@ -15886,26 +15371,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/tldts": { - "version": "6.1.47", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.47.tgz", - "integrity": "sha512-R/K2tZ5MiY+mVrnSkNJkwqYT2vUv1lcT6wJvd2emGaMJ7PHUGRY4e3tUsdFCXgqxi2QgbHjL3yJgXCo40v9Hxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^6.1.47" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/tldts-core": { - "version": "6.1.47", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.47.tgz", - "integrity": "sha512-6SWyFMnlst1fEt7GQVAAu16EGgFK0cLouH/2Mk6Ftlwhv3Ol40L0dlpGMcnnNiiOMyD2EV/aF3S+U2nKvvLvrA==", - "dev": true, - "license": "MIT" - }, "node_modules/tmp": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", @@ -15943,19 +15408,6 @@ "node": ">=0.6" } }, - "node_modules/tough-cookie": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", - "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^6.1.32" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -16093,6 +15545,7 @@ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "license": "Apache-2.0", + "optional": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -16130,6 +15583,19 @@ "node": ">=4" } }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/type-is": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", @@ -16491,9 +15957,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -16511,8 +15977,8 @@ ], "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -16679,21 +16145,6 @@ "node": ">= 0.8" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "node_modules/vscode-extension-tester": { "version": "8.11.0", "resolved": "https://registry.npmjs.org/vscode-extension-tester/-/vscode-extension-tester-8.11.0.tgz", @@ -16726,57 +16177,6 @@ "typescript": ">=4.6.2" } }, - "node_modules/vscode-extension-tester/node_modules/@sindresorhus/is": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.0.1.tgz", - "integrity": "sha512-QWLl2P+rsCJeofkDNIT3WFmb6NrRud1SUYW8dIhXK/46XFV8Q/g7Bsvib0Askb0reRLe+WYPeeE+l5cH7SlkuQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/vscode-extension-tester/node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/vscode-extension-tester/node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/vscode-extension-tester/node_modules/cacheable-request": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-12.0.1.tgz", - "integrity": "sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "^4.0.4", - "get-stream": "^9.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.4", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.1", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/vscode-extension-tester/node_modules/find-up": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", @@ -16794,70 +16194,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vscode-extension-tester/node_modules/get-stream": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", - "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", - "dev": true, - "dependencies": { - "@sec-ant/readable-stream": "^0.4.1", - "is-stream": "^4.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vscode-extension-tester/node_modules/got": { - "version": "14.4.5", - "resolved": "https://registry.npmjs.org/got/-/got-14.4.5.tgz", - "integrity": "sha512-sq+uET8TnNKRNnjEOPJzMcxeI0irT8BBNmf+GtZcJpmhYsQM1DSKmCROUjPWKsXZ5HzwD5Cf5/RV+QD9BSTxJg==", + "node_modules/vscode-extension-tester/node_modules/glob": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", "dev": true, + "license": "ISC", "dependencies": { - "@sindresorhus/is": "^7.0.1", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^12.0.1", - "decompress-response": "^6.0.0", - "form-data-encoder": "^4.0.2", - "http2-wrapper": "^2.2.1", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^4.0.1", - "responselike": "^3.0.0", - "type-fest": "^4.26.1" - }, - "engines": { - "node": ">=20" + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/vscode-extension-tester/node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/vscode-extension-tester/node_modules/is-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", - "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", - "dev": true, - "engines": { - "node": ">=18" + "node": "20 || >=22" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/vscode-extension-tester/node_modules/locate-path": { @@ -16875,49 +16233,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vscode-extension-tester/node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vscode-extension-tester/node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "node_modules/vscode-extension-tester/node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "license": "ISC", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vscode-extension-tester/node_modules/normalize-url": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", - "dev": true, "engines": { - "node": ">=14.16" + "node": "20 || >=22" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vscode-extension-tester/node_modules/p-cancelable": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz", - "integrity": "sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==", - "dev": true, - "engines": { - "node": ">=14.16" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/vscode-extension-tester/node_modules/p-limit": { @@ -16959,33 +16288,6 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/vscode-extension-tester/node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vscode-extension-tester/node_modules/type-fest": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.31.0.tgz", - "integrity": "sha512-yCxltHW07Nkhv/1F6wWBr8kz+5BGMfP+RbRSYFnegVb0qV/UMT0G0ElBloPVerqn4M2ZV80Ir1FtCcYv1cT6vQ==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/vscode-extension-tester/node_modules/yocto-queue": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", @@ -17470,10 +16772,11 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, diff --git a/package.json b/package.json index 4ba54533a..91cbe3288 100644 --- a/package.json +++ b/package.json @@ -47,29 +47,28 @@ "icon": "images/openshift_extension.png", "main": "./out/src/extension", "scripts": { - "verify": "ts-node ./build/verify-tools.ts", - "vscode:prepublish": "npm install && npm run clean && npm run lint && npm run compile-production && npm run bundle-tools && npm prune --omit=dev", - "compile": "npm run compile:check && npm run compile:build", - "compile-production": "npm run compile:check-production && npm run compile:build-production", - "compile:check": "tsc -b . && tsc -p ./src/webview -noEmit", - "compile:check-production": "tsc -b . -noEmit && tsc -p ./src/webview -noEmit", - "compile:build": "node ./build/esbuild.mjs", - "compile:build-production": "node ./build/esbuild.mjs --production", - "watch": "node ./build/esbuild-watch.mjs", - "clean": "shx rm -rf out/build out/src out/webview out/test out/tools out/test-resources out/**.tsbuildinfo", + "compile": "npm run prebuild-esm && node ./build/esbuild.build.cjs", + "build": "npm run prebuild-esm && node ./build/esbuild.build.cjs && npm run bundle-tools", + "vscode:prepublish": "npm run prebuild-esm && node ./build/esbuild.build.cjs --production && npm run bundle-tools && npm prune --omit=dev", + "prebuild-esm": "node ./build/esbuild.transform-esm.cjs", + "watch:extension": "tsc -p tsconfig.json --watch", + "watch:webviews": "node ./build/esbuild.webviews.cjs --watch", + "bundle-tools": "node ./build/bundle-tools.cjs --platform", + "verify-tools": "node ./build/verify-tools.cjs", "lint": "eslint . --quiet", "lint-fix": "eslint . --fix", "lint-nic": "eslint . --no-inline-config", "check-cycles": "dpdm --no-tree --no-warning --exit-code circular:1 ./src/extension.ts", - "bundle-tools": "ts-node ./build/bundle-tools.ts --platform", "todo": "leasot **/*.ts --ignore node_modules -x", - "test:prepare": "npm install && npm run build", - "test": "npm run test:prepare && node ./out/build/install-vscode.js && node ./out/build/run-tests.js unit", - "test-integration": "npm run test:prepare && node ./out/build/run-tests.js integration", - "test-integration:coverage": "npm run test:prepare && npm run test:instrument && node ./out/build/run-tests.js integration", + "clean": "shx rm -rf out/build out/src out/webview out/test out/tools out/test-resources out/**.tsbuildinfo", + "test:prepare": "npm install && npm run test:build-extension && npm run test:build-webviews && npm run bundle-tools", + "test:build-extension": "npm run prebuild-esm && tsc -p tsconfig.json", + "test:build-webviews": "node ./build/esbuild.webviews.cjs", "test:instrument": "shx rm -rf out/src-orig && shx mv out/src out/src-orig && istanbul instrument --complete-copy --embed-source --output out/src out/src-orig", - "test:coverage": "npm run build && npm run test:instrument && node ./out/build/install-vscode.js && node ./out/build/run-tests.js unit", - "build": "npm run clean && npm run lint && npm run compile && npm run bundle-tools", + "test": "npm run test:prepare && node ./build/install-vscode.cjs && node ./build/run-tests.cjs unit", + "test:coverage": "npm run test:prepare && npm run test:instrument && node ./build/install-vscode.cjs && node ./build/run-tests.cjs unit", + "test-integration": "npm run test:prepare && node ./build/run-tests.cjs integration", + "test-integration:coverage": "npm run test:prepare && npm run test:instrument && node ./build/run-tests.cjs integration", "cluster-ui-test": "extest setup-tests -e ./test-resources/extensions -c max -i && npm run test:prepare && extest run-tests out/test/ui/cluster-ui-test.js -o test/ui/settings.json -m test/ui/.mocharc.js -e ./test-resources/extensions -c max", "public-ui-test": "extest setup-tests -e ./test-resources/extensions -c max -i && npm run test:prepare && extest run-tests out/test/ui/public-ui-test.js -o test/ui/settings.json -m test/ui/.mocharc.js -e ./test-resources/extensions -c max" }, @@ -81,7 +80,7 @@ "@apidevtools/json-schema-ref-parser": "^14.1.0", "@codemirror/lang-yaml": "^6.1.2", "@devfile/api": "^2.2.2-1716821574", - "@kubernetes/client-node": "^0.22.3", + "@kubernetes/client-node": "^1.3.0", "@mui/icons-material": "^6.5.0", "@mui/lab": "^6.0.0-dev.240424162023-9968b4889d", "@mui/material": "^6.4.12", @@ -123,7 +122,7 @@ "@vscode/test-electron": "^2.5.2", "chai": "^5.2.1", "chokidar": "^4.0.3", - "clipboardy": "^2.3.0", + "clipboardy": "^4.0.0", "clsx": "^2.1.1", "codemirror": "^6.0.2", "dockerode": "^4.0.7", @@ -141,10 +140,11 @@ "eslint-plugin-json": "^4.0.1", "eslint-plugin-prettier": "^5.5.1", "express": "^5.1.0", + "fast-glob": "^3.3.3", "file-loader": "^6.2.0", "fs-extra": "^11.3.0", "git-up": "^8.1.1", - "got": "^11.8.6", + "got": "^14.4.7", "istanbul": "^0.4.5", "json-schema": "^0.4.0", "json-to-ast": "^2.1.0", @@ -152,6 +152,7 @@ "lodash": "^4.17.21", "mkdirp": "^3.0.1", "mocha": "^11.7.1", + "module-alias": "^2.2.3", "node-yaml-parser": "^0.0.9", "npm-run-all": "^4.1.5", "portfinder": "^1.0.37", @@ -195,6 +196,7 @@ "overrides": { "cookie": "^1.0.2", "cross-spawn": "^7.0.6", + "glob": "^7.2.3", "globals": "^16.0.0", "tough-cookie": "^5.1.2", "tar-fs": "^2.1.2" diff --git a/src/deployment.ts b/src/deployment.ts index a421cb85e..ef05d9a35 100644 --- a/src/deployment.ts +++ b/src/deployment.ts @@ -8,7 +8,7 @@ import * as path from 'path'; import validator from 'validator'; import { Disposable, InputBox, QuickInputButtons, ThemeIcon, TreeItem, window } from 'vscode'; import { CommandText } from './base/command'; -import { OtherObject, OpenShiftExplorer } from './explorer'; +import { OpenShiftExplorer, OtherObject } from './explorer'; import { Oc } from './oc/ocWrapper'; import { validateRFC1123DNSLabel } from './openshift/nameValidator'; import { inputValue, quickBtn } from './util/inputValue'; @@ -103,7 +103,7 @@ export class Deployment implements Disposable { if (!component) { return; } - const pods: OtherObject[] = await OpenShiftExplorer.getInstance().getPods(component); + const pods: OtherObject[] = await OpenShiftExplorer.getInstance().getPods(component) as unknown as OtherObject[]; const runnngPodsLength = pods.filter((pod) => pod.status.phase === 'Running').length; let count = runnngPodsLength.toString(); count = await inputValue(`How many replicas would you like to scale ${component.kind}/${component.metadata.name}?`, diff --git a/src/downloadUtil/archive.ts b/src/downloadUtil/archive.ts index 1a36956c8..e6a29cbdf 100644 --- a/src/downloadUtil/archive.ts +++ b/src/downloadUtil/archive.ts @@ -9,7 +9,7 @@ import type { Headers } from 'tar-fs'; import * as unzipm from 'unzip-stream'; import { promisify } from 'util'; import * as zlib from 'zlib'; -import * as targz from '../util/utils'; +import { Util as targz } from '../util/utils'; export class Archive { static extract( diff --git a/src/downloadUtil/download.ts b/src/downloadUtil/download.ts index 30e169d65..0831897b8 100644 --- a/src/downloadUtil/download.ts +++ b/src/downloadUtil/download.ts @@ -4,13 +4,12 @@ *-----------------------------------------------------------------------------------------------*/ import * as fs from 'fs-extra'; -import type { Got } from 'got/dist/source'; import { fromEvent } from 'rxjs'; import { throttleTime } from 'rxjs/operators'; import { promisify } from 'util'; // need to use `require`, since we replace these imports in the unit tests -import * as got from 'got'; +import got from 'got'; import * as stream from 'stream'; export class DownloadUtil { @@ -20,7 +19,7 @@ export class DownloadUtil { progressCb?: (current: number, increment: number) => void, throttle = 250, ): Promise { - const dls = (got as unknown as Got).stream(fromUrl); + const dls = got(fromUrl, { isStream: true }); if (progressCb) { let previous = 0; // Process progress event from 'got' diff --git a/src/explorer.ts b/src/explorer.ts index 6e6ae4b76..691594ecf 100644 --- a/src/explorer.ts +++ b/src/explorer.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See LICENSE file in the project root for license information. *-----------------------------------------------------------------------------------------------*/ -import { Context, KubernetesObject } from '@kubernetes/client-node'; +import type { Context, KubernetesObject } from '@kubernetes/client-node'; import * as fs from 'fs'; import * as path from 'path'; import * as tmp from 'tmp'; @@ -276,12 +276,14 @@ export class OpenShiftExplorer implements TreeDataProvider, Dispos label: element.metadata.name, collapsibleState: TreeItemCollapsibleState.Collapsed } - } else if (element.kind === 'Pod') { - const contextElement: OtherObject = element; + } else if (element.kind === 'Pod' && element ) { + const contextElement = element as OtherObject; + const podLabel = (contextElement as KubernetesObject).metadata?.name ?? 'unknown'; + const podKind = (contextElement as KubernetesObject).kind ?? 'unknown'; return { contextValue: 'openshift.k8sObject.pod', - label: contextElement.metadata.name, - description: `${contextElement.kind.substring(0, 1).toLocaleUpperCase()}${contextElement.kind.substring(1)}`, + label: podLabel, + description: `${podKind.substring(0, 1).toLocaleUpperCase()}${podKind.substring(1)}`, collapsibleState: TreeItemCollapsibleState.None, iconPath: contextElement.status.phase === 'Running' ? imagePath('context/runningPod.svg') : imagePath('context/notReadyPod.svg'), tooltip: `${contextElement.status.phase}\n${contextElement.status.podIP ? contextElement.status.podIP : ''}`, @@ -391,7 +393,7 @@ export class OpenShiftExplorer implements TreeDataProvider, Dispos let pods: OtherObject[] = []; if (shouldHaveReplicas) { try { - pods = await this.getPods(element); + pods = await this.getPods(element) as OtherObject[]; } catch { // ignore } @@ -698,7 +700,7 @@ export class OpenShiftExplorer implements TreeDataProvider, Dispos public async getPipelineTasks(element: KubernetesObject | OpenShiftObject): Promise { const namespace: string = await Oc.Instance.getActiveProject(); - const collections: OtherObject[] = await Oc.Instance.getKubernetesObjects(element.kind, namespace, undefined, this.executionContext); + const collections = await Oc.Instance.getKubernetesObjects(element.kind, namespace, undefined, this.executionContext) as OtherObject[]; const taskNames: PipelineTasks[] = []; if (!collections || collections.length === 0 || !collections[0].spec) { return []; @@ -744,7 +746,7 @@ export class OpenShiftExplorer implements TreeDataProvider, Dispos if (pods.length === 0) { contextElement.status.phase = 'Terminated' void OpenShiftExplorer.getInstance().refresh(contextElement); - void window.showInformationMessage(`Pod ${contextElement.metadata.name} ${contextElement.status.phase.toLowerCase()}`); + void window.showInformationMessage(`Pod ${(contextElement as KubernetesObject).metadata?.name} ${contextElement.status.phase.toLowerCase()}`); void OpenShiftExplorer.getInstance().refresh(); return; } diff --git a/src/extension.ts b/src/extension.ts index f8eb8924d..4fca1c4c1 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -16,6 +16,7 @@ import { REDHAT_CLOUD_PROVIDER } from './cloudProvider/redhatCloudProvider'; import { ComponentsTreeDataProvider } from './componentsView'; import { DebugSessionsView } from './debug'; import { Deployment } from './deployment'; +import { downloadFileAndCreateSha256, PlatformData } from './downloadUtil/downloadBinaries'; import { OpenShiftExplorer } from './explorer'; import { Feedback } from './feedback'; import { ManageRepository as HelmManageRepository } from './helm/manageRepository'; @@ -327,3 +328,11 @@ export async function activate(extensionContext: ExtensionContext): Promise { + return downloadFileAndCreateSha256(toolsCacheFolder, toolsFolder, platform); +} \ No newline at end of file diff --git a/src/k8s/console.ts b/src/k8s/console.ts index 395a35b9b..5f8275052 100644 --- a/src/k8s/console.ts +++ b/src/k8s/console.ts @@ -26,8 +26,10 @@ export class Console implements Disposable { static getCurrentProject(): string { const k8sConfigInfo = new KubeConfigInfo(); const k8sConfig = k8sConfigInfo.getEffectiveKubeConfig(); - const project = k8sConfig.contexts?.find((ctx) => ctx.name === k8sConfig.currentContext).namespace; - return project; + if (k8sConfig.currentContext === undefined) { + return undefined; + } + return k8sConfig.contexts?.find((ctx) => ctx.name === k8sConfig.currentContext).namespace; } @vsCommand('clusters.openshift.build.openConsole') diff --git a/src/openshift/cluster.ts b/src/openshift/cluster.ts index 4ecf210b6..5effef3d8 100644 --- a/src/openshift/cluster.ts +++ b/src/openshift/cluster.ts @@ -4,7 +4,7 @@ *-----------------------------------------------------------------------------------------------*/ import { CoreV1Api, KubeConfig, KubernetesObject, V1Secret, V1ServiceAccount } from '@kubernetes/client-node'; -import { Cluster as KcuCluster, Context as KcuContext } from '@kubernetes/client-node/dist/config_types'; +import { Cluster as KcuCluster, Context as KcuContext, User } from '@kubernetes/client-node/dist/config_types'; import * as https from 'https'; import { Disposable, ExtensionContext, QuickInputButtons, QuickPickItem, QuickPickItemButtonEvent, QuickPickItemKind, ThemeIcon, Uri, commands, env, window, workspace } from 'vscode'; import { CommandText } from '../base/command'; @@ -464,7 +464,7 @@ export class Cluster extends OpenShiftItem implements Disposable { ) .then(() => Promise.all( - users.map((user) => + users.map((user: User) => Oc.Instance.deleteUser(user.name) ), ), @@ -1175,24 +1175,17 @@ export class Cluster extends OpenShiftItem implements Disposable { static prepareSSOInKubeConfig(proxy: string, username: string, accessToken: string): KubeConfig { const kcu = new KubeConfig(); - const clusterProxy = { - name: 'sandbox-proxy', - server: proxy, - }; - const user = { - name: 'sso-user', - token: accessToken, - }; - const context = { - cluster: clusterProxy.name, - name: 'sandbox-proxy-context', - user: user.name, - namespace: `${username}-dev`, - }; - kcu.addCluster(clusterProxy); - kcu.addUser(user) - kcu.addContext(context); - kcu.setCurrentContext(context.name); + kcu.loadFromOptions({ + clusters: [{ name: 'sandbox-proxy', server: proxy, skipTLSVerify: false }], + users: [{ name: 'sso-user', token: accessToken }], + contexts: [{ + name: 'sandbox-proxy-context', + cluster: 'sandbox-proxy', + user: 'sso-user', + namespace: `${username}-dev`, + }], + currentContext: 'sandbox-proxy-context', + }); return kcu; } @@ -1211,24 +1204,24 @@ export class Cluster extends OpenShiftItem implements Disposable { } as V1Secret try { - await k8sApi.createNamespacedSecret(`${username}-dev`, v1Secret); + await k8sApi.createNamespacedSecret({ namespace: `${username}-dev`, body: v1Secret }); } catch { // Ignore } - const newSecrets = await k8sApi.listNamespacedSecret(`${username}-dev`); - return newSecrets?.body.items.find((secret) => secret.metadata.name === `pipeline-secret-${username}-dev`); + const newSecrets = await k8sApi.listNamespacedSecret({ namespace: `${username}-dev` }); + return newSecrets?.items.find((secret) => secret.metadata.name === `pipeline-secret-${username}-dev`); } static async getPipelineServiceAccountToken(k8sApi: CoreV1Api, username: string): Promise { try { - const serviceAccounts = await k8sApi.listNamespacedServiceAccount(`${username}-dev`); - const pipelineServiceAccount = serviceAccounts.body.items.find(serviceAccount => serviceAccount.metadata.name === 'pipeline'); + const serviceAccounts = await k8sApi.listNamespacedServiceAccount({ namespace: `${username}-dev` }); + const pipelineServiceAccount = serviceAccounts.items.find(serviceAccount => serviceAccount.metadata.name === 'pipeline'); if (!pipelineServiceAccount) { return; } - const secrets = await k8sApi.listNamespacedSecret(`${username}-dev`); - let pipelineTokenSecret = secrets?.body.items.find((secret) => secret.metadata.name === `pipeline-secret-${username}-dev`); + const secrets = await k8sApi.listNamespacedSecret({ namespace: `${username}-dev` }); + let pipelineTokenSecret = secrets?.items.find((secret) => secret.metadata.name === `pipeline-secret-${username}-dev`); if (!pipelineTokenSecret) { pipelineTokenSecret = await Cluster.installPipelineSecretToken(k8sApi, pipelineServiceAccount, username); if (!pipelineTokenSecret) { diff --git a/src/openshift/component.ts b/src/openshift/component.ts index d78dcdb2c..a19027c98 100644 --- a/src/openshift/component.ts +++ b/src/openshift/component.ts @@ -14,7 +14,7 @@ import { Odo } from '../odo/odoWrapper'; import { ComponentWorkspaceFolder } from '../odo/workspace'; import { ChildProcessUtil, CliExitData } from '../util/childProcessUtil'; import { Progress } from '../util/progress'; -import * as fs from '../util/utils'; +import { Util as fs } from '../util/utils'; import { vsCommand, VsCommandError } from '../vscommand'; import CreateComponentLoader from '../webview/create-component/createComponentLoader'; import { OpenShiftTerminalApi, OpenShiftTerminalManager } from '../webview/openshift-terminal/openShiftTerminal'; diff --git a/src/openshift/project.ts b/src/openshift/project.ts index 684e7cc2a..6448600d4 100644 --- a/src/openshift/project.ts +++ b/src/openshift/project.ts @@ -29,8 +29,9 @@ export class Project extends OpenShiftItem implements Disposable { static async set(): Promise { let message: string = null; const kind = await getNamespaceKind(); - const canCreateProjects = await Oc.Instance.canCreateNamespace(); - const canListProjects = await Oc.Instance.canListNamespaces(); + const oc = Oc.Instance; + const canCreateProjects = await oc.canCreateNamespace(); + const canListProjects = await oc.canListNamespaces(); const createNewProject = { label: `Create new ${kind}`, @@ -40,8 +41,7 @@ export class Project extends OpenShiftItem implements Disposable { label: `Manually set active ${kind}`, description: `Type in ${kind} name and make it active` }; - const projectsAndCreateNew = Oc.Instance - .getProjects() // + const projectsAndCreateNew = oc.getProjects() // .then((projects) => { const items = []; if (canCreateProjects) { @@ -65,7 +65,7 @@ export class Project extends OpenShiftItem implements Disposable { await Project.getProjectName(`${kind} name`, Promise.resolve([])) : selectedItem.label; if (!projectName) return null; - await Oc.Instance.setProject(projectName); + await oc.setProject(projectName); OpenShiftExplorer.getInstance().refresh(); Project.serverlessView.refresh(); message = `${kind} '${projectName}' set as active.`; @@ -77,11 +77,12 @@ export class Project extends OpenShiftItem implements Disposable { @vsCommand('openshift.namespace.create') static async create(): Promise { const kind = await getNamespaceKind(); - const projectList = Oc.Instance.getProjects(true); + const oc = Oc.Instance; + const projectList = oc.getProjects(true); let projectName = await Project.getProjectName(`${kind} name`, projectList); if (!projectName) return null; projectName = projectName.trim(); - return Oc.Instance.createProject(projectName) + return oc.createProject(projectName) .then(() => { const k8sConfigInfo = new KubeConfigInfo(); const currentContext = k8sConfigInfo.findContext(k8sConfigInfo.getEffectiveKubeConfig().currentContext); @@ -102,8 +103,8 @@ export class Project extends OpenShiftItem implements Disposable { @vsCommand('openshift.namespace.delete.palette', true) static async delFromPalette(): Promise { const kind = await getNamespaceKind(); - const projects = Oc.Instance - .getProjects(true) // Get only projects existing on cluster + const oc = Oc.Instance; + const projects = oc.getProjects(true) // Get only projects existing on cluster .then((projects) => [ ...projects.map((project) => ({ label: project.name, @@ -113,20 +114,21 @@ export class Project extends OpenShiftItem implements Disposable { const selectedItem = await window.showQuickPick(projects, {placeHolder: `Select ${kind} to delete`}); if (!selectedItem) return null; return Project.del({ - kind: 'project', - metadata: { - name: selectedItem.label, - }, - } as KubernetesObject); + kind: 'project', + metadata: { + name: selectedItem.label, + }, + } as KubernetesObject + ); } @vsCommand('openshift.project.delete', false) @vsCommand('openshift.namespace.delete', false) - static async del(project: KubernetesObject): Promise { + static async del(project: KubernetesObject, context?: { oc?: Oc }): Promise { let result: Promise = null; - - const isProjectEmpty = (await Oc.Instance.getAllKubernetesObjects(project.metadata.name)).length === 0; - + const oc = context?.oc ?? Oc.Instance; + const projectObjects = await oc.getAllKubernetesObjects(project.metadata.name); + const isProjectEmpty = !projectObjects || projectObjects.length === 0; const kind = await getNamespaceKind(); const value = await window.showWarningMessage(`Do you want to delete ${kind} '${project.metadata.name}'${!isProjectEmpty ? ' and all its contents' : ''}?`, 'Yes', 'Cancel'); if (value === 'Yes') { @@ -134,9 +136,13 @@ export class Project extends OpenShiftItem implements Disposable { `Deleting ${kind} '${project.metadata.name}'`, async () => { // migrate to odo3.ts - const projects = await Oc.Instance.getProjects(); + const projects = await oc.getProjects(); const selectedProject = projects.find(p => p.name === project.metadata.name); - await Oc.Instance.deleteProject(selectedProject.name); + if (selectedProject) { + await oc.deleteProject(selectedProject.name); + } else { + throw Error(`${kind} to delete not found: ${project.metadata.name}`) + } OpenShiftExplorer.getInstance().refresh(); }) .catch((err) => Promise.reject(new VsCommandError(`Failed to delete ${kind} with error '${err}'`, `Failed to delete ${kind}`))) diff --git a/src/util/async.ts b/src/util/async.ts index 2b1e19480..0e7c0f76e 100644 --- a/src/util/async.ts +++ b/src/util/async.ts @@ -14,6 +14,12 @@ export async function wait(timeout = 2500): Promise { return new Promise((res) => setTimeout(res, timeout)); } +export const Util = { + wait: async function (timeout = 2500): Promise { + return new Promise((res) => setTimeout(res, timeout)); + } +}; + export interface Task { (): T; } diff --git a/src/util/childProcessUtil.ts b/src/util/childProcessUtil.ts index 8aa42435e..2eb202d4d 100644 --- a/src/util/childProcessUtil.ts +++ b/src/util/childProcessUtil.ts @@ -5,7 +5,7 @@ import { ExecException, ExecOptions } from 'child_process'; import * as vscode from 'vscode'; -import * as cp from '../util/utils'; +import { Util as cp } from '../util/utils'; import { Filters } from './filters'; export interface CliExitData { diff --git a/src/util/kubeUtils.ts b/src/util/kubeUtils.ts index 8b2dbe587..b08101971 100644 --- a/src/util/kubeUtils.ts +++ b/src/util/kubeUtils.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See LICENSE file in the project root for license information. *-----------------------------------------------------------------------------------------------*/ -import { KubeConfig, loadYaml } from '@kubernetes/client-node'; +import { KubeConfig, loadYaml } from '@kubernetes/client-node/dist'; import { ActionOnInvalid, Cluster, Context, User } from '@kubernetes/client-node/dist/config_types'; import * as fs from 'fs'; import * as path from 'path'; @@ -31,10 +31,12 @@ type KubeConfigEntry = { class CustomKubeConfig extends KubeConfig { constructor(ctmContexts: Context[], ctmCurrentContext: string, ctmClusters: Cluster[], ctmUsers: User[]) { super(); - this.contexts = ctmContexts; - this.clusters = ctmClusters; - this.users = ctmUsers; - this.currentContext = ctmCurrentContext; + super.loadFromOptions({ + contexts: ctmContexts, + currentContext: ctmCurrentContext, + clusters: ctmClusters, + users: ctmUsers, + }); } }; diff --git a/src/util/utils.ts b/src/util/utils.ts index 335754ae0..b64a54fec 100644 --- a/src/util/utils.ts +++ b/src/util/utils.ts @@ -17,7 +17,6 @@ import { access as accessOriginal, rm as rmOriginal } from 'fs/promises'; import * as path from 'path'; import { decompress as decompressOriginal } from 'targz'; import { CreateNodeOptions, DocumentOptions, ParseOptions, SchemaOptions, ToStringOptions } from 'yaml'; - /** * Returns the absolute path for a specified relative image path * @@ -63,20 +62,21 @@ export const YAML_STRINGIFY_OPTIONS: DocumentOptions & SchemaOptions & ParseOpti // 'TypeError: Descriptor for property XXX is non-configurable and non-writable' error // that may occure when trying to stub the following methods with SinonStub // +export const Util = { + // Wraps from fs/promises + rm: rmOriginal, + access: accessOriginal, -// Wraps from fs/promises -export const rm = rmOriginal; -export const access = accessOriginal; - -// Wraps from fs-extra -export const ensureDirSync = ensureDirSyncOriginal; -export const watch = watchOriginal; -export const realpathSync = realpathSyncOriginal; -export const ensureFileSync = ensureFileSyncOriginal; -export const writeFileSync = writeFileSyncOriginal; + // Wraps from fs-extra + ensureDirSync: ensureDirSyncOriginal, + watch: watchOriginal, + realpathSync: realpathSyncOriginal, + ensureFileSync: ensureFileSyncOriginal, + writeFileSync: writeFileSyncOriginal, -// Wraps from child_process -export const exec = execOriginal; + // Wraps from child_process + exec: execOriginal, -// Wraps from child_process -export const decompress = decompressOriginal; + // Wraps from child_process + decompress: decompressOriginal +}; \ No newline at end of file diff --git a/src/util/watch.ts b/src/util/watch.ts index fe1b1f2c3..0b75b57f7 100644 --- a/src/util/watch.ts +++ b/src/util/watch.ts @@ -6,7 +6,7 @@ import { EventEmitter } from 'events'; import * as fs from 'fs'; import { FSWatcher } from 'fs-extra'; -import * as fsxt from '../util/utils'; +import { Util as fsxt } from '../util/utils'; export class WatchUtil { static watchFileForContextChange( diff --git a/src/vscommand.ts b/src/vscommand.ts index 3e68fa930..b3cfdead0 100644 --- a/src/vscommand.ts +++ b/src/vscommand.ts @@ -49,7 +49,7 @@ export function registerCommands(): Disposable[] { let exception: any; const startTime = Date.now(); try { - result = await Promise.resolve(cmd.method.call(null, ...params)); + result = await Promise.resolve(cmd.method.apply(null, params)); displayResult(result); } catch (err) { let stack:stackTraceParser.StackFrame[]; @@ -90,7 +90,7 @@ export function registerCommands(): Disposable[] { }); } -export function vsCommand(commandId: string, palette = false): (_target: any, key: string, descriptor: any)=> void { +export function vsCommand(commandId: string, palette = false): MethodDecorator { return (_target: any, key: string, descriptor: any): void => { if (!(typeof descriptor.value === 'function')) { throw new Error('not supported'); diff --git a/src/webview/cluster/app/index.html b/src/webview/cluster/app/index.html index 734e400a2..fc0e2abad 100644 --- a/src/webview/cluster/app/index.html +++ b/src/webview/cluster/app/index.html @@ -49,6 +49,19 @@
+ diff --git a/src/webview/cluster/clusterViewLoader.ts b/src/webview/cluster/clusterViewLoader.ts index 7aa8c14c0..a2dbe7755 100644 --- a/src/webview/cluster/clusterViewLoader.ts +++ b/src/webview/cluster/clusterViewLoader.ts @@ -116,10 +116,8 @@ async function clusterEditorMessageListener (event: any ): Promise { const oauthInfo = await sandboxAPI.getOauthServerInfo(signupStatus.apiEndpoint); const makeCoreV1ApiClient = ((proxy: string, username: string, accessToken: string): CoreV1Api => { const kcu = Cluster.prepareSSOInKubeConfig(proxy, username, accessToken); - const apiClient = new CoreV1Api(proxy); - apiClient.setDefaultAuthentication(kcu); - return apiClient; - }); + return kcu.makeApiClient(CoreV1Api); + }); const pipelineAccountToken = await Cluster.getPipelineServiceAccountToken( makeCoreV1ApiClient(signupStatus.proxyURL, signupStatus.compliantUsername, (sessionCheck as any).idToken), diff --git a/src/webview/create-component/app/index.html b/src/webview/create-component/app/index.html index ee9d74b8a..9f50919af 100644 --- a/src/webview/create-component/app/index.html +++ b/src/webview/create-component/app/index.html @@ -51,6 +51,19 @@
- + + diff --git a/src/webview/create-deployment/app/index.html b/src/webview/create-deployment/app/index.html index 1a16c9861..5a864d525 100644 --- a/src/webview/create-deployment/app/index.html +++ b/src/webview/create-deployment/app/index.html @@ -51,6 +51,19 @@
+ diff --git a/src/webview/create-route/app/index.html b/src/webview/create-route/app/index.html index e01f843fd..e92c38067 100644 --- a/src/webview/create-route/app/index.html +++ b/src/webview/create-route/app/index.html @@ -25,6 +25,19 @@
+ diff --git a/src/webview/create-service/app/index.html b/src/webview/create-service/app/index.html index e01f843fd..e92c38067 100644 --- a/src/webview/create-service/app/index.html +++ b/src/webview/create-service/app/index.html @@ -25,6 +25,19 @@
+ diff --git a/src/webview/devfile-registry/app/index.html b/src/webview/devfile-registry/app/index.html index 1a8e4dda8..fbadca083 100644 --- a/src/webview/devfile-registry/app/index.html +++ b/src/webview/devfile-registry/app/index.html @@ -51,6 +51,19 @@
- + + diff --git a/src/webview/feedback/app/index.html b/src/webview/feedback/app/index.html index 61cc2138c..f53bc523f 100644 --- a/src/webview/feedback/app/index.html +++ b/src/webview/feedback/app/index.html @@ -51,6 +51,19 @@
+ diff --git a/src/webview/helm-chart/app/index.html b/src/webview/helm-chart/app/index.html index 148902abd..308f7a58b 100644 --- a/src/webview/helm-chart/app/index.html +++ b/src/webview/helm-chart/app/index.html @@ -46,6 +46,19 @@
+ diff --git a/src/webview/helm-manage-repository/app/index.html b/src/webview/helm-manage-repository/app/index.html index cb9b0ca63..ae635c0fa 100644 --- a/src/webview/helm-manage-repository/app/index.html +++ b/src/webview/helm-manage-repository/app/index.html @@ -46,6 +46,19 @@
+ diff --git a/src/webview/invoke-serverless-function/app/index.html b/src/webview/invoke-serverless-function/app/index.html index 8c06f5894..4729566e0 100644 --- a/src/webview/invoke-serverless-function/app/index.html +++ b/src/webview/invoke-serverless-function/app/index.html @@ -39,6 +39,19 @@
+ diff --git a/src/webview/openshift-terminal/app/index.html b/src/webview/openshift-terminal/app/index.html index 63b5c1528..5b35bfcb3 100644 --- a/src/webview/openshift-terminal/app/index.html +++ b/src/webview/openshift-terminal/app/index.html @@ -35,7 +35,20 @@
- + + diff --git a/src/webview/serverless-function/app/index.html b/src/webview/serverless-function/app/index.html index 8f689e5cd..d25a6b845 100644 --- a/src/webview/serverless-function/app/index.html +++ b/src/webview/serverless-function/app/index.html @@ -51,6 +51,19 @@
+ diff --git a/src/webview/serverless-manage-repository/app/index.html b/src/webview/serverless-manage-repository/app/index.html index cb9b0ca63..ae635c0fa 100644 --- a/src/webview/serverless-manage-repository/app/index.html +++ b/src/webview/serverless-manage-repository/app/index.html @@ -46,6 +46,19 @@
+ diff --git a/src/webview/tsconfig.json b/src/webview/tsconfig.json index 23f525306..a0715bf96 100644 --- a/src/webview/tsconfig.json +++ b/src/webview/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "module": "esnext", "moduleResolution": "node", - "outDir": "../../out/webview", + "outDir": "../../out", "target": "es6", "jsx": "react", "typeRoots": [ @@ -12,7 +12,6 @@ "experimentalDecorators": true, "skipLibCheck": true, "esModuleInterop": true, - "noEmit": true, "incremental": true, }, "include": [ diff --git a/src/webview/welcome/app/index.html b/src/webview/welcome/app/index.html index a57273ac2..d627f9b71 100644 --- a/src/webview/welcome/app/index.html +++ b/src/webview/welcome/app/index.html @@ -46,6 +46,19 @@
+ diff --git a/test/bootstrap.js b/test/bootstrap.js new file mode 100644 index 000000000..00b62fa6c --- /dev/null +++ b/test/bootstrap.js @@ -0,0 +1,17 @@ +/*----------------------------------------------------------------------------------------------- + * Copyright (c) Red Hat, Inc. All rights reserved. + * Licensed under the MIT License. See LICENSE file in the project root for license information. + *-----------------------------------------------------------------------------------------------*/ + +const path = require('path'); +const moduleAlias = require('module-alias'); + +// --- Force specific modules to load from out/esm +moduleAlias.addAliases({ + 'clipboardy': path.resolve(__dirname, '../out/esm/clipboardy.cjs'), + 'got': path.resolve(__dirname, '../out/esm/got.cjs'), + '@kubernetes/client-node': path.resolve(__dirname, '../out/esm/k8s-client-node.cjs'), +}); + +// --- Register the aliases +moduleAlias(); \ No newline at end of file diff --git a/test/ui/common/ui/webviewView/openshiftTerminalWebviewView.ts b/test/ui/common/ui/webviewView/openshiftTerminalWebviewView.ts index 39544821b..2bec73fc3 100644 --- a/test/ui/common/ui/webviewView/openshiftTerminalWebviewView.ts +++ b/test/ui/common/ui/webviewView/openshiftTerminalWebviewView.ts @@ -2,6 +2,7 @@ * Copyright (c) Red Hat, Inc. All rights reserved. * Licensed under the MIT License. See LICENSE file in the project root for license information. *-----------------------------------------------------------------------------------------------*/ +import clipboard from 'clipboardy'; import { By, Key, VSBrowser, WebElement, WebviewView } from 'vscode-extension-tester'; import { WebviewViewForm } from './webviewViewForm'; @@ -16,8 +17,7 @@ export class OpenshiftTerminalWebviewView extends WebviewViewForm { async () => { try { await this.sendKeysToTerminal(copyKeys); - const cb = await import('clipboardy'); - return await cb.read(); + return await clipboard.read(); } catch { return null; } diff --git a/test/unit/activation.ts b/test/unit/activation.ts index e20544d84..f7e0ad3ef 100644 --- a/test/unit/activation.ts +++ b/test/unit/activation.ts @@ -3,11 +3,23 @@ * Licensed under the MIT License. See LICENSE file in the project root for license information. *-----------------------------------------------------------------------------------------------*/ /* eslint-disable no-console */ +import { strict as assert } from 'assert'; import * as vscode from 'vscode'; suite('Extension activation', function() { test('Extension is activated', async function() { this.timeout(120_000); + + console.log('Installed extensions:', vscode.extensions.all.map(e => e.id)); + + const accExt = await vscode.extensions.getExtension('redhat.vscode-redhat-account'); + assert.ok(accExt, 'Extension "redhat.vscode-redhat-account" not found'); + await accExt.activate(); + + const ext = vscode.extensions.getExtension('redhat.vscode-openshift-connector'); + assert.ok(ext, 'Extension "redhat.vscode-openshift-connector" not found'); + await ext.activate(); + await vscode.commands.executeCommand('openshift.output'); }); }); diff --git a/test/unit/extension.test.ts b/test/unit/extension.test.ts index 4d27244a3..e8c4cfa9c 100644 --- a/test/unit/extension.test.ts +++ b/test/unit/extension.test.ts @@ -14,6 +14,7 @@ import * as path from 'path'; import * as sinon from 'sinon'; import sinonChai from 'sinon-chai'; import * as vscode from 'vscode'; +import * as packagejson from '../../package.json'; import { CommandText } from '../../src/base/command'; import { Oc } from '../../src/oc/ocWrapper'; import { Project } from '../../src/oc/project'; @@ -21,8 +22,6 @@ import { Odo } from '../../src/odo/odoWrapper'; import { getNamespaceKind } from '../../src/util/kubeUtils'; import { Progress } from '../../src/util/progress'; -import * as packagejson from '../../package.json'; - const {expect} = chai; chai.use(sinonChai); @@ -67,7 +66,7 @@ suite('openshift toolkit Extension', () => { }, { uri: comp2Uri, index: 1, name: 'comp2' }]); - // eslint-disable-next-line @typescript-eslint/require-await + sandbox.stub(Odo.prototype, 'execute').callsFake(async (cmd: CommandText, cwd: string)=> { if (`${cmd}`.includes('version')) { return { error: undefined, stdout: 'Server: https://api.crc.testing:6443', stderr: '' }; @@ -90,8 +89,6 @@ suite('openshift toolkit Extension', () => { } return { error: undefined, stdout: '', stderr: ''}; }); - sandbox.stub(Oc.prototype, 'getAllKubernetesObjects').resolves([]); - sandbox.stub(Oc.prototype, 'getProjects').resolves([projectItem]); }); teardown(() => { @@ -117,21 +114,27 @@ suite('openshift toolkit Extension', () => { sandbox.stub(vscode.window, 'showWarningMessage').resolves('Yes'); const simStub = sandbox.stub(vscode.window, 'showInformationMessage'); sandbox.stub(Progress, 'execFunctionWithProgress').resolves(); - const p1 = {kind: 'project', metadata: { name: 'p1'}}; - await vscode.commands.executeCommand('openshift.project.delete', p1); + const p1 = {kind: 'project', metadata: { name: 'myproject'}}; + const stubbedOc = sandbox.createStubInstance(Oc); + stubbedOc.getProjects.resolves([ projectItem ]); + await vscode.commands.executeCommand('openshift.project.delete', p1, { oc: stubbedOc }); const kind = await getNamespaceKind(); expect(simStub).calledWith(`${kind} '${p1.metadata.name}' successfully deleted`); }); test('async command wrapper shows error message from rejected command', async () => { + const stubbedOc = sandbox.createStubInstance(Oc); + stubbedOc.getProjects.resolves([ projectItem ]); sandbox.stub(vscode.window, 'showWarningMessage').resolves('Yes'); sandbox.stub(vscode.window, 'showInformationMessage'); const semStub = sandbox.stub(vscode.window, 'showErrorMessage'); const error = new Error('message'); sandbox.stub(Progress, 'execFunctionWithProgress').rejects(error); - const p1 = {kind: 'project', metadata: { name: 'p1'}}; - await vscode.commands.executeCommand('openshift.project.delete', p1); + const p1 = {kind: 'project', metadata: { name: 'myproject1'}}; + await vscode.commands.executeCommand('openshift.project.delete', p1, { oc: stubbedOc }); const kind = await getNamespaceKind(); - expect(semStub).calledWith(`Failed to delete ${kind} with error '${error}'`); + expect(semStub).to.have.been.calledWithMatch( + sinon.match((msg: string) => msg.includes(`Failed to delete ${kind} with error`)) + ); }); }); diff --git a/test/unit/index.ts b/test/unit/index.ts index c895e21af..0a4c6ef8b 100644 --- a/test/unit/index.ts +++ b/test/unit/index.ts @@ -12,7 +12,6 @@ import { CoverageRunner, TestRunnerOptions } from '../coverage'; sourceMapSupport.install(); - const config: Mocha.MochaOptions = { reporter: 'spec', ui: 'tdd', diff --git a/test/unit/k8s/console.test.ts b/test/unit/k8s/console.test.ts index ba9fbc3f7..1aded78b7 100644 --- a/test/unit/k8s/console.test.ts +++ b/test/unit/k8s/console.test.ts @@ -18,10 +18,7 @@ suite('K8s/console', () => { let sandbox: sinon.SinonSandbox; let cliExecStub: sinon.SinonStub; let commandStub: any; - - const k8sConfigInfo = new KubeConfigInfo(); - const k8sConfig = k8sConfigInfo.getEffectiveKubeConfig(); - const project = (k8sConfig.contexts).find((ctx) => ctx.name === k8sConfig.currentContext).namespace; + let project: string; const context = { extraInfo: undefined, @@ -37,6 +34,11 @@ suite('K8s/console', () => { sandbox = sinon.createSandbox(); cliExecStub = sandbox.stub(CliChannel.prototype, 'executeTool').resolves({ stdout: '', stderr: undefined, error: undefined}); commandStub = sandbox.stub(vscode.commands, 'executeCommand'); + + const k8sConfigInfo = new KubeConfigInfo(); + const k8sConfig = k8sConfigInfo.getEffectiveKubeConfig(); + const ctx = k8sConfig.contexts.find((ctx) => ctx.name === k8sConfig.currentContext); + project = (ctx && ctx.namespace) ? ctx.namespace : undefined; }); teardown(() => { @@ -56,6 +58,7 @@ suite('K8s/console', () => { } }) }); + await Console.openBuildConfig(context); expect(commandStub).calledOnceWith('vscode.open', vscode.Uri.parse(`https://console-openshift-console.apps-crc.testing/k8s/ns/${project}/buildconfigs/cpm1-app1`)); @@ -70,7 +73,6 @@ suite('K8s/console', () => { }); await Console.openBuildConfig(context); expect(commandStub).calledOnceWith('vscode.open', vscode.Uri.parse(`https://162.165.64.43:8443/console/project/${project}/browse/builds/cpm1-app1?tab=history`)); - }); }); diff --git a/test/unit/openshift/component.test.ts b/test/unit/openshift/component.test.ts index 3dc9c9461..9f34b7ef3 100644 --- a/test/unit/openshift/component.test.ts +++ b/test/unit/openshift/component.test.ts @@ -6,8 +6,6 @@ import * as chai from 'chai'; import { PathLike, RmOptions } from 'fs-extra'; -import * as fsp from '../../../src/util/utils'; -// import * as fsp from 'fs/promises'; import * as path from 'path'; import pq from 'proxyquire'; import * as sinon from 'sinon'; @@ -23,10 +21,12 @@ import { CommandProvider } from '../../../src/odo/componentTypeDescription'; import { Odo } from '../../../src/odo/odoWrapper'; import { ComponentWorkspaceFolder, OdoWorkspace } from '../../../src/odo/workspace'; import * as openShiftComponent from '../../../src/openshift/component'; -import * as Util from '../../../src/util/async'; +import { Util } from '../../../src/util/async'; +import { Util as fsp } from '../../../src/util/utils'; import { OpenShiftTerminalManager } from '../../../src/webview/openshift-terminal/openShiftTerminal'; import { comp1Folder } from '../../fixtures'; + const { expect } = chai; chai.use(sinonChai); @@ -129,7 +129,9 @@ suite('OpenShift/Component', function () { setup(() => { sandbox = sinon.createSandbox(); sandbox.stub(vscode.workspace, 'updateWorkspaceFolders'); + Component = pq('../../../src/openshift/component', {}).Component; + termStub = sandbox.stub(OpenShiftTerminalManager.prototype, 'executeInTerminal'); execStub = sandbox.stub(Odo.prototype, 'execute').resolves({ stdout: '', stderr: undefined, error: undefined }); sandbox.stub(Oc.prototype, 'getProjects').resolves([projectItem]); diff --git a/test/unit/openshift/project.test.ts b/test/unit/openshift/project.test.ts index e9e6374ce..f4a7a5d29 100644 --- a/test/unit/openshift/project.test.ts +++ b/test/unit/openshift/project.test.ts @@ -147,7 +147,6 @@ suite('OpenShift/Project', () => { test('works without context', async () => { const result = await Project.del(null); - expect(result).equals(`Project '${projectItem.name}' successfully deleted`); expect(deleteProjectStub).to.be.calledWith(projectItem.name); }); @@ -155,7 +154,6 @@ suite('OpenShift/Project', () => { test('returns null when cancelled', async () => { warnStub.resolves('Cancel'); const result = await Project.del(null); - expect(result).null; }); diff --git a/test/unit/util/archive.test.ts b/test/unit/util/archive.test.ts index e6149f63a..9abbc3ae2 100644 --- a/test/unit/util/archive.test.ts +++ b/test/unit/util/archive.test.ts @@ -10,7 +10,7 @@ import * as sinon from 'sinon'; import sinonChai from 'sinon-chai'; import * as tmp from 'tmp'; import { Archive } from '../../../src/downloadUtil/archive'; -import * as targz from '../../../src/util/utils'; +import { Util as targz } from '../../../src/util/utils'; const {expect} = chai; chai.use(sinonChai); diff --git a/test/unit/util/childProcessUtil.test.ts b/test/unit/util/childProcessUtil.test.ts index 28ab9e57b..b926fd2c2 100644 --- a/test/unit/util/childProcessUtil.test.ts +++ b/test/unit/util/childProcessUtil.test.ts @@ -9,7 +9,7 @@ import * as sinon from 'sinon'; import sinonChai from 'sinon-chai'; import * as vscode from 'vscode'; import { ChildProcessUtil } from '../../../src/util/childProcessUtil'; -import * as childProcess from '../../../src/util/utils'; +import { Util as childProcess } from '../../../src/util/utils'; const {expect} = chai; chai.use(sinonChai); diff --git a/test/unit/util/download.test.ts b/test/unit/util/download.test.ts index c6021d90b..6cddbbfe5 100644 --- a/test/unit/util/download.test.ts +++ b/test/unit/util/download.test.ts @@ -27,21 +27,28 @@ suite('Download Util', () => { requestEmitter = new EventEmitter(); streamEmitter = new EventEmitter(); requestEmitter.pipe = (): any => streamEmitter; - progressMock = pq('../../../src/downloadUtil/download', { - got: { - stream: (): any => requestEmitter - }, - stream: { - pipeline: async (a, b, cb): Promise => { - await wait(300); - requestEmitter.emit('downloadProgress', {percent: 0.33}); - await wait(300); - requestEmitter.emit('downloadProgress', {percent: 0.66}); - await wait(300); - requestEmitter.emit('end'); - cb(null); - } + + const mockGot = { + default: (): any => requestEmitter, + got: (): any => requestEmitter, + stream: (): any => requestEmitter + }; + + const mockStream = { + pipeline: async (a, b, cb): Promise => { + await wait(300); + requestEmitter.emit('downloadProgress', {percent: 0.33}); + await wait(300); + requestEmitter.emit('downloadProgress', {percent: 0.66}); + await wait(300); + requestEmitter.emit('end'); + cb(null); } + }; + + progressMock = pq('../../../src/downloadUtil/download', { + got: mockGot, + stream: mockStream }).DownloadUtil as typeof DownloadUtilType; }); diff --git a/test/unit/util/watch.test.ts b/test/unit/util/watch.test.ts index 6daa2e640..d3690b4a1 100644 --- a/test/unit/util/watch.test.ts +++ b/test/unit/util/watch.test.ts @@ -8,7 +8,7 @@ import * as path from 'path'; import * as sinon from 'sinon'; import sinonChai from 'sinon-chai'; import * as tmp from 'tmp'; -import * as fs from '../../../src/util/utils'; +import { Util as fs } from '../../../src/util/utils'; import { WatchUtil } from '../../../src/util/watch'; const {expect} = chai; diff --git a/tsconfig.json b/tsconfig.json index f76371001..d7d1360d8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,51 +1,39 @@ { - "compilerOptions": { - "jsx": "react", - "module": "commonjs", - "target": "es6", - "outDir": "out", - "lib": [ - "es6", - "dom" - ], - "typeRoots": [ - "./src/@types" - ], - "sourceMap": true, - "rootDir": ".", - "esModuleInterop": true, - /* Strict Type-Checking Option */ - "strict": false, /* enable all strict type-checking options */ - /* Additional Checks */ - "noUnusedLocals": true, /* Report errors on unused locals. */ - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - // "noUnusedParameters": true, /* Report errors on unused parameters. */ - "experimentalDecorators": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "incremental": true + "compilerOptions": { + "outDir": "./out", + "rootDir": ".", + "paths": { + "clipboardy": [ "out/esm/clipboardy.cjs" ], + "got": [ "out/esm/got.cjs" ], + "@kubernetes/client-node": [ "out/esm/k8s-client-node.cjs" ] }, - "exclude": [ - "node_modules", - ".vscode-test", - "test-resources", - "src/webview/cluster/app", - "src/webview/create-service/app", - "src/webview/create-route/app", - "src/webview/create-component/app", - "src/webview/create-deployment/app", - "src/webview/create-component/pages", - "src/webview/create-deployment/pages", - "src/webview/devfile-registry/app", - "src/webview/welcome/app", - "src/webview/git-import/app", - "src/webview/helm-chart/app", - "src/webview/helm-manage-repository/app", - "src/webview/feedback/app", - "src/webview/serverless-function/app", - "src/webview/serverless-manage-repository/app", - "src/webview/openshift-terminal/app", - "src/webview/common" - ] -} + "baseUrl": ".", + "jsx": "react", + "target": "es6", + "lib": ["es6", "dom"], + "noEmit": false, + "module": "CommonJS", + "esModuleInterop": true, + "strict": false, + "noUnusedLocals": true, + "resolveJsonModule": true, + "moduleResolution": "node", + "experimentalDecorators": true, + "useDefineForClassFields": false, + "noImplicitOverride": false, + "skipLibCheck": true, + "incremental": true, + "allowSyntheticDefaultImports": true, + "isolatedModules": true, + "typeRoots": [ "./src/@types", "./node_modules/@types", "./out/extension" ], + "sourceMap": true + }, + "include": [ "test/**/*.ts", "src/**/*.ts" ], + "exclude": [ + "node_modules", + ".vscode-test", + "test-resources", + "src/webview/**/app/**/*", + "src/webview/common/**/*" + ] +} \ No newline at end of file