From 8a6b75008d0cb5c5dabb08281ad2393ba4341d1c Mon Sep 17 00:00:00 2001 From: Mike Olson Date: Sat, 13 Dec 2025 15:23:25 -0500 Subject: Add support for oxfmt formatter (#382) ## Summary - Add oxfmt (Oxc Formatter) as a new formatter option for JavaScript and TypeScript files ## Details [Oxfmt](https://oxc.rs/docs/guide/usage/formatter) is a Rust-powered, Prettier-compatible code formatter from the Oxc project. It's currently in alpha but offers significant performance improvements (30x+ faster than Prettier). Key points: - Uses `inplace` mode since oxfmt doesn't support stdin/stdout - Works with all common JS/TS extensions (.js, .jsx, .mjs, .cjs, .ts, .tsx, .mts) - Not added to `apheleia-mode-alist` - users can opt-in by setting `apheleia-formatter` to `oxfmt` - Defaults are already sensible: 2-space indent, printWidth 100, no tabs Example usage: ```elisp (setf (alist-get 'oxfmt apheleia-formatters) '("apheleia-npx" "oxfmt" inplace)) ;; To use for JS/TS files: (setq-default apheleia-formatter 'oxfmt) ;; Or per-mode: (setf (alist-get 'typescript-ts-mode apheleia-mode-alist) 'oxfmt) ``` --- CHANGELOG.md | 3 +++ apheleia-formatters.el | 1 + test/formatters/installers/oxfmt.bash | 1 + test/formatters/samplecode/oxfmt/in.js | 4 ++++ test/formatters/samplecode/oxfmt/in.ts | 1 + test/formatters/samplecode/oxfmt/out.js | 5 +++++ test/formatters/samplecode/oxfmt/out.ts | 6 ++++++ 7 files changed, 21 insertions(+) create mode 100644 test/formatters/installers/oxfmt.bash create mode 100644 test/formatters/samplecode/oxfmt/in.js create mode 100644 test/formatters/samplecode/oxfmt/in.ts create mode 100644 test/formatters/samplecode/oxfmt/out.js create mode 100644 test/formatters/samplecode/oxfmt/out.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index f36d76a..09e3bd4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,11 +9,14 @@ The format is based on [Keep a Changelog]. * `bibtex-reformat` for BibTeX files. * `rubocop` changed to use `--force-exclusion` to obey exclusions in config files ([#380]). +* [oxfmt](https://oxc.rs/docs/guide/usage/formatter) for JavaScript and + TypeScript files ([#382]). ### Bugs fixed * `shfmt` did not work with `apheleia-formatters-respect-indent-level` [#380]: https://github.com/radian-software/apheleia/pull/380 +[#382]: https://github.com/radian-software/apheleia/pull/382 ## 4.4.2 (released 2025-11-21) ### Bugs fixed diff --git a/apheleia-formatters.el b/apheleia-formatters.el index 0cfad9f..9bc39f8 100644 --- a/apheleia-formatters.el +++ b/apheleia-formatters.el @@ -112,6 +112,7 @@ "--enable-outside-detected-project")) (ocp-indent . ("ocp-indent")) (ormolu . ("ormolu" "--stdin-input-file" filepath)) + (oxfmt . ("apheleia-npx" "oxfmt" inplace)) (perltidy . ("perltidy" "--quiet" "--standard-error-output" (apheleia-formatters-indent "-t" "-i") (apheleia-formatters-fill-column "-l"))) diff --git a/test/formatters/installers/oxfmt.bash b/test/formatters/installers/oxfmt.bash new file mode 100644 index 0000000..7c33fd0 --- /dev/null +++ b/test/formatters/installers/oxfmt.bash @@ -0,0 +1 @@ +npm install -g oxfmt diff --git a/test/formatters/samplecode/oxfmt/in.js b/test/formatters/samplecode/oxfmt/in.js new file mode 100644 index 0000000..fd56713 --- /dev/null +++ b/test/formatters/samplecode/oxfmt/in.js @@ -0,0 +1,4 @@ +function HelloWorld({greeting = "hello", greeted = '"World"', silent = false, onMouseOver,}) { + + if(!greeting){return null}; + } diff --git a/test/formatters/samplecode/oxfmt/in.ts b/test/formatters/samplecode/oxfmt/in.ts new file mode 100644 index 0000000..c75d40f --- /dev/null +++ b/test/formatters/samplecode/oxfmt/in.ts @@ -0,0 +1 @@ +interface GreetingSettings{greeting: string; duration?: number; color?: string;}declare function greet(setting: GreetingSettings): void; diff --git a/test/formatters/samplecode/oxfmt/out.js b/test/formatters/samplecode/oxfmt/out.js new file mode 100644 index 0000000..ca6d896 --- /dev/null +++ b/test/formatters/samplecode/oxfmt/out.js @@ -0,0 +1,5 @@ +function HelloWorld({ greeting = "hello", greeted = '"World"', silent = false, onMouseOver }) { + if (!greeting) { + return null; + } +} diff --git a/test/formatters/samplecode/oxfmt/out.ts b/test/formatters/samplecode/oxfmt/out.ts new file mode 100644 index 0000000..143b5a7 --- /dev/null +++ b/test/formatters/samplecode/oxfmt/out.ts @@ -0,0 +1,6 @@ +interface GreetingSettings { + greeting: string; + duration?: number; + color?: string; +} +declare function greet(setting: GreetingSettings): void; -- cgit v1.0