### 🚀 Features -ca649e0ecma: Define math constants as known globals and resolve their types (#26585) (Armano) -9ef028ccodegen: Add `ascii_only` option (#25994) (Samuel Attard) -80a76a0minifier: Negate binary comparison for `typeof x < 'u'` (#26367) (Armano) ### 🐛 Bug Fixes -8ca76daparser: Reject `accessor` modifiers on methods (#26617) (camc314) -1916f31parser: Reject `readonly` modifier on constructors (#26612) (camc314) -1c42008parser: Handle escaped let in for loops (#26583) (camc314) -d21d5cfparser: Recognize annotated empty arrows in conditionals (#26537) (camc314) -d7713adparser: Classify Unicode line breaks in block comments (#26536) (camc314) -75cd919transformer: Preserve receivers in private optional chains (#26535) (camc314) -b32d25dparser: Reject escaped import-phase keywords (#26534) (camc314) -47b8311parser: Recognize contextual binding names in type lookaheads (#26532) (camc314) -d6b6705parser: Require arrow separator in TypeScript function types (#26529) (camc314) -e98beefparser: Disambiguate await using in for initializers (#26527) (camc314) -92afee6parser: Allow parenthesized JSX comma expressions with preserve_parens=false (#26524) (camc314) -31508b1parser: Reject return types on constructor overloads (#26523) (camc314) -a091fc4parser: Validate await context for await using declarations (#26495) (camc314) -5501e86parser: Disallow in expressions in using for-loop initializers (#26490) (camc314) -c8e5fa7parser: Allow escaped type names in import and export specifiers (#26487) (camc314) -2dcee2fparser: Reject async modifiers on class fields (#26486) (camc314) -973d58eparser: Require comma after TypeScript this parameter (#26480) (camc314) -32d00c5codegen: Preserve instantiation expression precedence (#26424) (camc314) -cfa47abparser: Allow `in` expressions in class static blocks (#26423) (camc314) -5986187packages/codegen: Preserve private-in right operand precedence (#26420) (camc314) -f8e6c6cpackages/codegen: Preserve in restriction through yield arguments (#26421) (camc314) -d61e3bfparser: Validate TS named tuple rest elements (#26419) (camc314) -ae6c386codegen: Preserve in restriction through yield arguments (#26413) (camc314) -42ac916codegen: Preserve private-in right operand precedence (#26411) (camc314) -10521b2parser: Allow escaped type default import bindings (#26409) (camc314) -72cb5e3parser: Reject rest parameters in getters (#26400) (camc314) -6e15ad5packages/codegen: Print matching quoted import names as identifiers (#26404) (camc314) -bbbb4bcpackages/codegen: Preserve private-in left operand precedence (#26403) (camc314) -a111b5bpackages/codegen: Print accessibility modifiers before abstract (#26402) (camc314) -4e76602parser: Allow `in` in arrow block bodies within `for` initializers (#26395) (camc314) -b20fc19parser: Reject partially parenthesized mixed coalesce expressions (#26394) (camc314) ### ⚡ Performance -1f902a6isolated_declarations: Key scope maps by `Ident` (#26380) (Dunqing) -a242469minfiier: Reduce allocs when creating indirect access (#26601) (Armano) -5b4787fminifier: Update chain expressions in place (#26544) (Armano) -0bc1661minifier: Try merging before creating new expression statements (#26556) (Armano) -c78d707minifier: Process newly created stmt in handle_if_statement (#26541) (Armano) -029c84bminfier: Update expressions in place when substituting alternate syntax (#26460) (Armano) -d198982codegen: Outline postfix source mapping work (#26450) (camc314) -53f006eecmascript: Format small integer literals with itoa (#26446) (camc314) -8bfb8c0codegen: Avoid duplicate sourcemap name lookups (#26441) (camc314) ### 📚 Documentation -38533acast: Move type annotation span comment to span field (#26522) (camc314)
Oxc Relay Transform
Native Node.js bindings for Oxc's Rust port of the Relay transform (babel-plugin-relay / @swc/plugin-relay).
The API follows oxc-transform: pass a filename, source text, and optional
options to either transformSync or transform. graphql tagged template
expressions are replaced with references to the artifact files generated by
relay-compiler; everything else — including TypeScript and JSX syntax — is
preserved untouched, so the output composes with any downstream toolchain.
import { transformSync } from "oxc-transform-relay";
const result = transformSync("src/Component.tsx", "const data = graphql`query FooQuery { id }`;");
console.log(result.code);
// import _FooQuery from "./__generated__/FooQuery.graphql.js";
// const data = _FooQuery;
errors contains every diagnostic reported by parsing and the transform; when
it is non-empty, code is empty.
Options
artifactDirectory— directoryrelay-compileremits all artifacts to (itsartifactDirectorysetting). When set, artifacts are imported via a relative path computed lexically from the file being transformed, so pass the filename and directory either both absolute or both relative to the same base directory. When unset, artifacts are imported from the__generated__directory next to the file being transformed.language—"typescript","javascript"(default), or"flow". Artifacts are imported asName.graphql.tsfor"typescript"andName.graphql.jsotherwise.eagerEsModules— emit a hoisted default import pergraphqltag (default, matchingbabel-plugin-relaysince Relay v17) instead of an inlinerequire()call (@swc/plugin-relayand Next.js behavior).lang,sourceType,sourcemap— configure the surrounding Oxc parse/codegen pipeline, as inoxc-transform.
Limitations
Compared to babel-plugin-relay: no development-mode artifact hash validation,
no jsModuleFormat: "haste", no isDevVariableName, and the GraphQL definition
name is extracted textually (like @swc/plugin-relay) rather than by parsing
the document, so documents are not validated.