Files
regex-tools/src/components/CapabilityPanel.tsx

123 lines
3.5 KiB
TypeScript

import { REGEXPP_VERSION, SYNTAX_PROFILE } from "../version";
import type { RegexExecutionResult } from "../regex/model/match";
import type { RegexSyntaxResult } from "../regex/model/syntax";
import type { RegexEngineCapabilities } from "../regex/model/flavour";
function capability(
capabilities: RegexEngineCapabilities | undefined,
key: keyof RegexEngineCapabilities,
unavailableDetail?: string,
): string {
if (!capabilities) return "Awaiting first engine result";
if (capabilities[key]) return "Available";
return unavailableDetail
? `Unavailable — ${unavailableDetail}`
: "Unavailable";
}
function offsetLabel(
unit: RegexExecutionResult["engine"]["offsetUnit"] | undefined,
): string {
switch (unit) {
case "utf16":
return "UTF-16 code units";
case "code-point":
return "Unicode code points";
case "utf8-byte":
return "UTF-8 bytes";
case "byte":
return "Bytes";
default:
return "Awaiting first engine result";
}
}
export function CapabilityPanel({
syntax,
execution,
}: {
readonly syntax?: RegexSyntaxResult;
readonly execution?: RegexExecutionResult;
}) {
const capabilities = execution?.engine.capabilities;
const rows = [
[
"Flavour",
execution?.engine.flavour ??
syntax?.root.support.flavour ??
"ECMAScript (awaiting workers)",
],
[
"Syntax provider",
syntax
? `${syntax.provider.id} ${syntax.provider.version}`
: `regexpp ${REGEXPP_VERSION} (awaiting syntax worker)`,
],
["Syntax profile", SYNTAX_PROFILE],
[
"Provider coverage",
syntax
? `${syntax.coverage.status}: ${syntax.coverage.summary}`
: "Awaiting syntax worker result",
],
[
"Execution engine",
execution?.engine.engineName ?? "Awaiting first engine result",
],
[
"Engine/runtime version",
execution?.engine.engineVersion ?? "Shown after first execution",
],
["Native offsets", offsetLabel(execution?.engine.offsetUnit)],
["Compilation", capability(capabilities, "compilation")],
["Matching", capability(capabilities, "matching")],
["Replacement", capability(capabilities, "replacement")],
["Named captures", capability(capabilities, "namedCaptures")],
[
"Capture history",
capability(
capabilities,
"captureHistory",
"the adapter exposes only the final retained capture",
),
],
[
"Actual execution trace",
capability(
capabilities,
"actualTrace",
"the adapter exposes no engine trace",
),
],
["Benchmark", capability(capabilities, "benchmark")],
] as const;
return (
<section
className="panel capability-panel"
aria-labelledby="capability-heading"
>
<header className="panel-heading">
<div>
<p className="eyebrow">Current provider and adapter metadata</p>
<h2 id="capability-heading">Capabilities</h2>
</div>
<span className="provenance-badge">Community build</span>
</header>
<dl className="capability-grid">
{rows.map(([term, value]) => (
<div key={term}>
<dt>{term}</dt>
<dd>{value}</dd>
</div>
))}
</dl>
<p className="capability-roadmap">
Next flavour: official PCRE2 10.47 WebAssembly with actual callout
traces. Python, Go, Rust, .NET and Java remain unavailable until their
named runtimes pass the same worker, offset, conformance and licensing
gates.
</p>
</section>
);
}