From 519d03a55e946d63c36bc1b94bb02fa662662e28 Mon Sep 17 00:00:00 2001 From: Xingwang Liao Date: Tue, 7 Mar 2023 18:56:11 +0800 Subject: [PATCH] feat: add support for more openid providers This may fix #1 --- .eslintrc.js | 7 + README.md | 7 +- package.json | 18 +- src/cli/cli-response.ts | 9 +- src/cli/index.ts | 1 + src/cli/npm.ts | 9 +- src/cli/usage.ts | 4 +- src/cli/web-response.ts | 9 +- src/client/plugin/clipboard.ts | 5 + src/client/plugin/lib.ts | 18 + src/client/verdaccio.ts | 32 +- src/query-params.ts | 17 +- src/server/constants.ts | 2 +- src/server/flows/CliFlow.ts | 18 +- src/server/flows/WebFlow.ts | 20 +- src/server/index.ts | 4 +- src/server/openid/AuthProvider.ts | 233 ++++++--- src/server/plugin/AuthCore.ts | 302 +++++++----- src/server/plugin/AuthProvider.ts | 25 +- src/server/plugin/Config.ts | 50 +- src/server/plugin/PatchHtml.ts | 3 +- src/server/plugin/Plugin.ts | 90 ++-- src/server/plugin/utils.ts | 74 +++ yarn.lock | 768 ++++++++++++++++++------------ 24 files changed, 1067 insertions(+), 658 deletions(-) create mode 100644 src/server/plugin/utils.ts diff --git a/.eslintrc.js b/.eslintrc.js index 8c38f9b..646000f 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -13,6 +13,7 @@ module.exports = { "plugin:prettier/recommended", "plugin:import/recommended", "plugin:import/typescript", + "plugin:unicorn/recommended", ], plugins: ["simple-import-sort"], rules: { @@ -20,6 +21,12 @@ module.exports = { "simple-import-sort/exports": "error", "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/no-non-null-assertion": "off", + "unicorn/no-null": "off", + "unicorn/no-process-exit": "off", + "unicorn/catch-error-name": "off", + "unicorn/filename-case": "off", + "unicorn/prefer-module": "off", + "unicorn/prevent-abbreviations": "off", }, settings: { "import/resolver": ["node", "typescript"], diff --git a/README.md b/README.md index 0bc147b..f0fe273 100644 --- a/README.md +++ b/README.md @@ -52,13 +52,14 @@ auth: # token-endpoint: https://example.com/oauth/token # optional # userinfo-endpoint: https://example.com/oauth/userinfo # optional # jwks-uri: https://example.com/oauth/jwks # optional - # scope: openid email groups # optional. custom scope + # scope: openid email groups # optional. custom scope, default is openid client-id: CLIENT_ID # required client-secret: CLIENT_SECRET # required - username-claim: name # optional. default is sub + username-claim: name # optional. username claim in openid, or key to get username in userinfo endpoint response, default is sub groups-claim: groups # optional. claim to get groups from # provider-type: gitlab # optional. define this to get groups from gitlab api - # authorized-group: false # optional. user in group is allowed to login, or false to disable + # authorized-groups: # optional. user in array is allowed to login. use true to ensure user have at least one group, false means no groups check + # - access # group-users: # optional. custom the group users. eg. animal group has user tom and jack. if set, 'groups-claim' and 'provider-type' take no effect # animal: # - tom diff --git a/package.json b/package.json index c1d4fea..79964f7 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ ], "scripts": { "build": "rimraf dist && rollup -c --environment NODE_ENV:production", - "start": "cross-env DEBUG='verdaccio:plugin:openid' verdaccio -c verdaccio/verdaccio.yml", + "start": "cross-env DEBUG='verdaccio:*' verdaccio -c verdaccio/verdaccio.yml", + "preview": "verdaccio -c verdaccio/verdaccio.yml", "lint": "eslint --fix --ext .js,.ts .", "link:openid": "yarn link && yarn link verdaccio-openid", "unlink:openid": "yarn unlink verdaccio-openid && yarn unlink", @@ -28,11 +29,11 @@ "dependencies": { "@gitbeaker/node": "^35.8.0", "@isaacs/ttlcache": "^1.2.1", - "@verdaccio/auth": "^6.0.0-6-next.42", - "@verdaccio/config": "^6.0.0-6-next.63", - "@verdaccio/core": "^6.0.0-6-next.63", + "@verdaccio/auth": "^6.0.0-6-next.44", + "@verdaccio/config": "^6.0.0-6-next.65", + "@verdaccio/core": "^6.0.0-6-next.65", "@verdaccio/signature": "^6.0.0-6-next.2", - "@verdaccio/url": "^11.0.0-6-next.29", + "@verdaccio/url": "^11.0.0-6-next.31", "core-js": "^3.29.0", "debug": "^4.3.4", "deepmerge": "^4.3.0", @@ -71,13 +72,14 @@ "eslint-plugin-import": "^2.27.5", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-simple-import-sort": "^10.0.0", + "eslint-plugin-unicorn": "^46.0.0", "prettier": "^2.8.4", - "rimraf": "^4.3.1", - "rollup": "^3.18.0", + "rimraf": "^4.4.0", + "rollup": "^3.19.0", "rollup-plugin-node-externals": "^5.1.2", "rollup-plugin-shebang-bin": "^0.0.5", "typescript": "^4.9.5", - "verdaccio": "^5.22.0", + "verdaccio": "^5.22.1", "verdaccio-htpasswd": "^11.0.0-6-next.13" }, "peerDependencies": { diff --git a/src/cli/cli-response.ts b/src/cli/cli-response.ts index 0202ae8..1204f44 100644 --- a/src/cli/cli-response.ts +++ b/src/cli/cli-response.ts @@ -1,15 +1,18 @@ export function respondWithCliMessage(status: string, message: string) { switch (status) { - case "success": + case "success": { console.log("All done! We've updated your npm configuration."); break; + } - case "denied": + case "denied": { console.warn("You are not a member of the required access group."); break; + } - default: + default: { console.error(message); break; + } } } diff --git a/src/cli/index.ts b/src/cli/index.ts index a625e3d..ce04c3a 100644 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -31,6 +31,7 @@ const server = express() respondWithCliMessage(status, message); server.close(); + // eslint-disable-next-line unicorn/no-process-exit process.exit(status === "success" ? 0 : 1); }) .listen(cliPort, () => { diff --git a/src/cli/npm.ts b/src/cli/npm.ts index d2bbc10..a625c2f 100644 --- a/src/cli/npm.ts +++ b/src/cli/npm.ts @@ -1,6 +1,7 @@ -import { execSync } from "child_process"; +import { execSync } from "node:child_process"; +import { URL } from "node:url"; + import minimist from "minimist"; -import { URL } from "url"; import logger from "../server/logger"; @@ -49,5 +50,7 @@ export function saveNpmToken(token: string) { const registry = getRegistryUrl(); const commands = getNpmSaveCommands(registry, token); - commands.forEach((command) => runCommand(command)); + for (const command of commands) { + runCommand(command); + } } diff --git a/src/cli/usage.ts b/src/cli/usage.ts index 92fb6d8..bf7ed22 100644 --- a/src/cli/usage.ts +++ b/src/cli/usage.ts @@ -16,7 +16,9 @@ export function getUsageInfo() { } export function printUsage() { - getUsageInfo().forEach((line) => console.log(line)); + for (const line of getUsageInfo()) { + console.log(line); + } } export function validateRegistry() { diff --git a/src/cli/web-response.ts b/src/cli/web-response.ts index 8c099db..aa27ed3 100644 --- a/src/cli/web-response.ts +++ b/src/cli/web-response.ts @@ -16,19 +16,22 @@ export function respondWithWebPage(status: string, message: string, res: Respons res.setHeader("Content-Type", "text/html"); switch (status) { - case "success": + case "success": { res.status(200); res.send(successPage); break; + } - case "denied": + case "denied": { res.status(401); res.send(buildAccessDeniedPage(withBack)); break; + } - default: + default: { res.status(500); res.send(buildErrorPage(message, withBack)); break; + } } } diff --git a/src/client/plugin/clipboard.ts b/src/client/plugin/clipboard.ts index d1467fe..6945279 100644 --- a/src/client/plugin/clipboard.ts +++ b/src/client/plugin/clipboard.ts @@ -1,3 +1,8 @@ +/** + * Copy text to the clipboard. + * + * @param text the text to copy to the clipboard + */ export async function copyToClipboard(text: string) { await navigator.clipboard.writeText(text); } diff --git a/src/client/plugin/lib.ts b/src/client/plugin/lib.ts index 2f6b56b..3952c2a 100644 --- a/src/client/plugin/lib.ts +++ b/src/client/plugin/lib.ts @@ -1,9 +1,21 @@ +/** + * Retry an action multiple times. + * + * @param action + */ export function retry(action: () => void) { for (let i = 0; i < 10; i++) { setTimeout(() => action(), 100 * i); } } +/** + * Check if the path of a mouse event contains an element. + * + * @param selector the selector of the element to check for + * @param e the mouse event + * @returns + */ function pathContainsElement(selector: string, e: MouseEvent): boolean { const path = e.path || e.composedPath?.(); const element = document.querySelector(selector)!; @@ -11,6 +23,12 @@ function pathContainsElement(selector: string, e: MouseEvent): boolean { return path.includes(element); } +/** + * Interrupt a click event on an element. + * + * @param selector the selector of the element to interrupt the click event for + * @param callback new callback to run instead of the original click event + */ export function interruptClick(selector: string, callback: () => void) { const handleClick = (e: MouseEvent) => { if (pathContainsElement(selector, e)) { diff --git a/src/client/verdaccio.ts b/src/client/verdaccio.ts index 13512e7..d846376 100644 --- a/src/client/verdaccio.ts +++ b/src/client/verdaccio.ts @@ -13,40 +13,40 @@ function updateUsageInfo(): void { const usageInfoLines = getUsageInfo().split("\n").reverse(); - tabs.forEach((tab) => { + for (const tab of tabs) { const alreadyReplaced = tab.getAttribute("replaced") === "true"; - if (alreadyReplaced) return; + if (alreadyReplaced) continue; - const commands = Array.from(tab.querySelectorAll("button")) + const commands = [...tab.querySelectorAll("button")] .map((node) => node.parentElement!) - .filter((node) => !!node.innerText.match(/^(npm|pnpm|yarn)/)); - if (!commands.length) return; + .filter((node) => !!/^(npm|pnpm|yarn)/.test(node.textContent || "")); + if (commands.length === 0) continue; - usageInfoLines.forEach((info) => { + for (const info of usageInfoLines) { const cloned = commands[0].cloneNode(true) as HTMLElement; const textEl = cloned.querySelector("span")!; - textEl.innerText = info; + textEl.textContent = info; const copyEl = cloned.querySelector("button")!; copyEl.style.visibility = loggedIn ? "visible" : "hidden"; - copyEl.onclick = (e) => { + copyEl.addEventListener("click", (e) => { e.preventDefault(); e.stopPropagation(); copyToClipboard(info); - }; + }); - commands[0].parentElement!.appendChild(cloned); + commands[0].parentElement!.append(cloned); tab.setAttribute("replaced", "true"); - }); + } // Remove commands that don't work with oauth - commands.forEach((node) => { - if (node.innerText.includes("adduser") || node.innerText.includes("set password")) { - node.parentElement!.removeChild(node); + for (const node of commands) { + if (node.textContent?.includes("adduser") || node.textContent?.includes("set password")) { + node.remove(); tab.setAttribute("replaced", "true"); } - }); - }); + } + } } init({ diff --git a/src/query-params.ts b/src/query-params.ts index 76ae9b9..32d797b 100644 --- a/src/query-params.ts +++ b/src/query-params.ts @@ -5,17 +5,20 @@ * @returns a key/value object */ export function parseQueryParams(search: string): Record { - if (!search) return {}; + const params = {}; + + if (!search) return params; if (search.startsWith("?")) { - search = search.substring(1); + search = search.slice(1); + } + + for (const str of search.split("&")) { + const [key, value] = str.split("="); + params[key] = decodeURIComponent(value); } - return search.split("&").reduce((acc, pair) => { - const [key, value] = pair.split("="); - acc[key] = decodeURIComponent(value); - return acc; - }, {}); + return params; } /** diff --git a/src/server/constants.ts b/src/server/constants.ts index 0083968..77088a6 100644 --- a/src/server/constants.ts +++ b/src/server/constants.ts @@ -1,4 +1,4 @@ -import { fileURLToPath } from "url"; +import { fileURLToPath } from "node:url"; import { pluginKey } from "@/constants"; diff --git a/src/server/flows/CliFlow.ts b/src/server/flows/CliFlow.ts index d63b279..48cf5f6 100644 --- a/src/server/flows/CliFlow.ts +++ b/src/server/flows/CliFlow.ts @@ -27,23 +27,21 @@ export class CliFlow implements IPluginMiddleware { try { const providerToken = await this.provider.getToken(req); - debug(`provider auth success, token: "%s"`, providerToken); + debug(`provider auth success, tokens: "%j"`, providerToken); - const username = await this.provider.getUsername(providerToken); - - let groups = this.core.getUserGroups(username); + const userinfo = await this.provider.getUserinfo(providerToken); + let groups = this.core.getUserGroups(userinfo.name); if (!groups) { - groups = await this.provider.getGroups(username); + groups = userinfo.groups; } - if (this.core.authenticate(username, groups)) { - const realGroups = this.core.filterRealGroups(username, groups); + if (this.core.authenticate(userinfo.name, groups)) { + const realGroups = this.core.filterRealGroups(userinfo.name, groups); - debug(`user authenticated, name: "%s", groups: "%o"`, username, realGroups); + debug(`user authenticated, name: "%s", groups: %j`, userinfo.name, realGroups); - const user = await this.core.createAuthenticatedUser(username, realGroups); - const npmToken = await this.core.issueNpmToken(user, providerToken); + const npmToken = await this.core.issueNpmToken(userinfo.name, realGroups, providerToken); params.status = "success"; params.token = npmToken; diff --git a/src/server/flows/WebFlow.ts b/src/server/flows/WebFlow.ts index 952db50..35e90ca 100644 --- a/src/server/flows/WebFlow.ts +++ b/src/server/flows/WebFlow.ts @@ -54,24 +54,22 @@ export class WebFlow implements IPluginMiddleware { const providerToken = await this.provider.getToken(req); debug(`provider auth success, token: "%s"`, providerToken); - const username = await this.provider.getUsername(providerToken); + const userinfo = await this.provider.getUserinfo(providerToken); - let groups = this.core.getUserGroups(username); + let groups = this.core.getUserGroups(userinfo.name); if (!groups) { - groups = await this.provider.getGroups(providerToken); + groups = userinfo.groups; } - if (this.core.authenticate(username, groups)) { - const realGroups = this.core.filterRealGroups(username, groups); + if (this.core.authenticate(userinfo.name, groups)) { + const realGroups = this.core.filterRealGroups(userinfo.name, groups); - debug(`user authenticated, name: "%s", groups: "%o"`, username, realGroups); + debug(`user authenticated, name: "%s", groups: "%j"`, userinfo.name, realGroups); - const user = this.core.createAuthenticatedUser(username, realGroups); + const uiToken = await this.core.issueUiToken(userinfo.name, realGroups); + const npmToken = await this.core.issueNpmToken(userinfo.name, realGroups, providerToken); - const uiToken = await this.core.issueUiToken(user, providerToken); - const npmToken = await this.core.issueNpmToken(user, providerToken); - - const params = { username: user.name!, uiToken, npmToken }; + const params = { username: userinfo.name, uiToken, npmToken }; const redirectUrl = `/?${stringifyQueryParams(params)}`; diff --git a/src/server/index.ts b/src/server/index.ts index e54f0b5..a64e37d 100644 --- a/src/server/index.ts +++ b/src/server/index.ts @@ -1,8 +1,6 @@ import dotenv from "dotenv"; -import { Plugin } from "./plugin/Plugin"; - dotenv.config(); // plugins must be a default export -export default Plugin; +export { Plugin as default } from "./plugin/Plugin"; diff --git a/src/server/openid/AuthProvider.ts b/src/server/openid/AuthProvider.ts index 00c855c..e13875f 100644 --- a/src/server/openid/AuthProvider.ts +++ b/src/server/openid/AuthProvider.ts @@ -8,7 +8,9 @@ import { generators, Issuer } from "openid-client"; import { getCallbackPath } from "@/redirect"; -import { AuthProvider, ConfigHolder } from "../plugin/AuthProvider"; +import { debug } from "../logger"; +import type { AuthProvider, ConfigHolder, ProviderUser, Token, TokenSet } from "../plugin/AuthProvider"; +import { extractAccessToken, getClaimsFromIdToken, hashToken } from "../plugin/utils"; export class OpenIDConnectAuthProvider implements AuthProvider { private client?: Client; @@ -21,7 +23,7 @@ export class OpenIDConnectAuthProvider implements AuthProvider { constructor(private readonly config: ConfigHolder) { this.providerHost = this.config.providerHost; - this.scope = this.initScope(); + this.scope = this.config.scope; this.stateCache = new TTLCache({ max: 1000, ttl: 5 * 60 * 1000 }); // 5min this.userinfoCache = new TTLCache({ max: 1000, ttl: 30 * 1000 }); // 1min @@ -32,28 +34,12 @@ export class OpenIDConnectAuthProvider implements AuthProvider { private get discoveredClient(): Client { if (!this.client) { - throw new Error("Client has not yet been discovered"); + throw new ReferenceError("Client has not yet been discovered"); } return this.client; } - private initScope() { - let scope: string; - - if (this.config.scope) { - scope = this.config.scope; - } else { - scope = "openid email"; - - if (this.config.groupsClaim) { - scope += " groups"; - } - } - - return scope; - } - private async discoverClient() { let issuer: Issuer; @@ -89,9 +75,9 @@ export class OpenIDConnectAuthProvider implements AuthProvider { return "openid"; } - getLoginUrl(req: Request): string { - const baseUrl = this.getBaseUrl(req); - const redirectUrl = baseUrl + getCallbackPath(req.params.id); + getLoginUrl(request: Request): string { + const baseUrl = this.getBaseUrl(request); + const redirectUrl = baseUrl + getCallbackPath(request.params.id); const state = generators.state(32); const nonce = generators.nonce(); @@ -106,16 +92,22 @@ export class OpenIDConnectAuthProvider implements AuthProvider { }); } - async getToken(callbackReq: Request): Promise { - const params = this.discoveredClient.callbackParams(callbackReq.url); + /** + * Parse callback request and get the token from provider. + * + * @param callbackRequest + * @returns + */ + async getToken(callbackRequest: Request): Promise { + const parameters = this.discoveredClient.callbackParams(callbackRequest.url); - const state = params.state; + const state = parameters.state; if (!state) { - throw new Error("No state parameter found in callback request"); + throw new URIError("No state parameter found in callback request"); } if (!this.stateCache.has(state)) { - throw new Error("State parameter does not match a known state"); + throw new URIError("State parameter does not match a known state"); } const nonce = this.stateCache.get(state); @@ -127,81 +119,158 @@ export class OpenIDConnectAuthProvider implements AuthProvider { scope: this.scope, }; - const baseUrl = this.getBaseUrl(callbackReq); - const redirectUrl = baseUrl + callbackReq.path; + const baseUrl = this.getBaseUrl(callbackRequest); + const redirectUrl = baseUrl + callbackRequest.path; - const tokenSet = await this.discoveredClient.callback(redirectUrl, params, checks); + const tokens = await this.discoveredClient.callback(redirectUrl, parameters, checks); + if (!tokens.access_token) { + throw new Error("No access_token was returned from the provider"); + } + if (!tokens.id_token && this.scope.includes("openid")) { + throw new Error(`"openid" scope is requested but no id_token was returned from the provider`); + } - if (tokenSet.access_token !== undefined) { - return tokenSet.access_token; + let expiresAt = tokens.expires_at; + // if expires_at is not set, try to get it from the id_token + if (!expiresAt && tokens.id_token) { + expiresAt = getClaimsFromIdToken(tokens.id_token).exp as number; } - throw new Error(`No "access_token" received in getToken callback.`); + return { + accessToken: tokens.access_token, + idToken: tokens.id_token, + expiresAt: expiresAt, + }; } - private async getUserinfo(token: string): Promise> { - let userinfo = this.userinfoCache.get(token); - if (!userinfo) { - userinfo = await this.discoveredClient.userinfo>(token); - - this.userinfoCache.set(token, userinfo); + /** + * Get the user info from id_token + * + * @param token + * @returns + */ + private getUserinfoFromIdToken(token: TokenSet): Record { + const idToken = token.idToken; + if (!idToken) { + throw new TypeError("No id_token found in token"); } - return userinfo; + return getClaimsFromIdToken(idToken); } - async getUsername(token: string): Promise { - const userinfo = await this.getUserinfo(token); - const username = userinfo[this.config.usernameClaim]; + /** + * Get the user info from the userinfo endpoint or from the cache. + * + * @param token + * @returns + */ + private async getUserinfoFromEndpoint(token: Token): Promise> { + const key = hashToken(token); - if (username) { - return String(username); - } + let userinfo = this.userinfoCache.get(key); + if (!userinfo) { + userinfo = await this.discoveredClient.userinfo>(extractAccessToken(token)); - throw new Error(`Could not grab username using the ${this.config.usernameClaim} property`); + this.userinfoCache.set(key, userinfo); + } + return userinfo; } /** - * Get the groups for the user from the groups claim or from the oidc endpoint. + * Get the user from the userinfo. * * @param token - * @returns {Promise} The groups the user is in. + * @returns */ - async getGroups(token: string): Promise { - if (this.config.groupsClaim) { - const userinfo = await this.getUserinfo(token); - const groups = userinfo[this.config.groupsClaim]; - - if (!groups) { - throw new Error(`Could not grab groups using the ${this.config.groupsClaim} property`); - } else if (Array.isArray(groups)) { - return groups; + async getUserinfo(token: Token): Promise { + let userinfo: Record; + + let username: unknown, groups: unknown; + if (typeof token !== "string") { + /** + * username and groups can be in the id_token if the scope is openid. + */ + try { + userinfo = this.getUserinfoFromIdToken(token); + + username = userinfo[this.config.usernameClaim]; + if (this.config.groupsClaim) { + groups = userinfo[this.config.groupsClaim]; + } + } catch { + debug("Could not get userinfo from id_token. Trying userinfo endpoint..."); + } + } + + if (!username || !groups) { + /** + * or we can get them from the userinfo endpoint. + */ + try { + userinfo = await this.getUserinfoFromEndpoint(token); + + username ??= userinfo[this.config.usernameClaim]; + if (this.config.groupsClaim) { + groups ??= userinfo[this.config.groupsClaim]; + } + } catch { + debug("Could not get userinfo from userinfo endpoint."); + } + } + + if (!username) { + throw new Error(`Could not get username with claim: "${this.config.usernameClaim}"`); + } + + if (!groups) { + if (this.config.providerType) { + groups = await this.getGroupsWithProviderType(token, this.config.providerType); + } else if (this.config.groupsClaim) { + throw new Error(`Could not get groups with claim: "${this.config.groupsClaim}"`); + } + } + + if (groups) { + if (Array.isArray(groups)) { + groups = groups.map(String); } else if (typeof groups === "string") { - return [groups]; + groups = [groups]; } else { - throw new Error(`Groups claim is not an array or string.`); + throw new TypeError(`Groups claim is not an array or string`); } } - if (this.config.providerType) { - let groups = this.groupsCache.get(token); + return { + name: String(username), + groups: groups as string[] | undefined, + }; + } - if (groups) return groups; + /** + * Get the groups for the user from the provider. + * + * @param token + * @param providerType + * @returns + */ + private async getGroupsWithProviderType(token: Token, providerType: string): Promise { + const key = hashToken(token); - switch (this.config.providerType) { - case "gitlab": { - groups = await this.getGitlabGroups(token); - break; - } - default: { - throw new Error("Unexpected provider type."); - } - } + let groups = this.groupsCache.get(key); + + if (groups) return groups; - this.groupsCache.set(token, groups); - return groups; + switch (providerType) { + case "gitlab": { + groups = await this.getGitlabGroups(token); + break; + } + default: { + throw new ReferenceError("Unexpected provider type."); + } } - throw new Error("No groups claim or provider type configured"); + this.groupsCache.set(key, groups); + return groups; } /** @@ -210,10 +279,10 @@ export class OpenIDConnectAuthProvider implements AuthProvider { * @param token * @returns {Promise} The groups the user is in. */ - async getGitlabGroups(token: string): Promise { + async getGitlabGroups(token: Token): Promise { const group = new Groups({ host: this.providerHost, - oauthToken: token, + oauthToken: extractAccessToken(token), }); const userGroups = await group.all(); @@ -221,7 +290,13 @@ export class OpenIDConnectAuthProvider implements AuthProvider { return userGroups.map((g) => g.name); } - public getBaseUrl(req: Request): string { - return getPublicUrl(this.config.urlPrefix, req as RequestOptions).replace(/\/$/, ""); + /** + * Get the base url from the request. + * + * @param request + * @returns + */ + public getBaseUrl(request: Request): string { + return getPublicUrl(this.config.urlPrefix, request as RequestOptions).replace(/\/$/, ""); } } diff --git a/src/server/plugin/AuthCore.ts b/src/server/plugin/AuthCore.ts index bdfc38b..220490f 100644 --- a/src/server/plugin/AuthCore.ts +++ b/src/server/plugin/AuthCore.ts @@ -1,27 +1,48 @@ import { Auth, buildUser, isAESLegacy } from "@verdaccio/auth"; -import { createAnonymousRemoteUser, createRemoteUser } from "@verdaccio/config"; -import { aesDecrypt, aesEncrypt, parseBasicPayload, signPayload, verifyPayload } from "@verdaccio/signature"; +import { defaultLoggedUserRoles, defaultNonLoggedUserRoles } from "@verdaccio/config"; +import { verifyPayload } from "@verdaccio/signature"; import type { JWTSignOptions, RemoteUser, Security } from "@verdaccio/types"; -import logger from "../logger"; -import { AuthProvider } from "./AuthProvider"; -import { ParsedPluginConfig } from "./Config"; +import { debug } from "../logger"; +import type { AuthProvider, Token, TokenSet } from "./AuthProvider"; +import type { PackageAccess, ParsedPluginConfig } from "./Config"; +import { base64Decode, base64Encode, isNowBefore } from "./utils"; -export type User = Omit & { - token?: string; +export type User = { + name: string; + realGroups: string[]; }; +export type LegacyUser = (User & Required>) | Pick; + +function accessTokenOnly(u: LegacyUser): u is Pick { + return !!(u as any).accessToken; +} + export class AuthCore { + private readonly provider: AuthProvider; + + private readonly configSecret: string; + private readonly security: Security; + private readonly groupUsers: Record | undefined; + + private readonly configuredGroups: string[]; + + private readonly authenticatedGroups: string[] | boolean; + private auth?: Auth; - private readonly configuredGroups: Record; + constructor(config: ParsedPluginConfig, provider: AuthProvider) { + this.provider = provider; - constructor(private readonly parsedConfig: ParsedPluginConfig, private readonly provider: AuthProvider) { - this.security = this.parsedConfig.security; + this.configSecret = config.secret; + this.security = config.security; + this.groupUsers = config.groupUsers; - this.configuredGroups = this.getConfiguredGroups(); + this.configuredGroups = this.initConfiguredGroups(config.packages); + this.authenticatedGroups = this.initAuthenticatedGroups(config.authorizedGroups); } setAuth(auth: Auth) { @@ -29,27 +50,63 @@ export class AuthCore { } private get secret(): string { - return this.auth ? this.auth.secret : this.parsedConfig.secret; + return this.auth ? this.auth.secret : this.configSecret; + } + + private initAuthenticatedGroups(val: unknown): string[] | boolean { + switch (typeof val) { + case "boolean": { + return val; + } + case "string": { + return [val].filter(Boolean); + } + case "object": { + return Array.isArray(val) ? val.filter(Boolean) : false; + } + default: { + return false; + } + } } /** * Returns all permission groups used in the Verdacio config. */ - getConfiguredGroups() { - const configuredGroups: Record = {}; - Object.values(this.parsedConfig.packages || {}).forEach((packageConfig) => { - ["access", "publish", "unpublish"] - .flatMap((key) => packageConfig[key]) - .filter(Boolean) - .forEach((group: string) => { - configuredGroups[group] = true; - }); - }); - return configuredGroups; + private initConfiguredGroups(packages: Record = {}): string[] { + const s = new Set(); + + for (const packageConfig of Object.values(packages)) { + const groups = ["access", "publish", "unpublish"].flatMap((key) => packageConfig[key]).filter(Boolean); + + for (const group of groups) { + s.add(group); + } + } + + return [...s]; } - private get requiredGroup(): string | null { - return this.parsedConfig.authorizedGroup ? this.parsedConfig.authorizedGroup : null; + /** + * Get the logged user's full groups + * + * Our JWT do not contain the user's full groups, so we need to get them from the config. + * + * @param user + * @returns + */ + getLoggedUserGroups(user: RemoteUser): string[] { + return [...user.real_groups, ...defaultLoggedUserRoles]; + } + + /** + * Get the non-logged user's full groups + * + * @param user + * @returns + */ + getNonLoggedUserGroups(user: RemoteUser): string[] { + return [...user.real_groups, ...defaultNonLoggedUserRoles]; } /** @@ -60,7 +117,7 @@ export class AuthCore { */ getUserGroups(username: string): string[] | undefined { let groupUsers; - if ((groupUsers = this.parsedConfig.groupUsers)) { + if ((groupUsers = this.groupUsers)) { return Object.keys(groupUsers).filter((group) => { return groupUsers[group].includes(username); }); @@ -68,25 +125,19 @@ export class AuthCore { } // get unique and sorted groups - filterRealGroups(username: string, groups: string[]): string[] { - const relevantGroups = groups.filter((group) => group in this.configuredGroups); - - relevantGroups.push(username); - - // put required group at the end - if (this.requiredGroup) { - relevantGroups.push(this.requiredGroup); - } + filterRealGroups(username: string, groups: string[] = []): string[] { + const authenticatedGroups = typeof this.authenticatedGroups === "boolean" ? [] : this.authenticatedGroups; - return relevantGroups.filter((val, index, self) => self.indexOf(val) === index).sort(); - } + const relevantGroups = groups.filter( + (group) => this.configuredGroups.includes(group) || authenticatedGroups.includes(group) + ); - createAuthenticatedUser(username: string, realGroups: string[]): RemoteUser { - return createRemoteUser(username, realGroups); - } + /** + * add the user to the groups + */ + relevantGroups.push(username); - createAnonymousUser(): RemoteUser { - return createAnonymousRemoteUser(); + return relevantGroups.filter((value, index, self) => self.indexOf(value) === index).sort(); } /** @@ -96,138 +147,157 @@ export class AuthCore { * @param groups * @returns true if the user is allowed to access the registry */ - authenticate(username: string | void, groups: string[] = []): boolean { + authenticate(username: string, groups: string[] = []): boolean { if (!username) return false; - if (this.requiredGroup) { - if (username !== this.requiredGroup && !groups.includes(this.requiredGroup)) { - logger.error( - { username, requiredGroup: this.requiredGroup }, - `access denied: User "@{username}" is not a member of "@{requiredGroup}"` - ); - return false; - } + debug("authenticate user %s with groups %j, required groups: %j", username, groups, this.authenticatedGroups); + + let authenticated: boolean; + + if (this.authenticatedGroups === true) { + authenticated = groups.length > 0; + } else if (this.authenticatedGroups === false) { + authenticated = true; + } else { + /** + * if authenticatedGroups is an array, the user must be in one of the groups + */ + authenticated = this.authenticatedGroups.some((group) => username === group || groups.includes(group)); } - // empty group is allowed - return true; + return authenticated; } - issueNpmToken(user: RemoteUser, providerToken: string): Promise { + issueNpmToken(username: string, realGroups: string[], providerToken: Token): Promise { const jwtSignOptions = this.security.api.jwt?.sign; if (isAESLegacy(this.security) || !jwtSignOptions) { - const npmToken = this.legacyEncrypt(user, providerToken); + const npmToken = this.legacyEncrypt(username, realGroups, providerToken); if (!npmToken) { - throw new Error("Failed to encrypt npm token"); + throw new Error("Internal server error, failed to encrypt npm token"); } return Promise.resolve(npmToken); } else { - return this.signJWT(user, providerToken, jwtSignOptions); + return this.signJWT(username, realGroups, jwtSignOptions); } } - async verifyNpmToken(token: string): Promise { + /** + * Verify the npm token + * + * @param token + * @returns + */ + async verifyNpmToken(token: string): Promise { const jwtSignOptions = this.security.api.jwt?.sign; // if jwt is not enabled, use legacy encryption // the token is the password in basic auth // decode it and get the token from the payload if (isAESLegacy(this.security) || !jwtSignOptions) { - const payload = this.legacyDecode(token); - - if (!payload.token) { - throw new Error("Invalid payload token"); + const legacyUser = this.legacyDecode(token); + if (accessTokenOnly(legacyUser)) { + const { accessToken } = legacyUser; + + const { name, groups } = await this.provider.getUserinfo(accessToken); + if (!this.authenticate(name, groups)) { + return false; + } + + return { name: name, realGroups: this.filterRealGroups(name, groups) }; + } else { + if (!isNowBefore(legacyUser.expiresAt)) { + return false; + } + + return { name: legacyUser.name, realGroups: legacyUser.realGroups }; } - - const name = await this.provider.getUsername(payload.token); - - return { ...payload, name }; } else { return this.verifyJWT(token); } } // The ui token of verdaccio is always a JWT token. - issueUiToken(user: RemoteUser, providerToken: string): Promise { + issueUiToken(username: string, realGroups: string[]): Promise { const jwtSignOptions = this.security.web.sign; - return this.signJWT(user, providerToken, jwtSignOptions); + return this.signJWT(username, realGroups, jwtSignOptions); } verifyUiToken(token: string): User { return this.verifyJWT(token); } - private signJWT(user: RemoteUser, providerToken: string, jwtSignOptions: JWTSignOptions): Promise { + private signJWT(username: string, realGroups: string[], jwtSignOptions: JWTSignOptions): Promise { + if (!this.auth) { + throw new ReferenceError("Unexpected error, auth is not initialized"); + } + // providerToken is not needed in the token, we use jwt to check the expiration // remove groups from the user, so that the token is smaller - const cleanedUser: RemoteUser = { ...user, groups: [] }; - return signPayload(cleanedUser, this.secret, jwtSignOptions); + const remoteUser: RemoteUser = { + name: username, + real_groups: [...realGroups], + groups: [], + }; + return this.auth.jwtEncrypt(remoteUser, jwtSignOptions); } private verifyJWT(token: string): User { // verifyPayload // use internal function to avoid error handling - return verifyPayload(token, this.secret) as User; - } - - private legacyEncrypt(user: RemoteUser, providerToken: string): string { - // encode the user info to get a token - // save it to the final token, so that we can get the user info from aes token. - const payloadToken = this.legacyEncode(user, providerToken); + const remoteUser = verifyPayload(token, this.secret); - // use internal function to encrypt token - const token = aesEncrypt(buildUser(user.name as string, payloadToken), this.secret); - - if (!token) { - throw new Error("Failed to encrypt token"); - } - - // the return value in verdaccio 5 is a buffer, we need to convert it to a string - return typeof token === "string" ? token : Buffer.from(token).toString("base64"); + return { + name: remoteUser.name as string, + realGroups: [...remoteUser.real_groups], + }; } - // decode the legacy token - private legacyDecrypt(value: string): User { - const payload = aesDecrypt(value, this.secret); - if (!payload) { - throw new Error("Failed to decrypt token"); + private legacyEncrypt(username: string, realGroups: string[], providerToken: Token): string { + if (!this.auth) { + throw new ReferenceError("Unexpected error, auth is not initialized"); } - const res = parseBasicPayload(payload); - if (!res) { - throw new Error("Failed to parse token"); - } + // encode the user info as a token, save it to the final token. + let u: LegacyUser; - let u: Omit; - try { - u = JSON.parse(Buffer.from(res.password, "base64").toString("utf8")); - } catch { + if (typeof providerToken === "string") { u = { - real_groups: [], + accessToken: providerToken, }; + } else { + // legacy token does not have a expiration time + // we use the provider expire time or token to check if the token is still valid + u = providerToken.expiresAt + ? { + name: username, + realGroups: [...realGroups], + expiresAt: providerToken.expiresAt, + } + : { + accessToken: providerToken.accessToken, + }; } + const payloadToken = this.legacyEncode(u); - return { name: res.user, real_groups: u.real_groups ?? [], token: u.token }; - } + // use internal function to encrypt token + const token = this.auth.aesEncrypt(buildUser(username, payloadToken)); - private legacyEncode(user: RemoteUser, providerToken: string): string { - // legacy token does not have a expiration time - // we use the provider token to check if the token is still valid - // remove name and groups from user, to reduce token size - const u: Omit = { - real_groups: user.real_groups, - token: providerToken, - }; + if (!token) { + throw new Error("Internal server error, failed to encrypt token"); + } + + // the return value in verdaccio 5 is a buffer, we need to convert it to a string + return typeof providerToken === "string" ? token : base64Encode(token); + } - // save groups and token in password field - return Buffer.from(JSON.stringify(u)).toString("base64"); + private legacyEncode(user: LegacyUser): string { + return base64Encode(JSON.stringify(user)); } - private legacyDecode(payloadToken: string): Omit { - const u: Omit = JSON.parse(Buffer.from(payloadToken, "base64").toString("utf8")); - return { real_groups: u.real_groups ?? [], token: u.token }; + private legacyDecode(payloadToken: string): LegacyUser { + return JSON.parse(base64Decode(payloadToken)); } } diff --git a/src/server/plugin/AuthProvider.ts b/src/server/plugin/AuthProvider.ts index d6dee18..8f603e6 100644 --- a/src/server/plugin/AuthProvider.ts +++ b/src/server/plugin/AuthProvider.ts @@ -7,7 +7,7 @@ export interface ConfigHolder { providerType?: string; issuer?: string; configurationUri?: string; - scope?: string; + scope: string; usernameClaim: string; groupsClaim?: string; authorizationEndpoint?: string; @@ -20,11 +20,26 @@ export interface ConfigHolder { packages: Record; } +export type TokenSet = { + accessToken: string; + idToken?: string; + // We not use the expires_in field + // because it is only accurate when the access token response is received + expiresAt?: number; +}; + +// when token is string, it is a access token +export type Token = TokenSet | string; + +export type ProviderUser = { + name: string; + groups?: string[]; +}; + export interface AuthProvider { getId(): string; - getLoginUrl(req: Request): string; + getLoginUrl(request: Request): string; - getToken(callbackReq: Request): Promise; - getUsername(providerToken: string): Promise; - getGroups(providerToken: string): Promise; + getToken(callbackRequest: Request): Promise; + getUserinfo(providerToken: Token): Promise; } diff --git a/src/server/plugin/Config.ts b/src/server/plugin/Config.ts index 6f2c367..3e76e75 100644 --- a/src/server/plugin/Config.ts +++ b/src/server/plugin/Config.ts @@ -1,11 +1,12 @@ +import process from "node:process"; + import type { Config as IncorrectVerdaccioConfig, PackageAccess as IncorrectVerdaccioPackageAccess, Security, } from "@verdaccio/types"; import merge from "deepmerge"; -import process from "process"; -import { array, lazy, mixed, object, Schema, string } from "yup"; +import { array, boolean, lazy, mixed, object, Schema, string } from "yup"; import { pluginKey } from "@/constants"; @@ -62,7 +63,7 @@ const defaultSecurity = { }, }; -function getEnvValue(name: any) { +function getEnvironmentValue(name: any) { const value = process.env[String(name)]; if (value === "true" || value === "false") { return value === "true"; @@ -71,26 +72,29 @@ function getEnvValue(name: any) { } function getConfigValue(config: Config, key: string, schema: Pick): T { - const valueOrEnvName = config.auth?.[pluginKey]?.[key] ?? config.middlewares?.[pluginKey]?.[key]; + const valueOrEnvironmentName = config.auth?.[pluginKey]?.[key] ?? config.middlewares?.[pluginKey]?.[key]; - const value = getEnvValue(valueOrEnvName) ?? valueOrEnvName; + const value = getEnvironmentValue(valueOrEnvironmentName) ?? valueOrEnvironmentName; try { schema.validateSync(value); - } catch (e: any) { + } catch (error: any) { let message: string; - if (e.errors) { + // eslint-disable-next-line unicorn/prefer-ternary + if (error.errors) { // ValidationError - message = e.errors[0]; + message = error.errors[0]; } else { - message = e.message || e; + message = error.message || error; } logger.error( { pluginKey, key, message }, 'invalid configuration at "auth.@{pluginKey}.@{key}": @{message} — Please check your verdaccio config.' ); + + // eslint-disable-next-line unicorn/no-process-exit process.exit(1); } @@ -100,9 +104,9 @@ function getConfigValue(config: Config, key: string, schema: Pick(this.config, "scope", string().optional()); + return getConfigValue(this.config, "scope", string().optional()) ?? "openid"; } public get clientId() { @@ -175,28 +179,24 @@ export class ParsedPluginConfig { return getConfigValue(this.config, "groups-claim", string().optional()); } - public get authorizedGroup() { - return ( - getConfigValue( - this.config, - "authorized-group", - mixed().oneOf([string(), false]).optional() - ) ?? false - ); + public get authorizedGroups() { + return getConfigValue(this.config, "authorized-groups", mixed().optional()) ?? false; } public get groupUsers() { return getConfigValue | undefined>( this.config, "group-users", - lazy((val) => { - switch (typeof val) { - case "object": + lazy((value) => { + switch (typeof value) { + case "object": { return object( - Object.fromEntries(Object.keys(val).map((key) => [key, array().of(string()).min(1).required()])) + Object.fromEntries(Object.keys(value).map((key) => [key, array(string()).compact().min(1).required()])) ).optional(); - default: + } + default: { return object().optional(); + } } }) ); diff --git a/src/server/plugin/PatchHtml.ts b/src/server/plugin/PatchHtml.ts index 472b95f..a113148 100644 --- a/src/server/plugin/PatchHtml.ts +++ b/src/server/plugin/PatchHtml.ts @@ -1,6 +1,7 @@ +import fs from "node:fs"; + import type { IPluginMiddleware } from "@verdaccio/types"; import type { Application, Handler } from "express"; -import fs from "fs"; import { publicRoot, staticPath } from "../constants"; diff --git a/src/server/plugin/Plugin.ts b/src/server/plugin/Plugin.ts index 11a41da..510a4d3 100644 --- a/src/server/plugin/Plugin.ts +++ b/src/server/plugin/Plugin.ts @@ -16,6 +16,7 @@ import { CliFlow, WebFlow } from "../flows"; import logger, { debug, setLogger } from "../logger"; import { OpenIDConnectAuthProvider } from "../openid"; import { AuthCore, User } from "./AuthCore"; +import type { AuthProvider } from "./AuthProvider"; import { Config, PackageAccess, ParsedPluginConfig } from "./Config"; import { PatchHtml } from "./PatchHtml"; import { ServeStatic } from "./ServeStatic"; @@ -25,7 +26,7 @@ import { ServeStatic } from "./ServeStatic"; */ export class Plugin implements IPluginMiddleware, IPluginAuth { private readonly parsedConfig: ParsedPluginConfig; - private readonly provider: OpenIDConnectAuthProvider; + private readonly provider: AuthProvider; private readonly core: AuthCore; constructor(private readonly config: Config, params: { logger: Logger }) { @@ -65,67 +66,54 @@ export class Plugin implements IPluginMiddleware, IPluginAuth { */ async authenticate(username: string, token: string, callback: AuthCallback): Promise { if (!username || !token) { + debug("username or token is empty, skip authentication"); + // set error to null, next auth plugin will be called - return callback(null, false); + callback(null, false); + return; } debug("authenticating user, username: %s, token: %s", username, token); - let user: User; + let user: User | boolean; try { user = await this.core.verifyNpmToken(token); - - debug("user: %o", user); } catch (e: any) { debug(`%s. user: "%s", token: "%s"`, e.message, username, token); // the token is not valid by us, let the next auth plugin to handle it - return callback(null, false); + callback(null, false); + return; } - if (!user.name) { - debug(`invalid token: %s. user: "%s"`, token, username); - return callback(null, false); + /** + * the result is false, means the token is not authenticated + */ + if (user === false) { + callback(errorUtils.getForbidden(`User "${username}" are not authenticated.`), false); + return; } + debug("user: %j", user); + if (username !== user.name) { logger.warn( { expected: user.name, actual: username }, `invalid username: expected "@{expected}", actual "@{actual}"` ); - return callback(errorUtils.getForbidden("Invalid username."), false); - } - - let groups: string[] | undefined; - if (Array.isArray(user.real_groups)) { - groups = user.real_groups; + callback(errorUtils.getForbidden("Invalid username."), false); + return; } - if (!groups) { - groups = this.core.getUserGroups(username); - } - - if (!groups && user.token) { - try { - groups = await this.provider.getGroups(user.token); - } catch (e: any) { - return callback(errorUtils.getForbidden(e.message), false); - } - } - - if (this.core.authenticate(username, groups)) { - return callback(null, groups || []); - } else { - return callback(errorUtils.getForbidden(`User "${username}" are not authenticated.`), false); - } + callback(null, user.realGroups); } /** * IPluginAuth */ allow_access(user: RemoteUser, config: AllowAccess & PackageAccess, callback: AuthAccessCallback): void { - debug("check access: %s (%o) -> %s", user.name, user.real_groups, config.name); + debug("check access: %s (%j) -> %s", user.name, user.real_groups, config.name); const grant = this.checkPackageAccess(user, config.access); if (!grant) { @@ -138,7 +126,7 @@ export class Plugin implements IPluginMiddleware, IPluginAuth { * IPluginAuth */ allow_publish(user: RemoteUser, config: AllowAccess & PackageAccess, callback: AuthAccessCallback): void { - debug("check publish: %s (%o) -> %s", user.name, user.real_groups, config.name); + debug("check publish: %s (%j) -> %s", user.name, user.real_groups, config.name); const grant = this.checkPackageAccess(user, config.publish || config.access); @@ -156,7 +144,7 @@ export class Plugin implements IPluginMiddleware, IPluginAuth { * IPluginAuth */ allow_unpublish(user: RemoteUser, config: AllowAccess & PackageAccess, callback: AuthAccessCallback): void { - debug("check publish: %s (%o) -> %s", user.name, user.real_groups, config.name); + debug("check publish: %s (%j) -> %s", user.name, user.real_groups, config.name); const grant = this.checkPackageAccess(user, config.unpublish || config.access); @@ -174,22 +162,26 @@ export class Plugin implements IPluginMiddleware, IPluginAuth { return true; } - let userGroups: string[]; - - // check if user is authenticated - if (this.core.authenticate(user.name, user.real_groups)) { - const authUser = this.core.createAuthenticatedUser(user.name as string, user.real_groups); - userGroups = authUser.groups; - } else { - // usually, user groups is empty with our jwt - // but with lagacy token, user groups is not empty - if (user.groups && user.groups.length > 0) { - userGroups = user.groups; + let groups: string[]; + if (user.name) { + // check if user is authenticated + // the authenticated groups may change after user login + if (this.core.authenticate(user.name, user.real_groups)) { + groups = this.core.getLoggedUserGroups(user); } else { - const unauthUser = this.core.createAnonymousUser(); - userGroups = unauthUser.groups; + logger.warn( + { username: user.name, groups: JSON.stringify(user.real_groups) }, + `"@{username}" with groups @{groups} is not authenticated for now, use non-authenticated groups instead.` + ); + groups = this.core.getNonLoggedUserGroups(user); } + } else { + // anonymous user + groups = user.groups; } - return requiredGroups.some((group) => userGroups.includes(group)); + + debug("user: %o, required groups: %j, actual groups: %j", user.name, requiredGroups, groups); + + return requiredGroups.some((group) => groups.includes(group)); } } diff --git a/src/server/plugin/utils.ts b/src/server/plugin/utils.ts new file mode 100644 index 0000000..8fd9ea2 --- /dev/null +++ b/src/server/plugin/utils.ts @@ -0,0 +1,74 @@ +import { Token } from "./AuthProvider"; + +/** + * Encode a string to base64 + * + * @param str + * @returns + */ +export function base64Encode(str: string): string { + if (Buffer.isEncoding("base64url")) { + return Buffer.from(str, "utf8").toString("base64url"); + } + return Buffer.from(str, "utf8").toString("base64").replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_"); +} + +/** + * Decode a base64 string + * + * @param str + * @returns + */ +export function base64Decode(str: string): string { + return Buffer.from(str, "base64").toString("utf8"); +} + +/** + * Get a hash of the token + * + * @param token + * @returns {string} + */ +export function hashToken(token: Token): string { + if (typeof token === "string") return token; + + return base64Encode(JSON.stringify(token)).slice(0, 16); +} + +/** + * Get the access token from the token set + * + * @param token + * @returns {string} + */ +export function extractAccessToken(token: Token): string { + if (typeof token === "string") return token; + + return token.accessToken; +} + +/** + * Get the claims from the id token + * + * @param idToken + * @returns + */ +export function getClaimsFromIdToken(idToken: string): Record { + const splits = idToken.split("."); + if (splits.length !== 3) { + throw new TypeError("Invalid id token"); + } + + return JSON.parse(base64Decode(splits[1])); +} + +/** + * Check if the current time is before the expireAt time + * + * @param expireAt + * @returns + */ +export function isNowBefore(expireAt: number): boolean { + const now = Math.floor(Date.now() / 1000); + return now < expireAt; +} diff --git a/yarn.lock b/yarn.lock index 9ee81ed..57faf34 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,7 +10,7 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.18.6": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": version "7.18.6" resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== @@ -18,9 +18,9 @@ "@babel/highlight" "^7.18.6" "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": - version "7.20.14" - resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.20.14.tgz#4106fc8b755f3e3ee0a0a7c27dde5de1d2b2baf8" - integrity sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw== + version "7.21.0" + resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" + integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== "@babel/core@^7.21.0": version "7.21.0" @@ -43,15 +43,6 @@ json5 "^2.2.2" semver "^6.3.0" -"@babel/generator@^7.20.7": - version "7.20.14" - resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.20.14.tgz#9fa772c9f86a46c6ac9b321039400712b96f64ce" - integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== - dependencies: - "@babel/types" "^7.20.7" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - "@babel/generator@^7.21.0", "@babel/generator@^7.21.1": version "7.21.1" resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" @@ -88,21 +79,7 @@ lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": - version "7.20.12" - resolved "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz#4349b928e79be05ed2d1643b20b99bb87c503819" - integrity sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-member-expression-to-functions" "^7.20.7" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" - -"@babel/helper-create-class-features-plugin@^7.21.0": +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": version "7.21.0" resolved "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz#64f49ecb0020532f19b1d014b03bccaa1ab85fb9" integrity sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ== @@ -117,12 +94,12 @@ "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": - version "7.20.5" - resolved "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" - integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== + version "7.21.0" + resolved "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz#53ff78472e5ce10a52664272a239787107603ebb" + integrity sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.2.1" + regexpu-core "^5.3.1" "@babel/helper-define-polyfill-provider@^0.3.3": version "0.3.3" @@ -148,15 +125,7 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== - dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" - -"@babel/helper-function-name@^7.21.0": +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": version "7.21.0" resolved "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== @@ -171,14 +140,7 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-member-expression-to-functions@^7.20.7": - version "7.20.7" - resolved "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" - integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== - dependencies: - "@babel/types" "^7.20.7" - -"@babel/helper-member-expression-to-functions@^7.21.0": +"@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": version "7.21.0" resolved "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz#319c6a940431a133897148515877d2f3269c3ba5" integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== @@ -192,21 +154,7 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11": - version "7.20.11" - resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" - integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.10" - "@babel/types" "^7.20.7" - -"@babel/helper-module-transforms@^7.21.0": +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.0", "@babel/helper-module-transforms@^7.21.2": version "7.21.2" resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== @@ -285,12 +233,7 @@ resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== - -"@babel/helper-validator-option@^7.21.0": +"@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0": version "7.21.0" resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== @@ -323,12 +266,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.20.13", "@babel/parser@^7.20.7": - version "7.20.15" - resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.20.15.tgz#eec9f36d8eaf0948bb88c87a46784b5ee9fd0c89" - integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg== - -"@babel/parser@^7.21.0", "@babel/parser@^7.21.2": +"@babel/parser@^7.20.7", "@babel/parser@^7.21.0", "@babel/parser@^7.21.2": version "7.21.2" resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== @@ -368,11 +306,11 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.20.7" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz#92592e9029b13b15be0f7ce6a7aedc2879ca45a7" - integrity sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ== + version "7.21.0" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" + integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.7" + "@babel/helper-create-class-features-plugin" "^7.21.0" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-class-static-block" "^7.14.5" @@ -444,9 +382,9 @@ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": - version "7.20.7" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz#49f2b372519ab31728cc14115bb0998b15bfda55" - integrity sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ== + version "7.21.0" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" @@ -461,12 +399,12 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.20.5" - resolved "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz#309c7668f2263f1c711aa399b5a9a6291eef6135" - integrity sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ== + version "7.21.0" + resolved "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" + integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.20.5" + "@babel/helper-create-class-features-plugin" "^7.21.0" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" @@ -614,21 +552,21 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-block-scoping@^7.20.2": - version "7.20.14" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.14.tgz#2f5025f01713ba739daf737997308e0d29d1dd75" - integrity sha512-sMPepQtsOs5fM1bwNvuJJHvaCfOEQfmc01FGw0ELlTpTJj5Ql/zuNRRldYhAPys4ghXdBIQJbRVYi44/7QflQQ== + version "7.21.0" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" + integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-classes@^7.20.2": - version "7.20.7" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz#f438216f094f6bb31dc266ebfab8ff05aecad073" - integrity sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ== + version "7.21.0" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" + integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-compilation-targets" "^7.20.7" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" + "@babel/helper-function-name" "^7.21.0" "@babel/helper-optimise-call-expression" "^7.18.6" "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-replace-supers" "^7.20.7" @@ -674,11 +612,11 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-for-of@^7.18.8": - version "7.18.8" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" - integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== + version "7.21.0" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz#964108c9988de1a60b4be2354a7d7e245f36e86e" + integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-function-name@^7.18.9": version "7.18.9" @@ -712,11 +650,11 @@ "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-transform-modules-commonjs@^7.19.6": - version "7.20.11" - resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz#8cb23010869bf7669fd4b3098598b6b2be6dc607" - integrity sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw== + version "7.21.2" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz#6ff5070e71e3192ef2b7e39820a06fb78e3058e7" + integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== dependencies: - "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-module-transforms" "^7.21.2" "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-simple-access" "^7.20.2" @@ -951,10 +889,15 @@ "@babel/helper-validator-option" "^7.21.0" "@babel/plugin-transform-typescript" "^7.21.0" +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.npmmirror.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + "@babel/runtime@^7.15.4", "@babel/runtime@^7.8.4": - version "7.20.13" - resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" - integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== + version "7.21.0" + resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" + integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== dependencies: regenerator-runtime "^0.13.11" @@ -967,23 +910,7 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/traverse@^7.20.10", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7": - version "7.20.13" - resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" - integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.13" - "@babel/types" "^7.20.7" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": +"@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": version "7.21.2" resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== @@ -999,16 +926,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.4.4": - version "7.20.7" - resolved "https://registry.npmmirror.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" - integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@babel/types@^7.21.0", "@babel/types@^7.21.2": +"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.4.4": version "7.21.2" resolved "https://registry.npmmirror.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== @@ -1017,6 +935,13 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@eslint-community/eslint-utils@^4.1.2": + version "4.2.0" + resolved "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz#a831e6e468b4b2b5ae42bf658bea015bf10bc518" + integrity sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ== + dependencies: + eslint-visitor-keys "^3.3.0" + "@eslint/eslintrc@^2.0.0": version "2.0.0" resolved "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.0.0.tgz#943309d8697c52fc82c076e90c1c74fbbe69dbff" @@ -1298,7 +1223,7 @@ "@types/express-serve-static-core@^4.17.33": version "4.17.33" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz#de35d30a9d637dc1450ad18dd583d75d5733d543" + resolved "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz#de35d30a9d637dc1450ad18dd583d75d5733d543" integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== dependencies: "@types/node" "*" @@ -1307,7 +1232,7 @@ "@types/express@^4.17.17": version "4.17.17" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" + resolved "https://registry.npmmirror.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== dependencies: "@types/body-parser" "*" @@ -1358,9 +1283,14 @@ integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== "@types/node@*": - version "18.11.18" - resolved "https://registry.npmmirror.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f" - integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA== + version "18.15.0" + resolved "https://registry.npmmirror.com/@types/node/-/node-18.15.0.tgz#286a65e3fdffd691e170541e6ecb0410b16a38be" + integrity sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w== + +"@types/normalize-package-data@^2.4.0": + version "2.4.1" + resolved "https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== "@types/qs@*": version "6.9.7" @@ -1390,9 +1320,9 @@ integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== "@types/serve-static@*": - version "1.15.0" - resolved "https://registry.npmmirror.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" - integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== + version "1.15.1" + resolved "https://registry.npmmirror.com/@types/serve-static/-/serve-static-1.15.1.tgz#86b1753f0be4f9a1bee68d459fcda5be4ea52b5d" + integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== dependencies: "@types/mime" "*" "@types/node" "*" @@ -1481,21 +1411,21 @@ "@typescript-eslint/types" "5.54.1" eslint-visitor-keys "^3.3.0" -"@verdaccio/auth@^6.0.0-6-next.42": - version "6.0.0-6-next.42" - resolved "https://registry.npmmirror.com/@verdaccio/auth/-/auth-6.0.0-6-next.42.tgz#89de789e6b777c2deac3d12cbed8c2b31cf9c029" - integrity sha512-idryl5U71Yu+IYnXdIWZ9kmT2NRkvD8BOqElgsc6x6AcuaQOPuWrpinSlWGboBJEbgEEu2LXWoFQDWRZJ4QY1Q== +"@verdaccio/auth@^6.0.0-6-next.44": + version "6.0.0-6-next.44" + resolved "https://registry.npmmirror.com/@verdaccio/auth/-/auth-6.0.0-6-next.44.tgz#8bc77a895fb258e3dc62422ef5819c6d30c94a56" + integrity sha512-yl67zlP9cto42iM2Ve3JbbkldELXDegPDiJWEAjUiv8DZSsw6LPxzDt1LQHVpIE0V1tj4GrucLso7FuiRSX4ag== dependencies: - "@verdaccio/config" "6.0.0-6-next.63" - "@verdaccio/core" "6.0.0-6-next.63" - "@verdaccio/loaders" "6.0.0-6-next.32" - "@verdaccio/logger" "6.0.0-6-next.31" + "@verdaccio/config" "6.0.0-6-next.65" + "@verdaccio/core" "6.0.0-6-next.65" + "@verdaccio/loaders" "6.0.0-6-next.34" + "@verdaccio/logger" "6.0.0-6-next.33" "@verdaccio/signature" "6.0.0-6-next.2" - "@verdaccio/utils" "6.0.0-6-next.31" + "@verdaccio/utils" "6.0.0-6-next.33" debug "4.3.4" express "4.18.2" lodash "4.17.21" - verdaccio-htpasswd "11.0.0-6-next.33" + verdaccio-htpasswd "11.0.0-6-next.35" "@verdaccio/commons-api@10.2.0": version "10.2.0" @@ -1513,23 +1443,23 @@ http-errors "1.8.0" http-status-codes "2.1.4" -"@verdaccio/config@6.0.0-6-next.63", "@verdaccio/config@^6.0.0-6-next.63": - version "6.0.0-6-next.63" - resolved "https://registry.npmmirror.com/@verdaccio/config/-/config-6.0.0-6-next.63.tgz#68d2917eb8a2b315c0e46311230bf0cba3692cdc" - integrity sha512-LTEvzmbsXOXyxAzch28eIRMPEGy7ePWwRjV/c3rDNYdT+U5T4XNvBDyxGjwOdiiKoa5SKLcFufmrczkBFTJzqw== +"@verdaccio/config@6.0.0-6-next.65", "@verdaccio/config@^6.0.0-6-next.65": + version "6.0.0-6-next.65" + resolved "https://registry.npmmirror.com/@verdaccio/config/-/config-6.0.0-6-next.65.tgz#3ef9d2bd492d14bf888900b98db89106635eb5a2" + integrity sha512-f6wUZH8k8FbhYqvVKWROx1yK60azcqITRPPa3wn56AjCdoni6xv2EJ2D1j7gf1Irh9Df4eMDqJ95Rrefo26elw== dependencies: - "@verdaccio/core" "6.0.0-6-next.63" - "@verdaccio/utils" "6.0.0-6-next.31" + "@verdaccio/core" "6.0.0-6-next.65" + "@verdaccio/utils" "6.0.0-6-next.33" debug "4.3.4" js-yaml "4.1.0" lodash "4.17.21" minimatch "3.1.2" yup "0.32.11" -"@verdaccio/core@6.0.0-6-next.63", "@verdaccio/core@^6.0.0-6-next.63": - version "6.0.0-6-next.63" - resolved "https://registry.npmmirror.com/@verdaccio/core/-/core-6.0.0-6-next.63.tgz#c56fa84a3b26ea58c233193c2fcd888726493276" - integrity sha512-9Eki5+MII6jQ3INyqd5PZzsnlXekE0lYlS5mBNE8lB/Hp/YvWt2jlFhhbIouuJRL5Xox5KYLo8ekBECTuZskcg== +"@verdaccio/core@6.0.0-6-next.65", "@verdaccio/core@^6.0.0-6-next.65": + version "6.0.0-6-next.65" + resolved "https://registry.npmmirror.com/@verdaccio/core/-/core-6.0.0-6-next.65.tgz#c6f77136f2af273f3db7a9205f4eafa3498e3178" + integrity sha512-HQl/7gYvpar5vhu2Z6U59bbdn4F3jzTmIUVgPIr7C69tVx33aY7ubVaYpB0j8OZhJx3Yn0Foo5NSkElWtJ3HzA== dependencies: ajv "8.11.2" core-js "3.28.0" @@ -1559,12 +1489,12 @@ dependencies: lockfile "1.0.4" -"@verdaccio/loaders@6.0.0-6-next.32": - version "6.0.0-6-next.32" - resolved "https://registry.npmmirror.com/@verdaccio/loaders/-/loaders-6.0.0-6-next.32.tgz#47f47e3465dc3f94cf1119e56ecb04f78de63e6f" - integrity sha512-E98bibXvJ8tG+ZDYxi8g6TBjDc9IMj3i8RoXIm9BwSNCeW5Y+HiKHovIrkCDCIEfOU7LSe4smn4LW81SxmLu+Q== +"@verdaccio/loaders@6.0.0-6-next.34": + version "6.0.0-6-next.34" + resolved "https://registry.npmmirror.com/@verdaccio/loaders/-/loaders-6.0.0-6-next.34.tgz#949012845454d44dfc5d17ac6a6be09eb429dfa5" + integrity sha512-ElSFp1D/DDdivsqee5dgmz31VZ1bBKbZPPJSKf3ajsfu878ujV6hRGmkuTLo9n3GHeaS44JFmox4GmVilmcNdA== dependencies: - "@verdaccio/logger" "6.0.0-6-next.31" + "@verdaccio/logger" "6.0.0-6-next.33" debug "4.3.4" lodash "4.17.21" @@ -1582,20 +1512,20 @@ lowdb "1.0.0" mkdirp "1.0.4" -"@verdaccio/logger-7@6.0.0-6-next.8": - version "6.0.0-6-next.8" - resolved "https://registry.npmmirror.com/@verdaccio/logger-7/-/logger-7-6.0.0-6-next.8.tgz#c249842e436ffd5cfc88ec40a26e00b18e9c1086" - integrity sha512-M79wnDtQIZ2xrlueehU3WB8UoQUu2iANHnLJs32OoNoqMRDibqvaAD54FfqPuuC4R8JGAZM+SIX7/bwrnefJvQ== +"@verdaccio/logger-7@6.0.0-6-next.10": + version "6.0.0-6-next.10" + resolved "https://registry.npmmirror.com/@verdaccio/logger-7/-/logger-7-6.0.0-6-next.10.tgz#4c266e5153bf638a8112ac4fdf92f226579c490d" + integrity sha512-PhikftJgc3HGUCzZkcuKAJ9kjiKDL+68Q12OBZLEZeRoY4Yj5ZoFzQqf0647mhvL/i5ZzgM1XT1PscYL2AQg8A== dependencies: - "@verdaccio/logger-commons" "6.0.0-6-next.31" + "@verdaccio/logger-commons" "6.0.0-6-next.33" pino "7.11.0" -"@verdaccio/logger-commons@6.0.0-6-next.31": - version "6.0.0-6-next.31" - resolved "https://registry.npmmirror.com/@verdaccio/logger-commons/-/logger-commons-6.0.0-6-next.31.tgz#9da2e9c09ddb46d6e43b508705084071bcb5dc69" - integrity sha512-Na5WIXh4n52+2JW/S3aPKf9mdbWCfDKSweCDAH/bP5xoOZWa22P/L1yYP6sIaUjWoAb4xEgf09KL9/gOB2hfBw== +"@verdaccio/logger-commons@6.0.0-6-next.33": + version "6.0.0-6-next.33" + resolved "https://registry.npmmirror.com/@verdaccio/logger-commons/-/logger-commons-6.0.0-6-next.33.tgz#2ec56b3eeeb621b39fa17111562b43a388716af4" + integrity sha512-HB3ABs9csHbjCfOs7hRVyo01IP2oaFd9Duta887q/L6jOfP7hvKyxFEz0qohppxO741hCFKWMQ9JxZBZnGftzw== dependencies: - "@verdaccio/core" "6.0.0-6-next.63" + "@verdaccio/core" "6.0.0-6-next.65" "@verdaccio/logger-prettify" "6.0.0-6-next.9" colorette "2.0.19" debug "4.3.4" @@ -1611,23 +1541,23 @@ pino-abstract-transport "1.0.0" sonic-boom "3.2.1" -"@verdaccio/logger@6.0.0-6-next.31": - version "6.0.0-6-next.31" - resolved "https://registry.npmmirror.com/@verdaccio/logger/-/logger-6.0.0-6-next.31.tgz#66051d5fb58b0dfc697995b130e9bce34be30736" - integrity sha512-2Bhk80/DQ3iBdwDyGSbSnUsju/Ccp1fC8gMjm7gLhFtH2GBmYN2jIlR9XD9h8mTpsouAXN3f3Ak0wTQABmzgKQ== +"@verdaccio/logger@6.0.0-6-next.33": + version "6.0.0-6-next.33" + resolved "https://registry.npmmirror.com/@verdaccio/logger/-/logger-6.0.0-6-next.33.tgz#e656e51740b4ffe999af3223e1e41763640eab7a" + integrity sha512-G+0Bmw+Tf3EXHlGy1ZqFYRkQYTyKip6a081xaiijdqtP+ll/Zoc1IVpmdwOrn+FaoFnW+GQqK/FIGGz862PI2A== dependencies: - "@verdaccio/logger-commons" "6.0.0-6-next.31" + "@verdaccio/logger-commons" "6.0.0-6-next.33" pino "8.10.0" -"@verdaccio/middleware@6.0.0-6-next.42": - version "6.0.0-6-next.42" - resolved "https://registry.npmmirror.com/@verdaccio/middleware/-/middleware-6.0.0-6-next.42.tgz#898436f268625164819ededfd143f308fa4057e2" - integrity sha512-Hk80hxxQM//jUq0Xrn328x2OKJh4Voz1PCeDe87A0Vt+c2VOoG2qOtcQG0/HukDVkZv5k3dnE4wKLLjDnlA/Vg== +"@verdaccio/middleware@6.0.0-6-next.44": + version "6.0.0-6-next.44" + resolved "https://registry.npmmirror.com/@verdaccio/middleware/-/middleware-6.0.0-6-next.44.tgz#66e04f1b1b3e78a6287ffb3af73b997366610352" + integrity sha512-CGtVb8r0PYecMGzFEuLKPLCKDWuYCEiUxTWP9vcYpBwccn2365nP2epbgxQ5+h0VWl5p+pj7nH5KqDa32yF7+A== dependencies: - "@verdaccio/config" "6.0.0-6-next.63" - "@verdaccio/core" "6.0.0-6-next.63" - "@verdaccio/url" "11.0.0-6-next.29" - "@verdaccio/utils" "6.0.0-6-next.31" + "@verdaccio/config" "6.0.0-6-next.65" + "@verdaccio/core" "6.0.0-6-next.65" + "@verdaccio/url" "11.0.0-6-next.31" + "@verdaccio/utils" "6.0.0-6-next.33" debug "4.3.4" express "4.18.2" express-rate-limit "5.5.1" @@ -1649,14 +1579,14 @@ resolved "https://registry.npmmirror.com/@verdaccio/streams/-/streams-10.2.0.tgz#e01d2bfdcfe8aa2389f31bc6b72a602628bd025b" integrity sha512-FaIzCnDg0x0Js5kSQn1Le3YzDHl7XxrJ0QdIw5LrDUmLsH3VXNi4/NMlSHnw5RiTTMs4UbEf98V3RJRB8exqJA== -"@verdaccio/tarball@11.0.0-6-next.32": - version "11.0.0-6-next.32" - resolved "https://registry.npmmirror.com/@verdaccio/tarball/-/tarball-11.0.0-6-next.32.tgz#9951e5ba529c9e6602b0c3f7fbf5bc20eba80dc1" - integrity sha512-99ZRS6AGkICWgNiTHUc6evRdfeGyxMqZ74ryMnUombL7LTzszOvhetMpGrhNs5JueBlo0bICsQxIj7KChRvuSA== +"@verdaccio/tarball@11.0.0-6-next.34": + version "11.0.0-6-next.34" + resolved "https://registry.npmmirror.com/@verdaccio/tarball/-/tarball-11.0.0-6-next.34.tgz#f8bab349f137c7328228b906899a9ec0ae55add0" + integrity sha512-FP7JWym2/4uzuBlvLO4WcNfAA58EKhoZiIPP+aQbK6n0eRIWlmd4ZaP2LP+SULKjXtk3fGsnQdzC0O/J8HKSgw== dependencies: - "@verdaccio/core" "6.0.0-6-next.63" - "@verdaccio/url" "11.0.0-6-next.29" - "@verdaccio/utils" "6.0.0-6-next.31" + "@verdaccio/core" "6.0.0-6-next.65" + "@verdaccio/url" "11.0.0-6-next.31" + "@verdaccio/utils" "6.0.0-6-next.33" debug "4.3.4" lodash "4.17.21" @@ -1665,27 +1595,27 @@ resolved "https://registry.npmmirror.com/@verdaccio/types/-/types-10.8.0.tgz#34451735facf94320a0a777f0e80f98108bbc486" integrity sha512-FuJyCRFPdy+gqCi0v29dE1xKn99Ztq6fuY9fb7ezeP1SRbUL/hgDaNkpjYvSIMCyb+dLFKOFBeZPyIUBLOSdlA== -"@verdaccio/ui-theme@6.0.0-6-next.63": - version "6.0.0-6-next.63" - resolved "https://registry.npmmirror.com/@verdaccio/ui-theme/-/ui-theme-6.0.0-6-next.63.tgz#7cc51d77343c0d1faee6fb2982ce4553bac6e33d" - integrity sha512-Z2jrb0oTzTPDTS4HajPJzYM7THdvIu+5JdLnVYJv0E5Aqf4pUmWunse1jM04ZOty5iybxjNlnSU4Pb6cMhZN3A== +"@verdaccio/ui-theme@6.0.0-6-next.65": + version "6.0.0-6-next.65" + resolved "https://registry.npmmirror.com/@verdaccio/ui-theme/-/ui-theme-6.0.0-6-next.65.tgz#91126db0eb796c4c800f26d33477f94c74e21c62" + integrity sha512-HQugL4nvXtPeuj876k7xUFdurXQ3bhi6eq9poQPIwZTf/Mielp5BSIF/thVk+OuYWFCT3Fb3Z9U8sP/QfiKpQw== -"@verdaccio/url@11.0.0-6-next.29", "@verdaccio/url@^11.0.0-6-next.29": - version "11.0.0-6-next.29" - resolved "https://registry.npmmirror.com/@verdaccio/url/-/url-11.0.0-6-next.29.tgz#f2bbbc7cd2cb3b8cb89fe8116b019be795630f42" - integrity sha512-h1mmPyCe9r1ePTXw817dE2FxttpHs2/IZmg1JurSR9uem8qKFwvI8UzF1KWJ4R/tW8slJuMgurK1wXnsM/1m4g== +"@verdaccio/url@11.0.0-6-next.31", "@verdaccio/url@^11.0.0-6-next.31": + version "11.0.0-6-next.31" + resolved "https://registry.npmmirror.com/@verdaccio/url/-/url-11.0.0-6-next.31.tgz#98b3c41b56bbe13dc9754cdf979aa121dec35e6b" + integrity sha512-X5HdJ2t+c1o14eed/g9eXsF2vrhrT5oXhs86V5sY2QdKxaNCknw1X2Ksus591K3aHYcwOgbzj5kc6mJ6NRwVQA== dependencies: - "@verdaccio/core" "6.0.0-6-next.63" + "@verdaccio/core" "6.0.0-6-next.65" debug "4.3.4" lodash "4.17.21" validator "13.9.0" -"@verdaccio/utils@6.0.0-6-next.31": - version "6.0.0-6-next.31" - resolved "https://registry.npmmirror.com/@verdaccio/utils/-/utils-6.0.0-6-next.31.tgz#fd47986144985d99ee382c92ef19ef17557295d9" - integrity sha512-JzWoYxZ6zGHmR48GI6RGkS/hWe1ILKmRYXDfbx5ZnIbRsWNKw7AAIj4b4IQ/NfIOq0U3yonG9NZAAtIAH7otSQ== +"@verdaccio/utils@6.0.0-6-next.33": + version "6.0.0-6-next.33" + resolved "https://registry.npmmirror.com/@verdaccio/utils/-/utils-6.0.0-6-next.33.tgz#9197aea19d5e99cbaed237dbfbe32c1e222c2be1" + integrity sha512-Ny+svJLmYgwcihaxGSHHZF1IU1SuBCWKaMhQefI4DrzmRQnW8N2eVOSRqENL26B/hK+120Y6NeHF0vh4iNgBpw== dependencies: - "@verdaccio/core" "6.0.0-6-next.63" + "@verdaccio/core" "6.0.0-6-next.65" lodash "4.17.21" minimatch "3.1.2" semver "7.3.8" @@ -1976,7 +1906,7 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.21.3, browserslist@^4.21.4: +browserslist@^4.21.3, browserslist@^4.21.5: version "4.21.5" resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== @@ -2051,9 +1981,9 @@ callsites@^3.0.0: integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== caniuse-lite@^1.0.30001449: - version "1.0.30001450" - resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz#022225b91200589196b814b51b1bbe45144cf74f" - integrity sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew== + version "1.0.30001464" + resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001464.tgz#888922718df48ce5e33dcfe1a2af7d42676c5eb7" + integrity sha512-oww27MtUmusatpRpCGSOneQk2/l5czXANDSFvsc7VuOQ86s3ANhZetpwXNf1zY/zdfP63Xvjz325DAdAoES13g== caseless@~0.12.0: version "0.12.0" @@ -2077,6 +2007,18 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +ci-info@^3.6.1: + version "3.8.0" + resolved "https://registry.npmmirror.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +clean-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7" + integrity sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw== + dependencies: + escape-string-regexp "^1.0.5" + clipanion@3.2.0: version "3.2.0" resolved "https://registry.npmmirror.com/clipanion/-/clipanion-3.2.0.tgz#ea55ce3fe27becb4ddd4915df6fb3de0f9e79a5c" @@ -2198,11 +2140,11 @@ cookies@0.8.0: keygrip "~1.1.0" core-js-compat@^3.25.1: - version "3.27.2" - resolved "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.27.2.tgz#607c50ad6db8fd8326af0b2883ebb987be3786da" - integrity sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg== + version "3.29.0" + resolved "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.29.0.tgz#1b8d9eb4191ab112022e7f6364b99b65ea52f528" + integrity sha512-ScMn3uZNAFhK2DGoEfErguoiAHhV2Ju+oJo/jK08p7B3f3UhocUrCCkTvnZaiS+edl5nlIoiBXKcwMc6elv4KQ== dependencies: - browserslist "^4.21.4" + browserslist "^4.21.5" core-js@3.28.0: version "3.28.0" @@ -2309,9 +2251,9 @@ define-lazy-prop@^2.0.0: integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.npmmirror.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== + version "1.2.0" + resolved "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== dependencies: has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -2403,9 +2345,9 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.4.284: - version "1.4.284" - resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" - integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== + version "1.4.327" + resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.327.tgz#288b106518cfed0a60f7de8a0480432a9be45477" + integrity sha512-DIk2H4g/3ZhjgiABJjVdQvUdMlSABOsjeCm6gmUzIdKxAuFrGiJ8QXMm3i09grZdDBMC/d8MELMrdwYRC0+YHg== encodeurl@~1.0.2: version "1.0.2" @@ -2432,6 +2374,13 @@ envinfo@7.8.1: resolved "https://registry.npmmirror.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + es-abstract@^1.19.0, es-abstract@^1.20.4: version "1.21.1" resolved "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.21.1.tgz#e6105a099967c08377830a0c9cb589d570dd86c6" @@ -2588,6 +2537,28 @@ eslint-plugin-simple-import-sort@^10.0.0: resolved "https://registry.npmmirror.com/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz#cc4ceaa81ba73252427062705b64321946f61351" integrity sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw== +eslint-plugin-unicorn@^46.0.0: + version "46.0.0" + resolved "https://registry.npmmirror.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-46.0.0.tgz#b5cdcc9465fd6e46ab7968b87dd4a43adc8d6031" + integrity sha512-j07WkC+PFZwk8J33LYp6JMoHa1lXc1u6R45pbSAipjpfpb7KIGr17VE2D685zCxR5VL4cjrl65kTJflziQWMDA== + dependencies: + "@babel/helper-validator-identifier" "^7.19.1" + "@eslint-community/eslint-utils" "^4.1.2" + ci-info "^3.6.1" + clean-regexp "^1.0.0" + esquery "^1.4.0" + indent-string "^4.0.0" + is-builtin-module "^3.2.0" + jsesc "^3.0.2" + lodash "^4.17.21" + pluralize "^8.0.0" + read-pkg-up "^7.0.1" + regexp-tree "^0.1.24" + regjsparser "^0.9.1" + safe-regex "^2.1.1" + semver "^7.3.8" + strip-indent "^3.0.0" + eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" @@ -2676,7 +2647,7 @@ espree@^9.4.0: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.3.0" -esquery@^1.4.2: +esquery@^1.4.0, esquery@^1.4.2: version "1.5.0" resolved "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== @@ -2862,6 +2833,14 @@ finalhandler@1.2.0: statuses "2.0.1" unpipe "~1.0.0" +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + find-up@^5.0.0: version "5.0.0" resolved "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -2958,7 +2937,7 @@ gensync@^1.0.0-beta.2: resolved "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: version "1.2.0" resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== @@ -2983,9 +2962,9 @@ get-symbol-description@^1.0.0: get-intrinsic "^1.1.1" get-tsconfig@^4.2.0: - version "4.3.0" - resolved "https://registry.npmmirror.com/get-tsconfig/-/get-tsconfig-4.3.0.tgz#4c26fae115d1050e836aea65d6fe56b507ee249b" - integrity sha512-YCcF28IqSay3fqpIu5y3Krg/utCBHBeoflkZyHj/QcqI2nrLPC3ZegS9CmIo+hJb8K7aiGsuUl7PwWVjNG2HQQ== + version "4.4.0" + resolved "https://registry.npmmirror.com/get-tsconfig/-/get-tsconfig-4.4.0.tgz#64eee64596668a81b8fce18403f94f245ee0d4e5" + integrity sha512-0Gdjo/9+FzsYhXCEFueo2aY1z1tpXrxWZzP7k8ul9qt1U5o8rYJwTJYmaeHdrVosYIVYkOy2iwCJ9FdpocJhPQ== getpass@^0.1.1: version "0.1.7" @@ -3221,6 +3200,11 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + http-cache-semantics@^4.0.0: version "4.1.1" resolved "https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" @@ -3324,6 +3308,11 @@ imurmurhash@^0.1.4: resolved "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -3338,11 +3327,11 @@ inherits@2, inherits@2.0.4, inherits@^2.0.3: integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== internal-slot@^1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.4.tgz#8551e7baf74a7a6ba5f749cfb16aa60722f0d6f3" - integrity sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ== + version "1.0.5" + resolved "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== dependencies: - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.0" has "^1.0.3" side-channel "^1.0.4" @@ -3352,14 +3341,19 @@ ipaddr.js@1.9.1: integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== is-array-buffer@^3.0.1: - version "3.0.1" - resolved "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" - integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ== + version "3.0.2" + resolved "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.0" is-typed-array "^1.1.10" +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -3527,9 +3521,9 @@ isstream@~0.1.2: integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== jose@^4.10.0: - version "4.11.2" - resolved "https://registry.npmmirror.com/jose/-/jose-4.11.2.tgz#d9699307c02e18ff56825843ba90e2fae9f09e23" - integrity sha512-njj0VL2TsIxCtgzhO+9RRobBvws4oYyCM8TpvoUQwl/MbIM3NFJRR9+e6x0sS5xXaP1t6OCBkaBME98OV9zU5A== + version "4.13.1" + resolved "https://registry.npmmirror.com/jose/-/jose-4.13.1.tgz#449111bb5ab171db85c03f1bd2cb1647ca06db1c" + integrity sha512-MSJQC5vXco5Br38mzaQKiq9mwt7lwj2eXpgpRyQYNHYt2lq1PjkWa7DLXX0WVcQLE9HhMh3jPiufS7fhJf+CLQ== js-sdsl@^4.1.4: version "4.3.0" @@ -3558,6 +3552,11 @@ jsesc@^2.5.1: resolved "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@^3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + jsesc@~0.5.0: version "0.5.0" resolved "https://registry.npmmirror.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" @@ -3568,6 +3567,11 @@ json-buffer@3.0.1: resolved "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -3593,7 +3597,7 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@^1.0.1: +json5@^1.0.2: version "1.0.2" resolved "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== @@ -3679,6 +3683,18 @@ li@^1.3.0: resolved "https://registry.npmmirror.com/li/-/li-1.3.0.tgz#22c59bcaefaa9a8ef359cf759784e4bf106aea1b" integrity sha512-z34TU6GlMram52Tss5mt1m//ifRIpKH5Dqm7yUVOdHI+BQCs9qGPHFaCUTIzsWX7edN30aa2WrPwR7IO10FHaw== +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -3856,6 +3872,11 @@ mimic-response@^3.1.0: resolved "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.npmmirror.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + mini-svg-data-uri@^1.4.4: version "1.4.4" resolved "https://registry.npmmirror.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz#8ab0aabcdf8c29ad5693ca595af19dd2ead09939" @@ -3882,12 +3903,7 @@ minimatch@^7.4.1: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== - -minimist@^1.2.8: +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -3971,9 +3987,19 @@ node-fetch@cjs: whatwg-url "^5.0.0" node-releases@^2.0.8: - version "2.0.9" - resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.9.tgz#fe66405285382b0c4ac6bcfbfbe7e8a510650b4d" - integrity sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA== + version "2.0.10" + resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" normalize-url@^6.0.1: version "6.1.0" @@ -4058,16 +4084,7 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -open@^8.4.0: - version "8.4.0" - resolved "https://registry.npmmirror.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" - integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -open@^8.4.2: +open@^8.4.0, open@^8.4.2: version "8.4.2" resolved "https://registry.npmmirror.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== @@ -4103,6 +4120,13 @@ p-cancelable@^2.0.0: resolved "https://registry.npmmirror.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + p-limit@^3.0.2: version "3.1.0" resolved "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -4110,6 +4134,13 @@ p-limit@^3.0.2: dependencies: yocto-queue "^0.1.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + p-locate@^5.0.0: version "5.0.0" resolved "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" @@ -4117,6 +4148,11 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -4124,6 +4160,16 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + parseurl@~1.3.3: version "1.3.3" resolved "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -4252,6 +4298,11 @@ pkginfo@0.4.1: resolved "https://registry.npmmirror.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" integrity sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ== +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.npmmirror.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -4315,13 +4366,20 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== -qs@6.11.0, qs@^6.10.1: +qs@6.11.0: version "6.11.0" resolved "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" +qs@^6.10.1: + version "6.11.1" + resolved "https://registry.npmmirror.com/qs/-/qs-6.11.1.tgz#6c29dff97f0c0060765911ba65cbc9764186109f" + integrity sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ== + dependencies: + side-channel "^1.0.4" + qs@~6.5.2: version "6.5.3" resolved "https://registry.npmmirror.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" @@ -4384,10 +4442,29 @@ raw-body@2.5.2: iconv-lite "0.4.24" unpipe "1.0.0" +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.npmmirror.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + readable-stream@^3.1.1: - version "3.6.0" - resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + version "3.6.1" + resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.1.tgz#f9f9b5f536920253b3d26e7660e7da4ccff9bb62" + integrity sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" @@ -4437,6 +4514,11 @@ regenerator-transform@^0.15.1: dependencies: "@babel/runtime" "^7.8.4" +regexp-tree@^0.1.24, regexp-tree@~0.1.1: + version "0.1.24" + resolved "https://registry.npmmirror.com/regexp-tree/-/regexp-tree-0.1.24.tgz#3d6fa238450a4d66e5bc9c4c14bb720e2196829d" + integrity sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw== + regexp.prototype.flags@^1.4.3: version "1.4.3" resolved "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" @@ -4451,23 +4533,18 @@ regexpp@^3.2.0: resolved "https://registry.npmmirror.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -regexpu-core@^5.2.1: - version "5.2.2" - resolved "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" - integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== +regexpu-core@^5.3.1: + version "5.3.1" + resolved "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.3.1.tgz#66900860f88def39a5cb79ebd9490e84f17bcdfb" + integrity sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ== dependencies: + "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" regenerate-unicode-properties "^10.1.0" - regjsgen "^0.7.1" regjsparser "^0.9.1" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" -regjsgen@^0.7.1: - version "0.7.1" - resolved "https://registry.npmmirror.com/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" - integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== - regjsparser@^0.9.1: version "0.9.1" resolved "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" @@ -4516,7 +4593,7 @@ resolve-from@^4.0.0: resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.14.2, resolve@^1.22.1: +resolve@^1.10.0, resolve@^1.14.2, resolve@^1.22.1: version "1.22.1" resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -4544,10 +4621,10 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -rimraf@^4.3.1: - version "4.3.1" - resolved "https://registry.npmmirror.com/rimraf/-/rimraf-4.3.1.tgz#ccb3525e39100478acb334fae6d23029b87912ea" - integrity sha512-GfHJHBzFQra23IxDzIdBqhOWfbtdgS1/dCHrDy+yvhpoJY5TdwdT28oWaHWfRpKFDLd3GZnGTx6Mlt4+anbsxQ== +rimraf@^4.4.0: + version "4.4.0" + resolved "https://registry.npmmirror.com/rimraf/-/rimraf-4.4.0.tgz#c7a9f45bb2ec058d2e60ef9aca5167974313d605" + integrity sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ== dependencies: glob "^9.2.0" @@ -4572,7 +4649,7 @@ roarr@^2.15.3: rollup-plugin-node-externals@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-node-externals/-/rollup-plugin-node-externals-5.1.2.tgz#a0bb3a44f4a2ec9faaedce9e8a688414febe43e9" + resolved "https://registry.npmmirror.com/rollup-plugin-node-externals/-/rollup-plugin-node-externals-5.1.2.tgz#a0bb3a44f4a2ec9faaedce9e8a688414febe43e9" integrity sha512-M32v8yPeVT0dYOYHfd6SNyl0X1xskB15jYFlwUPzIIVpLQ200KVlilbFsoNMUho4SnQuT7Di3s/aLm79bnP48w== rollup-plugin-shebang-bin@^0.0.5: @@ -4583,10 +4660,10 @@ rollup-plugin-shebang-bin@^0.0.5: "@rollup/pluginutils" "^5.0.2" magic-string "^0.26.7" -rollup@^3.18.0: - version "3.18.0" - resolved "https://registry.npmmirror.com/rollup/-/rollup-3.18.0.tgz#2354ba63ba66d6a09c652c3ea0dbcd9dad72bbde" - integrity sha512-J8C6VfEBjkvYPESMQYxKHxNOh4A5a3FlP+0BETGo34HEcE4eTlgCrO2+eWzlu2a/sHs2QUkZco+wscH7jhhgWg== +rollup@^3.19.0: + version "3.19.0" + resolved "https://registry.npmmirror.com/rollup/-/rollup-3.19.0.tgz#cc580f8e0c1dc89f3888f5943f9542cb136fa40f" + integrity sha512-xZzJZlH9Ca6cosfdNGPwl2z7Pby8dTi9TrYLPeg6/j7aUoDOhBd706tCUFvbiBj45h/cS7z/a4gS8xd5Yg0jBw== optionalDependencies: fsevents "~2.3.2" @@ -4616,6 +4693,13 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" +safe-regex@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" + integrity sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A== + dependencies: + regexp-tree "~0.1.1" + safe-stable-stringify@^2.1.0, safe-stable-stringify@^2.3.1: version "2.4.2" resolved "https://registry.npmmirror.com/safe-stable-stringify/-/safe-stable-stringify-2.4.2.tgz#ec7b037768098bf65310d1d64370de0dc02353aa" @@ -4631,6 +4715,11 @@ semver-compare@^1.0.0: resolved "https://registry.npmmirror.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== +"semver@2 || 3 || 4 || 5": + version "5.7.1" + resolved "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + semver@7.3.8, semver@^7.3.2, semver@^7.3.7, semver@^7.3.8: version "7.3.8" resolved "https://registry.npmmirror.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" @@ -4764,6 +4853,32 @@ sourcemap-codec@^1.4.8: resolved "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.12" + resolved "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" + integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== + split-on-first@^1.0.0: version "1.1.0" resolved "https://registry.npmmirror.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" @@ -4858,6 +4973,13 @@ strip-bom@^3.0.0: resolved "https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -4896,9 +5018,9 @@ tapable@^2.2.0: integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== terser@^5.15.1: - version "5.16.2" - resolved "https://registry.npmmirror.com/terser/-/terser-5.16.2.tgz#8f495819439e8b5c150e7530fc434a6e70ea18b2" - integrity sha512-JKuM+KvvWVqT7muHVyrwv7FVRPnmHDwF6XwoIxdbF5Witi0vu99RYpxDexpJndXt3jbZZmmWr2/mQa6HvSNdSg== + version "5.16.6" + resolved "https://registry.npmmirror.com/terser/-/terser-5.16.6.tgz#f6c7a14a378ee0630fbe3ac8d1f41b4681109533" + integrity sha512-IBZ+ZQIA9sMaXmRZCUMDjNH0D5AQQfdn4WUjHL0+1lF4TP1IHRJbrhb6fNaXWikrYQTSkb7SLxkeXAiy1p7mbg== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" @@ -4983,12 +5105,12 @@ tr46@~0.0.3: integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== tsconfig-paths@^3.14.1: - version "3.14.1" - resolved "https://registry.npmmirror.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + version "3.14.2" + resolved "https://registry.npmmirror.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== dependencies: "@types/json5" "^0.0.29" - json5 "^1.0.1" + json5 "^1.0.2" minimist "^1.2.6" strip-bom "^3.0.0" @@ -5048,6 +5170,16 @@ type-fest@^0.20.2: resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + type-fest@^2.19.0: version "2.19.0" resolved "https://registry.npmmirror.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" @@ -5153,6 +5285,14 @@ uuid@^3.3.2: resolved "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + validator@13.9.0: version "13.9.0" resolved "https://registry.npmmirror.com/validator/-/validator-13.9.0.tgz#33e7b85b604f3bbce9bb1a05d5c3e22e1c2ff855" @@ -5163,13 +5303,13 @@ vary@^1, vary@~1.1.2: resolved "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -verdaccio-audit@11.0.0-6-next.26: - version "11.0.0-6-next.26" - resolved "https://registry.npmmirror.com/verdaccio-audit/-/verdaccio-audit-11.0.0-6-next.26.tgz#033f8448bdf82d837cac833a5afff1a901acda2f" - integrity sha512-raaxB4gcJ09ubZ3exCJZo6kXHazsfwxkepX2dzS3UJ+/OA+Lt3sOIulmz+h5ggtwLfAJvYpVucqY4jwMaJWSmg== +verdaccio-audit@11.0.0-6-next.28: + version "11.0.0-6-next.28" + resolved "https://registry.npmmirror.com/verdaccio-audit/-/verdaccio-audit-11.0.0-6-next.28.tgz#5552f1fe886106cedda26368759f0638798cfe1e" + integrity sha512-Ik9HksxqG8+lzmNhFp8GDAHxU+iVXRxqEsUXNco2MSWfrYrppKKJnr+r+ki0q5PjbvppsbZKfKZ4cjuPaOyH0A== dependencies: - "@verdaccio/config" "6.0.0-6-next.63" - "@verdaccio/core" "6.0.0-6-next.63" + "@verdaccio/config" "6.0.0-6-next.65" + "@verdaccio/core" "6.0.0-6-next.65" express "4.18.2" https-proxy-agent "5.0.1" node-fetch cjs @@ -5185,12 +5325,12 @@ verdaccio-htpasswd@10.5.2: http-errors "2.0.0" unix-crypt-td-js "1.1.4" -verdaccio-htpasswd@11.0.0-6-next.33: - version "11.0.0-6-next.33" - resolved "https://registry.npmmirror.com/verdaccio-htpasswd/-/verdaccio-htpasswd-11.0.0-6-next.33.tgz#964b1f610c78682b66d090c860327eec30672e89" - integrity sha512-A7CyHGq8V5xOehMju9fu5lVNDMqDG+JHhN/G3fo2vBlr6wW5ANcaWrsGpMrJR1GbIPb8GOoj/OmAig1zRebJwQ== +verdaccio-htpasswd@11.0.0-6-next.35: + version "11.0.0-6-next.35" + resolved "https://registry.npmmirror.com/verdaccio-htpasswd/-/verdaccio-htpasswd-11.0.0-6-next.35.tgz#7b8e923049ebc3cc439a694b118361981ee14463" + integrity sha512-O0XgoQ9VV80rPLIgKKQhP9Jti/+oD2ULRiF/xtLCoMpw3anmaGLiYwMeXyxzFTxDC8C6p+N+GhEilztY5J+l3Q== dependencies: - "@verdaccio/core" "6.0.0-6-next.63" + "@verdaccio/core" "6.0.0-6-next.65" "@verdaccio/file-locking" "11.0.0-6-next.7" apache-md5 "1.1.8" bcryptjs "2.4.3" @@ -5211,22 +5351,22 @@ verdaccio-htpasswd@^11.0.0-6-next.13: http-errors "1.8.0" unix-crypt-td-js "1.1.4" -verdaccio@^5.22.0: - version "5.22.0" - resolved "https://registry.npmmirror.com/verdaccio/-/verdaccio-5.22.0.tgz#f2a9195db65d0e8c8133f4b0121ac6b22887ebf1" - integrity sha512-UJaWTYfmu8W3cgQ51YKcamtQKgrkXmdMk9sNj4N0JQ15/582OPucVht4Vw6y+Gvet+2r+OoGbTxPxLmbT1KajQ== +verdaccio@^5.22.1: + version "5.22.1" + resolved "https://registry.npmmirror.com/verdaccio/-/verdaccio-5.22.1.tgz#3608fb34c42722cd2620c1692d79936a9817d154" + integrity sha512-rTPFsgpy9Y02ycu80tMD8P1yBY7jO1kAJZvl9djfQ12ZGHYW8zL5cUuUm2D0hv+nneA2lBtEdvbvSr9xzgHnrA== dependencies: - "@verdaccio/config" "6.0.0-6-next.63" - "@verdaccio/core" "6.0.0-6-next.63" + "@verdaccio/config" "6.0.0-6-next.65" + "@verdaccio/core" "6.0.0-6-next.65" "@verdaccio/local-storage" "10.3.1" - "@verdaccio/logger-7" "6.0.0-6-next.8" - "@verdaccio/middleware" "6.0.0-6-next.42" + "@verdaccio/logger-7" "6.0.0-6-next.10" + "@verdaccio/middleware" "6.0.0-6-next.44" "@verdaccio/signature" "6.0.0-6-next.2" "@verdaccio/streams" "10.2.0" - "@verdaccio/tarball" "11.0.0-6-next.32" - "@verdaccio/ui-theme" "6.0.0-6-next.63" - "@verdaccio/url" "11.0.0-6-next.29" - "@verdaccio/utils" "6.0.0-6-next.31" + "@verdaccio/tarball" "11.0.0-6-next.34" + "@verdaccio/ui-theme" "6.0.0-6-next.65" + "@verdaccio/url" "11.0.0-6-next.31" + "@verdaccio/utils" "6.0.0-6-next.33" JSONStream "1.3.5" async "3.2.4" body-parser "1.20.2" @@ -5253,7 +5393,7 @@ verdaccio@^5.22.0: request "2.88.2" semver "7.3.8" validator "13.9.0" - verdaccio-audit "11.0.0-6-next.26" + verdaccio-audit "11.0.0-6-next.28" verdaccio-htpasswd "10.5.2" verror@1.10.0: