Commit Graph

36 Commits

Author SHA1 Message Date
Boshen 030857b509 refactor(diagnostics): update oxc-miette to v4 (#25395)
Remove the miette `Report` wrapper and update oxc-miette to v4's narrowed diagnostic and source protocol.

AI-assisted by OpenAI Codex.
2026-08-10 07:48:02 +00:00
leaysgur 465b723d04 refactor(formatter,oxfmt): unify host services as SessionServices on FormatSession (#25388)
- dispatcher
- string_embedder
- tailwind_sorter

Group these 3 together as `SessionServices`, make them available to `FormatSession`, and pass them around.
2026-08-09 14:32:10 +00:00
leaysgur e55215f931 chore(formatter,formatter_json): use print over println in example (#22910)
Since formatters already print their own "trailingNewLine", `print!` is fine.
2026-06-03 03:16:08 +00:00
leaysgur 705c0e969b refactor(formatter): introduce text-in public APIs (#22872)
Align `oxc_formatter` with `oxc_formatter_json`, both now expose `format(...) -> Result<Formatted<'a, _>, OxcDiagnostic>`.

- Add text-in `format` and `format_fragment`, also `format_program`, `parse_for_format` and the `FragmentContext` enum
  - Parse options, JSX enabling, js-in-xxx context aware handlings are applied internally
  - Make the `Formatter` struct and AST/IR primitives crate-internal
- Fold `get_parse_options` / `enable_jsx_source_type` and the `service` module into `parse_for_format`
2026-06-01 06:40:34 +00:00
leaysgur c323187f37 refactor(formatter): Split oxc_formatter and oxc_formatter_core (#22611)
Split `oxc_formatter` into:

- `oxc_formatter(_js)`: JS/TS specific formatter, comment handling, sortImports, jsdoc, etc
- `oxc_formatter_core`: Language agnostic IR, printer, etc

The naming convention is different from Biome or Ruff (they do not have `_core`, and `_formatter` is equivalent to the core), but this is because in Oxc, items without `_js` are the default.

As a basic task, I have added `Context` as a generic to all relevant parts to ensure support for multiple languages.

There might still be other components that could be refactored into the core, but I would like to finish them as I implement support for other languages.

Also moved some shared utilities to the core in advance.
2026-05-29 00:49:49 +00:00
renovate 611b3b69ef chore(deps): update dependency rust to v1.95.0 (#21509)
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [rust](https://redirect.github.com/rust-lang/rust) | minor | `1.94.1` → `1.95.0` |

---

### Release Notes

<details>
<summary>rust-lang/rust (rust)</summary>

### [`v1.95.0`](https://redirect.github.com/rust-lang/rust/compare/1.94.1...1.95.0)

[Compare Source](https://redirect.github.com/rust-lang/rust/compare/1.94.1...1.95.0)

</details>

---

### Configuration

📅 **Schedule**: (in timezone Asia/Shanghai)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/oxc-project/oxc).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMjMuOCIsInVwZGF0ZWRJblZlciI6IjQzLjEyMy44IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
2026-04-17 14:43:16 +00:00
Dunqing 4fec907ad5 feat(formatter): add JSDoc comment formatting support (#19828)
## Summary

Implements native JSDoc comment formatting in oxfmt, porting behavior from [prettier-plugin-jsdoc](https://github.com/hosseinmd/prettier-plugin-jsdoc) (v1.8.0). Tracked in #19702.

### Conformance

**145/145 (100%)** compatibility with prettier-plugin-jsdoc test suite.

- 1 fixture intentionally skipped (`descriptions/032-jsx-tsx-css`) — requires embedded CSS/HTML formatter callbacks not available in the standalone conformance runner
- Run with: `cargo run -p oxc_prettier_conformance -- --jsdoc`

Prettier conformance (non-JSDoc):
- **JS**: 746/753 (99.07%)
- **TS**: 591/601 (98.34%)

### Real-World Repository Testing

Validated against 5 real-world repositories (7,542 JSDoc tags total) using Prettier 3.8.1 + prettier-plugin-jsdoc 1.8.0 as baseline:

| Repository | JSDoc Tags | Files with Diffs |
|------------|-----------|-----------------|
| evolu      | 134       | 13              |
| wxt        | 1,183     | 1               |
| typedoc    | 792       | 11              |
| Chart.js   | 1,276     | 4               |
| svelte     | 4,157     | 5               |
| **Total**  | **7,542** | **34**          |

All 34 remaining diffs are **intentional design differences**, not bugs:
- `{@link}` kept atomic (upstream breaks across lines) — ~11 files
- `{@includeCode}` placed on own line (upstream splits tag syntax) — 3 files
- Sub-list continuation indent normalized to 4-space — 5 files
- `?Type` expanded to `Type | null` — 1 file
- Minor line-break position differences — 5 files
- Double-space normalized to single space — 1 file

10 upstream bugs documented in `tasks/prettier_conformance/jsdoc/upstream-jsdoc-bugs.md` — oxfmt intentionally produces correct output where the upstream plugin has known issues.

### Performance

Measured with `hyperfine` using `oxfmt --check` on real-world repos (16 threads):

| Repository | Without JSDoc | With JSDoc | Overhead    |
|------------|--------------|------------|-------------|
| evolu      | 434ms        | 427ms      | ~0% (noise) |
| wxt        | 410ms        | 410ms      | ~0% (noise) |
| typedoc    | 532ms        | 567ms      | ~7%         |
| Chart.js   | 497ms        | 479ms      | ~0% (noise) |
| svelte     | 510ms        | 549ms      | ~8%         |

typedoc and svelte (highest JSDoc density) show measurable ~7-8% wall-clock overhead. The rest are within noise. CPU time overhead is ~1-2% as JSDoc work parallelizes across threads.

### Architecture

The formatting pipeline processes each JSDoc comment through these stages:

1. **Parse** — Extract JSDoc structure via `oxc_jsdoc` (description, tags with type/name/comment)
2. **Normalize** — Canonicalize tag aliases (`@return` → `@returns`), normalize types (`Array.<T>` → `T[]`, `?Type` → `Type | null`), normalize markdown emphasis (`__bold__` → `**bold**`, `*italic*` → `_italic_`)
3. **Sort & Group** — Sort tags by upstream priority weights within `@typedef`/`@callback` groups; reorder `@param` tags to match function signature
4. **Format** — Route each tag to its specific formatter (type+name+comment, type+comment, generic, example); format descriptions via markdown AST with word wrapping; format embedded code blocks
5. **Serialize** — Assemble final comment with `/** ... */` wrapper, `* ` prefixes, and single-line optimization

**Key modules:**
- `serialize.rs` — Main pipeline orchestrator (`JsdocFormatter` struct)
- `tag_formatters.rs` — Tag-specific formatters (type+name+comment, type+comment, generic, example)
- `normalize.rs` — Type/emphasis/capitalization normalization
- `mdast_serialize.rs` — Markdown AST → formatted text serialization with `tag_string_length` offset
- `wrap.rs` — Word wrapping with `first_line_offset`, atomic JSDoc link tokens, table formatting
- `embedded.rs` — Embedded JS/TS/JSX/TSX code formatting in @example blocks
- `imports.rs` — `@import` tag parsing, merging, and sorting
- `param_order.rs` — `@param` tag reordering to match function signature
- `line_buffer.rs` — Single-allocation line accumulator

### Options Support

All 11 options from prettier-plugin-jsdoc are implemented:

| Option | Default | Status |
|--------|---------|--------|
| `capitalizeDescriptions` | `true` | ✅ |
| `commentLineStrategy` | `"singleLine"` | ✅ |
| `separateTagGroups` | `false` | ✅ |
| `separateReturnsFromParam` | `false` | ✅ |
| `bracketSpacing` | `false` | ✅ |
| `descriptionWithDot` | `false` | ✅ |
| `addDefaultToDescription` | `true` | ✅ |
| `preferCodeFences` | `false` | ✅ |
| `lineWrappingStyle` | `"greedy"` | ✅ (greedy + balance) |
| `descriptionTag` | `false` | ✅ |
| `keepUnparsableExampleIndent` | `false` | ✅ |

**Not yet ported** (no conformance fixtures): `jsdocVerticalAlignment`, `tsdoc` mode — can be added when needed.

### Features

- **Description formatting**: Capitalize first letter, normalize markdown emphasis, wrap text to print width
- **Markdown AST processing**: Parse descriptions via mdast for heading normalization, list formatting, reference links, code blocks, blockquotes, tables
- **Tag description wrapping**: Matches upstream's `tagStringLength` architecture — full description passes through markdown AST with first-line offset
- **Tag normalization**: 17 tag synonyms, sort by upstream priority weights within groups
- **Type formatting**: Normalize JSDoc types, format via the formatter's TS parser (simulating upstream's `formatType()`), handle rest params, bracket spacing
- **@example formatting**: Format embedded JS/TS/JSX/TSX code; fenced code blocks with language detection
- **@import handling**: Parse, merge by module path, sort (third-party before relative), format consolidated imports
- **@param reordering**: Reorder tags to match function signature parameter order
- **Default value handling**: Extract `[name=value]` defaults with "Default is \`value\`" suffix

### Upstream Fidelity

Verified against [prettier-plugin-jsdoc](https://github.com/hosseinmd/prettier-plugin-jsdoc) v1.8.0 source:

- **Identical**: Tag synonyms (17), sort priorities (46 tags), grouping logic (`TAGS_GROUP_HEAD`, `TAGS_GROUP_CONDITION`), type normalization pipeline, rest param handling, JSDoc link protection, emphasis normalization, capitalization rules
- **Architecture aligned**: Tag description wrapping uses `tag_string_length` / `first_line_offset` (equivalent to upstream's `!...?` prefix trick), balance mode effective width calculation, greedy fallback
- **10 upstream bugs documented** — oxfmt intentionally produces correct output where the plugin has known issues (HTML comment wrapping, `{@link}` off-by-one, `{@includeCode}` splitting, `@type` capitalization inconsistency, etc.)

### Optimization Techniques

- Single `LineBuffer` allocation per comment (one contiguous `String`, not `Vec<String>`)
- `Cow<'_, str>` throughout normalization — borrows when unchanged, allocates only when modified
- Fast-path skip of mdast parsing for plain-text descriptions (`needs_mdast_parsing()` heuristic)
- Fast-path skip of TS formatter for simple types (`needs_formatter_pass()` check)
- `SmallVec<[usize; 4]>` for import tag indices (stack allocation for common case)

## Test plan

- [x] `cargo test -p oxc_formatter` — 335 tests pass (76 unit + 259 fixture)
- [x] `cargo run -p oxc_prettier_conformance -- --jsdoc` — 145/145 (100%)
- [x] Prettier conformance: JS 746/753 (99.07%), TS 591/601 (98.34%)
- [x] Real-world repos: 34 diffs across 5 repos (7,542 JSDoc tags) — all design differences
- [x] Performance: 0-8% overhead across 5 real-world repos (typedoc ~7%, svelte ~8%, rest within noise)
- [x] `cargo clippy -p oxc_formatter --all-targets` — clean
- [x] `cargo fmt -- --check` — clean

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-03-23 07:44:47 +00:00
leaysgur fc66d6dfd1 refactor(formatter): Remove experimental prefix from sort_imports (#19472)
Internal changes that do not affect Oxfmt users.
2026-02-17 05:03:21 +00:00
leaysgur 4baebefa81 feat(formatter/sort_imports): Support { newlinesBetween: bool } inside groups (#19358)
Fixes #17830

Introduce new variant for `groups` like:

```json
  // "newlinesBetween": true, // Default
  "groups": [
      ["value-builtin", "value-external"],
      { "newlinesBetween": false }, // 👈🏻
      "value-parent",
      "value-sibling"
  ]
```

This allows you to specify line breaks globally between groups while reverting them at any position.

Conversely, you can also add line breaks at any position while specifying `newlinesBetween: false`.
2026-02-14 14:12:48 +00:00
Dunqing 233dda6a28 chore(formatter): support --diff in example (#18443)
Pass `--diff` to compare the formatted code to the input, which is very useful when you copy the Prettier output here to check if it is formatted as expected or for idempotency testing.
2026-01-26 05:35:54 +00:00
Dunqing 7ba9fa19f8 refactor(tasks): improve terminal diff output with context lines (#18437)
## Summary

Improves the `print_diff_in_terminal` function with better readability and a simpler API:

**API Changes:**
- `print_diff_in_terminal(expected, result)` - Simple API that takes two strings
- `print_text_diff(diff)` - For when you already have a `TextDiff` (e.g., to use `diff.ratio()`)

**Features:**
- Show 3 lines of context above and below each change
- Add line numbers with gutter separator (`│`)
- Add blank line between adjacent hunks for visual separation
- Add `...` separator when lines are skipped between hunks
- Use single-pass streaming algorithm with small fixed-size buffer
- Colors: red (`-`) for deletions, green (`+`) for insertions, dim for context

**Formatter Example:**
- Added `--diff` flag to show diff between original and formatted code

Example output:
```
    1 │class A {
    2 │  #x;
    3 │}
-   4 │var _x = /* @__PURE__ */ new WeakMap();
-   5 │var _B_brand = /* @__PURE__ */ new WeakSet();
    4 │class B {

-   7 │  constructor() {
-   8 │    babelHelpers.classPrivateMethodInitSpec(this, _B_brand);
-   9 │    babelHelpers.classPrivateFieldInitSpec(this, _x, void 0);
+   5 │  #x;
+   6 │  #y() {
+   7 │    this.#x;
    8 │  }

-  11 │}
-  12 │function _y() {
-  13 │  babelHelpers.classPrivateFieldGet2(_x, this);
    9 │}
```

## Test plan

- [x] `cargo check -p oxc_tasks_common` passes
- [x] Clippy passes
- [x] Verified output with `just test-transform --filter "plugins-integration/class-features-node-12/input.js"`

🤖 Generated with [Claude Code](https://claude.ai/code)
2026-01-23 08:53:25 +00:00
nilptr 984d5c1ca6 feat(oxfmt/sort-imports): support options.customGroups (#17576)
#17076 

### Authorship & Use of AI

All code changes in this pull request are completed by a human (myself).
ChatGPT is used **only** to assist with writing comments and this PR
description.

### Commit Structure

The changes are split into small, meaningful commits.
Each commit should be reviewable independently.

## Current State of the Implementation

For easier comparison, I forked
[actual](https://github.com/nilptr/actual) and made a few auxiliary
changes on a separate branch
[nilptr/feat/oxfmt-custom-groups](https://github.com/nilptr/actual/tree/nilptr/feat/oxfmt-custom-groups).

The auxiliary changes include:

- Upgraded `oxfmt` to address the incompatible binding API.
- Updated `eslint.config.mjs` to lint and fix .ts files.
- Updated `.oxfmtrc` to enable `experimentalSortImports`, keeping it
consistent with `eslint.config.mjs`.

### How to Compare? 

1. Clone `git@github.com:nilptr/actual.git` and check out
`nilptr/feat/oxfmt-custom-groups` branch.
2. Run `yarn install`
3. Run `NAPI_RS_NATIVE_LIBRARY_PATH=/path/to/binding.node yarn
fmt:oxfmt`

    The native binding can be obtained in one of the following ways:
- Download the
[oxfmt.darwin-arm64.node.zip](https://github.com/user-attachments/files/24402116/oxfmt.darwin-arm64.node.zip)
built by me (if you trust it, or scan it with
[VirusTotal](https://www.virustotal.com/gui/home/upload)).
- Build it by yourself: clone my repo, run `pnpm build`, and locate the
.node binding file under `apps/oxfmt/src-js`.
    
4. Inspect the results with `git diff` — the diff shows the differences
between perfectionist and oxfmt

### Observed Differences

There are 9 differences in total:

- **4 differences** are unrelevant to `experimentalSortImports`. (be the
way, they are introduced after I rebased main branch)
- **5 differences** are relevant to `experimentalSortImports`, but are
not caused by the group-matching logic, which is the focus of this PR.
  - 4 of them are blank lines after side-effect imports being removed
  - 1 of them is the wrong `ImportLineMetadata.source`

<img width="4064" height="2152" alt="image"
src="https://github.com/user-attachments/assets/8b4cb860-19d6-42b9-a0a4-6db0b3e40194"
/>

<img width="4064" height="2152" alt="image"
src="https://github.com/user-attachments/assets/e2616d7b-b4b2-4dbc-a0d3-ea15d1c0177e"
/>

------

I believe we can start review now.
While the review is ongoing, I will also try to see whether the observed
differences can be fixed in this PR.

---------

Co-authored-by: Yuji Sugiura <y.sugiura.0316@gmail.com>
2026-01-19 10:23:49 +09:00
Dunqing d6f90dd4a1 chore(formatter): add --print-width support for the formatter example (#16379)
Add `--print-width` support for the example and change the default to 80 for common cases
2025-12-02 08:24:01 +00:00
leaysgur 8c2d09f39f refactor(formatter/sort-imports): Resolve default options.(internalPattern|groups) in options.rs (#16375)
Yet another pure refactoring.
2025-12-02 07:37:06 +00:00
leaysgur e5a78ed269 refactor(formatter/sort-imports): Move SortImportsOptions to sort_imports/options.rs (#16374)
Pure refactoring.
2025-12-02 07:37:06 +00:00
leaysgur 73748568af feat(formatter/sort-imports): Support options.internalPattern (#16372)
Part of #14253

The original implementation accepts a `RegExp` string, but based on the actual usage, it seems that checking as prefix is sufficient for now.

https://github.com/search?q=%22internalPattern%3A+%5B%22&type=code
2025-12-02 07:37:06 +00:00
leaysgur 7818e22367 feat(formatter/sort-imports): Support options.groups (#15831)
Part of #14253

Now user can specify own `groups` like:

```js
groups: [
  "type",
  ["external", "builtin"]
]
```

- [x] Parse config
- [x] Implementation
- [x] Test
- [x] Refactor for readability
- [x] Refactor for performance
- [x] ~~Report non-defaults?~~

Sorry for the large diffs. Yes, it's incredibly complicated. 😓
2025-11-20 09:09:00 +00:00
leaysgur 25a01638d5 feat(formatter/sort_imports): Sort imports by Array<Array<string>> groups (#15578)
Current implementation was performimg sort based on hard-coded `enum`.

This PR changed it to use group definitions like this.

```js
[
  'type-import',
  ['value-builtin', 'value-external'],
  'type-internal',
  'value-internal',
  ['type-parent', 'type-sibling', 'type-index'],
  ['value-parent', 'value-sibling', 'value-index'],
  'ts-equals-import',
  'unknown',
]
```

> https://perfectionist.dev/rules/sort-imports#groups

And this will be refactored in the subsequent 2 PRs.
2025-11-11 05:53:54 +00:00
leaysgur 5708126aa8 feat(formatter/sort_imports): Add options.newlinesBetween (#15369)
Part of #14253

Implement `options.newlinseBetween`.

> https://perfectionist.dev/rules/sort-imports#newlinesbetween

Original implementation for this is `type: number | 'ignore'default: 1`.

However, our printer does not allow to insert multiple empty lines.

https://github.com/oxc-project/oxc/blob/e061ae3883dab0864bbe3803fa3d76248a7c2e43/crates/oxc_formatter/src/formatter/printer/mod.rs#L129

So, we only support as `bool` for now.
2025-11-07 02:46:25 +00:00
leaysgur 5de99c2765 refactor(formatter): Export unified way to get_parse_options (#15027)
Export `oxc_formatter::get_parse_options` to get this options everywhere.

```rs
ParseOpitons {
    parse_regular_expression: false,
    // Enable all syntax features
    allow_v8_intrinsics: true,
    allow_return_outside_function: true,
    // `oxc_formatter` expects this to be false
    preserve_parens: false,
}
```
2025-10-28 09:26:23 +00:00
leaysgur 597c9e8804 refactor(formatter): Remove redundunt public API (#14915)
As far as I can remember, `doc()` function was only added for the sort-imports example.

Now that we made `format()` as `pub`, there is no reason to use it.
2025-10-27 18:18:59 +09:00
Dunqing 8fe7e854ae feat(formatter): support printing Formatter IR (#14855) 2025-10-23 00:42:30 +00:00
leaysgur 142e7ac5e6 feat(formatter/sort-imports): Implement options.ignoreCase: bool (#14367)
Part of #14253

Implement `ignoreCase` option, default `true`.
2025-10-07 00:31:16 +00:00
leaysgur 593c416d9c feat(formatter/sort-imports): Add options.order: asc|desc (#14292)
Part of #14253

Implement `order` option.
2025-10-07 00:31:15 +00:00
leaysgur f75b8f760f feat(formatter/sort-imports): Wrap ImportDeclaration with JsLabels (#14109)
Part of #14253

This will help us to distinguish between the following in IR elements.

```js
import "x"
// vs
import("y")
```
2025-10-07 00:31:14 +00:00
leaysgur 6be4ae553d feat(formatter/sort-imports): Experimental sort-imports base (#14105)
Part of #14253

This is preparation for implementing sort-imports by reordering IR.

While performance is inferior, it is separated from the main formatting process and is completely opt-in.
This should also make it easier to find the cause if any issues arise.
2025-10-07 00:31:14 +00:00
leaysgur 10a41abcc3 feat(formatter): Export doc() API to inspect IR in example (#14068)
```sh
❯ cargo run -p oxc_formatter --example formatter t.ts --ir
    Finished `dev` profile [unoptimized] target(s) in 0.05s
     Running `target/debug/examples/formatter t.ts --ir`
[
  StaticText("import"),
  Space,
  StaticText("{"),
  Space,
  DynamicText("useState"),
  Space,
  StaticText("}"),
  Space,
  StaticText("from"),
  Space,
  LocatedTokenText("\"react\""),
  StaticText(";"),
  Line(Empty),
  StaticText("export"),
  Space,
  StaticText("function"),
  Space,
  DynamicText("useData"),
  Tag(StartGroup(Group { id: None, mode: Cell { value: Flat } })),
  Tag(EndGroup),
  Tag(StartGroup(Group { id: None, mode: Cell { value: Flat } })),
  StaticText("("),
  Tag(StartGroup(Group { id: None, mode: Cell { value: Flat } })),
  Tag(EndGroup),
  StaticText(")"),
  Tag(EndGroup),
  Space,
  Space,
  StaticText("{"),
  Tag(StartIndent),
  Line(Hard),

...

  StaticText("}"),
  Line(Hard),
]
```
2025-09-24 06:22:29 +00:00
Dunqing 2cead8bc3d feat(formatter): keep parser options consistent for all formatter usages (#13884)
Copy from oxfmt
https://github.com/oxc-project/oxc/blob/adda5f56de542ce178f0c68f5732d60166c278b2/apps/oxfmt/src/service.rs#L45-L54
2025-09-18 23:18:53 +00:00
Dunqing afb4ee049e feat(formatter): correctly handle semicolon (#13251) 2025-08-24 08:28:12 +00:00
Dunqing db1d1918fc feat(formatter): complete printing JSX-related nodes (#13112) 2025-08-24 03:32:05 +00:00
Copilot 514322c4c3 docs(rust): Add minimal documentation to example files in crates directory (#12731) 2025-08-02 22:02:20 +08:00
Dunqing b2cb2fa468 chore(formatter): align parser options of example with prettier conformance (#11905)
Keep them as the same, so that it wouldn't confuse you.
https://github.com/oxc-project/oxc/blob/36d5a795f053662238eead81021efad4ed0bf332/tasks/prettier_conformance/src/lib.rs#L423-L429
2025-06-26 03:12:14 +00:00
Boshen d82dff91c8 feat(formatter): new implementation based on biome formatter (#10108)
Part of #5068, suggested by @ematipico and @MichaReiser, where @leaysgur
and I explored using biome formatter as the base and made a success. All
credits to the old Rome and the new Biome team.

This PR is in a boilerplate state where some of the functions are marked
as `todo!()`.

I also made the following changes:

* changed the base to be less generic, removed the `Language` and
`Context` generics
* expanded the formatter lifetime to include an `'ast` lifetime
* added access to the source text and comments
* added a mechanism for tracking and accessing parent ast nodes (done by
our codegen)
* removed most of the unit tests because they no longer compile
* removed the `oxc_prettier` crate
2025-03-30 16:54:37 +08:00
Boshen a6717db423 refactor(formatter,linter,codegen): remove oxc_formatter (#1968)
closes #1941
2024-01-10 06:41:20 +00:00
Boshen 14720e7c69 refactor: move SourceType from oxc_ast to oxc_span (#351)
related #350
2023-05-12 23:16:14 +08:00
Boshen c2428d8abd chore: rename oxc_printer to oxc_formatter (#336) 2023-05-07 17:47:13 +08:00