diff --git a/reports/package.json b/reports/package.json index 6278be0..0cbe3ee 100644 --- a/reports/package.json +++ b/reports/package.json @@ -12,11 +12,13 @@ "preview": "vite preview" }, "dependencies": { + "jsonpath": "^1.1.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.15.0" }, "devDependencies": { + "@types/jsonpath": "^0.2.0", "@types/react": "^18.2.15", "@types/react-dom": "^18.2.7", "@typescript-eslint/eslint-plugin": "^6.0.0", diff --git a/reports/src/App.tsx b/reports/src/App.tsx index 5a7b192..d5566eb 100644 --- a/reports/src/App.tsx +++ b/reports/src/App.tsx @@ -5,15 +5,20 @@ import "./App.css"; function App() { // FIXME use the report from the config // eslint-disable-next-line @typescript-eslint/no-explicit-any - const configuration = JSON.stringify((window as any)["interuss"]); + const configuration = JSON.parse((window as any)["interuss"] || "{}"); console.log("Configuration:", configuration); - const { report, nav } = useReport(); + const { loading, report, nav } = useReport(configuration); + if (loading) { + return
Loading report...
; + } if (!report) { return
Report not found
; } const router = createBrowserRouter(nav); - return ; + return <> + + ; } export default App; diff --git a/reports/src/capability/CapabilityTable.tsx b/reports/src/capability/CapabilityTable.tsx index af0d658..62d9527 100644 --- a/reports/src/capability/CapabilityTable.tsx +++ b/reports/src/capability/CapabilityTable.tsx @@ -2,22 +2,33 @@ import { Capability, Check, Requirement, - exampleReport, } from "./capabilityTypes"; type CapabilityTableProps = { - capability?: Capability; + capability: Capability; }; +export const CheckLabel = ({name, docUrl} : {name: string, docUrl?: string}) => { + return docUrl ? {name} : <>{name} +} + export const CheckRow = ({ check }: { check: Check }) => { + const separator = " :: " + const checkSource = <> + {separator} + {separator} + {separator} + + + return ( - {check.name} + {checkSource} {check.result === "pass" ? "PASS" : "FAIL"} - Link + Link ); @@ -91,7 +102,7 @@ export const CapabilityRows = ({ capability }: { capability: Capability }) => { }; export const CapabilityTable = ({ - capability = exampleReport.capability, + capability }: CapabilityTableProps) => { return ( <> diff --git a/reports/src/capability/capabilityTypes.ts b/reports/src/capability/capabilityTypes.ts index a46eea1..7395c62 100644 --- a/reports/src/capability/capabilityTypes.ts +++ b/reports/src/capability/capabilityTypes.ts @@ -1,11 +1,24 @@ type CapabilityResult = "pass" | "fail" | "missing"; -type CheckResult = "pass" | "fail"; +export type CheckResult = "pass" | "fail"; export type Check = { - result: CheckResult; + scenario: { + name: string; + docUrl: string; + } + case: { + name: string; + docUrl: string; + } + step: { + name: string; + docUrl: string; + } + name: string; - detailLink: string; -}; + result: CheckResult + detailsUrl: string; +} export type Requirement = { name: string; @@ -22,113 +35,3 @@ export type Capability = { export type Report = { capability: Capability; }; - -export const exampleReport: Report = { - capability: { - name: "ASTM Service Provider", - result: "fail", - requirements: [ - { - name: "astm.f3548.v21.GEN0310", - checks: [ - { - name: "Nominal behavior :: Setup :: Clear", - result: "pass", - detailLink: "Link to test details", - }, - { - name: "SP polling :: Poll :: Valid data", - result: "pass", - detailLink: "Link to test details", - }, - ], - }, - { - name: "astm.f3548.v21.OPIN0030", - checks: [ - { - name: "...", - result: "fail", - detailLink: "Link to test details", - }, - { - name: "...", - result: "pass", - detailLink: "Link to test details", - }, - ], - }, - { - name: "astm.f3548.v21.SDC0015", - checks: [ - // Should display "Not tested" - ], - }, - { - name: "astm.f3548.v21.GEN0200", - checks: [ - { - name: "...", - result: "pass", - detailLink: "Link to test details", - }, - ], - }, - ], - childCapabilities: [ - { - name: "ASTM SP Operator ID Provider", - result: "pass", - requirements: [ - { - name: "child 1", - checks: [ - { - name: "Nominal behavior :: Setup :: Clear", - result: "pass", - detailLink: "Link to test details", - }, - { - name: "SP polling :: Poll :: Valid data", - result: "pass", - detailLink: "Link to test details", - }, - ], - }, - { - name: "child 2", - checks: [ - { - name: "...", - result: "fail", - detailLink: "Link to test details", - }, - { - name: "...", - result: "pass", - detailLink: "Link to test details", - }, - ], - }, - { - name: "child 3", - checks: [ - // Should display "Not tested" - ], - }, - { - name: "child 4", - checks: [ - { - name: "...", - result: "pass", - detailLink: "Link to test details", - }, - ], - }, - ], - childCapabilities: [], - }, - ], - }, -}; diff --git a/reports/src/capability/reportParser.ts b/reports/src/capability/reportParser.ts index 9f0354a..d7a06a8 100644 --- a/reports/src/capability/reportParser.ts +++ b/reports/src/capability/reportParser.ts @@ -1,27 +1,147 @@ import { + ReportsReportCheckedRequirement, + ReportsReportRequirementsCheckedConditionEvaluationReport, ReportsReportTestRunReport, ReportsReportTestSuiteActionReport, + ReportsReportTestSuiteReport, } from "../types/TestRunReport"; -import { Capability, Report, exampleReport } from "./capabilityTypes"; - -const parseTestSuite = (testSuite: ReportsReportTestSuiteActionReport) => { - console.log("Parse test suite", testSuite); - if (!testSuite.test_suite) return null; - const capabilities = testSuite.test_suite.capability_evaluations.map( - (c): Capability => ({ - name: `${c.capability_id} - ${c.participant_id}`, - requirements: [], - childCapabilities: [], - result: c.verified ? "pass" : "fail", +import { + Capability, + Check, + CheckResult, + Report, + Requirement, +} from "./capabilityTypes"; +import * as jp from "jsonpath"; + +const flattenChecks = ( + r: ReportsReportCheckedRequirement, + root: ReportsReportTestSuiteActionReport +): Check[] => { + const expandCheck = (checkLocation: string, result: CheckResult): Check => { + const l = jp.parse(checkLocation); + const check = jp.value(root, jp.stringify(l)); + const step = jp.value(root, jp.stringify(l.slice(0, -2))); + const _case = jp.value(root, jp.stringify(l.slice(0, -4))); + const scenario = jp.value(root, jp.stringify(l.slice(0, -6))); + + return { + scenario: { + name: scenario.name, + docUrl: scenario.documentation_url, + }, + case: { + name: _case.name, + docUrl: _case.documentation_url, + }, + step: { + name: step.name, + docUrl: step.documentation_url, + }, + name: check.name, + result, + detailsUrl: "", // TODO Add details page + navigation + }; + }; + + const res = [ + ...r.passed_checks.map((c) => expandCheck(c, "pass")), + + ...r.failed_checks.map((c) => expandCheck(c, "fail")), + ]; + return res; +}; + +const flattenRequirements = ( + requirementsChecked: ReportsReportRequirementsCheckedConditionEvaluationReport, + root: ReportsReportTestSuiteReport +): Requirement[] => { + return [ + ...requirementsChecked.passed_requirements.map((pr) => ({ + name: pr.requirement_id, + checks: flattenChecks(pr, root), + })), + + ...requirementsChecked.failed_requirements.map((fr) => ({ + name: fr.requirement_id, + checks: flattenChecks(fr, root), + })), + + ...requirementsChecked.untested_requirements.map((ur) => ({ + name: ur, + checks: [], + })), + ]; +}; + +const getCapability = ( + testSuite: ReportsReportTestSuiteReport +): Capability[] => { + return testSuite.capability_evaluations + .map((ce) => { + const c = ce.condition_evaluation; + if (c.requirements_checked) { + return { + name: ce.capability_id, + result: ce.verified ? "pass" : "fail", + requirements: flattenRequirements(c.requirements_checked, testSuite), + childCapabilities: [], + participant_id: ce.participant_id, + }; + } else if (c.capability_verified) { + return { + name: ce.capability_id, + result: ce.verified ? "pass" : "fail", + requirements: [], + childCapabilities: [], // TODO: Add child capabilities + participant_id: ce.participant_id, + }; + } else { + return null; + } }) - ); - console.log("Parsed capbilities", capabilities); + .filter((x) => !!x) as Capability[]; +}; + +const parseActions = ( + node?: ReportsReportTestSuiteActionReport +): Capability[] => { + if (!node) return []; + + try { + if (node.test_suite) { + return [ + ...getCapability(node.test_suite), + ...node.test_suite.actions.map((a) => parseActions(a)), + ].flat(); + } else if (node.test_scenario) { + return []; + } else if (node.action_generator) { + return node.action_generator.actions + .map((a) => { + return parseActions(a); + }) + .flat(); + } else { + // TODO Improve + console.error("Unknown state"); + return []; + } + } catch (err) { + console.error(err); + return []; + } }; export const parseReport = (report: ReportsReportTestRunReport): Report => { - // FixMe: Actually parse the report + const startTime = new Date().getTime(); console.log("Input Report", report); - const parsed = parseTestSuite(report.report); + const parsed = {capability: parseActions(report.report)[0]}; console.log("Parsed report", parsed); - return exampleReport; + console.info( + "[performance] Report rendered in ", + new Date().getTime() - startTime, + "ms" + ); + return parsed; }; diff --git a/reports/src/capability/useReport.tsx b/reports/src/capability/useReport.tsx index bbb1f3c..b03ecfe 100644 --- a/reports/src/capability/useReport.tsx +++ b/reports/src/capability/useReport.tsx @@ -1,31 +1,44 @@ -import { useState, useEffect } from "react"; -import { ReportsReportTestRunReport } from "../types/TestRunReport"; -import { RouteObject } from "react-router-dom"; -import { parseReport } from "./reportParser"; -import { getNavFromCapability } from "./reportNavigation"; +import {useState, useEffect, useMemo} from "react"; +import { + ReportsReportTestRunReport, +} from "../types/TestRunReport"; +import {RouteObject} from "react-router-dom"; +import {parseReport} from "./reportParser"; +import {getNavFromCapability} from "./reportNavigation"; -const reportUrl = - "/monitoring-tests-reports/uss_qualifier/output/report_uspace.json"; +const reportUrl = "/report_uspace.json"; + +type UseReportProps = { + report?: ReportsReportTestRunReport +} type UseReportReturn = { + loading: boolean, report?: ReportsReportTestRunReport; nav: RouteObject[]; }; -export const useReport = (): UseReportReturn => { +export const useReport = ({report: _report}: UseReportProps): UseReportReturn => { + const [loading, setLoading] = useState(true); const [report, setReport] = useState(); useEffect(() => { + if (_report) { + setReport(_report as ReportsReportTestRunReport); + setLoading(false); + return; + } + const fetchReport = async () => { const res = await fetch(reportUrl); const json = await res.json(); setReport(json as ReportsReportTestRunReport); + setLoading(false); }; fetchReport(); }, []); - const parsedReport = report ? parseReport(report) : undefined; - const nav = parsedReport ? getNavFromCapability(parsedReport.capability) : []; - - return { report, nav }; + const parsedReport = useMemo(() => report ? parseReport(report) : undefined, [report]); + const nav = useMemo(() => parsedReport ? getNavFromCapability(parsedReport.capability) : [], [parsedReport]); + return {loading, report, nav}; }; diff --git a/reports/src/types/TestRunReport.d.ts b/reports/src/types/TestRunReport.d.ts index ebcd13e..5f6ea16 100644 --- a/reports/src/types/TestRunReport.d.ts +++ b/reports/src/types/TestRunReport.d.ts @@ -74,17 +74,33 @@ export interface ReportsReportTestScenarioReport { */ // $ref?: string; /** - * Name of this test scenario + * True iff test scenario completed normally with no failed checks */ - name: string; + successful?: boolean; + /** + * Time at which the test scenario started + */ + start_time: string; + /** + * Reports for each of the test cases in this test scenario + */ + cases: ReportsReportTestCaseReport[]; /** * URL at which this test scenario is described */ documentation_url: string; + /** + * If there was an error while executing this test scenario, this field describes the error + */ + execution_error?: null | ReportsReportErrorReport; /** * Time at which the test scenario completed or encountered an error */ end_time?: string | null; + /** + * If this test scenario performed cleanup, this report captures the relevant information. + */ + cleanup?: null | ReportsReportTestStepReport; /** * Additional information about this scenario that may be useful */ @@ -95,42 +111,14 @@ export interface ReportsReportTestScenarioReport { // $ref?: string; [k: string]: ReportsReportNote; } | null; - /** - * Reports for each of the test cases in this test scenario - */ - cases: ReportsReportTestCaseReport[]; - /** - * Time at which the test scenario started - */ - start_time: string; /** * Type of this test scenario */ scenario_type: string; /** - * If this test scenario performed cleanup, this report captures the relevant information. - */ - cleanup?: null | ReportsReportTestStepReport; - /** - * If there was an error while executing this test scenario, this field describes the error - */ - execution_error?: null | ReportsReportErrorReport; - /** - * True iff test scenario completed normally with no failed checks - */ - successful?: number; - [k: string]: unknown; -} -/** - * monitoring.uss_qualifier.reports.report.Note, as defined in monitoring/uss_qualifier/reports/report.py - */ -export interface ReportsReportNote { - /** - * Path to content that replaces the $ref + * Name of this test scenario */ - // $ref?: string; - message: string; - timestamp: string; + name: string; [k: string]: unknown; } /** @@ -355,6 +343,18 @@ export interface ReportsReportErrorReport { timestamp: string; [k: string]: unknown; } +/** + * monitoring.uss_qualifier.reports.report.Note, as defined in monitoring/uss_qualifier/reports/report.py + */ +export interface ReportsReportNote { + /** + * Path to content that replaces the $ref + */ + // $ref?: string; + message: string; + timestamp: string; + [k: string]: unknown; +} /** * monitoring.uss_qualifier.reports.report.ActionGeneratorReport, as defined in monitoring/uss_qualifier/reports/report.py */ @@ -404,33 +404,33 @@ export interface ReportsReportTestSuiteReport { */ // $ref?: string; /** - * Type/location of this test suite - */ - suite_type: string; - /** - * Reports from test scenarios and test suites comprising the test suite for this report + * True iff test suite completed normally with no failed checks */ - actions: ReportsReportTestSuiteActionReport1[]; + successful?: boolean; /** - * List of capabilities defined in this test suite, evaluated for each participant. + * Time at which the test suite started */ - capability_evaluations: ReportsReportParticipantCapabilityEvaluationReport[]; + start_time: string; /** * URL at which this test suite is described */ documentation_url: string; /** - * Time at which the test suite started - */ - start_time: string; - /** - * True iff test suite completed normally with no failed checks + * List of capabilities defined in this test suite, evaluated for each participant. */ - successful?: number; + capability_evaluations: ReportsReportParticipantCapabilityEvaluationReport[]; /** * Time at which the test suite completed */ end_time?: string | null; + /** + * Reports from test scenarios and test suites comprising the test suite for this report + */ + actions: ReportsReportTestSuiteActionReport1[]; + /** + * Type/location of this test suite + */ + suite_type: string; /** * Name of this test suite */ @@ -445,19 +445,19 @@ export interface ReportsReportParticipantCapabilityEvaluationReport { * Path to content that replaces the $ref */ // $ref?: string; + condition_evaluation: ReportsReportParticipantCapabilityConditionEvaluationReport; /** - * ID of capability being evaluated. + * Whether the capability was successfully verified. */ - capability_id: string; + verified: boolean; /** * ID of participant for which capability is being evaluated. */ participant_id: string; /** - * Whether the capability was successfully verified. + * ID of capability being evaluated. */ - verified: number; - condition_evaluation: ReportsReportParticipantCapabilityConditionEvaluationReport; + capability_id: string; [k: string]: unknown; } /** @@ -472,6 +472,14 @@ export interface ReportsReportParticipantCapabilityConditionEvaluationReport { * When specified, the condition evaluated was CapabilityVerifiedCondition. */ capability_verified?: null | ReportsReportCapabilityVerifiedConditionEvaluationReport; + /** + * When specified, the condition evaluated was NoFailedChecksCondition. + */ + no_failed_checks?: null | ReportsReportNoFailedChecksConditionEvaluationReport; + /** + * Whether the condition was satisfied for the relevant participant. + */ + condition_satisfied: boolean; /** * When specified, the condition evaluated was AnyCondition. */ @@ -480,18 +488,10 @@ export interface ReportsReportParticipantCapabilityConditionEvaluationReport { * When specified, the condition evaluated was RequirementsCheckedCondition. */ requirements_checked?: null | ReportsReportRequirementsCheckedConditionEvaluationReport; - /** - * Whether the condition was satisfied for the relevant participant. - */ - condition_satisfied: number; /** * When specified, the condition evaluated was AllConditions. */ all_conditions?: null | ReportsReportAllConditionsEvaluationReport; - /** - * When specified, the condition evaluated was NoFailedChecksCondition. - */ - no_failed_checks?: null | ReportsReportNoFailedChecksConditionEvaluationReport; [k: string]: unknown; } /** @@ -529,21 +529,21 @@ export interface ReportsReportCheckedCapability { */ // $ref?: string; /** - * ID of the existing/previous participant-verifiable capability. + * Whether this capability was successfully verified */ - capability_id: string; + capability_verified: boolean; /** - * Location of the ParticipantCapabilityEvaluationReport for the existing/previous capability, relative to the TestSuiteReport in which the CapabilityVerifiedConditionEvaluationReport containing this CheckedCapability is located. + * The location of the ParticipantCapabilityConditionEvaluationReport for the capability, relative to the TestSuiteReport in which this checked requirement is located. */ - report_location: string; + capability_location: string; /** - * Whether this capability was successfully verified + * Location of the ParticipantCapabilityEvaluationReport for the existing/previous capability, relative to the TestSuiteReport in which the CapabilityVerifiedConditionEvaluationReport containing this CheckedCapability is located. */ - capability_verified: number; + report_location: string; /** - * The location of the ParticipantCapabilityConditionEvaluationReport for the capability, relative to the TestSuiteReport in which this checked requirement is located. + * ID of the existing/previous participant-verifiable capability. */ - capability_location: string; + capability_id: string; [k: string]: unknown; } /** @@ -566,6 +566,22 @@ export interface ReportsReportSpuriousReportMatch { location: string; [k: string]: unknown; } +/** + * Result of an evaluation of NoFailedChecksCondition dependent on whether any checks failed within the scope of the test suite in which this condition is located. + * + * monitoring.uss_qualifier.reports.report.NoFailedChecksConditionEvaluationReport, as defined in monitoring/uss_qualifier/reports/report.py + */ +export interface ReportsReportNoFailedChecksConditionEvaluationReport { + /** + * Path to content that replaces the $ref + */ + // $ref?: string; + /** + * The location of each FailedCheck, relative to the TestSuiteReport in which this report is located. + */ + failed_checks: string[]; + [k: string]: unknown; +} /** * Result of an evaluation of AnyCondition determined by whether any of the subconditions are satisfied. * @@ -602,6 +618,14 @@ export interface ReportsReportParticipantCapabilityConditionEvaluationReport1 { * When specified, the condition evaluated was CapabilityVerifiedCondition. */ capability_verified?: null | ReportsReportCapabilityVerifiedConditionEvaluationReport; + /** + * When specified, the condition evaluated was NoFailedChecksCondition. + */ + no_failed_checks?: null | ReportsReportNoFailedChecksConditionEvaluationReport; + /** + * Whether the condition was satisfied for the relevant participant. + */ + condition_satisfied: boolean; /** * When specified, the condition evaluated was AnyCondition. */ @@ -610,18 +634,10 @@ export interface ReportsReportParticipantCapabilityConditionEvaluationReport1 { * When specified, the condition evaluated was RequirementsCheckedCondition. */ requirements_checked?: null | ReportsReportRequirementsCheckedConditionEvaluationReport; - /** - * Whether the condition was satisfied for the relevant participant. - */ - condition_satisfied: number; /** * When specified, the condition evaluated was AllConditions. */ all_conditions?: null | ReportsReportAllConditionsEvaluationReport; - /** - * When specified, the condition evaluated was NoFailedChecksCondition. - */ - no_failed_checks?: null | ReportsReportNoFailedChecksConditionEvaluationReport; [k: string]: unknown; } /** @@ -692,22 +708,6 @@ export interface ReportsReportAllConditionsEvaluationReport { unsatisfied_conditions: ReportsReportParticipantCapabilityConditionEvaluationReport1[]; [k: string]: unknown; } -/** - * Result of an evaluation of NoFailedChecksCondition dependent on whether any checks failed within the scope of the test suite in which this condition is located. - * - * monitoring.uss_qualifier.reports.report.NoFailedChecksConditionEvaluationReport, as defined in monitoring/uss_qualifier/reports/report.py - */ -export interface ReportsReportNoFailedChecksConditionEvaluationReport { - /** - * Path to content that replaces the $ref - */ - // $ref?: string; - /** - * The location of each FailedCheck, relative to the TestSuiteReport in which this report is located. - */ - failed_checks: string[]; - [k: string]: unknown; -} /** * Configuration used to run uss_qualifier */ diff --git a/reports/yarn.lock b/reports/yarn.lock index a66fdca..ef7b4a7 100644 --- a/reports/yarn.lock +++ b/reports/yarn.lock @@ -437,6 +437,11 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== +"@types/jsonpath@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@types/jsonpath/-/jsonpath-0.2.0.tgz#13c62db22a34d9c411364fac79fd374d63445aa1" + integrity sha512-v7qlPA0VpKUlEdhghbDqRoKMxFB3h3Ch688TApBJ6v+XLDdvWCGLJIYiPKGZnS6MAOie+IorCfNYVHOPIHSWwQ== + "@types/prop-types@*": version "15.7.5" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" @@ -725,7 +730,7 @@ debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: dependencies: ms "2.1.2" -deep-is@^0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -792,6 +797,18 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escodegen@^1.8.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + eslint-plugin-react-hooks@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" @@ -867,6 +884,16 @@ espree@^9.6.0, espree@^9.6.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" +esprima@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" + integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A== + +esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + esquery@^1.4.2: version "1.5.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" @@ -881,6 +908,11 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" +estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" @@ -912,7 +944,7 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== @@ -1129,6 +1161,15 @@ json5@^2.2.2: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsonpath@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/jsonpath/-/jsonpath-1.1.1.tgz#0ca1ed8fb65bb3309248cc9d5466d12d5b0b9901" + integrity sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w== + dependencies: + esprima "1.2.2" + static-eval "2.0.2" + underscore "1.12.1" + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -1137,6 +1178,14 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -1222,6 +1271,18 @@ once@^1.3.0: dependencies: wrappy "1" +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + optionator@^0.9.3: version "0.9.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" @@ -1299,6 +1360,11 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + punycode@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" @@ -1416,6 +1482,18 @@ source-map-js@^1.0.2: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +static-eval@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" + integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg== + dependencies: + escodegen "^1.8.1" + strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -1471,6 +1549,13 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -1481,6 +1566,11 @@ typescript@^5.0.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== +underscore@1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" + integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== + update-browserslist-db@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" @@ -1521,6 +1611,11 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"