From 4922fce7c970793e4e2550a446ae6e8abe5e967c Mon Sep 17 00:00:00 2001 From: jedel1043 Date: Sat, 28 Mar 2026 02:52:31 -0600 Subject: [PATCH] Generate ES versions dynamically --- .../cards/TestGrid/index.tsx | 16 +++++- .../components/SuiteSelector/index.tsx | 6 +- .../conformance/ResultsDisplay/index.tsx | 3 +- .../conformance/ResultsDisplay/nav.tsx | 21 +++---- src/components/conformance/types.ts | 25 +-------- src/components/conformance/utils.ts | 55 ++----------------- 6 files changed, 37 insertions(+), 89 deletions(-) diff --git a/src/components/conformance/ResultsDisplay/components/SuiteDataContainer/cards/TestGrid/index.tsx b/src/components/conformance/ResultsDisplay/components/SuiteDataContainer/cards/TestGrid/index.tsx index 58650b53..3a128468 100644 --- a/src/components/conformance/ResultsDisplay/components/SuiteDataContainer/cards/TestGrid/index.tsx +++ b/src/components/conformance/ResultsDisplay/components/SuiteDataContainer/cards/TestGrid/index.tsx @@ -1,6 +1,5 @@ import React from "react"; import { - SpecEdition, TestOutcome, TestResult, SuiteResult, @@ -64,12 +63,25 @@ function applyFilter(filter: FilterOption, outcome: TestOutcome): boolean { } } +function esFlagToEdition(esFlag: string): number { + if (!esFlag.startsWith("es")) { + throw RangeError("invalid esFlag"); + } + + const parsedEsFlag = Number(esFlag.substring(2)); + if (!Number.isInteger(parsedEsFlag)) { + throw RangeError("esFlag is not an integer"); + } + + return parsedEsFlag; +} + function Grid(props: GridProps): React.ReactNode { return ( <> {props.esFlag ? props.tests - .filter((test) => test.edition <= SpecEdition[props.esFlag]) + .filter((test) => test.edition <= esFlagToEdition(props.esFlag)) .filter((test) => applyFilter(props.filterOption, test.result)) .map((test) => { return ( diff --git a/src/components/conformance/ResultsDisplay/components/SuiteSelector/index.tsx b/src/components/conformance/ResultsDisplay/components/SuiteSelector/index.tsx index 46d03ba7..fb0af7c9 100644 --- a/src/components/conformance/ResultsDisplay/components/SuiteSelector/index.tsx +++ b/src/components/conformance/ResultsDisplay/components/SuiteSelector/index.tsx @@ -88,17 +88,17 @@ function SuiteStatistics({ setFilter(filterOption); }, [filterOption]); - let passed = + const passed = filter == FilterOption.None || filter == FilterOption.Passed ? testResults.passed : 0; - let ignored = + const ignored = filter == FilterOption.None || filter == FilterOption.Ignored ? testResults.ignored : 0; - let failed = + const failed = filter == FilterOption.None || filter == FilterOption.Failed ? `${testResults.total - testResults.passed - testResults.ignored} (${testResults.panic}\u26A0)` : 0; diff --git a/src/components/conformance/ResultsDisplay/index.tsx b/src/components/conformance/ResultsDisplay/index.tsx index d90d773f..452bbc29 100644 --- a/src/components/conformance/ResultsDisplay/index.tsx +++ b/src/components/conformance/ResultsDisplay/index.tsx @@ -13,7 +13,7 @@ import { createSearchParams, mapToResultInfo, } from "@site/src/components/conformance/utils"; -import { useHistory, useLocation } from "@docusaurus/router"; +import { useHistory } from "@docusaurus/router"; import styles from "./styles.module.css"; @@ -211,6 +211,7 @@ export default function ResultsDisplay(props: ResultsProps): React.ReactNode {
void; setEcmaScriptFlag: (string) => void; setSortOption: (string) => void; @@ -21,6 +22,7 @@ export default function ResultNavigation(
@@ -96,6 +98,7 @@ function BreadCrumbItem(props: BreadCrumbItemProps): React.ReactNode { type DropDownProps = { esVersionValue: string; + editions: string[]; setEcmaScriptFlag: (string) => void; }; @@ -122,15 +125,13 @@ function EcmaScriptVersionDropdown(props: DropDownProps): React.ReactNode {
); diff --git a/src/components/conformance/types.ts b/src/components/conformance/types.ts index 8d126965..4bcd77ee 100644 --- a/src/components/conformance/types.ts +++ b/src/components/conformance/types.ts @@ -54,15 +54,7 @@ export type SuiteResult = { }; export type VersionedStats = { - es5: TestStats; - es6: TestStats; - es7: TestStats; - es8: TestStats; - es9: TestStats; - es10: TestStats; - es11: TestStats; - es12: TestStats; - es13: TestStats; + [edition: string]: TestStats; }; export type TestStats = { @@ -74,7 +66,7 @@ export type TestStats = { export type TestResult = { name: string; - edition: SpecEdition; + edition: number; strict: boolean; result: TestOutcome; }; @@ -85,16 +77,3 @@ export enum TestOutcome { Failed, Panic, } - -export enum SpecEdition { - es5 = 5, - es6, - es7, - es8, - es9, - es10, - es11, - es12, - es13, - ESNext, -} diff --git a/src/components/conformance/utils.ts b/src/components/conformance/utils.ts index edb97a31..9df4ebdc 100644 --- a/src/components/conformance/utils.ts +++ b/src/components/conformance/utils.ts @@ -3,7 +3,6 @@ import { FilterOption, ResultInfo, SortOption, - SpecEdition, SuiteResult, TestOutcome, TestResult, @@ -12,7 +11,6 @@ import { VersionedStats, VersionItem, } from "@site/src/components/conformance/types"; -import { url } from "node:inspector"; // Take a search param and create a state object export function createUrlState(search: string): UrlState { @@ -251,32 +249,16 @@ export function mapToTestStats(unmappedValue: HttpStatistics): TestStats { // Interface for the http response of boa_tester's versioned `Statistics` interface HttpVersionedStatistics { - es5: HttpStatistics; - es6: HttpStatistics; - es7: HttpStatistics; - es8: HttpStatistics; - es9: HttpStatistics; - es10: HttpStatistics; - es11: HttpStatistics; - es12: HttpStatistics; - es13: HttpStatistics; + [edition: string]: HttpStatistics; } // Function for converting an http response of boa_tester's versioned `Statistics` to `VersionedStats` export function mapToVersionedStats( unmappedValue: HttpVersionedStatistics, ): VersionedStats { - return { - es5: mapToTestStats(unmappedValue.es5), - es6: mapToTestStats(unmappedValue.es6), - es7: mapToTestStats(unmappedValue.es7), - es8: mapToTestStats(unmappedValue.es8), - es9: mapToTestStats(unmappedValue.es9), - es10: mapToTestStats(unmappedValue.es10), - es11: mapToTestStats(unmappedValue.es11), - es12: mapToTestStats(unmappedValue.es12), - es13: mapToTestStats(unmappedValue.es13), - }; + return Object.fromEntries( + Object.entries(unmappedValue).map(([k, v]) => [k, mapToTestStats(v)]), + ); } // Interface for the http response of boa_tester's `TestResult` @@ -291,39 +273,12 @@ interface HttpTestResult { export function mapToTestResult(unmappedValue: HttpTestResult): TestResult { return { name: unmappedValue.n, - edition: mapToSpecEditionEnum(unmappedValue.v), + edition: Number(unmappedValue.v), strict: Boolean(unmappedValue.s), result: mapToTestOutcomeEnum(unmappedValue.r), }; } -export function mapToSpecEditionEnum( - unmappedValue: number | string, -): SpecEdition { - switch (Number(unmappedValue)) { - case 5: - return SpecEdition.es5; - case 6: - return SpecEdition.es6; - case 7: - return SpecEdition.es7; - case 8: - return SpecEdition.es8; - case 9: - return SpecEdition.es9; - case 10: - return SpecEdition.es10; - case 11: - return SpecEdition.es11; - case 12: - return SpecEdition.es12; - case 13: - return SpecEdition.es13; - default: - return SpecEdition.ESNext; - } -} - export function mapToTestOutcomeEnum(unmappedValue: string): TestOutcome { switch (String(unmappedValue)) { case "O":