Просмотр исходного кода

feat: add experimental oxfmt formatter (#5620)

matvey 2 месяцев назад
Родитель
Сommit
1aee8b49e1

+ 1 - 0
packages/opencode/src/flag/flag.ts

@@ -26,6 +26,7 @@ export namespace Flag {
     truthy("OPENCODE_ENABLE_EXA") || OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_EXA")
   export const OPENCODE_EXPERIMENTAL_BASH_MAX_OUTPUT_LENGTH = number("OPENCODE_EXPERIMENTAL_BASH_MAX_OUTPUT_LENGTH")
   export const OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS = number("OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS")
+  export const OPENCODE_EXPERIMENTAL_OXFMT = OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_OXFMT")
 
   function truthy(key: string) {
     const value = process.env[key]?.toLowerCase()

+ 20 - 0
packages/opencode/src/format/formatter.ts

@@ -2,6 +2,7 @@ import { readableStreamToText } from "bun"
 import { BunProc } from "../bun"
 import { Instance } from "../project/instance"
 import { Filesystem } from "../util/filesystem"
+import { Flag } from "@/flag/flag"
 
 export interface Info {
   name: string
@@ -74,6 +75,25 @@ export const prettier: Info = {
   },
 }
 
+export const oxfmt: Info = {
+  name: "oxfmt",
+  command: [BunProc.which(), "x", "oxfmt", "$FILE"],
+  environment: {
+    BUN_BE_BUN: "1",
+  },
+  extensions: [".js", ".jsx", ".mjs", ".cjs", ".ts", ".tsx", ".mts", ".cts"],
+  async enabled() {
+    if (!Flag.OPENCODE_EXPERIMENTAL_OXFMT) return false
+    const items = await Filesystem.findUp("package.json", Instance.directory, Instance.worktree)
+    for (const item of items) {
+      const json = await Bun.file(item).json()
+      if (json.dependencies?.oxfmt) return true
+      if (json.devDependencies?.oxfmt) return true
+    }
+    return false
+  },
+}
+
 export const biome: Info = {
   name: "biome",
   command: [BunProc.which(), "x", "@biomejs/biome", "format", "--write", "$FILE"],

+ 1 - 0
packages/web/src/content/docs/cli.mdx

@@ -326,3 +326,4 @@ These environment variables enable experimental features that may change or be r
 | `OPENCODE_EXPERIMENTAL_BASH_MAX_OUTPUT_LENGTH`  | number  | Max output length for bash commands     |
 | `OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS` | number  | Default timeout for bash commands in ms |
 | `OPENCODE_EXPERIMENTAL_FILEWATCHER`             | boolean | Enable file watcher for entire dir      |
+| `OPENCODE_EXPERIMENTAL_OXFMT`                   | boolean | Enable oxfmt formatter                  |

+ 20 - 19
packages/web/src/content/docs/formatters.mdx

@@ -11,25 +11,26 @@ OpenCode automatically formats files after they are written or edited using lang
 
 OpenCode comes with several built-in formatters for popular languages and frameworks. Below is a list of the formatters, supported file extensions, and commands or config options it needs.
 
-| Formatter      | Extensions                                                                                               | Requirements                                                   |
-| -------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- |
-| gofmt          | .go                                                                                                      | `gofmt` command available                                      |
-| mix            | .ex, .exs, .eex, .heex, .leex, .neex, .sface                                                             | `mix` command available                                        |
-| prettier       | .js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml, and [more](https://prettier.io/docs/en/index.html) | `prettier` dependency in `package.json`                        |
-| biome          | .js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml, and [more](https://biomejs.dev/)                   | `biome.json(c)` config file                                    |
-| zig            | .zig, .zon                                                                                               | `zig` command available                                        |
-| clang-format   | .c, .cpp, .h, .hpp, .ino, and [more](https://clang.llvm.org/docs/ClangFormat.html)                       | `.clang-format` config file                                    |
-| ktlint         | .kt, .kts                                                                                                | `ktlint` command available                                     |
-| ruff           | .py, .pyi                                                                                                | `ruff` command available with config                           |
-| uv             | .py, .pyi                                                                                                | `uv` command available                                         |
-| rubocop        | .rb, .rake, .gemspec, .ru                                                                                | `rubocop` command available                                    |
-| standardrb     | .rb, .rake, .gemspec, .ru                                                                                | `standardrb` command available                                 |
-| htmlbeautifier | .erb, .html.erb                                                                                          | `htmlbeautifier` command available                             |
-| air            | .R                                                                                                       | `air` command available                                        |
-| dart           | .dart                                                                                                    | `dart` command available                                       |
-| ocamlformat    | .ml, .mli                                                                                                | `ocamlformat` command available and `.ocamlformat` config file |
-| terraform      | .tf, .tfvars                                                                                             | `terraform` command available                                  |
-| gleam          | .gleam                                                                                                   | `gleam` command available                                      |
+| Formatter            | Extensions                                                                                               | Requirements                                                                                         |
+| -------------------- | -------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
+| gofmt                | .go                                                                                                      | `gofmt` command available                                                                            |
+| mix                  | .ex, .exs, .eex, .heex, .leex, .neex, .sface                                                             | `mix` command available                                                                              |
+| prettier             | .js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml, and [more](https://prettier.io/docs/en/index.html) | `prettier` dependency in `package.json`                                                              |
+| biome                | .js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml, and [more](https://biomejs.dev/)                   | `biome.json(c)` config file                                                                          |
+| zig                  | .zig, .zon                                                                                               | `zig` command available                                                                              |
+| clang-format         | .c, .cpp, .h, .hpp, .ino, and [more](https://clang.llvm.org/docs/ClangFormat.html)                       | `.clang-format` config file                                                                          |
+| ktlint               | .kt, .kts                                                                                                | `ktlint` command available                                                                           |
+| ruff                 | .py, .pyi                                                                                                | `ruff` command available with config                                                                 |
+| uv                   | .py, .pyi                                                                                                | `uv` command available                                                                               |
+| rubocop              | .rb, .rake, .gemspec, .ru                                                                                | `rubocop` command available                                                                          |
+| standardrb           | .rb, .rake, .gemspec, .ru                                                                                | `standardrb` command available                                                                       |
+| htmlbeautifier       | .erb, .html.erb                                                                                          | `htmlbeautifier` command available                                                                   |
+| air                  | .R                                                                                                       | `air` command available                                                                              |
+| dart                 | .dart                                                                                                    | `dart` command available                                                                             |
+| ocamlformat          | .ml, .mli                                                                                                | `ocamlformat` command available and `.ocamlformat` config file                                       |
+| terraform            | .tf, .tfvars                                                                                             | `terraform` command available                                                                        |
+| gleam                | .gleam                                                                                                   | `gleam` command available                                                                            |
+| oxfmt (Experimental) | .js, .jsx, .ts, .tsx                                                                                     | `oxfmt` dependency in `package.json` and an [experiental env variable flag](/docs/cli/#experimental) |
 
 So if your project has `prettier` in your `package.json`, OpenCode will automatically use it.