From dbf194437a5bcd3206cdad9f64f7352e9a6cb232 Mon Sep 17 00:00:00 2001 From: Serhii Stotskyi Date: Sat, 8 Feb 2025 07:25:48 +0200 Subject: [PATCH] chore(ci): adds unit tests + coverage for deploy-web (#800) --- .github/workflows/docker-build-deploy-web.yml | 49 +- apps/deploy-web/__mocks__/next/config.ts | 9 + apps/deploy-web/jest.config.ts | 24 + apps/deploy-web/next.config.js | 8 +- apps/deploy-web/package.json | 8 + .../components/authorizations/GranteeRow.tsx | 2 +- .../components/providers/ProviderRawData.tsx | 22 +- apps/deploy-web/src/hooks/useWalletBalance.ts | 2 +- apps/deploy-web/src/queries/useLeaseQuery.ts | 9 +- apps/deploy-web/src/utils/apiUtils.ts | 4 +- apps/deploy-web/tests/seeders/provider.ts | 105 +++ .../tests/unit/ProviderRawData.spec.tsx | 60 ++ apps/deploy-web/tests/unit/mocks.tsx | 19 + apps/deploy-web/tests/unit/setup.ts | 6 + package-lock.json | 688 +++++++++++++++++- package.json | 2 +- 16 files changed, 990 insertions(+), 27 deletions(-) create mode 100644 apps/deploy-web/__mocks__/next/config.ts create mode 100644 apps/deploy-web/jest.config.ts create mode 100644 apps/deploy-web/tests/seeders/provider.ts create mode 100644 apps/deploy-web/tests/unit/ProviderRawData.spec.tsx create mode 100644 apps/deploy-web/tests/unit/mocks.tsx create mode 100644 apps/deploy-web/tests/unit/setup.ts diff --git a/.github/workflows/docker-build-deploy-web.yml b/.github/workflows/docker-build-deploy-web.yml index 12ede8fb9..b246ec860 100644 --- a/.github/workflows/docker-build-deploy-web.yml +++ b/.github/workflows/docker-build-deploy-web.yml @@ -3,6 +3,8 @@ name: Deploy Web CI on: pull_request: branches: ["main"] + push: + branches: ["main"] jobs: build-deploy-web: @@ -14,12 +16,55 @@ jobs: # Check for changes in deploy-web folder - uses: dorny/paths-filter@v2 - id: filter + id: has_changes with: filters: | deploy-web: - 'apps/deploy-web/**' + - 'packages/*/**' + + - name: Decide whether to validate + id: validation + run: echo "enabled=${{ github.event_name == 'push' || steps.has_changes.outputs.deploy-web == 'true' }}" >> $GITHUB_OUTPUT + + - name: Setup Node.js + if: steps.validation.outputs.enabled == 'true' + uses: actions/setup-node@v4 + with: + node-version: 20.14.0 + + - name: Restore root node_modules cache + if: steps.validation.outputs.enabled == 'true' + uses: actions/cache@v4 + id: cache + with: + path: | + node_modules + apps/deploy-web/node_modules + packages/*/node_modules + key: deploy-web-${{ runner.os }}-${{ hashFiles('package-lock.json') }} + + - name: Install dependencies + if: steps.validation.outputs.enabled == 'true' && steps.cache.outputs.cache-hit != 'true' + run: npm ci + + - name: Run static code analysis + if: steps.validation.outputs.enabled == 'true' + run: npm run lint -w apps/deploy-web -- --quiet + + - name: Run tests + if: steps.validation.outputs.enabled == 'true' + run: npm run test:cov --workspace=apps/deploy-web + + - name: Upload Test Coverage + if: steps.validation.outputs.enabled == 'true' + uses: codecov/codecov-action@v5 + with: + directory: ./apps/deploy-web/coverage + flags: deploy-web + token: ${{ secrets.CODECOV_TOKEN }} + base_sha: ${{ github.event.pull_request.base.sha }} - name: Build the Docker image - if: steps.filter.outputs.deploy-web == 'true' + if: steps.validation.outputs.enabled == 'true' && github.event_name == 'pull_request' run: packages/docker/script/dc.sh build deploy-web --build-arg DEPLOYMENT_ENV=production diff --git a/apps/deploy-web/__mocks__/next/config.ts b/apps/deploy-web/__mocks__/next/config.ts new file mode 100644 index 000000000..56890b8b8 --- /dev/null +++ b/apps/deploy-web/__mocks__/next/config.ts @@ -0,0 +1,9 @@ +import packageJSON from "../../package.json"; + +export default function getConfig() { + return { + publicRuntimeConfig: { + version: packageJSON.version + } + }; +} diff --git a/apps/deploy-web/jest.config.ts b/apps/deploy-web/jest.config.ts new file mode 100644 index 000000000..df5148c06 --- /dev/null +++ b/apps/deploy-web/jest.config.ts @@ -0,0 +1,24 @@ +import nextJest from "next/jest.js"; + +const createJestConfig = nextJest({ + // Provide the path to your Next.js app to load next.config.js and .env files in your test environment + dir: "./" +}); + +const styleMockPath = "/../../node_modules/next/dist/build/jest/__mocks__/styleMock.js"; +const getConfig = createJestConfig({ + testEnvironment: "jsdom", + collectCoverageFrom: ["/src/**/*.{js,ts,tsx}"], + testMatch: ["/tests/unit/**/*.spec.{tsx,ts}"], + transform: { + "\\.tsx?$": ["ts-jest", { tsconfig: "/tsconfig.json" }] + }, + moduleNameMapper: { + "^@src(.*)$": "/src/$1", + "@interchain-ui\\/react\\/styles$": styleMockPath, + "@interchain-ui\\/react\\/globalStyles$": styleMockPath + }, + setupFilesAfterEnv: ["/tests/unit/setup.ts"] +}); + +export default getConfig; diff --git a/apps/deploy-web/next.config.js b/apps/deploy-web/next.config.js index ab9e9d421..da93faa4a 100644 --- a/apps/deploy-web/next.config.js +++ b/apps/deploy-web/next.config.js @@ -20,6 +20,12 @@ try { } } +const transpilePackages = ["geist", "@akashnetwork/ui"]; + +if (process.env.NODE_ENV === "test") { + transpilePackages.push("nanoid", "uint8arrays", "multiformats"); +} + /** * @type {import('next').NextConfig} */ @@ -39,7 +45,7 @@ const moduleExports = { eslint: { ignoreDuringBuilds: true }, - transpilePackages: ["geist", "@akashnetwork/ui"], + transpilePackages, experimental: { instrumentationHook: true }, diff --git a/apps/deploy-web/package.json b/apps/deploy-web/package.json index eca0d75e3..4c7585706 100644 --- a/apps/deploy-web/package.json +++ b/apps/deploy-web/package.json @@ -14,6 +14,8 @@ "lint": "eslint .", "release": "release-it", "start": "next start", + "test:cov": "DEPLOYMENT_ENV=staging jest --coverage", + "test:unit": "DEPLOYMENT_ENV=staging jest", "type-check": "tsc" }, "dependencies": { @@ -119,10 +121,14 @@ "devDependencies": { "@akashnetwork/dev-config": "*", "@chain-registry/types": "^0.50.12", + "@faker-js/faker": "^9.4.0", "@keplr-wallet/types": "^0.12.111", "@next/bundle-analyzer": "^14.0.1", "@octokit/openapi-types": "^22.2.0", "@playwright/test": "^1.45.0", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.2.0", "@types/auth0": "^2.35.3", "@types/file-saver": "^2.0.5", "@types/gtag.js": "^0.0.20", @@ -139,6 +145,8 @@ "eslint": "^8.57.0", "eslint-config-next": "^14.2.3", "eslint-plugin-simple-import-sort": "^12.1.0", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", "postcss": "^8.4.31", "postcss-nesting": "^12.0.2", "prettier": "^3.3.0", diff --git a/apps/deploy-web/src/components/authorizations/GranteeRow.tsx b/apps/deploy-web/src/components/authorizations/GranteeRow.tsx index eac5f86c8..b8861b581 100644 --- a/apps/deploy-web/src/components/authorizations/GranteeRow.tsx +++ b/apps/deploy-web/src/components/authorizations/GranteeRow.tsx @@ -15,7 +15,7 @@ type Props = { export const GranteeRow: React.FunctionComponent = ({ grant }) => { const limit = grant?.authorization?.spend_limit; - const denomData = limit ? useDenomData(limit.denom) : null; + const denomData = useDenomData(limit?.denom); return ( diff --git a/apps/deploy-web/src/components/providers/ProviderRawData.tsx b/apps/deploy-web/src/components/providers/ProviderRawData.tsx index cc0fa7f45..76bd8ae83 100644 --- a/apps/deploy-web/src/components/providers/ProviderRawData.tsx +++ b/apps/deploy-web/src/components/providers/ProviderRawData.tsx @@ -11,11 +11,19 @@ import Layout from "../layout/Layout"; import { CustomNextSeo } from "../shared/CustomNextSeo"; import ProviderDetailLayout, { ProviderDetailTabs } from "./ProviderDetailLayout"; +export const COMPONENTS = { + Layout, + CustomNextSeo, + ProviderDetailLayout, + DynamicReactJson +}; + type Props = { owner: string; + components?: typeof COMPONENTS; }; -export const ProviderRawData: React.FunctionComponent = ({ owner }) => { +export const ProviderRawData: React.FunctionComponent = ({ owner, components: c = COMPONENTS }) => { const [provider, setProvider] = useState | null>(null); const { isLoading: isLoadingProvider, refetch: getProviderDetail } = useProviderDetail(owner, { enabled: false, @@ -59,12 +67,12 @@ export const ProviderRawData: React.FunctionComponent = ({ owner }) => { }; return ( - - + + - - {provider && } - - + + {provider && } + + ); }; diff --git a/apps/deploy-web/src/hooks/useWalletBalance.ts b/apps/deploy-web/src/hooks/useWalletBalance.ts index 21af13c4e..d4db12361 100644 --- a/apps/deploy-web/src/hooks/useWalletBalance.ts +++ b/apps/deploy-web/src/hooks/useWalletBalance.ts @@ -83,7 +83,7 @@ type DenomData = { balance: number; }; -export const useDenomData = (denom: string) => { +export const useDenomData = (denom?: string) => { const { isLoaded, price, aktToUSD } = usePricing(); const { balance: walletBalance } = useWalletBalance(); const [depositData, setDepositData] = useState(null); diff --git a/apps/deploy-web/src/queries/useLeaseQuery.ts b/apps/deploy-web/src/queries/useLeaseQuery.ts index f0941eafc..906714db4 100644 --- a/apps/deploy-web/src/queries/useLeaseQuery.ts +++ b/apps/deploy-web/src/queries/useLeaseQuery.ts @@ -1,5 +1,7 @@ import { useQuery } from "react-query"; +import { AxiosStatic } from "axios"; +import { useServices } from "@src/context/ServicesProvider"; import { useScopedFetchProviderUrl } from "@src/hooks/useScopedFetchProviderUrl"; import { LeaseDto, RpcLease } from "@src/types/deployment"; import { ApiProviderList } from "@src/types/provider"; @@ -28,12 +30,12 @@ export function useDeploymentLeaseList(address: string, deployment, options) { return useQuery(QueryKeys.getLeasesKey(address, deployment?.dseq), () => getDeploymentLeases(settings.apiEndpoint, address, deployment), options); } -async function getAllLeases(apiEndpoint: string, address: string, deployment?) { +async function getAllLeases(apiEndpoint: string, address: string, deployment?: any, httpClient?: AxiosStatic) { if (!address) { return null; } - const response = await loadWithPagination(ApiUrlService.leaseList(apiEndpoint, address, deployment?.dseq), "leases", 1000); + const response = await loadWithPagination(ApiUrlService.leaseList(apiEndpoint, address, deployment?.dseq), "leases", 1000, httpClient); const leases = response.map(l => leaseToDto(l, deployment)); @@ -42,7 +44,8 @@ async function getAllLeases(apiEndpoint: string, address: string, deployment?) { export function useAllLeases(address: string, options = {}) { const { settings } = useSettings(); - return useQuery(QueryKeys.getAllLeasesKey(address), () => getAllLeases(settings.apiEndpoint, address), options); + const { axios } = useServices(); + return useQuery(QueryKeys.getAllLeasesKey(address), () => getAllLeases(settings.apiEndpoint, address, undefined, axios), options); } export function useLeaseStatus(provider: ApiProviderList | undefined, lease: LeaseDto, options) { diff --git a/apps/deploy-web/src/utils/apiUtils.ts b/apps/deploy-web/src/utils/apiUtils.ts index c155dfcfa..b0e9cf6a7 100644 --- a/apps/deploy-web/src/utils/apiUtils.ts +++ b/apps/deploy-web/src/utils/apiUtils.ts @@ -127,7 +127,7 @@ export class ApiUrlService { // TODO: implement proper pagination on clients // Issue: https://github.com/akash-network/console/milestone/7 -export async function loadWithPagination(baseUrl: string, dataKey: string, limit: number) { +export async function loadWithPagination(baseUrl: string, dataKey: string, limit: number, httpClient = axios) { let items = []; let nextKey = null; // let callCount = 1; @@ -140,7 +140,7 @@ export async function loadWithPagination(baseUrl: string, dataKey: string, li queryUrl += "&pagination.key=" + encodeURIComponent(nextKey); } // console.log(`Querying ${dataKey} [${callCount}] from : ${queryUrl}`); - const response = await axios.get(queryUrl); + const response = await httpClient.get(queryUrl); const data = response.data; // if (!nextKey) { diff --git a/apps/deploy-web/tests/seeders/provider.ts b/apps/deploy-web/tests/seeders/provider.ts new file mode 100644 index 000000000..3e84b08f1 --- /dev/null +++ b/apps/deploy-web/tests/seeders/provider.ts @@ -0,0 +1,105 @@ +import { faker } from "@faker-js/faker"; + +import { ApiProviderDetail } from "@src/types/provider"; + +export function buildProvider(overrides?: Partial): ApiProviderDetail { + return { + owner: `akash${faker.string.alphanumeric({ length: 39 })}`, + name: `${faker.internet.domainWord()}.${faker.internet.domainWord()}.${faker.internet.domainName()}`, + hostUri: `https://${faker.internet.domainName()}:8443`, + createdHeight: faker.number.int({ min: 100000, max: 500000 }), + email: faker.internet.email(), + website: faker.internet.url(), + lastCheckDate: faker.date.recent(), + deploymentCount: faker.number.int({ min: 0, max: 100 }), + leaseCount: faker.number.int({ min: 0, max: 100 }), + cosmosSdkVersion: `0.${faker.number.int({ min: 40, max: 50 })}.${faker.number.int({ min: 0, max: 20 })}`, + akashVersion: `0.${faker.number.int({ min: 5, max: 10 })}.${faker.number.int({ min: 0, max: 10 })}`, + ipRegion: faker.location.state(), + ipRegionCode: faker.location.state({ abbreviated: true }), + ipCountry: faker.location.country(), + ipCountryCode: faker.location.countryCode(), + ipLat: faker.location.latitude().toString(), + ipLon: faker.location.longitude().toString(), + stats: { + cpu: { + active: faker.number.int({ min: 0, max: 10 }), + available: faker.number.int({ min: 5000, max: 20000 }), + pending: faker.number.int({ min: 0, max: 5 }) + }, + gpu: { + active: faker.number.int({ min: 0, max: 2 }), + available: faker.number.int({ min: 1, max: 4 }), + pending: faker.number.int({ min: 0, max: 2 }) + }, + memory: { + active: faker.number.int({ min: 0, max: 10000000000 }), + available: faker.number.int({ min: 8000000000, max: 64000000000 }), + pending: faker.number.int({ min: 0, max: 1000000000 }) + }, + storage: { + ephemeral: { + active: faker.number.int({ min: 0, max: 10000000000 }), + available: faker.number.int({ min: 50000000000, max: 200000000000 }), + pending: faker.number.int({ min: 0, max: 5000000000 }) + }, + persistent: { + active: faker.number.int({ min: 0, max: 5000000000 }), + available: faker.number.int({ min: 10000000000, max: 50000000000 }), + pending: faker.number.int({ min: 0, max: 2000000000 }) + } + } + }, + gpuModels: [ + { + vendor: "nvidia", + model: "rtx4000", + ram: "8Gi", + interface: "PCIe" + } + ], + uptime1d: faker.number.float({ min: 0.9, max: 1, fractionDigits: 4 }), + uptime7d: faker.number.float({ min: 0.9, max: 1, fractionDigits: 4 }), + uptime30d: faker.number.float({ min: 0.9, max: 1, fractionDigits: 4 }), + isValidVersion: faker.datatype.boolean(), + isOnline: faker.datatype.boolean(), + lastOnlineDate: faker.date.recent().toISOString(), + isAudited: faker.datatype.boolean(), + attributes: [ + { key: "region", value: "us-east", auditedBy: [faker.string.alphanumeric(42)] }, + { key: "host", value: faker.internet.domainWord(), auditedBy: [faker.string.alphanumeric(42)] }, + { key: "tier", value: "community", auditedBy: [faker.string.alphanumeric(42)] }, + { key: "organization", value: "overclock", auditedBy: [faker.string.alphanumeric(42)] }, + { key: "capabilities/storage/1/class", value: "beta3", auditedBy: [faker.string.alphanumeric(42)] }, + { key: "capabilities/storage/1/persistent", value: "true", auditedBy: [faker.string.alphanumeric(42)] }, + { key: "capabilities/gpu/vendor/nvidia/model/rtx4000", value: "true", auditedBy: [faker.string.alphanumeric(42)] } + ], + host: faker.internet.domainWord(), + organization: faker.company.name(), + statusPage: null, + locationRegion: faker.location.state(), + country: faker.location.countryCode(), + city: faker.location.city(), + timezone: faker.location.timeZone(), + locationType: "", + hostingProvider: "", + hardwareCpu: "", + hardwareCpuArch: "", + hardwareGpuVendor: "", + hardwareGpuModels: ["Nvidia Quadro RTX 4000"], + hardwareDisk: ["hdd"], + featPersistentStorage: faker.datatype.boolean(), + featPersistentStorageType: ["hdd"], + hardwareMemory: "", + networkProvider: "", + networkSpeedDown: faker.number.int({ min: 0, max: 1000 }), + networkSpeedUp: faker.number.int({ min: 0, max: 1000 }), + tier: "Community hosted provider", + featEndpointCustomDomain: faker.datatype.boolean(), + workloadSupportChia: faker.datatype.boolean(), + workloadSupportChiaCapabilities: [], + featEndpointIp: faker.datatype.boolean(), + uptime: [], + ...overrides + } as ApiProviderDetail; +} diff --git a/apps/deploy-web/tests/unit/ProviderRawData.spec.tsx b/apps/deploy-web/tests/unit/ProviderRawData.spec.tsx new file mode 100644 index 000000000..05881b0a6 --- /dev/null +++ b/apps/deploy-web/tests/unit/ProviderRawData.spec.tsx @@ -0,0 +1,60 @@ +import { QueryClientProvider } from "react-query"; +import { AxiosStatic } from "axios"; + +import { COMPONENTS, ProviderRawData } from "@src/components/providers/ProviderRawData"; +import { ServicesProvider } from "@src/context/ServicesProvider"; +import { queryClient } from "@src/queries"; +import { ProviderProxyService } from "@src/services/provider-proxy/provider-proxy.service"; +import { ApiProviderDetail } from "@src/types/provider"; +import { buildProvider } from "../seeders/provider"; +import { MockComponents } from "./mocks"; + +import { act, render } from "@testing-library/react"; + +describe(ProviderRawData.name, () => { + it("renders", async () => { + const components = MockComponents(COMPONENTS); + const provider = buildProvider(); + await setup({ components, provider }); + + expect(components.Layout).toHaveBeenCalled(); + expect(components.CustomNextSeo).toHaveBeenCalled(); + expect(components.ProviderDetailLayout).toHaveBeenCalledWith(expect.objectContaining({ address: provider.owner, provider }), {}); + expect(components.DynamicReactJson).toHaveBeenCalledWith(expect.objectContaining({ src: JSON.parse(JSON.stringify(provider)) }), {}); + }); + + async function setup(props?: Props) { + const axios = { + get: jest.fn(async url => { + if (url.includes("/leases/")) return new Promise(() => {}); + if (url.includes("/providers/")) + return { + data: props?.provider || buildProvider() + }; + + throw new Error(`unexpected request: ${url}`); + }) + } as unknown as AxiosStatic; + const providerProxy = { + fetchProviderUrl: jest.fn(() => { + return new Promise(() => {}); + }) + } as unknown as ProviderProxyService; + const result = render( + + + + + + ); + + await act(() => Promise.resolve()); + + return result; + } + + interface Props { + provider?: ApiProviderDetail; + components?: typeof COMPONENTS; + } +}); diff --git a/apps/deploy-web/tests/unit/mocks.tsx b/apps/deploy-web/tests/unit/mocks.tsx new file mode 100644 index 000000000..3392cecfc --- /dev/null +++ b/apps/deploy-web/tests/unit/mocks.tsx @@ -0,0 +1,19 @@ +import { FC } from "react"; + +/** + * Dump component that just renders children in React.Fragment + */ +export function ComponentMock(props: Record) { + return <>{props.children}; +} + +export function MockComponents>(components: T, overrides?: Partial): Mocked { + return Object.keys(components).reduce((all, name: keyof T) => { + all[name] = overrides?.[name] || (jest.fn(ComponentMock) as T[keyof T]); + return all; + }, {} as T); +} + +export type Mocked> = { + [K in keyof T]: jest.MockedFunction; +}; diff --git a/apps/deploy-web/tests/unit/setup.ts b/apps/deploy-web/tests/unit/setup.ts new file mode 100644 index 000000000..710757111 --- /dev/null +++ b/apps/deploy-web/tests/unit/setup.ts @@ -0,0 +1,6 @@ +import "@testing-library/jest-dom"; + +import { TextDecoder, TextEncoder } from "util"; + +Object.assign(global, { TextDecoder, TextEncoder }); +window.matchMedia = (() => {}) as unknown as Window["matchMedia"]; diff --git a/package-lock.json b/package-lock.json index a260f4f6a..033a4c198 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,7 @@ }, "apps/api": { "name": "@akashnetwork/console-api", - "version": "2.58.1", + "version": "2.59.0", "license": "Apache-2.0", "dependencies": { "@akashnetwork/akash-api": "^1.3.0", @@ -230,7 +230,7 @@ }, "apps/deploy-web": { "name": "@akashnetwork/console-web", - "version": "2.42.1", + "version": "2.43.0", "license": "Apache-2.0", "dependencies": { "@akashnetwork/akash-api": "^1.3.0", @@ -335,10 +335,14 @@ "devDependencies": { "@akashnetwork/dev-config": "*", "@chain-registry/types": "^0.50.12", + "@faker-js/faker": "^9.4.0", "@keplr-wallet/types": "^0.12.111", "@next/bundle-analyzer": "^14.0.1", "@octokit/openapi-types": "^22.2.0", "@playwright/test": "^1.45.0", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.2.0", "@types/auth0": "^2.35.3", "@types/file-saver": "^2.0.5", "@types/gtag.js": "^0.0.20", @@ -355,6 +359,8 @@ "eslint": "^8.57.0", "eslint-config-next": "^14.2.3", "eslint-plugin-simple-import-sort": "^12.1.0", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", "postcss": "^8.4.31", "postcss-nesting": "^12.0.2", "prettier": "^3.3.0", @@ -398,6 +404,23 @@ "xstream": "^11.14.0" } }, + "apps/deploy-web/node_modules/@faker-js/faker": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.4.0.tgz", + "integrity": "sha512-85+k0AxaZSTowL0gXp8zYWDIrWclTbRPg/pm/V0dSFZ6W6D4lhcG3uuZl4zLsEKfEvs69xDbLN2cHQudwp95JA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/fakerjs" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0.0", + "npm": ">=9.0.0" + } + }, "apps/deploy-web/node_modules/@keplr-wallet/types": { "version": "0.12.123", "resolved": "https://registry.npmjs.org/@keplr-wallet/types/-/types-0.12.123.tgz", @@ -639,7 +662,7 @@ }, "apps/provider-proxy": { "name": "@akashnetwork/provider-proxy", - "version": "1.4.0", + "version": "1.4.1", "license": "Apache-2.0", "dependencies": { "@akashnetwork/logging": "*", @@ -1315,6 +1338,13 @@ "url": "https://github.com/sponsors/kossnocorp" } }, + "node_modules/@adobe/css-tools": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.1.tgz", + "integrity": "sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@akashnetwork/akash-api": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@akashnetwork/akash-api/-/akash-api-1.4.0.tgz", @@ -15597,6 +15627,154 @@ "url": "https://github.com/sponsors/tannerlinsley" } }, + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/dom/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@testing-library/dom/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz", + "integrity": "sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.21", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/jest-dom/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/react": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.2.0.tgz", + "integrity": "sha512-2cSskAvA1QNtKc8Y9VJQRv0tm3hLVgxRGDB+KYhIaPQJ1I+RHbhIXcM+zClKXzMes/wshsMVzf4B9vS4IZpqDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@textea/json-viewer": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/@textea/json-viewer/-/json-viewer-3.4.1.tgz", @@ -15614,6 +15792,16 @@ "react-dom": "^17 || ^18" } }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", @@ -15643,6 +15831,13 @@ "optional": true, "peer": true }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/async": { "version": "3.2.24", "resolved": "https://registry.npmjs.org/@types/async/-/async-3.2.24.tgz", @@ -15964,6 +16159,18 @@ "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", "dev": true }, + "node_modules/@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "license": "MIT" @@ -16231,6 +16438,13 @@ "version": "2.0.3", "license": "MIT" }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", @@ -17098,6 +17312,14 @@ "version": "4.2.2", "license": "Apache-2.0" }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/abi-wan-kanabi": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/abi-wan-kanabi/-/abi-wan-kanabi-2.2.3.tgz", @@ -17178,6 +17400,17 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, "node_modules/acorn-import-attributes": { "version": "1.9.5", "license": "MIT", @@ -20440,6 +20673,13 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, "node_modules/cssesc": { "version": "3.0.0", "license": "MIT", @@ -20450,6 +20690,33 @@ "node": ">=4" } }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true, + "license": "MIT" + }, "node_modules/csstype": { "version": "3.1.3", "license": "MIT" @@ -20696,6 +20963,58 @@ "node": ">= 14" } }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/data-view-buffer": { "version": "1.0.1", "license": "MIT", @@ -20816,6 +21135,13 @@ "node": ">=0.10.0" } }, + "node_modules/decimal.js": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", + "dev": true, + "license": "MIT" + }, "node_modules/decimal.js-light": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", @@ -21284,6 +21610,13 @@ "node": ">=6.0.0" } }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" + }, "node_modules/dom-helpers": { "version": "5.2.1", "license": "MIT", @@ -21292,6 +21625,30 @@ "csstype": "^3.0.2" } }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -24555,6 +24912,19 @@ "url": "https://jaywcjlove.github.io/#/sponsor" } }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "license": "MIT" @@ -25522,6 +25892,13 @@ "node": ">=0.10.0" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, "node_modules/is-reference": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", @@ -26209,6 +26586,34 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-environment-jsdom": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, "node_modules/jest-environment-node": { "version": "29.7.0", "license": "MIT", @@ -26871,6 +27276,126 @@ "signal-exit": "^3.0.2" } }, + "node_modules/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jsdom/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/jsencrypt": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/jsencrypt/-/jsencrypt-3.3.2.tgz", @@ -28245,6 +28770,16 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0" } }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, "node_modules/macos-release": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.3.0.tgz", @@ -30426,6 +30961,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/minimalistic-assert": { "version": "1.0.1", "license": "ISC" @@ -31373,6 +31918,13 @@ "resolved": "https://registry.npmjs.org/numbered/-/numbered-1.1.0.tgz", "integrity": "sha512-pv/ue2Odr7IfYOO0byC1KgBI10wo5YDauLhxY6/saNzAdAs0r1SotGCPzzCLNPL0xtrAwWRialLu23AAu9xO1g==" }, + "node_modules/nwsapi": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", + "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==", + "dev": true, + "license": "MIT" + }, "node_modules/oauth4webapi": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/oauth4webapi/-/oauth4webapi-2.12.0.tgz", @@ -33296,7 +33848,6 @@ "resolved": "https://registry.npmjs.org/psl/-/psl-1.10.0.tgz", "integrity": "sha512-KSKHEbjAnpUuAUserOq0FxGXCUrzC3WniuSJhvdbs102rL55266ZcHBqLWOsG30spQMlPdpy7icATiAQehg/iA==", "license": "MIT", - "peer": true, "dependencies": { "punycode": "^2.3.1" } @@ -33535,8 +34086,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", @@ -34351,6 +34901,30 @@ "node": ">= 0.10" } }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redent/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/redeyed": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", @@ -35812,6 +36386,19 @@ "version": "2.1.2", "license": "MIT" }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/scheduler": { "version": "0.23.2", "license": "MIT", @@ -37298,6 +37885,19 @@ "node": ">=6" } }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "license": "MIT", @@ -37456,6 +38056,13 @@ "node": ">=0.10" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, "node_modules/system-architecture": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz", @@ -38306,7 +38913,6 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -38322,7 +38928,6 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 4.0.0" } @@ -39412,7 +40017,6 @@ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "license": "MIT", - "peer": true, "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -39843,6 +40447,19 @@ "he": "^1.2.0" } }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/walker": { "version": "1.0.8", "license": "Apache-2.0", @@ -40095,6 +40712,32 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/whatwg-fetch": { "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", @@ -40102,6 +40745,16 @@ "license": "MIT", "peer": true }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/whatwg-url": { "version": "5.0.0", "license": "MIT", @@ -40703,6 +41356,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, "node_modules/xstream": { "version": "11.14.0", "license": "MIT", diff --git a/package.json b/package.json index e1aafde8a..0258b432f 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "lint-staged": { "*.{js,jsx,ts,tsx}": [ - "eslint --fix", + "eslint --fix --quiet", "prettier --write" ], "package.json": [