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"