diff --git a/.gitignore b/.gitignore index 85bb15b..daecdbb 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ node_modules .store dist lib -.npmrc \ No newline at end of file +.npmrc +.vscode \ No newline at end of file diff --git a/package.json b/package.json index 9e11130..163d56f 100644 --- a/package.json +++ b/package.json @@ -12,5 +12,9 @@ "lage": "^2.7.16", "typescript": "^5.4.2", "prettier": "^3.2.5" + }, + "engines": { + "node": ">=16", + "pnpm": "8" } } \ No newline at end of file diff --git a/packages/ado-npm-auth/package.json b/packages/ado-npm-auth/package.json index 9aee07e..3eaa399 100644 --- a/packages/ado-npm-auth/package.json +++ b/packages/ado-npm-auth/package.json @@ -26,9 +26,11 @@ "dependencies": { "@npmcli/config": "^4.0.1", "azureauth": "^0.4.5", - "workspace-tools": "^0.26.3" + "workspace-tools": "^0.26.3", + "js-yaml": "^4.1.0" }, "devDependencies": { + "@types/js-yaml": "4.0.9", "@types/node": "^20.5.9", "@types/npmcli__config": "^6.0.0", "eslint": "^8.30.0", diff --git a/packages/ado-npm-auth/src/npmrc/make-ado-request.ts b/packages/ado-npm-auth/src/ado/make-ado-request.ts similarity index 92% rename from packages/ado-npm-auth/src/npmrc/make-ado-request.ts rename to packages/ado-npm-auth/src/ado/make-ado-request.ts index a0da1e0..85f335d 100644 --- a/packages/ado-npm-auth/src/npmrc/make-ado-request.ts +++ b/packages/ado-npm-auth/src/ado/make-ado-request.ts @@ -1,3 +1,4 @@ +import { toBase64 } from "../utils/encoding.js"; import { makeRequest } from "../utils/request.js"; /** @@ -14,7 +15,7 @@ export const makeADORequest = async ({ password, organization }: { password: string; organization: string; }) => { - const auth = `Basic ${Buffer.from(`.:${password}`).toString("base64")}`; + const auth = `Basic ${toBase64(`.:${password}`)}`; const options = { hostname: "feeds.dev.azure.com", diff --git a/packages/ado-npm-auth/src/args.ts b/packages/ado-npm-auth/src/args.ts new file mode 100644 index 0000000..324d982 --- /dev/null +++ b/packages/ado-npm-auth/src/args.ts @@ -0,0 +1,15 @@ +export interface Args { + doValidCheck: boolean; + skipAuth: boolean; + configFile?: string; +} + +export function parseArgs(args: string[]) : Args { + const doValidCheck = !args.includes("--skip-check"); + const skipAuth = args.includes("--skip-auth"); + + return { + doValidCheck, + skipAuth + } +} \ No newline at end of file diff --git a/packages/ado-npm-auth/src/cli.ts b/packages/ado-npm-auth/src/cli.ts index 1740fc1..098982c 100644 --- a/packages/ado-npm-auth/src/cli.ts +++ b/packages/ado-npm-auth/src/cli.ts @@ -2,32 +2,87 @@ import { isSupportedPlatformAndArchitecture } from "./azureauth/is-supported-pla import { isCodespaces } from "./utils/is-codespaces.js"; import { logTelemetry } from "./telemetry/index.js"; import { arch, platform } from "os"; -import { isValidPat } from "./npmrc/is-valid-pat.js"; -import { setNpmrcPat } from "./npmrc/set-npmrc-pat.js"; +import { Args, parseArgs } from "./args.js"; +import { NpmrcFileProvider } from "./npmrc/npmrcFileProvider.js"; +import { defaultEmail, defaultUser, ValidatedFeed } from "./fileProvider.js"; +import { generateNpmrcPat } from "./npmrc/generate-npmrc-pat.js"; +import { partition } from "./utils/partition.js"; +import { YarnRcFileProvider } from "./yarnrc/yarnrcFileProvider.js"; -export const run = async (): Promise => { - const doValidCheck = !process.argv.includes("--skip-check"); - const skipAuth = process.argv.includes("--skip-auth"); +const fileProviders = [new NpmrcFileProvider(), new YarnRcFileProvider()] + +export const run = async (args: Args): Promise => { + + const validatedFeeds: ValidatedFeed[] = []; + if (args.doValidCheck || args.skipAuth) { + for (const fileProvider of fileProviders) { + if (await fileProvider.isSupportedInRepo()) { + validatedFeeds.push(...await fileProvider.validateAllUsedFeeds()); + } + } + } - if (doValidCheck && (await isValidPat())) { + const invalidFeeds = validatedFeeds.filter(feed => !feed.isValid); + const invalidFeedCount = invalidFeeds.length; + + if (args.doValidCheck && invalidFeedCount == 0) { return null; } - if (skipAuth && !(await isValidPat())) { + if (args.skipAuth && invalidFeedCount != 0) { logTelemetry( - { success: false, automaticSuccess: false, error: "invalid token" }, + { success: false, automaticSuccess: false, error: "invalid token(s)" }, true ); console.log( - "❌ Your token is invalid." + invalidFeedCount == 1 + ? "❌ Your token is invalid." + : `❌ ${invalidFeedCount} tokens are invalid.` ); return false; } try { console.log("🔑 Authenticating to package feed...") - await setNpmrcPat(); + + const adoOrgs = new Set(); + for (const adoOrg of invalidFeeds.map(feed => feed.feed.adoOrganization)) + { + adoOrgs.add(adoOrg); + } + + // get a token for each feed + const organizationPatMap: Record = {}; + for (const adoOrg of adoOrgs) { + organizationPatMap[adoOrg] = await generateNpmrcPat(adoOrg, false); + } + + // Update the pat in the invalid feeds. + for (const invalidFeed of invalidFeeds) { + const feed = invalidFeed.feed; + + const authToken = organizationPatMap[feed.adoOrganization]; + if (!authToken) { + console.log(`❌ Failed to obtain pat for ${feed.registry} via ${invalidFeed.fileProvider.id}`); + return false; + } + feed.authToken = authToken; + if (!feed.email) { + feed.email = defaultEmail; + } + if (!feed.userName) { + feed.userName = defaultUser; + } + } + + + const invalidFeedsByProvider = partition(invalidFeeds, feed => feed.fileProvider); + for (const [fileProvider, updatedFeeds] of invalidFeedsByProvider) { + await fileProvider.writeWorspaceRegistries(updatedFeeds.map(updatedFeed => updatedFeed.feed)); + } + return true; + } catch (error) { logTelemetry( { @@ -54,7 +109,9 @@ if (!isSupportedPlatformAndArchitecture()) { process.exit(0); } -const result = await run(); +const args = parseArgs(process.argv) + +const result = await run(args); if (result === null) { // current auth is valid, do nothing diff --git a/packages/ado-npm-auth/src/fileProvider.ts b/packages/ado-npm-auth/src/fileProvider.ts new file mode 100644 index 0000000..5b60f63 --- /dev/null +++ b/packages/ado-npm-auth/src/fileProvider.ts @@ -0,0 +1,98 @@ +import { getWorkspaceRoot } from "workspace-tools"; +import { join } from "node:path"; +import fs from "node:fs/promises"; +import { homedir } from "node:os"; +import { getOrganizationFromFeedUrl } from "./utils/get-organization-from-feed-url.js"; +import { makeADORequest } from "./ado/make-ado-request.js"; + + +/** + * Default user to be used in the .npmrc + */ +export const defaultUser = "me"; + +/** + * Default email to be used in the .npmrc + */ +export const defaultEmail = "me@example.com"; + +export interface Feed { + registry: string; + adoOrganization: string; + userName?: string; + email?: string; + authToken?: string; +} + +export type ValidatedFeed = { feed: Feed; isValid: boolean, fileProvider: FileProvider } + +export abstract class FileProvider { + public workspaceFilePath: string; + public userFilePath: string; + + public feeds: Map; + + constructor(public id: string, public workspaceFileName: string) { + const workspaceRoot = getWorkspaceRoot(process.cwd()) || ""; + this.workspaceFilePath = join(workspaceRoot, this.workspaceFileName); + + const userHome = + process.env["HOME"] || process.env["USERPROFILE"] || homedir() || ""; + this.userFilePath = join(userHome, workspaceFileName); + this.feeds = new Map(); + } + + public async isSupportedInRepo(): Promise { + try { + await fs.access(this.workspaceFilePath); + } catch (error) { + return false; + } + + return true; + } + + public async validateAllUsedFeeds(): Promise { + await this.prepUserFile(); + + const result: ValidatedFeed[] = []; + + const workspaceRegistries = await this.getWorkspaceRegistries(); + const userFeeds = await this.getUserFeeds(); + + // check each feed for validity + for (const registry of workspaceRegistries) { + const feed = userFeeds.get(registry); + + if (feed) { + let feedIsValid = true; + try { + await makeADORequest({ + password: feed.authToken || "", + organization: feed.adoOrganization, + }); + } catch (e) { + feedIsValid = false; + } + result.push({ feed: feed, isValid: feedIsValid, fileProvider: this }); + } else { + // No representation of the token in the users config file. + result.push({ + feed: { + registry: registry, + adoOrganization: getOrganizationFromFeedUrl(registry), + }, + isValid: false, + fileProvider: this, + }); + } + } + + return result; + } + + abstract prepUserFile(): Promise; + abstract getUserFeeds(): Promise>; + abstract getWorkspaceRegistries(): Promise; + abstract writeWorspaceRegistries(feedsToPatch: Iterable): Promise; +} diff --git a/packages/ado-npm-auth/src/npmrc/base64.ts b/packages/ado-npm-auth/src/npmrc/base64.ts deleted file mode 100644 index 048a0ba..0000000 --- a/packages/ado-npm-auth/src/npmrc/base64.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Decode a base64 encoded string - * @param {string} base64string - * @returns - */ -export const decode = (base64string: string) => - Buffer.from(base64string, "base64").toString("utf8").trim(); diff --git a/packages/ado-npm-auth/src/npmrc/check-tokens.ts b/packages/ado-npm-auth/src/npmrc/check-tokens.ts deleted file mode 100644 index d13ad0e..0000000 --- a/packages/ado-npm-auth/src/npmrc/check-tokens.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { makeADORequest } from "./make-ado-request.js"; -import { getUserPat } from "./get-user-pat.js"; -import { NpmrcOrg } from "./get-repo-npmrc-ado-orgs.js"; -import { getUserNPMRC } from "./npmrc.js"; - -/** - * Validates the tokens for each feed/organization by making a simple network request to ADO - * @param { Object } options - * @param { boolean } [options.silent] - * @param { Array } [options.feeds] - */ -export const checkTokens = async function ({ feeds }: { feeds: NpmrcOrg[] }) { - const userNpmRc = getUserNPMRC(); - - const feedsWithPat = await getUserPat({ npmrc: userNpmRc, feeds }); - - const missingPats = feedsWithPat.filter((item) => !item.pat); - - if (missingPats.length) { - return false - } - - try { - // check each feed for validity - for (const feed of feedsWithPat) { - await makeADORequest({ - password: feed.pat || "", - organization: feed.organization, - }); - } - - } catch (e) { - return false; - } - - return true; -}; diff --git a/packages/ado-npm-auth/src/npmrc/generate-npmrc-pat.ts b/packages/ado-npm-auth/src/npmrc/generate-npmrc-pat.ts index 84de1af..c664dd3 100644 --- a/packages/ado-npm-auth/src/npmrc/generate-npmrc-pat.ts +++ b/packages/ado-npm-auth/src/npmrc/generate-npmrc-pat.ts @@ -1,5 +1,6 @@ import { hostname } from "os"; import { AdoPatResponse, adoPat } from "../azureauth/ado.js"; +import { toBase64 } from "../utils/encoding.js"; /** * Generates a valid ADO PAT, scoped for vso.packaging in the given ado organization, 30 minute timeout @@ -22,8 +23,7 @@ export const generateNpmrcPat = async ( const rawToken = (pat as AdoPatResponse).token; if (encode) { - // base64 encode the token - return Buffer.from(rawToken).toString("base64"); + return toBase64(rawToken); } return rawToken; diff --git a/packages/ado-npm-auth/src/npmrc/get-repo-npmrc-ado-orgs.ts b/packages/ado-npm-auth/src/npmrc/get-repo-npmrc-ado-orgs.ts deleted file mode 100644 index fee4f0d..0000000 --- a/packages/ado-npm-auth/src/npmrc/get-repo-npmrc-ado-orgs.ts +++ /dev/null @@ -1,63 +0,0 @@ -import Config from "@npmcli/config"; -import { getWorkspaceRoot } from "workspace-tools"; -import { join } from "node:path"; -import fs from "node:fs/promises" -import { getOrganizationFromFeedUrl } from "../utils/get-organization-from-feed-url.js"; - -export type NpmrcOrg = { - feed: string; - organization: string; - pat?: string; -}; - -/** - * Determine what ADO organizations are used in the workspace's .npmrc - * These should be used to authenticate against - * @returns A list of the feeds/ado orgs used in the .npmrc - */ -export const getRepoNpmrcAdoOrganizations = async (): Promise< - Array -> => { - const workspaceRoot = getWorkspaceRoot(process.cwd()) || ""; - let config!: Config; - const npmrcPath = join(workspaceRoot, ".npmrc") - - try { - await fs.access(npmrcPath) - } catch(error) { - throw new Error("No project .npmrc file found") - } - - try { - config = new Config({ - npmPath: npmrcPath, - shorthands: {}, - definitions: {} as any, // needed so we can access random feed names - }); - - await config.load(); - } catch (error) { - if (error instanceof TypeError && error.message.includes("Invalid URL")) { - throw new Error("Registry URL missing or invalid") - } - throw new Error("Error loading .npmrc") - } - - // @npmcli/config does not have a normal way to display all keys - // so we use this ugly access instead - const projectNpmrcKeys = Object.keys( - (config.data?.get("project") || {})["data"] || {} - ); - - // find any and all keys which are a registry - const registries = projectNpmrcKeys.filter((key) => key.includes("registry")); - - return registries.map((registry) => { - const feed = config.get(registry, "project") as string; - - return { - feed, - organization: getOrganizationFromFeedUrl(feed), - }; - }); -}; diff --git a/packages/ado-npm-auth/src/npmrc/get-user-pat.ts b/packages/ado-npm-auth/src/npmrc/get-user-pat.ts deleted file mode 100644 index 8e54e00..0000000 --- a/packages/ado-npm-auth/src/npmrc/get-user-pat.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { decode } from "./base64.js"; -import { NpmrcOrg } from "./get-repo-npmrc-ado-orgs.js"; -import { getFeedWithoutProtocol } from "../utils/get-feed-without-protocol.js"; -import { readNpmRC } from "./npmrc.js"; - -/** - * Get the User's PAT(s) from the .npmrc file - * They will be scoped to a particular feed and ADO organization - * @param {Object} options - * @param {string} options.npmrc Path to the users' .npmrc file - * @param {Array } [options.feeds] Feeds to get the PATs for - * @returns {Promise> } - */ -export const getUserPat = async ({ npmrc, feeds = [] }: { - npmrc: string; - feeds?: NpmrcOrg[]; -}) => { - try { - const contents = await readNpmRC({ npmrc }); - const feedsWithPat = feeds.slice(); // create a copy of feeds - - for (let i = 0; i < feeds.length; i++) { - const match = contents.toString().match( - // SHould match the URL from the user .npmrc - new RegExp(`${getFeedWithoutProtocol(feeds[i].feed)}:_password=(.*)`) - ); - - if (match) { - const [, base64password] = match; - const pat = decode(base64password); - - feedsWithPat[i].pat = pat; - } - } - - return feedsWithPat; - } catch (error) { - // user npmrc does not exist, or is invalid - return []; - } -}; diff --git a/packages/ado-npm-auth/src/npmrc/is-valid-pat.ts b/packages/ado-npm-auth/src/npmrc/is-valid-pat.ts deleted file mode 100644 index 75dcd12..0000000 --- a/packages/ado-npm-auth/src/npmrc/is-valid-pat.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { checkTokens } from "./check-tokens.js"; -import { getOrganizationFromFeedUrl } from "../utils/get-organization-from-feed-url.js"; -import { homedir, EOL } from "node:os"; -import { join } from "node:path"; -import { readFile, writeFile } from "node:fs/promises"; -import { - NpmrcOrg, - getRepoNpmrcAdoOrganizations, -} from "./get-repo-npmrc-ado-orgs.js"; - -export const isValidPat = async (): Promise => { - await removeUserNpmrcRegistries(); - - const feeds = await getNpmrcFeeds(); - return await checkTokens({ feeds }); -}; - -const removeUserNpmrcRegistries = async () => { - const userNpmrc = join(homedir(), ".npmrc"); - - try { - const npmrcContent = await readFile(userNpmrc, "utf-8"); - - // remove the entry for registries in the user-level .npmrc - const updatedNpmrcContent = npmrcContent - .split(EOL) - .filter((line) => !line.includes("registry=")) - .join(EOL); - await writeFile(userNpmrc, updatedNpmrcContent); - } catch (error) { - // user npmrc does not exist so make an empty one - await writeFile(userNpmrc, ""); - } -}; - -const getNpmrcFeeds = async (): Promise> => { - const projectNpmrcOrgs = await getRepoNpmrcAdoOrganizations(); - const userNpmrc = await getUserNpmrcFeeds(); - - // make a lookup map for pats by org - const tokenMap = userNpmrc.reduce((acc, curr) => { - acc[curr.organization] = curr.pat; - return acc; - }, {} as Record); - - // try to fill up pats for each project feed from user npmrc feeds - projectNpmrcOrgs.forEach((feed) => { - feed.pat = tokenMap[feed.organization]; - }); - - return projectNpmrcOrgs; -}; - -const getUserNpmrcFeeds = async (): Promise> => { - const userNpmrcFilepath = join(homedir(), ".npmrc"); - const userNpmrcContent = await readFile(userNpmrcFilepath, "utf-8"); - return userNpmrcContent - .split(EOL) - .filter((line) => line.includes(":_password=")) - .map((line) => { - const [feedRaw, pat] = line.split(":_password="); - const feed = `https:${feedRaw}`; - const organization = getOrganizationFromFeedUrl(feed); - return { - feed, - organization, - pat, - }; - }); -}; diff --git a/packages/ado-npm-auth/src/npmrc/npmrc.ts b/packages/ado-npm-auth/src/npmrc/npmrc.ts deleted file mode 100644 index c6624cb..0000000 --- a/packages/ado-npm-auth/src/npmrc/npmrc.ts +++ /dev/null @@ -1,25 +0,0 @@ -import fs from "fs"; -import path from "path"; - -/** - * Cross platform way to find the users' .npmrc file - * @returns The user's npmrc from home or user profile - */ -export const getUserNPMRC = () => { - const userHome = process.env["HOME"] || process.env["USERPROFILE"] || ""; - const userNpmRc = path.join(userHome, ".npmrc"); - - return userNpmRc; -}; - -/** - * Read the an .npmrc file - * @param {Object} options - * @param {string} options.npmrc Path to the users' .npmrc file - * @returns - */ -export const readNpmRC = async ({ npmrc }: { npmrc: string; }) => { - const contents = await fs.promises.readFile(npmrc, "utf8"); - - return contents; -}; diff --git a/packages/ado-npm-auth/src/npmrc/npmrcFileProvider.ts b/packages/ado-npm-auth/src/npmrc/npmrcFileProvider.ts new file mode 100644 index 0000000..ca6f1f7 --- /dev/null +++ b/packages/ado-npm-auth/src/npmrc/npmrcFileProvider.ts @@ -0,0 +1,180 @@ +import Config from "@npmcli/config"; +import { defaultEmail, defaultUser, Feed, FileProvider } from "../fileProvider.js"; +import fs from "node:fs/promises"; +import { EOL } from "node:os"; +import { getOrganizationFromFeedUrl } from "../utils/get-organization-from-feed-url.js"; +import { getFeedWithoutProtocol } from "../utils/get-feed-without-protocol.js"; +import { fromBase64, toBase64 } from "../utils/encoding.js"; + +export class NpmrcFileProvider extends FileProvider { + constructor() { + super("NpmRc", ".npmrc"); + } + + override async prepUserFile(): Promise { + try { + const npmrcContent = await fs.readFile(this.userFilePath, "utf-8"); + + // remove the entry for registries in the user-level .npmrc + const updatedNpmrcContent = npmrcContent + .split(EOL) + .filter((line) => !line.includes("registry=")) + .join(EOL); + await fs.writeFile(this.userFilePath, updatedNpmrcContent); + } catch (error) { + // user npmrc does not exist so make an empty one + await fs.writeFile(this.userFilePath, ""); + } + } + + override async getWorkspaceRegistries(): Promise { + let config!: Config; + + try { + config = new Config({ + npmPath: this.workspaceFilePath, + shorthands: {}, + definitions: {} as any, // needed so we can access random feed names + }); + + await config.load(); + } catch (error) { + if (error instanceof TypeError && error.message.includes("Invalid URL")) { + throw new Error("Registry URL missing or invalid"); + } + throw new Error("Error loading .npmrc"); + } + + // @npmcli/config does not have a normal way to display all keys + // so we use this ugly access instead + const projectNpmrcKeys = Object.keys( + (config.data?.get("project") || {})["data"] || {}, + ); + + // find any and all keys which are a registry + const registries = projectNpmrcKeys.filter((key) => + key.includes("registry"), + ); + + return registries + .map(registry => config.get(registry, "project") as string) + .map(feed => getFeedWithoutProtocol(feed)); + } + + override async getUserFeeds(): Promise> { + const result = new Map(); + + await this.processNpmRcFile( + this.userFilePath, + (_: string, registry: string, field: string, value: string) => { + let feed = result.get(registry); + if (!feed) { + feed = { + registry: registry, + adoOrganization: getOrganizationFromFeedUrl(registry), + }; + result.set(feed.registry, feed); + } + switch (field) { + case "_password": + feed.authToken = fromBase64(value).trim(); + break; + case "username": + feed.userName = value; + break; + case "email": + feed.email = value; + break; + } + }, + ); + + return result; + } + + async patchUserNpmRcFile( + newLinesByRegistryAndField: Map + ): Promise { + const linesToAdd = new Set(newLinesByRegistryAndField.values()) + + const npmrcLines = await this.processNpmRcFile( + this.userFilePath, + (line, registry, field, _value) => { + const newLine = newLinesByRegistryAndField.get(this.toRegistryAndFunctionKey(registry, field)); + if (newLine !== undefined) { + linesToAdd.delete(newLine); + return newLine; + } + + return line; + }, + (line) => line + ); + + for (const lineToAdd of linesToAdd) { + npmrcLines.push(lineToAdd); + } + + return npmrcLines; + } + + toRegistryAndFunctionKey(registry: string, field: string): string { + return `//${registry}:${field}=`; + } + + override async writeWorspaceRegistries(feedsToPatch: Iterable): Promise { + const newLinesByRegistryAndField = new Map(); + + // Build a map with registry and feed with the updated line for value. + for (var feedToPatch of feedsToPatch) { + newLinesByRegistryAndField.set(this.toRegistryAndFunctionKey(feedToPatch.registry, "username"), `//${feedToPatch.registry}:username=${feedToPatch.userName || defaultUser}`); + newLinesByRegistryAndField.set(this.toRegistryAndFunctionKey(feedToPatch.registry, "email"), `//${feedToPatch.registry}:email=${feedToPatch.email || defaultEmail}`); + newLinesByRegistryAndField.set(this.toRegistryAndFunctionKey(feedToPatch.registry, "_password"), `//${feedToPatch.registry}:_password=${toBase64(feedToPatch.authToken)}`); + } + + const npmrcLines = await this.patchUserNpmRcFile(newLinesByRegistryAndField); + + await fs.writeFile(this.userFilePath, npmrcLines.join(EOL), { + encoding: "utf-8", + }); + } + + async processNpmRcFile( + npmrcFilePath: string, + handleFeedConfig: ( + line: string, + registry: string, + field: string, + value: string, + ) => string | void, + handleOtherLine?: (line: string) => string | void, + ): Promise { + const npmrc = await fs.readFile(npmrcFilePath, { + encoding: "utf8", + }); + const npmrcLines = npmrc.split("\n").map((line: string) => line.trim()); + + const resultLines: string[] = []; + for (const line of npmrcLines) { + const slashColonIndex = line.indexOf("/:"); + if (line.startsWith("//") && slashColonIndex >= 2) { + const registry = line.substring(2, slashColonIndex + 1); + const remainder = line.substring(slashColonIndex + 2); + const field = remainder.substring(0, remainder.indexOf("=")); + const value = remainder.substring(remainder.indexOf("=") + 1); + + const newLine = handleFeedConfig(line, registry, field, value); + if (newLine) { + resultLines.push(newLine); + } + } else if (handleOtherLine) { + const newLine = handleOtherLine(line); + if (newLine) { + resultLines.push(newLine); + } + } + } + + return resultLines; + } +} diff --git a/packages/ado-npm-auth/src/npmrc/pat.ts b/packages/ado-npm-auth/src/npmrc/pat.ts deleted file mode 100644 index 62de7c5..0000000 --- a/packages/ado-npm-auth/src/npmrc/pat.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { decode } from "./base64.js"; -import { NpmrcOrg } from "./get-repo-npmrc-ado-orgs.js"; -import { getFeedWithoutProtocol } from "../utils/get-feed-without-protocol.js"; -import { readNpmRC } from "./npmrc.js"; - -/** - * Get the User's PAT from the .npmrc file - * @param {Object} options - * @param {string} options.npmrc Path to the users' .npmrc file - * @param { Array } [options.feeds] Feeds to get the PATs for - * @returns { Promise> } - */ -export const getUserPat = async ({ npmrc, feeds = [] }: { npmrc: string; feeds: NpmrcOrg[]}) => { - try { - const contents = await readNpmRC({ npmrc }); - const feedsWithPat = feeds.slice(); // create a copy of feeds - - for (let i = 0; i < feeds.length; i++) { - const match = contents.toString().match( - // SHould match the URL from the user .npmrc - new RegExp(`${getFeedWithoutProtocol(feeds[i].feed)}:_password=(.*)`) - ); - - if (match) { - const [, base64password] = match; - const pat = decode(base64password); - - feedsWithPat[i].pat = pat; - } - } - - return feedsWithPat; - } catch (error) { - // user npmrc does not exist, or is invalid - return []; - } -}; diff --git a/packages/ado-npm-auth/src/npmrc/set-npmrc-pat.ts b/packages/ado-npm-auth/src/npmrc/set-npmrc-pat.ts deleted file mode 100644 index b3ccec2..0000000 --- a/packages/ado-npm-auth/src/npmrc/set-npmrc-pat.ts +++ /dev/null @@ -1,142 +0,0 @@ -import fs from "fs"; -import { EOL } from "os"; -import { generateNpmrcPat } from "./generate-npmrc-pat.js"; -import { NpmrcOrg, getRepoNpmrcAdoOrganizations } from "./get-repo-npmrc-ado-orgs.js"; -import { getUserNPMRC, readNpmRC } from "./npmrc.js"; -import { getFeedWithoutProtocol } from "../utils/get-feed-without-protocol.js"; - -// /** -// * URL for the user's PAT settings -// * @param { string } organization -// */ -// const getTokenUrl = (organization: string) => -// `https://dev.azure.com/${organization}/_usersSettings/tokens`; - -/** - * Default user to be used in the .npmrc - */ -const defaultUser = "me"; - -/** - * Default email to be used in the .npmrc - */ -const defaultEmail = "me@example.com"; - -/** - * Create a base64 encoded string from a string - * @param {string} input - * @returns {string} - */ -const base64 = (input: string) => { - return Buffer.from(input).toString("base64"); -}; - - -/** - * Create the user npmrc given an array of registry urls and a token - * @param {object} options - * @param {Array } options.feeds - * @param {string} options.existingNpmrc - * @returns {string} - */ -const createUserNpmrc = async ({ feeds, existingNpmrc }: { - feeds: Array, - existingNpmrc: string, -}) => { - let newUserNpmRc = existingNpmrc; - - if (newUserNpmRc.indexOf("Azure Artifacts Auth") === -1) { - newUserNpmRc = `# Generated by Azure Artifacts Auth${EOL}${newUserNpmRc}`; - } - - for (const feed of feeds) { - const feedWithoutProtocol = "//" + getFeedWithoutProtocol(feed.feed); - let isAlreadyInNpmrc = newUserNpmRc.indexOf(feedWithoutProtocol) > -1; - if (isAlreadyInNpmrc) { - newUserNpmRc = newUserNpmRc.replace( - new RegExp(`${feedWithoutProtocol}:_password\=(.*)`), - `${feedWithoutProtocol}:_password=${feed.pat}` - ); - } else { - const entry = [ - `${feedWithoutProtocol}:username=${defaultUser}`, - `${feedWithoutProtocol}:email=${defaultEmail}`, - `${feedWithoutProtocol}:_password=${feed.pat}`, - "", - ].join(EOL); - - newUserNpmRc += entry + EOL; - } - } - - return newUserNpmRc; -}; - -const userNpmrc = getUserNPMRC(); - -/** - * - * @param {Object} options - * @param {Record} [options.organizationPatMap] Map of ADO Organization to packaging PAT for that org - * @param {boolean} [options.accept] - * @param {string} [options.npmrcFilePath] - * @param {boolean} [options.silent] - * @returnsshort - */ -export const setupNpmrc = async function ({ - organizationPatMap = {}, - feeds, -}: { - organizationPatMap: Record; - feeds: NpmrcOrg[]; -}) { - for (const feed of feeds) { - try { - let pat = organizationPatMap[feed.organization]; - - if (!pat) { - throw new Error(`No PAT found for ${feed.organization}`); - } - - const b64Pat = base64(pat); - feed.pat = b64Pat; - - } catch (e) { - throw new Error( - `Error setting up npmrc for ${feed.organization} organization: ${(e as any).message}` - ); - } - } - - let userNpmrcFile = ""; - try { - userNpmrcFile = await readNpmRC({ npmrc: userNpmrc }); - } catch (e) { - /* No user .npmrc file, that's ok */ - } - // const newnpmrc = - let newnpmrc = await createUserNpmrc({ - existingNpmrc: userNpmrcFile, - feeds, - }); - - await fs.promises.writeFile(userNpmrc, newnpmrc); -}; - -export const setNpmrcPat = async (): Promise => { - const adoOrgs = await getRepoNpmrcAdoOrganizations(); - - // get a token for each feed - const organizationPatMap: Record = {}; - for (const adoOrg of adoOrgs) { - organizationPatMap[adoOrg.organization] = await generateNpmrcPat( - adoOrg.organization, - false - ); - } - - await setupNpmrc({ - organizationPatMap, - feeds: adoOrgs - }); -}; diff --git a/packages/ado-npm-auth/src/telemetry/index.ts b/packages/ado-npm-auth/src/telemetry/index.ts index 7cedc72..c32f14a 100644 --- a/packages/ado-npm-auth/src/telemetry/index.ts +++ b/packages/ado-npm-auth/src/telemetry/index.ts @@ -34,7 +34,7 @@ export const logTelemetry = ( ); outputProperties.set( "error", - inputProperties.error ? inputProperties.error : "" + inputProperties.error || "" ); outputProperties.set("platform", isWsl() ? "wsl" : platform()); outputProperties.set("arch", arch()); diff --git a/packages/ado-npm-auth/src/utils/encoding.ts b/packages/ado-npm-auth/src/utils/encoding.ts new file mode 100644 index 0000000..8ed5fac --- /dev/null +++ b/packages/ado-npm-auth/src/utils/encoding.ts @@ -0,0 +1,17 @@ +/** + * Create a base64 encoded string from a string + * @param {string} input + * @returns {string} + */ +export function toBase64(input: string | undefined) : string { + return Buffer.from(input || "").toString("base64"); +}; + +/** + * Decode a base64 encoded string + * @param {string} base64string + * @returns + */ +export const fromBase64 = (base64string: string) => + Buffer.from(base64string, "base64").toString("utf8"); + \ No newline at end of file diff --git a/packages/ado-npm-auth/src/utils/get-organization-from-feed-url.ts b/packages/ado-npm-auth/src/utils/get-organization-from-feed-url.ts index 401e6f4..6f69762 100644 --- a/packages/ado-npm-auth/src/utils/get-organization-from-feed-url.ts +++ b/packages/ado-npm-auth/src/utils/get-organization-from-feed-url.ts @@ -23,6 +23,9 @@ */ const extractAdoDetails = (url: string) => { try { + if (!url.startsWith("https://")) { + url = "https://" + url; + } const parsedUrl = new URL(url); const hostname = parsedUrl.hostname; const pathname = parsedUrl.pathname; diff --git a/packages/ado-npm-auth/src/utils/partition.ts b/packages/ado-npm-auth/src/utils/partition.ts new file mode 100644 index 0000000..53fd442 --- /dev/null +++ b/packages/ado-npm-auth/src/utils/partition.ts @@ -0,0 +1,14 @@ +export function partition(items: TValue[], keySelector: (item: TValue) =>TKey) : Map { + const result = new Map(); + for (var item of items) { + const key = keySelector(item); + const existing = result.get(key); + if (existing) { + existing.push(item); + } else { + result.set(key, [item]); + } + } + + return result; +} \ No newline at end of file diff --git a/packages/ado-npm-auth/src/utils/request.ts b/packages/ado-npm-auth/src/utils/request.ts index d481ead..dade4a8 100644 --- a/packages/ado-npm-auth/src/utils/request.ts +++ b/packages/ado-npm-auth/src/utils/request.ts @@ -1,4 +1,10 @@ import https, { RequestOptions } from "https"; + +const defaultOptions: RequestOptions = { + port: 443, + method: "GET", +} + /** * * @param {import("http").RequestOptions} options @@ -6,7 +12,11 @@ import https, { RequestOptions } from "https"; */ export const makeRequest = async (options: RequestOptions) => { return new Promise((resolve, reject) => { - const req = https.request(options, (res) => { + const mergedOptions = { + ...defaultOptions, + ...options}; + + const req = https.request(mergedOptions, (res) => { let data = ""; let dataJson = {}; let ok = res.statusCode === 200; @@ -16,7 +26,7 @@ export const makeRequest = async (options: RequestOptions) => { }); res.on("end", () => { - if (data && options?.headers?.Accept === "application/json") { + if (data && mergedOptions?.headers?.Accept === "application/json") { dataJson = JSON.parse(data.toString().trim()); } diff --git a/packages/ado-npm-auth/src/yarnrc/yarnrcFileProvider.ts b/packages/ado-npm-auth/src/yarnrc/yarnrcFileProvider.ts new file mode 100644 index 0000000..6fefa1f --- /dev/null +++ b/packages/ado-npm-auth/src/yarnrc/yarnrcFileProvider.ts @@ -0,0 +1,113 @@ +import { Feed, FileProvider } from "../fileProvider.js"; +import yaml from "js-yaml"; +import fs from "node:fs/promises" +import { fromBase64, toBase64 } from "../utils/encoding.js"; +import { getOrganizationFromFeedUrl } from "../utils/get-organization-from-feed-url.js"; +import { getFeedWithoutProtocol } from "../utils/get-feed-without-protocol.js"; + +export class YarnRcFileProvider extends FileProvider { + constructor() { + super("YarnRc", ".yarnrc.yml"); + } + + override async prepUserFile(): Promise { + // no need to do anything + } + + override async getUserFeeds(): Promise> { + const result = new Map(); + const yarnrc = await this.paseYarnRc(this.userFilePath); + if (!yarnrc) { + // No content + return result; + } + const npmRegistries = yarnrc.npmRegistries || {}; + for (var registry of Object.keys(npmRegistries) ) { + const registryData = npmRegistries[registry] || {}; + const registryWithoutProtocol = registry.startsWith("//") ? registry.substring(2) : registry; + + const feed: Feed = { + registry: registryWithoutProtocol, + adoOrganization: getOrganizationFromFeedUrl(registryWithoutProtocol), + } + + const authToken = fromBase64(registryData.npmAuthIdent || "") + const userPasswordIndex = authToken.indexOf(":"); + if (userPasswordIndex > 0) { + feed.userName = authToken.substring(0, userPasswordIndex); + feed.authToken = authToken.substring(userPasswordIndex + 1); + } + + result.set(registryWithoutProtocol, feed); + } + + return result; + } + + override async getWorkspaceRegistries(): Promise { + const registries : string[] = [] + const yarnrc = await this.paseYarnRc(this.workspaceFilePath); + + if (yarnrc.npmRegistryServer) { + registries.push(getFeedWithoutProtocol(yarnrc.npmRegistryServer)); + } + + if (yarnrc.npmScopes) { + for (var scope of Object.keys(yarnrc.npmScopes) ) { + const scopeRegistry = yarnrc.npmScopes[scope]?.npmRegistryServer; + if (scopeRegistry) { + registries.push(scopeRegistry); + } + } + } + + return registries; + } + + override async writeWorspaceRegistries(feedsToPatch: Iterable): Promise { + const yarnrc = await this.paseYarnRc(this.userFilePath) || {}; + + if (!yarnrc.npmRegistries) { + yarnrc.npmRegistries = {}; + } + + for (var feed of feedsToPatch) { + const yarnRcYamlKey = "//" + feed.registry; + const entry = yarnrc.npmRegistries[yarnRcYamlKey] || {}; + // Make sure alwaysAuth is the default + if (entry.npmAlwaysAuth === undefined) { + entry.npmAlwaysAuth = true; + } + entry.npmAuthIdent = toBase64(`${feed.userName}:${feed.authToken}`); + yarnrc.npmRegistries[yarnRcYamlKey] = entry; + } + + const yarnrcContent = yaml.dump(yarnrc); + await fs.writeFile(this.userFilePath, yarnrcContent); + } + + async paseYarnRc(filePath: string): Promise { + const content = await fs.readFile(filePath, 'utf8'); + return yaml.load(content, {filename: filePath}) as YarnRc; + } + +} + +interface YarnRc { + npmRegistryServer?: string, + npmScopes?: { + [org: string]: { + npmRegistryServer?: string, + npmAlwaysAuth?: boolean, + npmAuthIdent?: string, + npmAuthToken?: string, + }, + }, + npmRegistries?: { + [registry: string]: { + npmAlwaysAuth?: boolean, + npmAuthIdent?: string, + npmAuthToken?: string, + }, + }, +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d5f0a18..50d89e8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,13 +10,13 @@ importers: devDependencies: lage: specifier: ^2.7.16 - version: 2.7.16 + version: 2.7.21 prettier: specifier: ^3.2.5 - version: 3.2.5 + version: 3.3.3 typescript: specifier: ^5.4.2 - version: 5.4.5 + version: 5.5.3 packages/ado-npm-auth: dependencies: @@ -26,13 +26,19 @@ importers: azureauth: specifier: ^0.4.5 version: link:../node-azureauth + js-yaml: + specifier: ^4.1.0 + version: 4.1.0 workspace-tools: specifier: ^0.26.3 version: 0.26.6 devDependencies: + '@types/js-yaml': + specifier: 4.0.9 + version: 4.0.9 '@types/node': specifier: ^20.5.9 - version: 20.12.7 + version: 20.14.11 '@types/npmcli__config': specifier: ^6.0.0 version: 6.0.3 @@ -41,28 +47,28 @@ importers: version: 8.57.0 rimraf: specifier: ^5.0.1 - version: 5.0.5 + version: 5.0.9 terser-webpack-plugin: specifier: ^1.4.3 - version: 1.4.5(webpack@5.91.0) + version: 1.4.5(webpack@5.93.0) tslib: specifier: ^2.2.0 - version: 2.6.2 + version: 2.6.3 typescript: specifier: ^5.2.2 - version: 5.4.5 + version: 5.5.3 vite: specifier: ^5.2.8 - version: 5.2.8(@types/node@20.12.7) + version: 5.3.4(@types/node@20.14.11) vitest: specifier: ^1.5.0 - version: 1.5.0(@types/node@20.12.7) + version: 1.6.0(@types/node@20.14.11) webpack: specifier: ^5.64.4 - version: 5.91.0(webpack-cli@4.10.0) + version: 5.93.0(webpack-cli@4.10.0) webpack-cli: specifier: ^4.10.0 - version: 4.10.0(webpack@5.91.0) + version: 4.10.0(webpack@5.93.0) packages/node-azureauth: dependencies: @@ -78,34 +84,29 @@ importers: devDependencies: '@types/node': specifier: ^20.12.7 - version: 20.12.7 + version: 20.14.11 prettier: specifier: ^3.2.5 - version: 3.2.5 + version: 3.3.3 typescript: specifier: ^5.4.5 - version: 5.4.5 + version: 5.5.3 vite: specifier: ^5.2.8 - version: 5.2.8(@types/node@20.12.7) + version: 5.3.4(@types/node@20.14.11) vitest: specifier: ^1.5.0 - version: 1.5.0(@types/node@20.12.7) + version: 1.6.0(@types/node@20.14.11) packages: - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true - /@discoveryjs/json-ext@0.5.7: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} dev: true - /@esbuild/aix-ppc64@0.20.2: - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + /@esbuild/aix-ppc64@0.21.5: + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] @@ -113,8 +114,8 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.20.2: - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + /@esbuild/android-arm64@0.21.5: + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -122,8 +123,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.20.2: - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + /@esbuild/android-arm@0.21.5: + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -131,8 +132,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.20.2: - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + /@esbuild/android-x64@0.21.5: + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -140,8 +141,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.20.2: - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + /@esbuild/darwin-arm64@0.21.5: + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -149,8 +150,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.20.2: - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + /@esbuild/darwin-x64@0.21.5: + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -158,8 +159,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.20.2: - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + /@esbuild/freebsd-arm64@0.21.5: + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -167,8 +168,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.20.2: - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + /@esbuild/freebsd-x64@0.21.5: + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -176,8 +177,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.20.2: - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + /@esbuild/linux-arm64@0.21.5: + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -185,8 +186,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.20.2: - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + /@esbuild/linux-arm@0.21.5: + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -194,8 +195,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.20.2: - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + /@esbuild/linux-ia32@0.21.5: + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -203,8 +204,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.20.2: - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + /@esbuild/linux-loong64@0.21.5: + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -212,8 +213,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.20.2: - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + /@esbuild/linux-mips64el@0.21.5: + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -221,8 +222,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.20.2: - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + /@esbuild/linux-ppc64@0.21.5: + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -230,8 +231,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.20.2: - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + /@esbuild/linux-riscv64@0.21.5: + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -239,8 +240,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.20.2: - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + /@esbuild/linux-s390x@0.21.5: + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -248,8 +249,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.20.2: - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + /@esbuild/linux-x64@0.21.5: + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -257,8 +258,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.20.2: - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + /@esbuild/netbsd-x64@0.21.5: + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -266,8 +267,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.20.2: - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + /@esbuild/openbsd-x64@0.21.5: + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -275,8 +276,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.20.2: - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + /@esbuild/sunos-x64@0.21.5: + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -284,8 +285,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.20.2: - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + /@esbuild/win32-arm64@0.21.5: + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -293,8 +294,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.20.2: - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + /@esbuild/win32-ia32@0.21.5: + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -302,8 +303,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.20.2: - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + /@esbuild/win32-x64@0.21.5: + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -321,8 +322,8 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + /@eslint-community/regexpp@4.11.0: + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true @@ -331,7 +332,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.3.5 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -351,9 +352,10 @@ packages: /@humanwhocodes/config-array@0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4 + debug: 4.3.5 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -366,6 +368,7 @@ packages: /@humanwhocodes/object-schema@2.0.3: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead dev: true /@isaacs/cliui@8.0.2: @@ -392,7 +395,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 dev: true @@ -413,15 +416,15 @@ packages: '@jridgewell/trace-mapping': 0.3.25 dev: true - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + /@jridgewell/sourcemap-codec@1.5.0: + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} dev: true /@jridgewell/trace-mapping@0.3.25: resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 dev: true /@nodelib/fs.scandir@2.1.5: @@ -452,7 +455,7 @@ packages: nopt: 6.0.0 proc-log: 2.0.1 read-package-json-fast: 2.0.3 - semver: 7.6.0 + semver: 7.6.3 walk-up-path: 1.0.0 dev: false @@ -477,120 +480,128 @@ packages: dev: true optional: true - /@rollup/rollup-android-arm-eabi@4.14.2: - resolution: {integrity: sha512-ahxSgCkAEk+P/AVO0vYr7DxOD3CwAQrT0Go9BJyGQ9Ef0QxVOfjDZMiF4Y2s3mLyPrjonchIMH/tbWHucJMykQ==} + /@rollup/rollup-android-arm-eabi@4.18.1: + resolution: {integrity: sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.14.2: - resolution: {integrity: sha512-lAarIdxZWbFSHFSDao9+I/F5jDaKyCqAPMq5HqnfpBw8dKDiCaaqM0lq5h1pQTLeIqueeay4PieGR5jGZMWprw==} + /@rollup/rollup-android-arm64@4.18.1: + resolution: {integrity: sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.14.2: - resolution: {integrity: sha512-SWsr8zEUk82KSqquIMgZEg2GE5mCSfr9sE/thDROkX6pb3QQWPp8Vw8zOq2GyxZ2t0XoSIUlvHDkrf5Gmf7x3Q==} + /@rollup/rollup-darwin-arm64@4.18.1: + resolution: {integrity: sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.14.2: - resolution: {integrity: sha512-o/HAIrQq0jIxJAhgtIvV5FWviYK4WB0WwV91SLUnsliw1lSAoLsmgEEgRWzDguAFeUEUUoIWXiJrPqU7vGiVkA==} + /@rollup/rollup-darwin-x64@4.18.1: + resolution: {integrity: sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.14.2: - resolution: {integrity: sha512-nwlJ65UY9eGq91cBi6VyDfArUJSKOYt5dJQBq8xyLhvS23qO+4Nr/RreibFHjP6t+5ap2ohZrUJcHv5zk5ju/g==} + /@rollup/rollup-linux-arm-gnueabihf@4.18.1: + resolution: {integrity: sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-musleabihf@4.18.1: + resolution: {integrity: sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.14.2: - resolution: {integrity: sha512-Pg5TxxO2IVlMj79+c/9G0LREC9SY3HM+pfAwX7zj5/cAuwrbfj2Wv9JbMHIdPCfQpYsI4g9mE+2Bw/3aeSs2rQ==} + /@rollup/rollup-linux-arm64-gnu@4.18.1: + resolution: {integrity: sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.14.2: - resolution: {integrity: sha512-cAOTjGNm84gc6tS02D1EXtG7tDRsVSDTBVXOLbj31DkwfZwgTPYZ6aafSU7rD/4R2a34JOwlF9fQayuTSkoclA==} + /@rollup/rollup-linux-arm64-musl@4.18.1: + resolution: {integrity: sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.14.2: - resolution: {integrity: sha512-4RyT6v1kXb7C0fn6zV33rvaX05P0zHoNzaXI/5oFHklfKm602j+N4mn2YvoezQViRLPnxP8M1NaY4s/5kXO5cw==} + /@rollup/rollup-linux-powerpc64le-gnu@4.18.1: + resolution: {integrity: sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==} cpu: [ppc64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.14.2: - resolution: {integrity: sha512-KNUH6jC/vRGAKSorySTyc/yRYlCwN/5pnMjXylfBniwtJx5O7X17KG/0efj8XM3TZU7raYRXJFFReOzNmL1n1w==} + /@rollup/rollup-linux-riscv64-gnu@4.18.1: + resolution: {integrity: sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==} cpu: [riscv64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-s390x-gnu@4.14.2: - resolution: {integrity: sha512-xPV4y73IBEXToNPa3h5lbgXOi/v0NcvKxU0xejiFw6DtIYQqOTMhZ2DN18/HrrP0PmiL3rGtRG9gz1QE8vFKXQ==} + /@rollup/rollup-linux-s390x-gnu@4.18.1: + resolution: {integrity: sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==} cpu: [s390x] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.14.2: - resolution: {integrity: sha512-QBhtr07iFGmF9egrPOWyO5wciwgtzKkYPNLVCFZTmr4TWmY0oY2Dm/bmhHjKRwZoGiaKdNcKhFtUMBKvlchH+Q==} + /@rollup/rollup-linux-x64-gnu@4.18.1: + resolution: {integrity: sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.14.2: - resolution: {integrity: sha512-8zfsQRQGH23O6qazZSFY5jP5gt4cFvRuKTpuBsC1ZnSWxV8ZKQpPqOZIUtdfMOugCcBvFGRa1pDC/tkf19EgBw==} + /@rollup/rollup-linux-x64-musl@4.18.1: + resolution: {integrity: sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.14.2: - resolution: {integrity: sha512-H4s8UjgkPnlChl6JF5empNvFHp77Jx+Wfy2EtmYPe9G22XV+PMuCinZVHurNe8ggtwoaohxARJZbaH/3xjB/FA==} + /@rollup/rollup-win32-arm64-msvc@4.18.1: + resolution: {integrity: sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.14.2: - resolution: {integrity: sha512-djqpAjm/i8erWYF0K6UY4kRO3X5+T4TypIqw60Q8MTqSBaQNpNXDhxdjpZ3ikgb+wn99svA7jxcXpiyg9MUsdw==} + /@rollup/rollup-win32-ia32-msvc@4.18.1: + resolution: {integrity: sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.14.2: - resolution: {integrity: sha512-teAqzLT0yTYZa8ZP7zhFKEx4cotS8Tkk5XiqNMJhD4CpaWB1BHARE4Qy+RzwnXvSAYv+Q3jAqCVBS+PS+Yee8Q==} + /@rollup/rollup-win32-x64-msvc@4.18.1: + resolution: {integrity: sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==} cpu: [x64] os: [win32] requiresBuild: true @@ -604,12 +615,12 @@ packages: /@types/eslint-scope@3.7.7: resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} dependencies: - '@types/eslint': 8.56.9 + '@types/eslint': 8.56.10 '@types/estree': 1.0.5 dev: true - /@types/eslint@8.56.9: - resolution: {integrity: sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==} + /@types/eslint@8.56.10: + resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 @@ -619,12 +630,16 @@ packages: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: true + /@types/js-yaml@4.0.9: + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + dev: true + /@types/json-schema@7.0.15: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true - /@types/node@20.12.7: - resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + /@types/node@20.14.11: + resolution: {integrity: sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==} dependencies: undici-types: 5.26.5 dev: true @@ -632,7 +647,7 @@ packages: /@types/npmcli__config@6.0.3: resolution: {integrity: sha512-JasDNjgkmtYWGJxMmhmfc8gRrRgcONd4DRaUTD/jWGhwIJSkUMSGHPatTVfUmD7QopQh93TzDH14FZL5tB2tEA==} dependencies: - '@types/node': 20.12.7 + '@types/node': 20.14.11 '@types/semver': 7.5.8 dev: true @@ -644,38 +659,38 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true - /@vitest/expect@1.5.0: - resolution: {integrity: sha512-0pzuCI6KYi2SIC3LQezmxujU9RK/vwC1U9R0rLuGlNGcOuDWxqWKu6nUdFsX9tH1WU0SXtAxToOsEjeUn1s3hA==} + /@vitest/expect@1.6.0: + resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} dependencies: - '@vitest/spy': 1.5.0 - '@vitest/utils': 1.5.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 chai: 4.4.1 dev: true - /@vitest/runner@1.5.0: - resolution: {integrity: sha512-7HWwdxXP5yDoe7DTpbif9l6ZmDwCzcSIK38kTSIt6CFEpMjX4EpCgT6wUmS0xTXqMI6E/ONmfgRKmaujpabjZQ==} + /@vitest/runner@1.6.0: + resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} dependencies: - '@vitest/utils': 1.5.0 + '@vitest/utils': 1.6.0 p-limit: 5.0.0 pathe: 1.1.2 dev: true - /@vitest/snapshot@1.5.0: - resolution: {integrity: sha512-qpv3fSEuNrhAO3FpH6YYRdaECnnRjg9VxbhdtPwPRnzSfHVXnNzzrpX4cJxqiwgRMo7uRMWDFBlsBq4Cr+rO3A==} + /@vitest/snapshot@1.6.0: + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} dependencies: - magic-string: 0.30.9 + magic-string: 0.30.10 pathe: 1.1.2 pretty-format: 29.7.0 dev: true - /@vitest/spy@1.5.0: - resolution: {integrity: sha512-vu6vi6ew5N5MMHJjD5PoakMRKYdmIrNJmyfkhRpQt5d9Ewhw9nZ5Aqynbi3N61bvk9UvZ5UysMT6ayIrZ8GA9w==} + /@vitest/spy@1.6.0: + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} dependencies: tinyspy: 2.2.1 dev: true - /@vitest/utils@1.5.0: - resolution: {integrity: sha512-BDU0GNL8MWkRkSRdNFvCUCAVOeHaUlVJ9Tx0TYBZyXaaOTmGtUFObzchCivIBrIwKzvZA7A9sCejVhXM2aY98A==} + /@vitest/utils@1.6.0: + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 @@ -789,14 +804,14 @@ packages: '@xtuc/long': 4.2.2 dev: true - /@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.91.0): + /@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.93.0): resolution: {integrity: sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==} peerDependencies: webpack: 4.x.x || 5.x.x webpack-cli: 4.x.x dependencies: - webpack: 5.91.0(webpack-cli@4.10.0) - webpack-cli: 4.10.0(webpack@5.91.0) + webpack: 5.93.0(webpack-cli@4.10.0) + webpack-cli: 4.10.0(webpack@5.93.0) dev: true /@webpack-cli/info@1.5.0(webpack-cli@4.10.0): @@ -804,8 +819,8 @@ packages: peerDependencies: webpack-cli: 4.x.x dependencies: - envinfo: 7.12.0 - webpack-cli: 4.10.0(webpack@5.91.0) + envinfo: 7.13.0 + webpack-cli: 4.10.0(webpack@5.93.0) dev: true /@webpack-cli/serve@1.7.0(webpack-cli@4.10.0): @@ -817,7 +832,7 @@ packages: webpack-dev-server: optional: true dependencies: - webpack-cli: 4.10.0(webpack@5.91.0) + webpack-cli: 4.10.0(webpack@5.93.0) dev: true /@xtuc/ieee754@1.2.0: @@ -836,29 +851,31 @@ packages: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: false - /acorn-import-assertions@1.9.0(acorn@8.11.3): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + /acorn-import-attributes@1.9.5(acorn@8.12.1): + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.11.3 + acorn: 8.12.1 dev: true - /acorn-jsx@5.3.2(acorn@8.11.3): + /acorn-jsx@5.3.2(acorn@8.12.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.11.3 + acorn: 8.12.1 dev: true - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + /acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} engines: {node: '>=0.4.0'} + dependencies: + acorn: 8.12.1 dev: true - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + /acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} hasBin: true dev: true @@ -961,22 +978,22 @@ packages: dependencies: balanced-match: 1.0.2 - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 dev: false - /browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + /browserslist@4.23.2: + resolution: {integrity: sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001609 - electron-to-chromium: 1.4.735 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) + caniuse-lite: 1.0.30001642 + electron-to-chromium: 1.4.829 + node-releases: 2.0.17 + update-browserslist-db: 1.1.0(browserslist@4.23.2) dev: true /buffer-alloc-unsafe@1.1.0: @@ -1039,8 +1056,8 @@ packages: engines: {node: '>=6'} dev: true - /caniuse-lite@1.0.30001609: - resolution: {integrity: sha512-JFPQs34lHKx1B5t1EpQpWH4c+29zIyn/haGsbpfq3suuV9v56enjFt23zqijxGTMwy1p/4H2tjnQMY+p1WoAyA==} + /caniuse-lite@1.0.30001642: + resolution: {integrity: sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==} dev: true /chai@4.4.1: @@ -1049,7 +1066,7 @@ packages: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 - deep-eql: 4.1.3 + deep-eql: 4.1.4 get-func-name: 2.0.2 loupe: 2.3.7 pathval: 1.1.1 @@ -1079,8 +1096,8 @@ packages: engines: {node: '>=10'} dev: false - /chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + /chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} dev: true @@ -1134,8 +1151,13 @@ packages: typedarray: 0.0.6 dev: true + /confbox@0.1.7: + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + dev: true + /copy-concurrently@1.0.5: resolution: {integrity: sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==} + deprecated: This package is no longer supported. dependencies: aproba: 1.2.0 fs-write-stream-atomic: 1.0.10 @@ -1160,8 +1182,8 @@ packages: resolution: {integrity: sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==} dev: true - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + /debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1225,8 +1247,8 @@ packages: strip-dirs: 2.1.0 dev: false - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + /deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} dependencies: type-detect: 4.0.8 @@ -1268,8 +1290,8 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /electron-to-chromium@1.4.735: - resolution: {integrity: sha512-pkYpvwg8VyOTQAeBqZ7jsmpCjko1Qc6We1ZtZCjRyYbT5v4AIUKDy5cQTRotQlSSZmMr8jqpEt6JtOj5k7lR7A==} + /electron-to-chromium@1.4.829: + resolution: {integrity: sha512-5qp1N2POAfW0u1qGAxXEtz6P7bO1m6gpZr5hdf5ve6lxpLM7MpiM4jIPz7xcrNlClQMafbyUDDWjlIQZ1Mw0Rw==} dev: true /emoji-regex@8.0.0: @@ -1285,16 +1307,16 @@ packages: dependencies: once: 1.4.0 - /enhanced-resolve@5.16.0: - resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} + /enhanced-resolve@5.17.0: + resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==} engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 dev: true - /envinfo@7.12.0: - resolution: {integrity: sha512-Iw9rQJBGpJRd3rwXm9ft/JiGoAZmLxxJZELYDQoPRZ4USVhkKtIcNBPw6U+/K2mBpaqM25JSV6Yl4Az9vO2wJg==} + /envinfo@7.13.0: + resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} engines: {node: '>=4'} hasBin: true dev: true @@ -1306,39 +1328,39 @@ packages: prr: 1.0.1 dev: true - /es-module-lexer@1.5.0: - resolution: {integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==} + /es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} dev: true - /esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + /esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/aix-ppc64': 0.20.2 - '@esbuild/android-arm': 0.20.2 - '@esbuild/android-arm64': 0.20.2 - '@esbuild/android-x64': 0.20.2 - '@esbuild/darwin-arm64': 0.20.2 - '@esbuild/darwin-x64': 0.20.2 - '@esbuild/freebsd-arm64': 0.20.2 - '@esbuild/freebsd-x64': 0.20.2 - '@esbuild/linux-arm': 0.20.2 - '@esbuild/linux-arm64': 0.20.2 - '@esbuild/linux-ia32': 0.20.2 - '@esbuild/linux-loong64': 0.20.2 - '@esbuild/linux-mips64el': 0.20.2 - '@esbuild/linux-ppc64': 0.20.2 - '@esbuild/linux-riscv64': 0.20.2 - '@esbuild/linux-s390x': 0.20.2 - '@esbuild/linux-x64': 0.20.2 - '@esbuild/netbsd-x64': 0.20.2 - '@esbuild/openbsd-x64': 0.20.2 - '@esbuild/sunos-x64': 0.20.2 - '@esbuild/win32-arm64': 0.20.2 - '@esbuild/win32-ia32': 0.20.2 - '@esbuild/win32-x64': 0.20.2 + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 dev: true /escalade@3.1.2: @@ -1378,7 +1400,7 @@ packages: hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/regexpp': 4.11.0 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.0 '@humanwhocodes/config-array': 0.11.14 @@ -1388,13 +1410,13 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4 + debug: 4.3.5 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - esquery: 1.5.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 @@ -1412,7 +1434,7 @@ packages: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.3 + optionator: 0.9.4 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: @@ -1423,13 +1445,13 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 3.4.3 dev: true - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + /esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 @@ -1510,7 +1532,7 @@ packages: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.7 dev: false /fast-json-stable-stringify@2.1.0: @@ -1564,8 +1586,8 @@ packages: engines: {node: '>=4'} dev: false - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 @@ -1627,8 +1649,8 @@ packages: readable-stream: 2.3.8 dev: true - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + /foreground-child@3.2.1: + resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} engines: {node: '>=14'} dependencies: cross-spawn: 7.0.3 @@ -1648,6 +1670,7 @@ packages: /fs-write-stream-atomic@1.0.10: resolution: {integrity: sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==} + deprecated: This package is no longer supported. dependencies: graceful-fs: 4.2.11 iferr: 0.1.5 @@ -1779,20 +1802,21 @@ packages: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: true - /glob@10.3.12: - resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} - engines: {node: '>=16 || 14 >=14.17'} + /glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.4 - minipass: 7.0.4 - path-scurry: 1.10.2 + foreground-child: 3.2.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 dev: true /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -1805,6 +1829,7 @@ packages: /glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -1900,6 +1925,7 @@ packages: /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. dependencies: once: 1.4.0 wrappy: 1.0.2 @@ -1917,8 +1943,9 @@ packages: engines: {node: '>= 0.10'} dev: true - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + /is-core-module@2.15.0: + resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} + engines: {node: '>= 0.4'} dependencies: hasown: 2.0.2 dev: true @@ -1990,9 +2017,8 @@ packages: engines: {node: '>=0.10.0'} dev: true - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + /jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: @@ -2003,7 +2029,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.12.7 + '@types/node': 20.14.11 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -2037,10 +2063,6 @@ packages: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - dev: true - /keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: @@ -2052,8 +2074,8 @@ packages: engines: {node: '>=0.10.0'} dev: true - /lage@2.7.16: - resolution: {integrity: sha512-yi9LZm6XEWiLNA6LcrcVSbsjAZw30bbQW6cppZKDYOrdbR0f2mYjpFNOdElRhJctkx8YFbP2xYg1Hsf61bc+Cg==} + /lage@2.7.21: + resolution: {integrity: sha512-qHnBRjPOicWTBxOPLLv7segc6BfPJcSFAhwYV8ruKLscyj8tjYPYnTjyvPP2vvbePp2yaMwfjQBqarYsq8ZWgA==} hasBin: true dependencies: glob-hasher: 1.4.2 @@ -2078,8 +2100,8 @@ packages: resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} dependencies: - mlly: 1.6.1 - pkg-types: 1.0.3 + mlly: 1.7.1 + pkg-types: 1.1.3 dev: true /locate-path@3.0.0: @@ -2113,9 +2135,8 @@ packages: get-func-name: 2.0.2 dev: true - /lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} - engines: {node: 14 || >=16.14} + /lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} dev: true /lru-cache@5.1.1: @@ -2124,18 +2145,10 @@ packages: yallist: 3.1.1 dev: true - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + /magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} dependencies: - yallist: 4.0.0 - dev: false - - /magic-string@0.30.9: - resolution: {integrity: sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 dev: true /make-dir@1.3.0: @@ -2161,11 +2174,11 @@ packages: engines: {node: '>= 8'} dev: false - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + /micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} engines: {node: '>=8.6'} dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 dev: false @@ -2198,8 +2211,8 @@ packages: brace-expansion: 2.0.1 dev: false - /minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 @@ -2209,8 +2222,8 @@ packages: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + /minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} dev: true @@ -2252,17 +2265,18 @@ packages: hasBin: true dev: false - /mlly@1.6.1: - resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} + /mlly@1.7.1: + resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} dependencies: - acorn: 8.11.3 + acorn: 8.12.1 pathe: 1.1.2 - pkg-types: 1.0.3 - ufo: 1.5.3 + pkg-types: 1.1.3 + ufo: 1.5.4 dev: true /move-concurrently@1.0.1: resolution: {integrity: sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==} + deprecated: This package is no longer supported. dependencies: aproba: 1.2.0 copy-concurrently: 1.0.5 @@ -2296,8 +2310,8 @@ packages: hasBin: true dev: false - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + /node-releases@2.0.17: + resolution: {integrity: sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==} dev: true /nopt@6.0.0: @@ -2334,16 +2348,16 @@ packages: dependencies: mimic-fn: 4.0.0 - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + /optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + word-wrap: 1.2.5 dev: true /p-limit@2.3.0: @@ -2363,7 +2377,7 @@ packages: resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} engines: {node: '>=18'} dependencies: - yocto-queue: 1.0.0 + yocto-queue: 1.1.1 dev: true /p-locate@3.0.0: @@ -2391,6 +2405,10 @@ packages: engines: {node: '>=6'} dev: true + /package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + dev: true + /parallel-transform@1.2.0: resolution: {integrity: sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==} dependencies: @@ -2444,12 +2462,12 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true - /path-scurry@1.10.2: - resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} - engines: {node: '>=16 || 14 >=14.17'} + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} dependencies: - lru-cache: 10.2.0 - minipass: 7.0.4 + lru-cache: 10.4.3 + minipass: 7.1.2 dev: true /path-type@4.0.0: @@ -2469,8 +2487,8 @@ packages: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} dev: false - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} dev: true /picomatch@2.3.1: @@ -2519,20 +2537,20 @@ packages: find-up: 4.1.0 dev: true - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + /pkg-types@1.1.3: + resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==} dependencies: - jsonc-parser: 3.2.1 - mlly: 1.6.1 + confbox: 0.1.7 + mlly: 1.7.1 pathe: 1.1.2 dev: true - /postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + /postcss@8.4.39: + resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 + picocolors: 1.0.1 source-map-js: 1.2.0 dev: true @@ -2541,8 +2559,8 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + /prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} engines: {node: '>=14'} hasBin: true dev: true @@ -2553,7 +2571,7 @@ packages: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 - react-is: 18.2.0 + react-is: 18.3.1 dev: true /proc-log@2.0.1: @@ -2619,8 +2637,8 @@ packages: safe-buffer: 5.2.1 dev: true - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + /react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} dev: true /read-package-json-fast@2.0.3: @@ -2670,7 +2688,7 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: - is-core-module: 2.13.1 + is-core-module: 2.15.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -2681,6 +2699,7 @@ packages: /rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true dependencies: glob: 7.2.3 @@ -2688,41 +2707,43 @@ packages: /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true dependencies: glob: 7.2.3 dev: true - /rimraf@5.0.5: - resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} - engines: {node: '>=14'} + /rimraf@5.0.9: + resolution: {integrity: sha512-3i7b8OcswU6CpU8Ej89quJD4O98id7TtVM5U4Mybh84zQXdrFmDLouWBEEaD/QfO3gDDfH+AGFCGsR7kngzQnA==} + engines: {node: 14 >=14.20 || 16 >=16.20 || >=18} hasBin: true dependencies: - glob: 10.3.12 + glob: 10.4.5 dev: true - /rollup@4.14.2: - resolution: {integrity: sha512-WkeoTWvuBoFjFAhsEOHKRoZ3r9GfTyhh7Vff1zwebEFLEFjT1lG3784xEgKiTa7E+e70vsC81roVL2MP4tgEEQ==} + /rollup@4.18.1: + resolution: {integrity: sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.14.2 - '@rollup/rollup-android-arm64': 4.14.2 - '@rollup/rollup-darwin-arm64': 4.14.2 - '@rollup/rollup-darwin-x64': 4.14.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.14.2 - '@rollup/rollup-linux-arm64-gnu': 4.14.2 - '@rollup/rollup-linux-arm64-musl': 4.14.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.14.2 - '@rollup/rollup-linux-riscv64-gnu': 4.14.2 - '@rollup/rollup-linux-s390x-gnu': 4.14.2 - '@rollup/rollup-linux-x64-gnu': 4.14.2 - '@rollup/rollup-linux-x64-musl': 4.14.2 - '@rollup/rollup-win32-arm64-msvc': 4.14.2 - '@rollup/rollup-win32-ia32-msvc': 4.14.2 - '@rollup/rollup-win32-x64-msvc': 4.14.2 + '@rollup/rollup-android-arm-eabi': 4.18.1 + '@rollup/rollup-android-arm64': 4.18.1 + '@rollup/rollup-darwin-arm64': 4.18.1 + '@rollup/rollup-darwin-x64': 4.18.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.18.1 + '@rollup/rollup-linux-arm-musleabihf': 4.18.1 + '@rollup/rollup-linux-arm64-gnu': 4.18.1 + '@rollup/rollup-linux-arm64-musl': 4.18.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.18.1 + '@rollup/rollup-linux-riscv64-gnu': 4.18.1 + '@rollup/rollup-linux-s390x-gnu': 4.18.1 + '@rollup/rollup-linux-x64-gnu': 4.18.1 + '@rollup/rollup-linux-x64-musl': 4.18.1 + '@rollup/rollup-win32-arm64-msvc': 4.18.1 + '@rollup/rollup-win32-ia32-msvc': 4.18.1 + '@rollup/rollup-win32-x64-msvc': 4.18.1 fsevents: 2.3.3 dev: true @@ -2773,12 +2794,10 @@ packages: hasBin: true dev: true - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + /semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true - dependencies: - lru-cache: 6.0.0 dev: false /serialize-javascript@4.0.0: @@ -2969,7 +2988,7 @@ packages: xtend: 4.0.2 dev: false - /terser-webpack-plugin@1.4.5(webpack@5.91.0): + /terser-webpack-plugin@1.4.5(webpack@5.93.0): resolution: {integrity: sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==} engines: {node: '>= 6.9.0'} peerDependencies: @@ -2982,12 +3001,12 @@ packages: serialize-javascript: 4.0.0 source-map: 0.6.1 terser: 4.8.1 - webpack: 5.91.0(webpack-cli@4.10.0) + webpack: 5.93.0(webpack-cli@4.10.0) webpack-sources: 1.4.3 worker-farm: 1.7.0 dev: true - /terser-webpack-plugin@5.3.10(webpack@5.91.0): + /terser-webpack-plugin@5.3.10(webpack@5.93.0): resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -3007,8 +3026,8 @@ packages: jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 - terser: 5.30.3 - webpack: 5.91.0(webpack-cli@4.10.0) + terser: 5.31.3 + webpack: 5.93.0(webpack-cli@4.10.0) dev: true /terser@4.8.1: @@ -3016,19 +3035,19 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - acorn: 8.11.3 + acorn: 8.12.1 commander: 2.20.3 source-map: 0.6.1 source-map-support: 0.5.21 dev: true - /terser@5.30.3: - resolution: {integrity: sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==} + /terser@5.31.3: + resolution: {integrity: sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==} engines: {node: '>=10'} hasBin: true dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.11.3 + acorn: 8.12.1 commander: 2.20.3 source-map-support: 0.5.21 dev: true @@ -3048,12 +3067,12 @@ packages: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: false - /tinybench@2.6.0: - resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} + /tinybench@2.8.0: + resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} dev: true - /tinypool@0.8.3: - resolution: {integrity: sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==} + /tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} engines: {node: '>=14.0.0'} dev: true @@ -3073,8 +3092,8 @@ packages: is-number: 7.0.0 dev: false - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + /tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} dev: true /type-check@0.4.0: @@ -3098,14 +3117,14 @@ packages: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} dev: true - /typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + /typescript@5.5.3: + resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} engines: {node: '>=14.17'} hasBin: true dev: true - /ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + /ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} dev: true /unbzip2-stream@1.4.3: @@ -3131,15 +3150,15 @@ packages: imurmurhash: 0.1.4 dev: true - /update-browserslist-db@1.0.13(browserslist@4.23.0): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + /update-browserslist-db@1.1.0(browserslist@4.23.2): + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.23.0 + browserslist: 4.23.2 escalade: 3.1.2 - picocolors: 1.0.0 + picocolors: 1.0.1 dev: true /uri-js@4.4.1: @@ -3151,16 +3170,16 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - /vite-node@1.5.0(@types/node@20.12.7): - resolution: {integrity: sha512-tV8h6gMj6vPzVCa7l+VGq9lwoJjW8Y79vst8QZZGiuRAfijU+EEWuc0kFpmndQrWhMMhet1jdSF+40KSZUqIIw==} + /vite-node@1.6.0(@types/node@20.14.11): + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true dependencies: cac: 6.7.14 - debug: 4.3.4 + debug: 4.3.5 pathe: 1.1.2 - picocolors: 1.0.0 - vite: 5.2.8(@types/node@20.12.7) + picocolors: 1.0.1 + vite: 5.3.4(@types/node@20.14.11) transitivePeerDependencies: - '@types/node' - less @@ -3172,8 +3191,8 @@ packages: - terser dev: true - /vite@5.2.8(@types/node@20.12.7): - resolution: {integrity: sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==} + /vite@5.3.4(@types/node@20.14.11): + resolution: {integrity: sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -3200,23 +3219,23 @@ packages: terser: optional: true dependencies: - '@types/node': 20.12.7 - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.14.2 + '@types/node': 20.14.11 + esbuild: 0.21.5 + postcss: 8.4.39 + rollup: 4.18.1 optionalDependencies: fsevents: 2.3.3 dev: true - /vitest@1.5.0(@types/node@20.12.7): - resolution: {integrity: sha512-d8UKgR0m2kjdxDWX6911uwxout6GHS0XaGH1cksSIVVG8kRlE7G7aBw7myKQCvDI5dT4j7ZMa+l706BIORMDLw==} + /vitest@1.6.0(@types/node@20.14.11): + resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.5.0 - '@vitest/ui': 1.5.0 + '@vitest/browser': 1.6.0 + '@vitest/ui': 1.6.0 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -3233,27 +3252,27 @@ packages: jsdom: optional: true dependencies: - '@types/node': 20.12.7 - '@vitest/expect': 1.5.0 - '@vitest/runner': 1.5.0 - '@vitest/snapshot': 1.5.0 - '@vitest/spy': 1.5.0 - '@vitest/utils': 1.5.0 - acorn-walk: 8.3.2 + '@types/node': 20.14.11 + '@vitest/expect': 1.6.0 + '@vitest/runner': 1.6.0 + '@vitest/snapshot': 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + acorn-walk: 8.3.3 chai: 4.4.1 - debug: 4.3.4 + debug: 4.3.5 execa: 8.0.1 local-pkg: 0.5.0 - magic-string: 0.30.9 + magic-string: 0.30.10 pathe: 1.1.2 - picocolors: 1.0.0 + picocolors: 1.0.1 std-env: 3.7.0 strip-literal: 2.1.0 - tinybench: 2.6.0 - tinypool: 0.8.3 - vite: 5.2.8(@types/node@20.12.7) - vite-node: 1.5.0(@types/node@20.12.7) - why-is-node-running: 2.2.2 + tinybench: 2.8.0 + tinypool: 0.8.4 + vite: 5.3.4(@types/node@20.14.11) + vite-node: 1.6.0(@types/node@20.14.11) + why-is-node-running: 2.3.0 transitivePeerDependencies: - less - lightningcss @@ -3276,7 +3295,7 @@ packages: graceful-fs: 4.2.11 dev: true - /webpack-cli@4.10.0(webpack@5.91.0): + /webpack-cli@4.10.0(webpack@5.93.0): resolution: {integrity: sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==} engines: {node: '>=10.13.0'} hasBin: true @@ -3297,7 +3316,7 @@ packages: optional: true dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.91.0) + '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.93.0) '@webpack-cli/info': 1.5.0(webpack-cli@4.10.0) '@webpack-cli/serve': 1.7.0(webpack-cli@4.10.0) colorette: 2.0.20 @@ -3307,7 +3326,7 @@ packages: import-local: 3.1.0 interpret: 2.2.0 rechoir: 0.7.1 - webpack: 5.91.0(webpack-cli@4.10.0) + webpack: 5.93.0(webpack-cli@4.10.0) webpack-merge: 5.10.0 dev: true @@ -3332,8 +3351,8 @@ packages: engines: {node: '>=10.13.0'} dev: true - /webpack@5.91.0(webpack-cli@4.10.0): - resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} + /webpack@5.93.0(webpack-cli@4.10.0): + resolution: {integrity: sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -3347,12 +3366,12 @@ packages: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/wasm-edit': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 - acorn: 8.11.3 - acorn-import-assertions: 1.9.0(acorn@8.11.3) - browserslist: 4.23.0 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.16.0 - es-module-lexer: 1.5.0 + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) + browserslist: 4.23.2 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.0 + es-module-lexer: 1.5.4 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -3363,9 +3382,9 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.91.0) + terser-webpack-plugin: 5.3.10(webpack@5.93.0) watchpack: 2.4.1 - webpack-cli: 4.10.0(webpack@5.91.0) + webpack-cli: 4.10.0(webpack@5.93.0) webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' @@ -3380,8 +3399,8 @@ packages: dependencies: isexe: 2.0.0 - /why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + /why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true dependencies: @@ -3393,6 +3412,11 @@ packages: resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} dev: true + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true + /worker-farm@1.7.0: resolution: {integrity: sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==} dependencies: @@ -3408,7 +3432,7 @@ packages: globby: 11.1.0 jju: 1.4.0 js-yaml: 4.1.0 - micromatch: 4.0.5 + micromatch: 4.0.7 dev: false /wrap-ansi@7.0.0: @@ -3444,10 +3468,6 @@ packages: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: false - /yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} dependencies: @@ -3459,7 +3479,7 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + /yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} dev: true