├── .node-version ├── .gitignore ├── .github ├── renovate.json └── workflows │ ├── ci.yml │ └── release.yml ├── .npmignore ├── rolldown.config.ts ├── tsconfig.json ├── src ├── index.ts └── common.ts ├── LICENSE ├── README.md ├── package.json └── pnpm-lock.yaml /.node-version: -------------------------------------------------------------------------------- 1 | 22.14.0 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | lib 2 | node_modules/ 3 | -------------------------------------------------------------------------------- /.github/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": ["github>Boshen/renovate"] 4 | } 5 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src 2 | node_modules 3 | tsconfig.json 4 | *.map 5 | .tags 6 | .DS_Store 7 | webpack.config.js 8 | esbuild.js 9 | yarn.lock 10 | yarn-error.log 11 | .github 12 | .eslintrc.js 13 | .prettierrc 14 | -------------------------------------------------------------------------------- /rolldown.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "rolldown"; 2 | 3 | export default defineConfig({ 4 | input: "src/index.ts", 5 | output: { 6 | file: "lib/index.js", 7 | format: "cjs", 8 | sourcemap: false, 9 | }, 10 | external: ["coc.nvim"], 11 | platform: "node", 12 | experimental: { 13 | attachDebugInfo: "none", 14 | }, 15 | }); 16 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "lib": ["esnext"], 5 | "module": "commonjs", 6 | "declaration": false, 7 | "sourceMap": true, 8 | "outDir": "lib", 9 | "strict": true, 10 | "moduleResolution": "node", 11 | "noImplicitAny": false, 12 | "esModuleInterop": true 13 | }, 14 | "include": ["src"] 15 | } 16 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - main 7 | push: 8 | branches: 9 | - main 10 | 11 | permissions: {} 12 | 13 | jobs: 14 | lint: 15 | runs-on: ubuntu-latest 16 | 17 | steps: 18 | - uses: taiki-e/checkout-action@b13d20b7cda4e2f325ef19895128f7ff735c0b3d # v1.3.1 19 | 20 | - uses: oxc-project/setup-node@141eb77546de6702f92d320926403fe3f9f6a6f2 # v1.0.5 21 | 22 | - run: pnpm run lint 23 | 24 | - run: pnpm run build 25 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { ExtensionContext } from "coc.nvim"; 2 | import { createActivate } from "./common"; 3 | 4 | const activateOxlint = createActivate({ 5 | name: "oxlint", 6 | languages: ["typescript", "javascript", "typescriptreact", "javascriptreact", "vue", "svelte"], 7 | }); 8 | 9 | const activateOxfmt = createActivate({ 10 | name: "oxfmt", 11 | languages: ["typescript", "javascript", "typescriptreact", "javascriptreact"], 12 | }); 13 | 14 | export async function activate(context: ExtensionContext): Promise { 15 | await activateOxlint(context); 16 | await activateOxfmt(context); 17 | } 18 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 rzvxa 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # coc-oxc 2 | 3 | [Oxc](https://github.com/oxc-project/oxc) extension for coc.nvim 4 | 5 | ## Install 6 | 7 | `:CocInstall coc-oxc` 8 | 9 | ## Features 10 | 11 | - **oxlint**: Fast linter with auto-fix support 12 | - **oxfmt**: Fast formatter with format-on-save support 13 | 14 | > **Note:** This plugin only uses oxlint and oxfmt installed in the respective project; it does not activate globally. 15 | 16 | ## Configurations 17 | 18 | ### Oxlint (Linter) 19 | 20 | - `oxc.oxlint.enable`: Enable oxlint language server (default: `true`) 21 | - `oxc.oxlint.run`: Run the linter on save `onSave` or on type `onType` (default: `onType`) 22 | - `oxc.oxlint.configPath`: Path to oxlint configuration (default: `null`, searches for `.oxlintrc.json`) 23 | - `oxc.oxlint.binPath`: Path to the `oxlint` binary (default: searches in `node_modules/.bin`) 24 | 25 | ### Oxfmt (Formatter) 26 | 27 | - `oxc.oxfmt.enable`: Enable oxfmt formatting (default: `true`) 28 | - `oxc.oxfmt.binPath`: Path to the `oxfmt` binary (default: searches in `node_modules/.bin`) 29 | 30 | ## Format on Save 31 | 32 | To enable format on save, add this to your coc-config (`:CocConfig`): 33 | 34 | ```json 35 | { 36 | "oxc.oxfmt.enable": true, 37 | "coc.preferences.formatOnSaveFiletypes": [ 38 | "javascript", 39 | "javascriptreact", 40 | "typescript", 41 | "typescriptreact" 42 | ], 43 | "typescript.format.enable": false, 44 | "biome.format.enable": false, 45 | "prettier.enable": false 46 | } 47 | ``` 48 | 49 | You can also format manually with `:call CocAction('format')` 50 | 51 | ## Commands 52 | 53 | ### Oxlint Commands 54 | 55 | - `oxlint.restartServer`: Restart oxlint Server 56 | - `oxlint.showOutputChannel`: Show oxlint Output Channel 57 | 58 | ### Oxfmt Commands 59 | 60 | - `oxfmt.restartServer`: Restart oxfmt Server 61 | - `oxfmt.showOutputChannel`: Show oxfmt Output Channel 62 | 63 | ## License 64 | 65 | MIT 66 | 67 | --- 68 | 69 | > This extension is built with [create-coc-extension](https://github.com/fannheyward/create-coc-extension) 70 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: 7 | - main 8 | paths: 9 | - package.json 10 | 11 | permissions: {} 12 | 13 | jobs: 14 | check: 15 | name: Check version 16 | runs-on: ubuntu-latest 17 | outputs: 18 | version: ${{ steps.version.outputs.version }} 19 | version_changed: ${{ steps.version.outputs.changed }} 20 | steps: 21 | - uses: taiki-e/checkout-action@b13d20b7cda4e2f325ef19895128f7ff735c0b3d # v1.3.1 22 | 23 | - name: Check version changes 24 | uses: EndBug/version-check@5102328418c0130d66ca712d755c303e93368ce2 # v2.1.7 25 | id: version 26 | with: 27 | static-checking: localIsNew 28 | file-url: https://unpkg.com/coc-oxc@latest/package.json 29 | file-name: package.json 30 | 31 | - name: Set version name 32 | if: steps.version.outputs.changed == 'true' 33 | run: | 34 | echo "Version change found! New version: ${{ steps.version.outputs.version }} (${{ steps.version.outputs.version_type }})" 35 | 36 | release: 37 | needs: check 38 | if: needs.check.outputs.version_changed == 'true' 39 | runs-on: ubuntu-latest 40 | permissions: 41 | contents: write 42 | id-token: write 43 | steps: 44 | - uses: taiki-e/checkout-action@b13d20b7cda4e2f325ef19895128f7ff735c0b3d # v1.3.1 45 | 46 | - uses: oxc-project/setup-node@141eb77546de6702f92d320926403fe3f9f6a6f2 # v1.0.5 47 | 48 | - run: pnpm run build 49 | 50 | - run: npm install -g npm@latest # For trusted publishing support 51 | 52 | - run: pnpm publish --tag latest --provenance --access public 53 | 54 | - name: Create GitHub Release 55 | uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0 56 | with: 57 | draft: false 58 | name: v${{ needs.check.outputs.version }} 59 | tag_name: v${{ needs.check.outputs.version }} 60 | target_commitish: ${{ github.sha }} 61 | generate_release_notes: true 62 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "coc-oxc", 3 | "version": "0.1.0", 4 | "description": "Oxc extension for coc.nvim", 5 | "keywords": [ 6 | "coc.nvim" 7 | ], 8 | "license": "MIT", 9 | "author": "Boshen and oxc contributors", 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/oxc-project/coc-oxc.git" 13 | }, 14 | "files": [ 15 | "lib/**" 16 | ], 17 | "main": "lib/index.js", 18 | "scripts": { 19 | "prepare": "rolldown -c", 20 | "watch": "rolldown -c --watch", 21 | "build": "rolldown -c", 22 | "ready": "pnpm lint && pnpm fmt", 23 | "lint": "oxlint --type-aware --deny-warnings --import-plugin -D correctness -D perf", 24 | "fmt": "oxfmt" 25 | }, 26 | "devDependencies": { 27 | "coc.nvim": "0.0.83-next.24", 28 | "oxfmt": "^0.19.0", 29 | "oxlint": "^1.16.0", 30 | "oxlint-tsgolint": "^0.10.0", 31 | "rolldown": "^1.0.0-beta.52", 32 | "typescript": "^5.9.2" 33 | }, 34 | "contributes": { 35 | "configuration": { 36 | "type": "object", 37 | "title": "oxc configuration", 38 | "properties": { 39 | "oxc.oxlint.enable": { 40 | "type": "boolean", 41 | "default": true, 42 | "description": "Enable oxlint language server" 43 | }, 44 | "oxc.oxlint.run": { 45 | "scope": "resource", 46 | "type": "string", 47 | "enum": [ 48 | "onSave", 49 | "onType" 50 | ], 51 | "default": "onType", 52 | "description": "Run oxlint on save (onSave) or on type (onType)" 53 | }, 54 | "oxc.oxlint.binPath": { 55 | "type": "string", 56 | "default": "", 57 | "description": "Path to the `oxlint` binary" 58 | }, 59 | "oxc.oxlint.configPath": { 60 | "type": [ 61 | "string", 62 | "null" 63 | ], 64 | "scope": "resource", 65 | "default": null, 66 | "description": "Path to oxlint configuration. Keep it empty to enable nested configuration." 67 | }, 68 | "oxc.oxfmt.enable": { 69 | "type": "boolean", 70 | "default": true, 71 | "description": "Enable oxfmt language server" 72 | }, 73 | "oxc.oxfmt.binPath": { 74 | "type": "string", 75 | "default": "", 76 | "description": "Path to the `oxfmt` binary" 77 | } 78 | } 79 | }, 80 | "commands": [ 81 | { 82 | "command": "oxlint.restartServer", 83 | "title": "Restart oxlint Server", 84 | "category": "Oxlint" 85 | }, 86 | { 87 | "command": "oxlint.showOutputChannel", 88 | "title": "Show oxlint Output Channel", 89 | "category": "Oxlint" 90 | }, 91 | { 92 | "command": "oxfmt.restartServer", 93 | "title": "Restart oxfmt Server", 94 | "category": "Oxfmt" 95 | }, 96 | { 97 | "command": "oxfmt.showOutputChannel", 98 | "title": "Show oxfmt Output Channel", 99 | "category": "Oxfmt" 100 | } 101 | ] 102 | }, 103 | "activationEvents": [ 104 | "onLanguage:javascript", 105 | "onLanguage:javascriptreact", 106 | "onLanguage:svelte", 107 | "onLanguage:typescript", 108 | "onLanguage:typescriptreact", 109 | "onLanguage:vue" 110 | ], 111 | "engines": { 112 | "coc": "^0.0.82" 113 | }, 114 | "packageManager": "pnpm@10.25.0" 115 | } 116 | -------------------------------------------------------------------------------- /src/common.ts: -------------------------------------------------------------------------------- 1 | import { existsSync } from "node:fs"; 2 | import { execFile } from "node:child_process"; 3 | import { promisify } from "node:util"; 4 | import { join } from "path"; 5 | import { 6 | Executable, 7 | ExtensionContext, 8 | LanguageClient, 9 | LanguageClientOptions, 10 | OutputChannel, 11 | ServerOptions, 12 | commands, 13 | services, 14 | window, 15 | workspace, 16 | } from "coc.nvim"; 17 | 18 | const execFileAsync = promisify(execFile); 19 | 20 | type Optional = T | null; 21 | 22 | export interface ClientConfig { 23 | name: string; 24 | languages: string[]; 25 | } 26 | 27 | function findBinary(config: ClientConfig): Optional { 28 | const cfg = workspace.getConfiguration(`oxc.${config.name}`); 29 | let bin = cfg.get("binPath", ""); 30 | if (bin && existsSync(bin)) { 31 | return bin; 32 | } 33 | 34 | bin = join(workspace.root, "node_modules", ".bin", config.name); 35 | return existsSync(bin) ? bin : null; 36 | } 37 | 38 | async function supportsLsp(command: string): Promise { 39 | try { 40 | const { stdout } = await execFileAsync(command, ["--help"]); 41 | return stdout.includes("--lsp"); 42 | } catch { 43 | return false; 44 | } 45 | } 46 | 47 | function createServerOptions(command: string): ServerOptions { 48 | const run: Executable = { 49 | command, 50 | args: ["--lsp"], 51 | options: { 52 | env: { 53 | ...process.env, 54 | RUST_LOG: process.env.RUST_LOG || "info", 55 | }, 56 | }, 57 | }; 58 | 59 | return { 60 | run, 61 | debug: run, 62 | }; 63 | } 64 | 65 | function createClient( 66 | config: ClientConfig, 67 | command: string, 68 | outputChannel: OutputChannel, 69 | ): LanguageClient { 70 | const settings: any = JSON.parse( 71 | JSON.stringify(workspace.getConfiguration(`oxc.${config.name}`)), 72 | ); 73 | const documentSelector = config.languages.map((language) => ({ 74 | language, 75 | scheme: "file", 76 | })); 77 | 78 | // Format settings to match what oxc LSP server expects 79 | // Map coc-oxc config names to LSP server expected names 80 | const options: Record = {}; 81 | 82 | if (config.name === "oxfmt") { 83 | // For oxfmt: map 'enable' to 'fmt.experimental' 84 | if (settings.enable !== undefined) { 85 | options["fmt.experimental"] = settings.enable; 86 | } 87 | if (settings.binPath) { 88 | options["fmt.binPath"] = settings.binPath; 89 | } 90 | } else if (config.name === "oxlint") { 91 | // For oxlint: keep existing config names 92 | Object.assign(options, settings); 93 | } 94 | 95 | const initializationOptions = [ 96 | { 97 | workspaceUri: `file://${workspace.root}`, 98 | options, 99 | }, 100 | ]; 101 | 102 | const clientOptions: LanguageClientOptions = { 103 | outputChannel, 104 | progressOnInitialization: true, 105 | documentSelector, 106 | initializationOptions, 107 | }; 108 | 109 | return new LanguageClient(config.name, config.name, createServerOptions(command), clientOptions); 110 | } 111 | 112 | function configureClient(config: ClientConfig, context: ExtensionContext, client: LanguageClient) { 113 | context.subscriptions.push( 114 | commands.registerCommand(`${config.name}.restartServer`, async () => { 115 | if (!client) { 116 | await window.showErrorMessage(`${config.name} client not found`); 117 | return; 118 | } 119 | try { 120 | await client.restart(); 121 | await window.showInformationMessage(`${config.name} server restarted.`); 122 | } catch (err) { 123 | client.error("Restarting client failed", err); 124 | } 125 | }), 126 | ); 127 | 128 | workspace.onDidChangeConfiguration((e) => { 129 | if (!e.affectsConfiguration(`oxc.${config.name}`)) { 130 | return; 131 | } 132 | 133 | const settings: any = JSON.parse( 134 | JSON.stringify(workspace.getConfiguration(`oxc.${config.name}`)), 135 | ); 136 | void client.sendNotification("workspace/didChangeConfiguration", { settings }); 137 | }); 138 | } 139 | 140 | export function createActivate(config: ClientConfig): (context: ExtensionContext) => Promise { 141 | return async (context: ExtensionContext): Promise => { 142 | const cfg = workspace.getConfiguration(`oxc.${config.name}`); 143 | const enable = cfg.get("enable", true); 144 | if (!enable) { 145 | return; 146 | } 147 | 148 | const command = findBinary(config); 149 | if (!command) { 150 | return; 151 | } 152 | 153 | if (!(await supportsLsp(command))) { 154 | return; 155 | } 156 | 157 | const channel = window.createOutputChannel(config.name); 158 | 159 | context.subscriptions.push( 160 | commands.registerCommand(`${config.name}.showOutputChannel`, () => { 161 | channel.show(); 162 | }), 163 | ); 164 | 165 | const client = createClient(config, command, channel); 166 | configureClient(config, context, client); 167 | context.subscriptions.push(services.registerLanguageClient(client)); 168 | }; 169 | } 170 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | coc.nvim: 12 | specifier: 0.0.83-next.24 13 | version: 0.0.83-next.24(@types/node@16.18.126) 14 | oxfmt: 15 | specifier: ^0.19.0 16 | version: 0.19.0 17 | oxlint: 18 | specifier: ^1.16.0 19 | version: 1.34.0(oxlint-tsgolint@0.10.0) 20 | oxlint-tsgolint: 21 | specifier: ^0.10.0 22 | version: 0.10.0 23 | rolldown: 24 | specifier: ^1.0.0-beta.52 25 | version: 1.0.0-beta.55 26 | typescript: 27 | specifier: ^5.9.2 28 | version: 5.9.3 29 | 30 | packages: 31 | 32 | '@emnapi/core@1.7.1': 33 | resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} 34 | 35 | '@emnapi/runtime@1.7.1': 36 | resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} 37 | 38 | '@emnapi/wasi-threads@1.1.0': 39 | resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} 40 | 41 | '@napi-rs/wasm-runtime@1.1.0': 42 | resolution: {integrity: sha512-Fq6DJW+Bb5jaWE69/qOE0D1TUN9+6uWhCeZpdnSBk14pjLcCWR7Q8n49PTSPHazM37JqrsdpEthXy2xn6jWWiA==} 43 | 44 | '@oxc-project/types@0.103.0': 45 | resolution: {integrity: sha512-bkiYX5kaXWwUessFRSoXFkGIQTmc6dLGdxuRTrC+h8PSnIdZyuXHHlLAeTmOue5Br/a0/a7dHH0Gca6eXn9MKg==} 46 | 47 | '@oxfmt/darwin-arm64@0.19.0': 48 | resolution: {integrity: sha512-FfNpn3ximwbBZCaS8WL2vAXcFuQFQgvv/brO6D1WdmL4pnFOgfBIpFfkeFnKfdmdpxtg9O0wF8NTcdw5Iyl2Bg==} 49 | cpu: [arm64] 50 | os: [darwin] 51 | 52 | '@oxfmt/darwin-x64@0.19.0': 53 | resolution: {integrity: sha512-31FWUHAgTdTzOslz0zoA60UDEdeZZpeM6wTzCdffetwLbHkK8ZuCuzd+DauHZPNlSU8G72iw4lF7Zve9pSkK9w==} 54 | cpu: [x64] 55 | os: [darwin] 56 | 57 | '@oxfmt/linux-arm64-gnu@0.19.0': 58 | resolution: {integrity: sha512-BkU9h39xKj/8uko82uFDJUharM8VxZO+uXKglpBnEC8XxWRzXocVCX4wpLT/Tfk4NyBy6fRM9DeISdZvQKZCjA==} 59 | cpu: [arm64] 60 | os: [linux] 61 | 62 | '@oxfmt/linux-arm64-musl@0.19.0': 63 | resolution: {integrity: sha512-wWYk6Z/3iC+0zZAUkVCcEHui/IsUqsl+GEm9o6H7oARPLisXajbwCQcmqYslUD7eK6OXdYoWriBkEvSX/5dU4A==} 64 | cpu: [arm64] 65 | os: [linux] 66 | 67 | '@oxfmt/linux-x64-gnu@0.19.0': 68 | resolution: {integrity: sha512-EB/b3or437E3uDie8QxeU3eA502JcmR1koyIBcH9rFidY0cMik58xvw54tXCY3WpMRxEXf37aHZzUSDP3qJnZg==} 69 | cpu: [x64] 70 | os: [linux] 71 | 72 | '@oxfmt/linux-x64-musl@0.19.0': 73 | resolution: {integrity: sha512-htMB45orYoa1oFSjSmoGgcBDsD47/0joDfqpa8TrTDI5qsW5kAedpFR5wSce8Is9oj7SJ07omhOj96P/QiekWA==} 74 | cpu: [x64] 75 | os: [linux] 76 | 77 | '@oxfmt/win32-arm64@0.19.0': 78 | resolution: {integrity: sha512-x7+3Eh/VWdXEda+BUmAKYlhGrRJVera7RfWw47Yx8PJUGtNqBfeYGDbf0W59ceK8Z3bY3OinrmOO3d1jOuXzMQ==} 79 | cpu: [arm64] 80 | os: [win32] 81 | 82 | '@oxfmt/win32-x64@0.19.0': 83 | resolution: {integrity: sha512-X+FKXBg2jx4CxF5SJs3xpx1msMw5JfxaGD5qBZYqlHGdryQsy6zUY+bQwDDcuy3Ic/WNGD8ZNEuggeYNE7jx/Q==} 84 | cpu: [x64] 85 | os: [win32] 86 | 87 | '@oxlint-tsgolint/darwin-arm64@0.10.0': 88 | resolution: {integrity: sha512-mhBF/pjey0UdLL1ocU46Fqta+uJuRfqrLfDpcViRg17BtDiUNd8JY9iN2FOoS2HGSCAgCUjZ0AZkwkHwFs/VTw==} 89 | cpu: [arm64] 90 | os: [darwin] 91 | 92 | '@oxlint-tsgolint/darwin-x64@0.10.0': 93 | resolution: {integrity: sha512-roLi34mw/i1z+NS7luboix55SXyhVv38dNUTcRDkk+0lNPzI9ngrM+1y1N2oBSUmz5o9OZGnfJJ7BSGCw/fFEQ==} 94 | cpu: [x64] 95 | os: [darwin] 96 | 97 | '@oxlint-tsgolint/linux-arm64@0.10.0': 98 | resolution: {integrity: sha512-HL9NThPH1V2F6l9XhwNmhQZUknN4m4yQYEvQFFGfZTYN6cvEEBIiqfF4KvBUg8c0xadMbQlW+Ug7/ybA9Nn+CA==} 99 | cpu: [arm64] 100 | os: [linux] 101 | 102 | '@oxlint-tsgolint/linux-x64@0.10.0': 103 | resolution: {integrity: sha512-Tw8QNq8ab+4+qE5krvJyMA66v6XE3GoiISRD5WmJ7YOxUnu//jSw/bBm7OYf/TNEZyeV0BTR7zXzhT5R+VFWlQ==} 104 | cpu: [x64] 105 | os: [linux] 106 | 107 | '@oxlint-tsgolint/win32-arm64@0.10.0': 108 | resolution: {integrity: sha512-LTogmTRwpwQqVaH1Ama8Wd5/VVZWBSF8v5qTbeT628+1F5Kt1V5eHBvyFh4oN18UCZlgqrh7DqkDhsieXUaC8Q==} 109 | cpu: [arm64] 110 | os: [win32] 111 | 112 | '@oxlint-tsgolint/win32-x64@0.10.0': 113 | resolution: {integrity: sha512-ygqxx8EmNWy9/wCQS5uXq9k/o2EyYNwNxY1ZHNzlmZC/kV06Aemx5OBDafefawBNqH7xTZPfccUrjdiy+QlTrw==} 114 | cpu: [x64] 115 | os: [win32] 116 | 117 | '@oxlint/darwin-arm64@1.34.0': 118 | resolution: {integrity: sha512-euz3Dtp5/UE9axFkQnllOWp3gOwoqaxfZPUUwiW8HBelqhI9PRMVIfQ/akmwl+G5XixQZIgXkXQ5SJxnb1+Qww==} 119 | cpu: [arm64] 120 | os: [darwin] 121 | 122 | '@oxlint/darwin-x64@1.34.0': 123 | resolution: {integrity: sha512-XpmNviE5KOnHkhmQPwJJIBs+mJkr0qItTZBN4dz+O3p9gWN+gCqi3CBP71RiVahZw4qAEQSgY4wro+z0kx+erg==} 124 | cpu: [x64] 125 | os: [darwin] 126 | 127 | '@oxlint/linux-arm64-gnu@1.34.0': 128 | resolution: {integrity: sha512-aCPdoEUGsJGF9y88vDYoaugG4IEGwSBa+usyuAvEVl3vTfuTmE0RDQEC1Z+WnJ3J/cIEpbgKOzS12VwbzFicjg==} 129 | cpu: [arm64] 130 | os: [linux] 131 | 132 | '@oxlint/linux-arm64-musl@1.34.0': 133 | resolution: {integrity: sha512-cMo72LQBFmdnVLRKLAHD94ZUBq5Z+aA9Y+RKzkjhCmJuef5ZAfKC24TJD/6c5LxGYzkwwmyySoQAHq5B69i3PQ==} 134 | cpu: [arm64] 135 | os: [linux] 136 | 137 | '@oxlint/linux-x64-gnu@1.34.0': 138 | resolution: {integrity: sha512-+9xFhhkqgNIysEh+uHvcba8v4UtL1YzxuyDS2wTLdWrkGvIllCx5WjJItt3K/AhwatciksgNEXSo2Hh4fcQRog==} 139 | cpu: [x64] 140 | os: [linux] 141 | 142 | '@oxlint/linux-x64-musl@1.34.0': 143 | resolution: {integrity: sha512-qa7TL2DfEDdMeSP5UiU5JMs6D2PW7ZJAQ0WZYTgqDV8BlZ6nMkIYVBVIk3QPxIfkyxvfJVbG1RB3PkSWDcfwpA==} 144 | cpu: [x64] 145 | os: [linux] 146 | 147 | '@oxlint/win32-arm64@1.34.0': 148 | resolution: {integrity: sha512-mSJumUveg1S3DiOgvsrVNAGuvenBbbC/zsfT1qhltT+GLhJ7RPBK2I/jz0fTdE+I7M9/as8yc0XJ/eY23y2amA==} 149 | cpu: [arm64] 150 | os: [win32] 151 | 152 | '@oxlint/win32-x64@1.34.0': 153 | resolution: {integrity: sha512-izsDDt5WY4FSISCkPRLUYQD1aRaaEJkPLtEZe3DlioSUdUVAdvVbE+BGllFqR16DWfTTwO/6K4jDeooxQzTMjw==} 154 | cpu: [x64] 155 | os: [win32] 156 | 157 | '@rolldown/binding-android-arm64@1.0.0-beta.55': 158 | resolution: {integrity: sha512-5cPpHdO+zp+klznZnIHRO1bMHDq5hS9cqXodEKAaa/dQTPDjnE91OwAsy3o1gT2x4QaY8NzdBXAvutYdaw0WeA==} 159 | engines: {node: ^20.19.0 || >=22.12.0} 160 | cpu: [arm64] 161 | os: [android] 162 | 163 | '@rolldown/binding-darwin-arm64@1.0.0-beta.55': 164 | resolution: {integrity: sha512-l0887CGU2SXZr0UJmeEcXSvtDCOhDTTYXuoWbhrEJ58YQhQk24EVhDhHMTyjJb1PBRniUgNc1G0T51eF8z+TWw==} 165 | engines: {node: ^20.19.0 || >=22.12.0} 166 | cpu: [arm64] 167 | os: [darwin] 168 | 169 | '@rolldown/binding-darwin-x64@1.0.0-beta.55': 170 | resolution: {integrity: sha512-d7qP2AVYzN0tYIP4vJ7nmr26xvmlwdkLD/jWIc9Z9dqh5y0UGPigO3m5eHoHq9BNazmwdD9WzDHbQZyXFZjgtA==} 171 | engines: {node: ^20.19.0 || >=22.12.0} 172 | cpu: [x64] 173 | os: [darwin] 174 | 175 | '@rolldown/binding-freebsd-x64@1.0.0-beta.55': 176 | resolution: {integrity: sha512-j311E4NOB0VMmXHoDDZhrWidUf7L/Sa6bu/+i2cskvHKU40zcUNPSYeD2YiO2MX+hhDFa5bJwhliYfs+bTrSZw==} 177 | engines: {node: ^20.19.0 || >=22.12.0} 178 | cpu: [x64] 179 | os: [freebsd] 180 | 181 | '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.55': 182 | resolution: {integrity: sha512-lAsaYWhfNTW2A/9O7zCpb5eIJBrFeNEatOS/DDOZ5V/95NHy50g4b/5ViCqchfyFqRb7MKUR18/+xWkIcDkeIw==} 183 | engines: {node: ^20.19.0 || >=22.12.0} 184 | cpu: [arm] 185 | os: [linux] 186 | 187 | '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.55': 188 | resolution: {integrity: sha512-2x6ffiVLZrQv7Xii9+JdtyT1U3bQhKj59K3eRnYlrXsKyjkjfmiDUVx2n+zSyijisUqD62fcegmx2oLLfeTkCA==} 189 | engines: {node: ^20.19.0 || >=22.12.0} 190 | cpu: [arm64] 191 | os: [linux] 192 | 193 | '@rolldown/binding-linux-arm64-musl@1.0.0-beta.55': 194 | resolution: {integrity: sha512-QbNncvqAXziya5wleI+OJvmceEE15vE4yn4qfbI/hwT/+8ZcqxyfRZOOh62KjisXxp4D0h3JZspycXYejxAU3w==} 195 | engines: {node: ^20.19.0 || >=22.12.0} 196 | cpu: [arm64] 197 | os: [linux] 198 | 199 | '@rolldown/binding-linux-x64-gnu@1.0.0-beta.55': 200 | resolution: {integrity: sha512-YZCTZZM+rujxwVc6A+QZaNMJXVtmabmFYLG2VGQTKaBfYGvBKUgtbMEttnp/oZ88BMi2DzadBVhOmfQV8SuHhw==} 201 | engines: {node: ^20.19.0 || >=22.12.0} 202 | cpu: [x64] 203 | os: [linux] 204 | 205 | '@rolldown/binding-linux-x64-musl@1.0.0-beta.55': 206 | resolution: {integrity: sha512-28q9OQ/DDpFh2keS4BVAlc3N65/wiqKbk5K1pgLdu/uWbKa8hgUJofhXxqO+a+Ya2HVTUuYHneWsI2u+eu3N5Q==} 207 | engines: {node: ^20.19.0 || >=22.12.0} 208 | cpu: [x64] 209 | os: [linux] 210 | 211 | '@rolldown/binding-openharmony-arm64@1.0.0-beta.55': 212 | resolution: {integrity: sha512-LiCA4BjCnm49B+j1lFzUtlC+4ZphBv0d0g5VqrEJua/uyv9Ey1v9tiaMql1C8c0TVSNDUmrkfHQ71vuQC7YfpQ==} 213 | engines: {node: ^20.19.0 || >=22.12.0} 214 | cpu: [arm64] 215 | os: [openharmony] 216 | 217 | '@rolldown/binding-wasm32-wasi@1.0.0-beta.55': 218 | resolution: {integrity: sha512-nZ76tY7T0Oe8vamz5Cv5CBJvrqeQxwj1WaJ2GxX8Msqs0zsQMMcvoyxOf0glnJlxxgKjtoBxAOxaAU8ERbW6Tg==} 219 | engines: {node: '>=14.0.0'} 220 | cpu: [wasm32] 221 | 222 | '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.55': 223 | resolution: {integrity: sha512-TFVVfLfhL1G+pWspYAgPK/FSqjiBtRKYX9hixfs508QVEZPQlubYAepHPA7kEa6lZXYj5ntzF87KC6RNhxo+ew==} 224 | engines: {node: ^20.19.0 || >=22.12.0} 225 | cpu: [arm64] 226 | os: [win32] 227 | 228 | '@rolldown/binding-win32-x64-msvc@1.0.0-beta.55': 229 | resolution: {integrity: sha512-j1WBlk0p+ISgLzMIgl0xHp1aBGXenoK2+qWYc/wil2Vse7kVOdFq9aeQ8ahK6/oxX2teQ5+eDvgjdywqTL+daA==} 230 | engines: {node: ^20.19.0 || >=22.12.0} 231 | cpu: [x64] 232 | os: [win32] 233 | 234 | '@rolldown/pluginutils@1.0.0-beta.55': 235 | resolution: {integrity: sha512-vajw/B3qoi7aYnnD4BQ4VoCcXQWnF0roSwE2iynbNxgW4l9mFwtLmLmUhpDdcTBfKyZm1p/T0D13qG94XBLohA==} 236 | 237 | '@tybys/wasm-util@0.10.1': 238 | resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} 239 | 240 | '@types/node@16.18.126': 241 | resolution: {integrity: sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==} 242 | 243 | coc.nvim@0.0.83-next.24: 244 | resolution: {integrity: sha512-5U1efxofnRxNlr4Y05n/bqsd/TSNYrIAoL0AOs55n2l4bUz6IeekmTL0V47mi0/P8fkQQokOuYbV4qELCxxbWA==} 245 | engines: {node: '>=16.18.0'} 246 | peerDependencies: 247 | '@types/node': ^16.18.0 248 | 249 | oxfmt@0.19.0: 250 | resolution: {integrity: sha512-tPTa3j4kXdJBzBRlK9wR0/Lnd4J21rzg29cRr/VVqqfvdhZs6M+Q6TkL+rxI/IQpq8ZY8L3c+KZvga/RgeuMsg==} 251 | engines: {node: ^20.19.0 || >=22.12.0} 252 | hasBin: true 253 | 254 | oxlint-tsgolint@0.10.0: 255 | resolution: {integrity: sha512-LDDSIu5J/4D4gFUuQQIEQpAC6maNEbMg4nC8JL/+Pe0cUDR86dtVZ09E2x5MwCh8f9yfktoaxt5x6UIVyzrajg==} 256 | hasBin: true 257 | 258 | oxlint@1.34.0: 259 | resolution: {integrity: sha512-Ni0N8wAiKlgaYkI/Yz4VrutfVIZgd2shDtS+loQxyBTwO8YUAnk3+g7OQ1cyI/aatHiFwvFNfV/uvZyHUtyPpA==} 260 | engines: {node: ^20.19.0 || >=22.12.0} 261 | hasBin: true 262 | peerDependencies: 263 | oxlint-tsgolint: '>=0.9.2' 264 | peerDependenciesMeta: 265 | oxlint-tsgolint: 266 | optional: true 267 | 268 | rolldown@1.0.0-beta.55: 269 | resolution: {integrity: sha512-r8Ws43aYCnfO07ao0SvQRz4TBAtZJjGWNvScRBOHuiNHvjfECOJBIqJv0nUkL1GYcltjvvHswRilDF1ocsC0+g==} 270 | engines: {node: ^20.19.0 || >=22.12.0} 271 | hasBin: true 272 | 273 | tinypool@2.0.0: 274 | resolution: {integrity: sha512-/RX9RzeH2xU5ADE7n2Ykvmi9ED3FBGPAjw9u3zucrNNaEBIO0HPSYgL0NT7+3p147ojeSdaVu08F6hjpv31HJg==} 275 | engines: {node: ^20.0.0 || >=22.0.0} 276 | 277 | tslib@2.8.1: 278 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 279 | 280 | typescript@5.9.3: 281 | resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 282 | engines: {node: '>=14.17'} 283 | hasBin: true 284 | 285 | snapshots: 286 | 287 | '@emnapi/core@1.7.1': 288 | dependencies: 289 | '@emnapi/wasi-threads': 1.1.0 290 | tslib: 2.8.1 291 | optional: true 292 | 293 | '@emnapi/runtime@1.7.1': 294 | dependencies: 295 | tslib: 2.8.1 296 | optional: true 297 | 298 | '@emnapi/wasi-threads@1.1.0': 299 | dependencies: 300 | tslib: 2.8.1 301 | optional: true 302 | 303 | '@napi-rs/wasm-runtime@1.1.0': 304 | dependencies: 305 | '@emnapi/core': 1.7.1 306 | '@emnapi/runtime': 1.7.1 307 | '@tybys/wasm-util': 0.10.1 308 | optional: true 309 | 310 | '@oxc-project/types@0.103.0': {} 311 | 312 | '@oxfmt/darwin-arm64@0.19.0': 313 | optional: true 314 | 315 | '@oxfmt/darwin-x64@0.19.0': 316 | optional: true 317 | 318 | '@oxfmt/linux-arm64-gnu@0.19.0': 319 | optional: true 320 | 321 | '@oxfmt/linux-arm64-musl@0.19.0': 322 | optional: true 323 | 324 | '@oxfmt/linux-x64-gnu@0.19.0': 325 | optional: true 326 | 327 | '@oxfmt/linux-x64-musl@0.19.0': 328 | optional: true 329 | 330 | '@oxfmt/win32-arm64@0.19.0': 331 | optional: true 332 | 333 | '@oxfmt/win32-x64@0.19.0': 334 | optional: true 335 | 336 | '@oxlint-tsgolint/darwin-arm64@0.10.0': 337 | optional: true 338 | 339 | '@oxlint-tsgolint/darwin-x64@0.10.0': 340 | optional: true 341 | 342 | '@oxlint-tsgolint/linux-arm64@0.10.0': 343 | optional: true 344 | 345 | '@oxlint-tsgolint/linux-x64@0.10.0': 346 | optional: true 347 | 348 | '@oxlint-tsgolint/win32-arm64@0.10.0': 349 | optional: true 350 | 351 | '@oxlint-tsgolint/win32-x64@0.10.0': 352 | optional: true 353 | 354 | '@oxlint/darwin-arm64@1.34.0': 355 | optional: true 356 | 357 | '@oxlint/darwin-x64@1.34.0': 358 | optional: true 359 | 360 | '@oxlint/linux-arm64-gnu@1.34.0': 361 | optional: true 362 | 363 | '@oxlint/linux-arm64-musl@1.34.0': 364 | optional: true 365 | 366 | '@oxlint/linux-x64-gnu@1.34.0': 367 | optional: true 368 | 369 | '@oxlint/linux-x64-musl@1.34.0': 370 | optional: true 371 | 372 | '@oxlint/win32-arm64@1.34.0': 373 | optional: true 374 | 375 | '@oxlint/win32-x64@1.34.0': 376 | optional: true 377 | 378 | '@rolldown/binding-android-arm64@1.0.0-beta.55': 379 | optional: true 380 | 381 | '@rolldown/binding-darwin-arm64@1.0.0-beta.55': 382 | optional: true 383 | 384 | '@rolldown/binding-darwin-x64@1.0.0-beta.55': 385 | optional: true 386 | 387 | '@rolldown/binding-freebsd-x64@1.0.0-beta.55': 388 | optional: true 389 | 390 | '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.55': 391 | optional: true 392 | 393 | '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.55': 394 | optional: true 395 | 396 | '@rolldown/binding-linux-arm64-musl@1.0.0-beta.55': 397 | optional: true 398 | 399 | '@rolldown/binding-linux-x64-gnu@1.0.0-beta.55': 400 | optional: true 401 | 402 | '@rolldown/binding-linux-x64-musl@1.0.0-beta.55': 403 | optional: true 404 | 405 | '@rolldown/binding-openharmony-arm64@1.0.0-beta.55': 406 | optional: true 407 | 408 | '@rolldown/binding-wasm32-wasi@1.0.0-beta.55': 409 | dependencies: 410 | '@napi-rs/wasm-runtime': 1.1.0 411 | optional: true 412 | 413 | '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.55': 414 | optional: true 415 | 416 | '@rolldown/binding-win32-x64-msvc@1.0.0-beta.55': 417 | optional: true 418 | 419 | '@rolldown/pluginutils@1.0.0-beta.55': {} 420 | 421 | '@tybys/wasm-util@0.10.1': 422 | dependencies: 423 | tslib: 2.8.1 424 | optional: true 425 | 426 | '@types/node@16.18.126': {} 427 | 428 | coc.nvim@0.0.83-next.24(@types/node@16.18.126): 429 | dependencies: 430 | '@types/node': 16.18.126 431 | 432 | oxfmt@0.19.0: 433 | dependencies: 434 | tinypool: 2.0.0 435 | optionalDependencies: 436 | '@oxfmt/darwin-arm64': 0.19.0 437 | '@oxfmt/darwin-x64': 0.19.0 438 | '@oxfmt/linux-arm64-gnu': 0.19.0 439 | '@oxfmt/linux-arm64-musl': 0.19.0 440 | '@oxfmt/linux-x64-gnu': 0.19.0 441 | '@oxfmt/linux-x64-musl': 0.19.0 442 | '@oxfmt/win32-arm64': 0.19.0 443 | '@oxfmt/win32-x64': 0.19.0 444 | 445 | oxlint-tsgolint@0.10.0: 446 | optionalDependencies: 447 | '@oxlint-tsgolint/darwin-arm64': 0.10.0 448 | '@oxlint-tsgolint/darwin-x64': 0.10.0 449 | '@oxlint-tsgolint/linux-arm64': 0.10.0 450 | '@oxlint-tsgolint/linux-x64': 0.10.0 451 | '@oxlint-tsgolint/win32-arm64': 0.10.0 452 | '@oxlint-tsgolint/win32-x64': 0.10.0 453 | 454 | oxlint@1.34.0(oxlint-tsgolint@0.10.0): 455 | optionalDependencies: 456 | '@oxlint/darwin-arm64': 1.34.0 457 | '@oxlint/darwin-x64': 1.34.0 458 | '@oxlint/linux-arm64-gnu': 1.34.0 459 | '@oxlint/linux-arm64-musl': 1.34.0 460 | '@oxlint/linux-x64-gnu': 1.34.0 461 | '@oxlint/linux-x64-musl': 1.34.0 462 | '@oxlint/win32-arm64': 1.34.0 463 | '@oxlint/win32-x64': 1.34.0 464 | oxlint-tsgolint: 0.10.0 465 | 466 | rolldown@1.0.0-beta.55: 467 | dependencies: 468 | '@oxc-project/types': 0.103.0 469 | '@rolldown/pluginutils': 1.0.0-beta.55 470 | optionalDependencies: 471 | '@rolldown/binding-android-arm64': 1.0.0-beta.55 472 | '@rolldown/binding-darwin-arm64': 1.0.0-beta.55 473 | '@rolldown/binding-darwin-x64': 1.0.0-beta.55 474 | '@rolldown/binding-freebsd-x64': 1.0.0-beta.55 475 | '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.55 476 | '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.55 477 | '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.55 478 | '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.55 479 | '@rolldown/binding-linux-x64-musl': 1.0.0-beta.55 480 | '@rolldown/binding-openharmony-arm64': 1.0.0-beta.55 481 | '@rolldown/binding-wasm32-wasi': 1.0.0-beta.55 482 | '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.55 483 | '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.55 484 | 485 | tinypool@2.0.0: {} 486 | 487 | tslib@2.8.1: 488 | optional: true 489 | 490 | typescript@5.9.3: {} 491 | --------------------------------------------------------------------------------