@arborium/arborium 1.0.5 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"arborium.js","sources":["../src/wasi-shims.ts","../src/plugins-manifest.ts","../src/loader.ts","../src/detect.ts"],"sourcesContent":["/**\n * Minimal WASI shims for browser environment.\n * These provide stub implementations for WASI interfaces that\n * the grammar plugins require but don't actually use.\n */\n\n// Error type for WASI I/O\nclass WasiError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'WasiError';\n }\n}\n\n// Minimal stream implementation\nclass OutputStream {\n write(_contents: Uint8Array): bigint {\n // Silently discard output\n return BigInt(0);\n }\n\n blockingWriteAndFlush(_contents: Uint8Array): void {\n // No-op\n }\n\n blockingFlush(): void {\n // No-op\n }\n\n checkWrite(): bigint {\n return BigInt(1024 * 1024); // Allow large writes\n }\n\n subscribe(): void {\n // No-op\n }\n}\n\nclass InputStream {\n read(_len: bigint): Uint8Array {\n return new Uint8Array(0);\n }\n\n blockingRead(_len: bigint): Uint8Array {\n return new Uint8Array(0);\n }\n\n subscribe(): void {\n // No-op\n }\n}\n\n// Create the WASI import object expected by jco-generated modules\nexport function createWasiImports() {\n const stdout = new OutputStream();\n const stderr = new OutputStream();\n const stdin = new InputStream();\n\n // WASI interface implementations\n const environment = {\n getEnvironment: (): Array<[string, string]> => [],\n getArguments: (): string[] => [],\n };\n\n const exit = {\n exit: (status: { tag: string; val?: number }): void => {\n if (status.tag === 'err') {\n throw new WasiError(`WASI exit with error: ${status.val}`);\n }\n },\n };\n\n const stdinIface = { getStdin: () => stdin };\n const stdoutIface = { getStdout: () => stdout };\n const stderrIface = { getStderr: () => stderr };\n\n const wallClock = {\n now: (): { seconds: bigint; nanoseconds: number } => {\n const ms = Date.now();\n return {\n seconds: BigInt(Math.floor(ms / 1000)),\n nanoseconds: (ms % 1000) * 1_000_000,\n };\n },\n resolution: (): { seconds: bigint; nanoseconds: number } => {\n return { seconds: BigInt(0), nanoseconds: 1_000_000 };\n },\n };\n\n const filesystemTypes = {\n Descriptor: class {},\n DirectoryEntryStream: class {},\n filesystemErrorCode: () => null,\n };\n\n const preopens = {\n getDirectories: (): Array<[unknown, string]> => [],\n };\n\n const ioError = { Error: WasiError };\n const streams = { InputStream, OutputStream };\n\n const random = {\n getRandomBytes: (len: bigint): Uint8Array => {\n const bytes = new Uint8Array(Number(len));\n crypto.getRandomValues(bytes);\n return bytes;\n },\n getRandomU64: (): bigint => {\n const bytes = new Uint8Array(8);\n crypto.getRandomValues(bytes);\n const view = new DataView(bytes.buffer);\n return view.getBigUint64(0, true);\n },\n };\n\n // Return both versioned (@0.2.3) and unversioned imports for compatibility\n return {\n // Unversioned (used by published grammars)\n 'wasi:cli/environment': environment,\n 'wasi:cli/exit': exit,\n 'wasi:cli/stdin': stdinIface,\n 'wasi:cli/stdout': stdoutIface,\n 'wasi:cli/stderr': stderrIface,\n 'wasi:clocks/wall-clock': wallClock,\n 'wasi:filesystem/types': filesystemTypes,\n 'wasi:filesystem/preopens': preopens,\n 'wasi:io/error': ioError,\n 'wasi:io/streams': streams,\n 'wasi:random/random': random,\n\n // Versioned @0.2.3 (for newer builds)\n 'wasi:cli/environment@0.2.3': environment,\n 'wasi:cli/exit@0.2.3': exit,\n 'wasi:cli/stdin@0.2.3': stdinIface,\n 'wasi:cli/stdout@0.2.3': stdoutIface,\n 'wasi:cli/stderr@0.2.3': stderrIface,\n 'wasi:clocks/wall-clock@0.2.3': wallClock,\n 'wasi:filesystem/types@0.2.3': filesystemTypes,\n 'wasi:filesystem/preopens@0.2.3': preopens,\n 'wasi:io/error@0.2.3': ioError,\n 'wasi:io/streams@0.2.3': streams,\n 'wasi:random/random@0.2.3': random,\n };\n}\n\n// Grammar types import (the plugin exports these)\nexport const grammarTypesImport = {\n 'arborium:grammar/types@0.1.0': {\n // Types are just interfaces, nothing to export\n },\n};\n","// AUTO-GENERATED by `cargo xtask build` - DO NOT EDIT\n\nexport interface PluginEntry {\n language: string;\n package: string;\n version: string;\n cdn_js: string;\n cdn_wasm: string;\n local_js: string;\n local_wasm: string;\n}\n\nexport interface PluginsManifest {\n generated_at: string;\n entries: PluginEntry[];\n}\n\nexport const pluginsManifest: PluginsManifest = {\n generated_at: \"2025-12-11T15:13:48.211698+00:00\",\n entries: [\n\n {\n language: \"ada\",\n package: \"@arborium/ada\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/ada@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/ada@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-moss/ada/npm/grammar.js\",\n local_wasm: \"/langs/group-moss/ada/npm/grammar.core.wasm\",\n },\n\n {\n language: \"agda\",\n package: \"@arborium/agda\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/agda@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/agda@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-fern/agda/npm/grammar.js\",\n local_wasm: \"/langs/group-fern/agda/npm/grammar.core.wasm\",\n },\n\n {\n language: \"asciidoc\",\n package: \"@arborium/asciidoc\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/asciidoc@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/asciidoc@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-willow/asciidoc/npm/grammar.js\",\n local_wasm: \"/langs/group-willow/asciidoc/npm/grammar.core.wasm\",\n },\n\n {\n language: \"asm\",\n package: \"@arborium/asm\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/asm@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/asm@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-birch/asm/npm/grammar.js\",\n local_wasm: \"/langs/group-birch/asm/npm/grammar.core.wasm\",\n },\n\n {\n language: \"awk\",\n package: \"@arborium/awk\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/awk@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/awk@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-hazel/awk/npm/grammar.js\",\n local_wasm: \"/langs/group-hazel/awk/npm/grammar.core.wasm\",\n },\n\n {\n language: \"bash\",\n package: \"@arborium/bash\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/bash@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/bash@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-hazel/bash/npm/grammar.js\",\n local_wasm: \"/langs/group-hazel/bash/npm/grammar.core.wasm\",\n },\n\n {\n language: \"batch\",\n package: \"@arborium/batch\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/batch@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/batch@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-hazel/batch/npm/grammar.js\",\n local_wasm: \"/langs/group-hazel/batch/npm/grammar.core.wasm\",\n },\n\n {\n language: \"c\",\n package: \"@arborium/c\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/c@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/c@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-birch/c/npm/grammar.js\",\n local_wasm: \"/langs/group-birch/c/npm/grammar.core.wasm\",\n },\n\n {\n language: \"c-sharp\",\n package: \"@arborium/c-sharp\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/c-sharp@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/c-sharp@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-sage/c-sharp/npm/grammar.js\",\n local_wasm: \"/langs/group-sage/c-sharp/npm/grammar.core.wasm\",\n },\n\n {\n language: \"caddy\",\n package: \"@arborium/caddy\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/caddy@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/caddy@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-maple/caddy/npm/grammar.js\",\n local_wasm: \"/langs/group-maple/caddy/npm/grammar.core.wasm\",\n },\n\n {\n language: \"capnp\",\n package: \"@arborium/capnp\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/capnp@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/capnp@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-pine/capnp/npm/grammar.js\",\n local_wasm: \"/langs/group-pine/capnp/npm/grammar.core.wasm\",\n },\n\n {\n language: \"clojure\",\n package: \"@arborium/clojure\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/clojure@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/clojure@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-cedar/clojure/npm/grammar.js\",\n local_wasm: \"/langs/group-cedar/clojure/npm/grammar.core.wasm\",\n },\n\n {\n language: \"cmake\",\n package: \"@arborium/cmake\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/cmake@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/cmake@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-maple/cmake/npm/grammar.js\",\n local_wasm: \"/langs/group-maple/cmake/npm/grammar.core.wasm\",\n },\n\n {\n language: \"commonlisp\",\n package: \"@arborium/commonlisp\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/commonlisp@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/commonlisp@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-fern/commonlisp/npm/grammar.js\",\n local_wasm: \"/langs/group-fern/commonlisp/npm/grammar.core.wasm\",\n },\n\n {\n language: \"cpp\",\n package: \"@arborium/cpp\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/cpp@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/cpp@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-birch/cpp/npm/grammar.js\",\n local_wasm: \"/langs/group-birch/cpp/npm/grammar.core.wasm\",\n },\n\n {\n language: \"css\",\n package: \"@arborium/css\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/css@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/css@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-acorn/css/npm/grammar.js\",\n local_wasm: \"/langs/group-acorn/css/npm/grammar.core.wasm\",\n },\n\n {\n language: \"d\",\n package: \"@arborium/d\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/d@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/d@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-birch/d/npm/grammar.js\",\n local_wasm: \"/langs/group-birch/d/npm/grammar.core.wasm\",\n },\n\n {\n language: \"dart\",\n package: \"@arborium/dart\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/dart@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/dart@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-pine/dart/npm/grammar.js\",\n local_wasm: \"/langs/group-pine/dart/npm/grammar.core.wasm\",\n },\n\n {\n language: \"devicetree\",\n package: \"@arborium/devicetree\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/devicetree@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/devicetree@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-pine/devicetree/npm/grammar.js\",\n local_wasm: \"/langs/group-pine/devicetree/npm/grammar.core.wasm\",\n },\n\n {\n language: \"diff\",\n package: \"@arborium/diff\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/diff@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/diff@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-willow/diff/npm/grammar.js\",\n local_wasm: \"/langs/group-willow/diff/npm/grammar.core.wasm\",\n },\n\n {\n language: \"dockerfile\",\n package: \"@arborium/dockerfile\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/dockerfile@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/dockerfile@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-maple/dockerfile/npm/grammar.js\",\n local_wasm: \"/langs/group-maple/dockerfile/npm/grammar.core.wasm\",\n },\n\n {\n language: \"dot\",\n package: \"@arborium/dot\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/dot@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/dot@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-maple/dot/npm/grammar.js\",\n local_wasm: \"/langs/group-maple/dot/npm/grammar.core.wasm\",\n },\n\n {\n language: \"elisp\",\n package: \"@arborium/elisp\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/elisp@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/elisp@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-sage/elisp/npm/grammar.js\",\n local_wasm: \"/langs/group-sage/elisp/npm/grammar.core.wasm\",\n },\n\n {\n language: \"elixir\",\n package: \"@arborium/elixir\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/elixir@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/elixir@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-fern/elixir/npm/grammar.js\",\n local_wasm: \"/langs/group-fern/elixir/npm/grammar.core.wasm\",\n },\n\n {\n language: \"elm\",\n package: \"@arborium/elm\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/elm@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/elm@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-fern/elm/npm/grammar.js\",\n local_wasm: \"/langs/group-fern/elm/npm/grammar.core.wasm\",\n },\n\n {\n language: \"erlang\",\n package: \"@arborium/erlang\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/erlang@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/erlang@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-fern/erlang/npm/grammar.js\",\n local_wasm: \"/langs/group-fern/erlang/npm/grammar.core.wasm\",\n },\n\n {\n language: \"fish\",\n package: \"@arborium/fish\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/fish@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/fish@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-hazel/fish/npm/grammar.js\",\n local_wasm: \"/langs/group-hazel/fish/npm/grammar.core.wasm\",\n },\n\n {\n language: \"fsharp\",\n package: \"@arborium/fsharp\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/fsharp@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/fsharp@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-sage/fsharp/npm/grammar.js\",\n local_wasm: \"/langs/group-sage/fsharp/npm/grammar.core.wasm\",\n },\n\n {\n language: \"gleam\",\n package: \"@arborium/gleam\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/gleam@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/gleam@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-fern/gleam/npm/grammar.js\",\n local_wasm: \"/langs/group-fern/gleam/npm/grammar.core.wasm\",\n },\n\n {\n language: \"glsl\",\n package: \"@arborium/glsl\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/glsl@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/glsl@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-moss/glsl/npm/grammar.js\",\n local_wasm: \"/langs/group-moss/glsl/npm/grammar.core.wasm\",\n },\n\n {\n language: \"go\",\n package: \"@arborium/go\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/go@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/go@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-birch/go/npm/grammar.js\",\n local_wasm: \"/langs/group-birch/go/npm/grammar.core.wasm\",\n },\n\n {\n language: \"graphql\",\n package: \"@arborium/graphql\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/graphql@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/graphql@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-maple/graphql/npm/grammar.js\",\n local_wasm: \"/langs/group-maple/graphql/npm/grammar.core.wasm\",\n },\n\n {\n language: \"haskell\",\n package: \"@arborium/haskell\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/haskell@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/haskell@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-fern/haskell/npm/grammar.js\",\n local_wasm: \"/langs/group-fern/haskell/npm/grammar.core.wasm\",\n },\n\n {\n language: \"hcl\",\n package: \"@arborium/hcl\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/hcl@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/hcl@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-maple/hcl/npm/grammar.js\",\n local_wasm: \"/langs/group-maple/hcl/npm/grammar.core.wasm\",\n },\n\n {\n language: \"hlsl\",\n package: \"@arborium/hlsl\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/hlsl@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/hlsl@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-moss/hlsl/npm/grammar.js\",\n local_wasm: \"/langs/group-moss/hlsl/npm/grammar.core.wasm\",\n },\n\n {\n language: \"html\",\n package: \"@arborium/html\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/html@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/html@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-acorn/html/npm/grammar.js\",\n local_wasm: \"/langs/group-acorn/html/npm/grammar.core.wasm\",\n },\n\n {\n language: \"idris\",\n package: \"@arborium/idris\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/idris@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/idris@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-fern/idris/npm/grammar.js\",\n local_wasm: \"/langs/group-fern/idris/npm/grammar.core.wasm\",\n },\n\n {\n language: \"ini\",\n package: \"@arborium/ini\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/ini@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/ini@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-maple/ini/npm/grammar.js\",\n local_wasm: \"/langs/group-maple/ini/npm/grammar.core.wasm\",\n },\n\n {\n language: \"java\",\n package: \"@arborium/java\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/java@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/java@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-cedar/java/npm/grammar.js\",\n local_wasm: \"/langs/group-cedar/java/npm/grammar.core.wasm\",\n },\n\n {\n language: \"javascript\",\n package: \"@arborium/javascript\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/javascript@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/javascript@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-acorn/javascript/npm/grammar.js\",\n local_wasm: \"/langs/group-acorn/javascript/npm/grammar.core.wasm\",\n },\n\n {\n language: \"jinja2\",\n package: \"@arborium/jinja2\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/jinja2@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/jinja2@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-willow/jinja2/npm/grammar.js\",\n local_wasm: \"/langs/group-willow/jinja2/npm/grammar.core.wasm\",\n },\n\n {\n language: \"jq\",\n package: \"@arborium/jq\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/jq@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/jq@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-maple/jq/npm/grammar.js\",\n local_wasm: \"/langs/group-maple/jq/npm/grammar.core.wasm\",\n },\n\n {\n language: \"json\",\n package: \"@arborium/json\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/json@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/json@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-acorn/json/npm/grammar.js\",\n local_wasm: \"/langs/group-acorn/json/npm/grammar.core.wasm\",\n },\n\n {\n language: \"julia\",\n package: \"@arborium/julia\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/julia@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/julia@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-moss/julia/npm/grammar.js\",\n local_wasm: \"/langs/group-moss/julia/npm/grammar.core.wasm\",\n },\n\n {\n language: \"kdl\",\n package: \"@arborium/kdl\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/kdl@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/kdl@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-maple/kdl/npm/grammar.js\",\n local_wasm: \"/langs/group-maple/kdl/npm/grammar.core.wasm\",\n },\n\n {\n language: \"kotlin\",\n package: \"@arborium/kotlin\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/kotlin@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/kotlin@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-cedar/kotlin/npm/grammar.js\",\n local_wasm: \"/langs/group-cedar/kotlin/npm/grammar.core.wasm\",\n },\n\n {\n language: \"lean\",\n package: \"@arborium/lean\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/lean@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/lean@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-fern/lean/npm/grammar.js\",\n local_wasm: \"/langs/group-fern/lean/npm/grammar.core.wasm\",\n },\n\n {\n language: \"lua\",\n package: \"@arborium/lua\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/lua@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/lua@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-hazel/lua/npm/grammar.js\",\n local_wasm: \"/langs/group-hazel/lua/npm/grammar.core.wasm\",\n },\n\n {\n language: \"markdown\",\n package: \"@arborium/markdown\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/markdown@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/markdown@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-willow/markdown/npm/grammar.js\",\n local_wasm: \"/langs/group-willow/markdown/npm/grammar.core.wasm\",\n },\n\n {\n language: \"matlab\",\n package: \"@arborium/matlab\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/matlab@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/matlab@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-moss/matlab/npm/grammar.js\",\n local_wasm: \"/langs/group-moss/matlab/npm/grammar.core.wasm\",\n },\n\n {\n language: \"meson\",\n package: \"@arborium/meson\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/meson@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/meson@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-maple/meson/npm/grammar.js\",\n local_wasm: \"/langs/group-maple/meson/npm/grammar.core.wasm\",\n },\n\n {\n language: \"nginx\",\n package: \"@arborium/nginx\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/nginx@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/nginx@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-maple/nginx/npm/grammar.js\",\n local_wasm: \"/langs/group-maple/nginx/npm/grammar.core.wasm\",\n },\n\n {\n language: \"ninja\",\n package: \"@arborium/ninja\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/ninja@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/ninja@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-maple/ninja/npm/grammar.js\",\n local_wasm: \"/langs/group-maple/ninja/npm/grammar.core.wasm\",\n },\n\n {\n language: \"nix\",\n package: \"@arborium/nix\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/nix@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/nix@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-maple/nix/npm/grammar.js\",\n local_wasm: \"/langs/group-maple/nix/npm/grammar.core.wasm\",\n },\n\n {\n language: \"objc\",\n package: \"@arborium/objc\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/objc@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/objc@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-birch/objc/npm/grammar.js\",\n local_wasm: \"/langs/group-birch/objc/npm/grammar.core.wasm\",\n },\n\n {\n language: \"ocaml\",\n package: \"@arborium/ocaml\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/ocaml@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/ocaml@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-fern/ocaml/npm/grammar.js\",\n local_wasm: \"/langs/group-fern/ocaml/npm/grammar.core.wasm\",\n },\n\n {\n language: \"perl\",\n package: \"@arborium/perl\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/perl@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/perl@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-hazel/perl/npm/grammar.js\",\n local_wasm: \"/langs/group-hazel/perl/npm/grammar.core.wasm\",\n },\n\n {\n language: \"php\",\n package: \"@arborium/php\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/php@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/php@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-hazel/php/npm/grammar.js\",\n local_wasm: \"/langs/group-hazel/php/npm/grammar.core.wasm\",\n },\n\n {\n language: \"postscript\",\n package: \"@arborium/postscript\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/postscript@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/postscript@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-sage/postscript/npm/grammar.js\",\n local_wasm: \"/langs/group-sage/postscript/npm/grammar.core.wasm\",\n },\n\n {\n language: \"powershell\",\n package: \"@arborium/powershell\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/powershell@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/powershell@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-hazel/powershell/npm/grammar.js\",\n local_wasm: \"/langs/group-hazel/powershell/npm/grammar.core.wasm\",\n },\n\n {\n language: \"prolog\",\n package: \"@arborium/prolog\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/prolog@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/prolog@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-moss/prolog/npm/grammar.js\",\n local_wasm: \"/langs/group-moss/prolog/npm/grammar.core.wasm\",\n },\n\n {\n language: \"python\",\n package: \"@arborium/python\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/python@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/python@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-hazel/python/npm/grammar.js\",\n local_wasm: \"/langs/group-hazel/python/npm/grammar.core.wasm\",\n },\n\n {\n language: \"query\",\n package: \"@arborium/query\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/query@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/query@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-maple/query/npm/grammar.js\",\n local_wasm: \"/langs/group-maple/query/npm/grammar.core.wasm\",\n },\n\n {\n language: \"r\",\n package: \"@arborium/r\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/r@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/r@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-moss/r/npm/grammar.js\",\n local_wasm: \"/langs/group-moss/r/npm/grammar.core.wasm\",\n },\n\n {\n language: \"rescript\",\n package: \"@arborium/rescript\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/rescript@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/rescript@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-pine/rescript/npm/grammar.js\",\n local_wasm: \"/langs/group-pine/rescript/npm/grammar.core.wasm\",\n },\n\n {\n language: \"ron\",\n package: \"@arborium/ron\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/ron@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/ron@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-maple/ron/npm/grammar.js\",\n local_wasm: \"/langs/group-maple/ron/npm/grammar.core.wasm\",\n },\n\n {\n language: \"ruby\",\n package: \"@arborium/ruby\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/ruby@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/ruby@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-hazel/ruby/npm/grammar.js\",\n local_wasm: \"/langs/group-hazel/ruby/npm/grammar.core.wasm\",\n },\n\n {\n language: \"rust\",\n package: \"@arborium/rust\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/rust@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/rust@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-birch/rust/npm/grammar.js\",\n local_wasm: \"/langs/group-birch/rust/npm/grammar.core.wasm\",\n },\n\n {\n language: \"scala\",\n package: \"@arborium/scala\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/scala@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/scala@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-cedar/scala/npm/grammar.js\",\n local_wasm: \"/langs/group-cedar/scala/npm/grammar.core.wasm\",\n },\n\n {\n language: \"scheme\",\n package: \"@arborium/scheme\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/scheme@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/scheme@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-fern/scheme/npm/grammar.js\",\n local_wasm: \"/langs/group-fern/scheme/npm/grammar.core.wasm\",\n },\n\n {\n language: \"scss\",\n package: \"@arborium/scss\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/scss@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/scss@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-acorn/scss/npm/grammar.js\",\n local_wasm: \"/langs/group-acorn/scss/npm/grammar.core.wasm\",\n },\n\n {\n language: \"sparql\",\n package: \"@arborium/sparql\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/sparql@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/sparql@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-moss/sparql/npm/grammar.js\",\n local_wasm: \"/langs/group-moss/sparql/npm/grammar.core.wasm\",\n },\n\n {\n language: \"sql\",\n package: \"@arborium/sql\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/sql@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/sql@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-maple/sql/npm/grammar.js\",\n local_wasm: \"/langs/group-maple/sql/npm/grammar.core.wasm\",\n },\n\n {\n language: \"ssh-config\",\n package: \"@arborium/ssh-config\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/ssh-config@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/ssh-config@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-maple/ssh-config/npm/grammar.js\",\n local_wasm: \"/langs/group-maple/ssh-config/npm/grammar.core.wasm\",\n },\n\n {\n language: \"starlark\",\n package: \"@arborium/starlark\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/starlark@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/starlark@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-pine/starlark/npm/grammar.js\",\n local_wasm: \"/langs/group-pine/starlark/npm/grammar.core.wasm\",\n },\n\n {\n language: \"svelte\",\n package: \"@arborium/svelte\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/svelte@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/svelte@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-willow/svelte/npm/grammar.js\",\n local_wasm: \"/langs/group-willow/svelte/npm/grammar.core.wasm\",\n },\n\n {\n language: \"swift\",\n package: \"@arborium/swift\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/swift@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/swift@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-pine/swift/npm/grammar.js\",\n local_wasm: \"/langs/group-pine/swift/npm/grammar.core.wasm\",\n },\n\n {\n language: \"textproto\",\n package: \"@arborium/textproto\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/textproto@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/textproto@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-pine/textproto/npm/grammar.js\",\n local_wasm: \"/langs/group-pine/textproto/npm/grammar.core.wasm\",\n },\n\n {\n language: \"thrift\",\n package: \"@arborium/thrift\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/thrift@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/thrift@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-pine/thrift/npm/grammar.js\",\n local_wasm: \"/langs/group-pine/thrift/npm/grammar.core.wasm\",\n },\n\n {\n language: \"tlaplus\",\n package: \"@arborium/tlaplus\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/tlaplus@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/tlaplus@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-moss/tlaplus/npm/grammar.js\",\n local_wasm: \"/langs/group-moss/tlaplus/npm/grammar.core.wasm\",\n },\n\n {\n language: \"toml\",\n package: \"@arborium/toml\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/toml@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/toml@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-maple/toml/npm/grammar.js\",\n local_wasm: \"/langs/group-maple/toml/npm/grammar.core.wasm\",\n },\n\n {\n language: \"tsx\",\n package: \"@arborium/tsx\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/tsx@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/tsx@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-acorn/tsx/npm/grammar.js\",\n local_wasm: \"/langs/group-acorn/tsx/npm/grammar.core.wasm\",\n },\n\n {\n language: \"typescript\",\n package: \"@arborium/typescript\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/typescript@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/typescript@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-acorn/typescript/npm/grammar.js\",\n local_wasm: \"/langs/group-acorn/typescript/npm/grammar.core.wasm\",\n },\n\n {\n language: \"typst\",\n package: \"@arborium/typst\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/typst@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/typst@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-willow/typst/npm/grammar.js\",\n local_wasm: \"/langs/group-willow/typst/npm/grammar.core.wasm\",\n },\n\n {\n language: \"uiua\",\n package: \"@arborium/uiua\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/uiua@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/uiua@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-pine/uiua/npm/grammar.js\",\n local_wasm: \"/langs/group-pine/uiua/npm/grammar.core.wasm\",\n },\n\n {\n language: \"vb\",\n package: \"@arborium/vb\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/vb@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/vb@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-sage/vb/npm/grammar.js\",\n local_wasm: \"/langs/group-sage/vb/npm/grammar.core.wasm\",\n },\n\n {\n language: \"verilog\",\n package: \"@arborium/verilog\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/verilog@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/verilog@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-moss/verilog/npm/grammar.js\",\n local_wasm: \"/langs/group-moss/verilog/npm/grammar.core.wasm\",\n },\n\n {\n language: \"vhdl\",\n package: \"@arborium/vhdl\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/vhdl@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/vhdl@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-moss/vhdl/npm/grammar.js\",\n local_wasm: \"/langs/group-moss/vhdl/npm/grammar.core.wasm\",\n },\n\n {\n language: \"vim\",\n package: \"@arborium/vim\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/vim@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/vim@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-sage/vim/npm/grammar.js\",\n local_wasm: \"/langs/group-sage/vim/npm/grammar.core.wasm\",\n },\n\n {\n language: \"vue\",\n package: \"@arborium/vue\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/vue@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/vue@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-willow/vue/npm/grammar.js\",\n local_wasm: \"/langs/group-willow/vue/npm/grammar.core.wasm\",\n },\n\n {\n language: \"x86asm\",\n package: \"@arborium/x86asm\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/x86asm@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/x86asm@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-birch/x86asm/npm/grammar.js\",\n local_wasm: \"/langs/group-birch/x86asm/npm/grammar.core.wasm\",\n },\n\n {\n language: \"xml\",\n package: \"@arborium/xml\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/xml@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/xml@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-acorn/xml/npm/grammar.js\",\n local_wasm: \"/langs/group-acorn/xml/npm/grammar.core.wasm\",\n },\n\n {\n language: \"yaml\",\n package: \"@arborium/yaml\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/yaml@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/yaml@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-maple/yaml/npm/grammar.js\",\n local_wasm: \"/langs/group-maple/yaml/npm/grammar.core.wasm\",\n },\n\n {\n language: \"yuri\",\n package: \"@arborium/yuri\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/yuri@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/yuri@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-pine/yuri/npm/grammar.js\",\n local_wasm: \"/langs/group-pine/yuri/npm/grammar.core.wasm\",\n },\n\n {\n language: \"zig\",\n package: \"@arborium/zig\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/zig@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/zig@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-birch/zig/npm/grammar.js\",\n local_wasm: \"/langs/group-birch/zig/npm/grammar.core.wasm\",\n },\n\n {\n language: \"zsh\",\n package: \"@arborium/zsh\",\n version: \"1.0.5\",\n cdn_js: \"https://cdn.jsdelivr.net/npm/@arborium/zsh@1.0.5/grammar.js\",\n cdn_wasm: \"https://cdn.jsdelivr.net/npm/@arborium/zsh@1.0.5/grammar.core.wasm\",\n local_js: \"/langs/group-hazel/zsh/npm/grammar.js\",\n local_wasm: \"/langs/group-hazel/zsh/npm/grammar.core.wasm\",\n },\n\n ],\n};","/**\n * Arborium loader - loads grammar plugins and highlights code.\n *\n * Architecture:\n * 1. Grammar registry is bundled at build time (no network request needed in production)\n * - Can be overridden via pluginsUrl config for local development\n * 2. Load grammar WIT components on demand from @arborium/<lang> packages\n * 3. Parse and highlight using the grammar's tree-sitter parser\n */\n\nimport { createWasiImports, grammarTypesImport } from \"./wasi-shims.js\";\nimport type { ParseResult, ArboriumConfig, Grammar, Span, Injection } from \"./types.js\";\nimport { pluginsManifest, type PluginsManifest, type PluginEntry } from \"./plugins-manifest.js\";\n\n// Default config\nexport const defaultConfig: Required<ArboriumConfig> = {\n manual: false,\n theme: \"one-dark\",\n selector: \"pre code\",\n cdn: \"jsdelivr\",\n version: \"1\", // Major version - allows patch/minor upgrades via CDN\n pluginsUrl: \"\", // Empty means use bundled manifest\n hostUrl: \"\", // Empty means use CDN based on version\n};\n\n// Rust host module (loaded on demand)\ninterface HostModule {\n highlight: (language: string, source: string) => string;\n isLanguageAvailable: (language: string) => boolean;\n}\nlet hostModule: HostModule | null = null;\nlet hostLoadPromise: Promise<HostModule | null> | null = null;\n\n// Merged config\nlet config: Required<ArboriumConfig> = { ...defaultConfig };\n\n// Grammar plugins cache\nconst grammarCache = new Map<string, GrammarPlugin>();\n\n// Active manifest - starts with bundled, can be overridden via pluginsUrl\nlet activeManifest: PluginsManifest = pluginsManifest;\nlet manifestLoadPromise: Promise<void> | null = null;\n\n// Languages we know are available\nlet availableLanguages: Set<string> = new Set(pluginsManifest.entries.map((e) => e.language));\n\n/** Ensure the manifest is loaded (fetches from pluginsUrl if configured, otherwise uses bundled) */\nasync function ensureManifestLoaded(): Promise<void> {\n // If no override URL, use bundled manifest (already loaded)\n if (!config.pluginsUrl) {\n return;\n }\n\n // If we already loaded from this URL, we're done\n if (manifestLoadPromise) {\n return manifestLoadPromise;\n }\n\n manifestLoadPromise = (async () => {\n console.debug(`[arborium] Loading plugins manifest from: ${config.pluginsUrl}`);\n const response = await fetch(config.pluginsUrl);\n if (!response.ok) {\n throw new Error(`Failed to load plugins.json: ${response.status}`);\n }\n activeManifest = await response.json();\n availableLanguages = new Set(activeManifest.entries.map((e) => e.language));\n console.debug(`[arborium] Available languages: ${Array.from(availableLanguages).join(\", \")}`);\n })();\n\n return manifestLoadPromise;\n}\n\n/** WIT Result type as returned by jco-generated code */\ntype WitResult<T, E> = { tag: \"ok\"; val: T } | { tag: \"err\"; val: E };\n\n/** Plugin interface as exported by jco-generated WIT components */\ninterface JcoPlugin {\n languageId(): string;\n injectionLanguages(): string[];\n createSession(): number;\n freeSession(session: number): void;\n setText(session: number, text: string): void;\n parse(session: number): WitResult<ParseResult, { message: string }>;\n}\n\n/** A loaded grammar plugin (WIT component) */\ninterface GrammarPlugin {\n languageId: string;\n injectionLanguages: string[];\n parse: (text: string) => ParseResult;\n}\n\n/** Load a grammar plugin */\nasync function loadGrammarPlugin(language: string): Promise<GrammarPlugin | null> {\n // Check cache\n const cached = grammarCache.get(language);\n if (cached) {\n console.debug(`[arborium] Grammar '${language}' found in cache`);\n return cached;\n }\n\n // Ensure manifest is loaded (no-op if using bundled manifest)\n await ensureManifestLoaded();\n\n // Find language entry in active manifest\n const entry = activeManifest.entries.find((e) => e.language === language);\n if (!entry) {\n console.debug(`[arborium] Grammar '${language}' not found in manifest`);\n return null;\n }\n\n try {\n // Use local URLs when pluginsUrl is set (local dev), otherwise use CDN\n const jsUrl = config.pluginsUrl ? entry.local_js : entry.cdn_js;\n const baseUrl = jsUrl.substring(0, jsUrl.lastIndexOf(\"/\"));\n\n console.debug(`[arborium] Loading grammar '${language}' from ${jsUrl}`);\n // Dynamically import the JS module\n const module = await import(/* @vite-ignore */ jsUrl);\n\n // Create a getCoreModule function that fetches WASM files by path\n const getCoreModule = async (path: string): Promise<WebAssembly.Module> => {\n const wasmUrl = `${baseUrl}/${path}`;\n const response = await fetch(wasmUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch WASM ${path}: ${response.status}`);\n }\n const bytes = await response.arrayBuffer();\n return WebAssembly.compile(bytes);\n };\n\n // Create WASI imports\n const wasiImports = createWasiImports();\n const imports = {\n ...wasiImports,\n ...grammarTypesImport,\n };\n\n // Instantiate the jco-generated component\n const instance = await module.instantiate(getCoreModule, imports);\n\n // Get the plugin interface\n const jcoPlugin = (instance.plugin || instance[\"arborium:grammar/plugin@0.1.0\"]) as JcoPlugin;\n if (!jcoPlugin) {\n console.error(`Grammar '${language}' missing plugin interface`);\n return null;\n }\n\n // Wrap as GrammarPlugin with session-based parsing\n const plugin: GrammarPlugin = {\n languageId: language,\n injectionLanguages: jcoPlugin.injectionLanguages?.() ?? [],\n parse: (text: string) => {\n const session = jcoPlugin.createSession();\n try {\n jcoPlugin.setText(session, text);\n const result = jcoPlugin.parse(session);\n\n // Handle various result shapes from jco\n // Some versions return { tag: 'ok', val: ParseResult }\n // Others might return ParseResult directly\n if (result.tag === \"err\") {\n const err = result.val as { message?: string };\n console.error(`[arborium] Parse error: ${err?.message}`);\n return { spans: [], injections: [] };\n }\n\n // Extract the actual value - could be result.val or result itself\n const val = result.tag === \"ok\" ? result.val : result;\n if (!val || typeof val !== \"object\") {\n console.error(`[arborium] Unexpected parse result:`, result);\n return { spans: [], injections: [] };\n }\n\n // Access spans/injections with type coercion\n const parsed = val as { spans?: Span[]; injections?: Injection[] };\n return {\n spans: parsed.spans || [],\n injections: parsed.injections || [],\n };\n } finally {\n jcoPlugin.freeSession(session);\n }\n },\n };\n\n grammarCache.set(language, plugin);\n console.debug(`[arborium] Grammar '${language}' loaded successfully`);\n return plugin;\n } catch (e) {\n console.error(`[arborium] Failed to load grammar '${language}':`, e);\n return null;\n }\n}\n\n// Handle to plugin mapping for the host interface\nconst handleToPlugin = new Map<number, GrammarPlugin>();\nlet nextHandle = 1;\n\n/** Setup window.arboriumHost for the Rust host to call into */\nfunction setupHostInterface(): void {\n (window as any).arboriumHost = {\n /** Check if a language is available (sync) */\n isLanguageAvailable(language: string): boolean {\n return availableLanguages.has(language) || grammarCache.has(language);\n },\n\n /** Load a grammar and return a handle (async) */\n async loadGrammar(language: string): Promise<number> {\n const plugin = await loadGrammarPlugin(language);\n if (!plugin) return 0; // 0 = not found\n\n // Check if we already have a handle\n for (const [handle, p] of handleToPlugin) {\n if (p === plugin) return handle;\n }\n\n // Create new handle\n const handle = nextHandle++;\n handleToPlugin.set(handle, plugin);\n return handle;\n },\n\n /** Parse text using a grammar handle (sync) */\n parse(handle: number, text: string): ParseResult {\n const plugin = handleToPlugin.get(handle);\n if (!plugin) return { spans: [], injections: [] };\n return plugin.parse(text);\n },\n };\n}\n\n/** Get the host URL based on config */\nfunction getHostUrl(): string {\n if (config.hostUrl) {\n return config.hostUrl;\n }\n // Use CDN\n const cdn = config.cdn;\n const version = config.version;\n let baseUrl: string;\n if (cdn === \"jsdelivr\") {\n baseUrl = \"https://cdn.jsdelivr.net/npm\";\n } else if (cdn === \"unpkg\") {\n baseUrl = \"https://unpkg.com\";\n } else {\n baseUrl = cdn;\n }\n const versionSuffix = version === \"latest\" ? \"\" : `@${version}`;\n return `${baseUrl}/@arborium/arborium${versionSuffix}/dist`;\n}\n\n/** Load the Rust host module */\nasync function loadHost(): Promise<HostModule | null> {\n if (hostModule) return hostModule;\n if (hostLoadPromise) return hostLoadPromise;\n\n hostLoadPromise = (async () => {\n // Setup the interface the host imports\n setupHostInterface();\n\n const hostUrl = getHostUrl();\n const jsUrl = `${hostUrl}/arborium_host.js`;\n const wasmUrl = `${hostUrl}/arborium_host_bg.wasm`;\n\n console.debug(`[arborium] Loading host from ${jsUrl}`);\n try {\n const module = await import(/* @vite-ignore */ jsUrl);\n await module.default(wasmUrl);\n\n hostModule = {\n highlight: module.highlight,\n isLanguageAvailable: module.isLanguageAvailable,\n };\n console.debug(`[arborium] Host loaded successfully`);\n return hostModule;\n } catch (e) {\n console.error(\"[arborium] Failed to load host:\", e);\n return null;\n }\n })();\n\n return hostLoadPromise;\n}\n\n/** Highlight source code */\nexport async function highlight(\n language: string,\n source: string,\n _config?: ArboriumConfig,\n): Promise<string> {\n // Try to use the Rust host (handles injections properly)\n const host = await loadHost();\n if (host) {\n try {\n return host.highlight(language, source);\n } catch (e) {\n console.warn(\"Host highlight failed, falling back to JS:\", e);\n }\n }\n\n // Fallback to JS-only highlighting (no injection support)\n const plugin = await loadGrammarPlugin(language);\n if (!plugin) {\n return escapeHtml(source);\n }\n\n const result = plugin.parse(source);\n return spansToHtml(source, result.spans);\n}\n\n/** Load a grammar for direct use */\nexport async function loadGrammar(\n language: string,\n _config?: ArboriumConfig,\n): Promise<Grammar | null> {\n const plugin = await loadGrammarPlugin(language);\n if (!plugin) return null;\n\n return {\n languageId: () => plugin.languageId,\n injectionLanguages: () => plugin.injectionLanguages,\n highlight: async (source: string) => {\n const result = plugin.parse(source);\n return spansToHtml(source, result.spans);\n },\n parse: (source: string) => plugin.parse(source),\n dispose: () => {\n // No-op for now, plugins are cached\n },\n };\n}\n\n/** Convert spans to HTML */\nexport function spansToHtml(source: string, spans: Span[]): string {\n // Sort spans by start position\n const sorted = [...spans].sort((a, b) => a.start - b.start);\n\n let html = \"\";\n let pos = 0;\n\n for (const span of sorted) {\n // Skip overlapping spans\n if (span.start < pos) continue;\n\n // Add text before span\n if (span.start > pos) {\n html += escapeHtml(source.slice(pos, span.start));\n }\n\n // Get tag for capture\n const tag = getTagForCapture(span.capture);\n const text = escapeHtml(source.slice(span.start, span.end));\n\n if (tag) {\n html += `<a-${tag}>${text}</a-${tag}>`;\n } else {\n html += text;\n }\n\n pos = span.end;\n }\n\n // Add remaining text\n if (pos < source.length) {\n html += escapeHtml(source.slice(pos));\n }\n\n return html;\n}\n\n/** Get the short tag for a capture name */\nfunction getTagForCapture(capture: string): string | null {\n if (capture.startsWith(\"keyword\") || capture === \"include\" || capture === \"conditional\") {\n return \"k\";\n }\n if (capture.startsWith(\"function\") || capture.startsWith(\"method\")) {\n return \"f\";\n }\n if (capture.startsWith(\"string\") || capture === \"character\") {\n return \"s\";\n }\n if (capture.startsWith(\"comment\")) {\n return \"c\";\n }\n if (capture.startsWith(\"type\")) {\n return \"t\";\n }\n if (capture.startsWith(\"variable\")) {\n return \"v\";\n }\n if (capture.startsWith(\"number\") || capture === \"float\") {\n return \"n\";\n }\n if (capture.startsWith(\"operator\")) {\n return \"o\";\n }\n if (capture.startsWith(\"punctuation\")) {\n return \"p\";\n }\n if (capture.startsWith(\"tag\")) {\n return \"tg\";\n }\n if (capture.startsWith(\"attribute\")) {\n return \"at\";\n }\n return null;\n}\n\n/** Escape HTML special characters */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\n/** Get current config, optionally merging with overrides */\nexport function getConfig(overrides?: Partial<ArboriumConfig>): Required<ArboriumConfig> {\n if (overrides) {\n return { ...config, ...overrides };\n }\n return { ...config };\n}\n\n/** Set/merge config */\nexport function setConfig(newConfig: Partial<ArboriumConfig>): void {\n config = { ...config, ...newConfig };\n}\n\n/** Check if a language is available */\nexport async function isLanguageAvailable(language: string): Promise<boolean> {\n await ensureManifestLoaded();\n return availableLanguages.has(language);\n}\n\n/** Get list of available languages */\nexport async function getAvailableLanguages(): Promise<string[]> {\n await ensureManifestLoaded();\n return Array.from(availableLanguages);\n}\n","/**\n * Simple language detection heuristics.\n * Not meant to be comprehensive - just catches common cases.\n */\n\n/** Shebang patterns */\nconst SHEBANG_PATTERNS: Array<[RegExp, string]> = [\n [/^#!.*\\bpython[23]?\\b/, 'python'],\n [/^#!.*\\bnode\\b/, 'javascript'],\n [/^#!.*\\bdeno\\b/, 'typescript'],\n [/^#!.*\\bbun\\b/, 'typescript'],\n [/^#!.*\\bruby\\b/, 'ruby'],\n [/^#!.*\\bperl\\b/, 'perl'],\n [/^#!.*\\bphp\\b/, 'php'],\n [/^#!.*\\bbash\\b/, 'bash'],\n [/^#!.*\\bzsh\\b/, 'zsh'],\n [/^#!.*\\bsh\\b/, 'bash'],\n [/^#!.*\\blua\\b/, 'lua'],\n [/^#!.*\\bawk\\b/, 'awk'],\n];\n\n/** Keyword fingerprints - first few unique keywords that identify a language */\nconst KEYWORD_FINGERPRINTS: Array<[RegExp, string]> = [\n // Rust - distinctive keywords\n [/\\b(fn|impl|trait|pub\\s+fn|let\\s+mut|&mut|->)\\b/, 'rust'],\n\n // Go - distinctive keywords\n [/\\b(func|package\\s+\\w+|import\\s+\\(|go\\s+func|chan\\s+\\w+)\\b/, 'go'],\n\n // Python - distinctive patterns\n [/\\b(def\\s+\\w+\\s*\\(|import\\s+\\w+|from\\s+\\w+\\s+import|class\\s+\\w+:)\\b/, 'python'],\n\n // TypeScript - distinctive type annotations\n [/:\\s*(string|number|boolean|void)\\b|\\binterface\\s+\\w+\\s*\\{/, 'typescript'],\n\n // JavaScript - distinctive patterns (after TS check)\n [/\\b(const|let|var)\\s+\\w+\\s*=|function\\s+\\w+\\s*\\(|=>\\s*\\{/, 'javascript'],\n\n // Ruby - distinctive keywords\n [/\\b(def\\s+\\w+|end\\b|do\\s*\\|.*\\||puts\\s+|require\\s+['\"])\\b/, 'ruby'],\n\n // Java - distinctive patterns\n [/\\b(public\\s+class|private\\s+\\w+|System\\.out\\.println)\\b/, 'java'],\n\n // C++ - distinctive patterns\n [/\\b(#include\\s*<|std::|template\\s*<|nullptr|cout\\s*<<)\\b/, 'cpp'],\n\n // C - distinctive patterns (after C++ check)\n [/\\b(#include\\s*[<\"]|printf\\s*\\(|int\\s+main\\s*\\(|void\\s+\\w+\\s*\\()\\b/, 'c'],\n\n // C# - distinctive patterns\n [/\\b(namespace\\s+\\w+|using\\s+System|public\\s+static\\s+void)\\b/, 'c-sharp'],\n\n // PHP - distinctive patterns\n [/<\\?php|\\$\\w+\\s*=/, 'php'],\n\n // Swift - distinctive patterns\n [/\\b(func\\s+\\w+|var\\s+\\w+:\\s*\\w+|let\\s+\\w+:\\s*\\w+|@objc)\\b/, 'swift'],\n\n // Kotlin - distinctive patterns\n [/\\b(fun\\s+\\w+|val\\s+\\w+|var\\s+\\w+:|data\\s+class)\\b/, 'kotlin'],\n\n // Scala - distinctive patterns\n [/\\b(def\\s+\\w+|val\\s+\\w+|var\\s+\\w+|object\\s+\\w+|case\\s+class)\\b/, 'scala'],\n\n // Haskell - distinctive patterns\n [/\\b(module\\s+\\w+|import\\s+qualified|data\\s+\\w+\\s*=|::\\s*\\w+\\s*->)\\b/, 'haskell'],\n\n // Elixir - distinctive patterns\n [/\\b(defmodule\\s+\\w+|def\\s+\\w+|defp\\s+\\w+|\\|>)\\b/, 'elixir'],\n\n // Lua - distinctive patterns\n [/\\b(local\\s+\\w+\\s*=|function\\s+\\w+\\.\\w+|require\\s*\\()\\b/, 'lua'],\n\n // SQL - distinctive patterns\n [/\\b(SELECT\\s+.*\\s+FROM|INSERT\\s+INTO|CREATE\\s+TABLE|ALTER\\s+TABLE)\\b/i, 'sql'],\n\n // Shell/Bash - distinctive patterns\n [/\\b(if\\s+\\[\\s*|then\\b|fi\\b|echo\\s+[\"']|export\\s+\\w+=)\\b/, 'bash'],\n\n // YAML - distinctive patterns\n [/^\\s*[\\w-]+:\\s*[\\w\\-\"'[{]|^---\\s*$/, 'yaml'],\n\n // JSON - distinctive patterns\n [/^\\s*\\{[\\s\\S]*\"[\\w-]+\":\\s*/, 'json'],\n\n // TOML - distinctive patterns\n [/^\\s*\\[[\\w.-]+\\]\\s*$|^\\s*\\w+\\s*=\\s*[\"'\\d\\[]/, 'toml'],\n\n // HTML - distinctive patterns\n [/<(!DOCTYPE|html|head|body|div|span|p|a\\s)/i, 'html'],\n\n // CSS - distinctive patterns\n [/^\\s*[\\w.#@][\\w\\s,#.:>+~-]*\\{[^}]*\\}|@media\\s|@import\\s/, 'css'],\n\n // Markdown - distinctive patterns\n [/^#{1,6}\\s+\\w|^\\s*[-*+]\\s+\\w|^\\s*\\d+\\.\\s+\\w|```\\w*\\n/, 'markdown'],\n\n // XML - distinctive patterns\n [/<\\?xml|<[\\w:-]+\\s+xmlns/, 'xml'],\n\n // Dockerfile\n [/^FROM\\s+\\w+|^RUN\\s+|^COPY\\s+|^ENTRYPOINT\\s+/m, 'dockerfile'],\n\n // Nginx config\n [/\\b(server\\s*\\{|location\\s+[\\/~]|proxy_pass\\s+)\\b/, 'nginx'],\n\n // Zig\n [/\\b(pub\\s+fn|const\\s+\\w+\\s*=|@import\\(|comptime)\\b/, 'zig'],\n];\n\n/**\n * Detect the language of a code snippet.\n * Returns null if detection fails.\n */\nexport function detectLanguage(source: string): string | null {\n // Check shebang first (most reliable)\n const firstLine = source.split('\\n')[0];\n for (const [pattern, language] of SHEBANG_PATTERNS) {\n if (pattern.test(firstLine)) {\n return language;\n }\n }\n\n // Check keyword fingerprints\n for (const [pattern, language] of KEYWORD_FINGERPRINTS) {\n if (pattern.test(source)) {\n return language;\n }\n }\n\n return null;\n}\n\n/**\n * Extract language from class name.\n * Supports multiple patterns:\n * - \"language-rust\" -> \"rust\" (standard)\n * - \"lang-rust\" -> \"rust\" (common alternative)\n * - \"rust\" -> \"rust\" (docs.rs style, bare language name)\n */\nexport function extractLanguageFromClass(className: string): string | null {\n // Try \"language-*\" pattern first (most specific)\n const langMatch = className.match(/\\blanguage-(\\w+)\\b/);\n if (langMatch) return langMatch[1];\n\n // Try \"lang-*\" pattern\n const shortMatch = className.match(/\\blang-(\\w+)\\b/);\n if (shortMatch) return shortMatch[1];\n\n // Try bare language names (for docs.rs compatibility)\n // Only match known language names to avoid false positives\n const knownLanguages = new Set([\n 'rust', 'javascript', 'typescript', 'python', 'ruby', 'go', 'java',\n 'c', 'cpp', 'csharp', 'php', 'swift', 'kotlin', 'scala', 'haskell',\n 'elixir', 'lua', 'sql', 'bash', 'shell', 'yaml', 'json', 'toml',\n 'html', 'css', 'xml', 'markdown', 'dockerfile', 'nginx', 'zig',\n 'text', 'plaintext', 'console', 'sh',\n ]);\n\n for (const cls of className.split(/\\s+/)) {\n if (knownLanguages.has(cls.toLowerCase())) {\n return cls.toLowerCase();\n }\n }\n\n return null;\n}\n\n/**\n * Normalize language identifier (handle aliases)\n */\nexport function normalizeLanguage(lang: string): string {\n const aliases: Record<string, string> = {\n js: 'javascript',\n ts: 'typescript',\n py: 'python',\n rb: 'ruby',\n rs: 'rust',\n sh: 'bash',\n shell: 'bash',\n yml: 'yaml',\n cs: 'c-sharp',\n csharp: 'c-sharp',\n 'c++': 'cpp',\n 'c#': 'c-sharp',\n 'f#': 'fsharp',\n dockerfile: 'dockerfile',\n docker: 'dockerfile',\n makefile: 'make',\n plaintext: 'text',\n plain: 'text',\n txt: 'text',\n };\n\n const lower = lang.toLowerCase();\n return aliases[lower] || lower;\n}\n"],"names":["WasiError","message","OutputStream","_contents","InputStream","_len","createWasiImports","stdout","stderr","stdin","environment","exit","status","stdinIface","stdoutIface","stderrIface","wallClock","ms","filesystemTypes","preopens","ioError","streams","random","len","bytes","grammarTypesImport","pluginsManifest","defaultConfig","hostModule","hostLoadPromise","config","grammarCache","activeManifest","manifestLoadPromise","availableLanguages","e","ensureManifestLoaded","response","loadGrammarPlugin","language","cached","entry","jsUrl","baseUrl","module","getCoreModule","path","wasmUrl","imports","instance","jcoPlugin","plugin","text","session","result","err","val","parsed","handleToPlugin","nextHandle","setupHostInterface","handle","p","getHostUrl","cdn","version","versionSuffix","loadHost","hostUrl","highlight","source","_config","host","escapeHtml","spansToHtml","loadGrammar","spans","sorted","a","b","html","pos","span","tag","getTagForCapture","capture","getConfig","overrides","SHEBANG_PATTERNS","KEYWORD_FINGERPRINTS","detectLanguage","firstLine","pattern","extractLanguageFromClass","className","langMatch","shortMatch","knownLanguages","cls","normalizeLanguage","lang","aliases","lower"],"mappings":"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"}
1
+ {"version":3,"file":"arborium.js","sources":["../src/wasi-shims.ts","../src/plugins-manifest.ts","../src/loader.ts","../src/detect.ts"],"sourcesContent":["/**\n * Minimal WASI shims for browser environment.\n * These provide stub implementations for WASI interfaces that\n * the grammar plugins require but don't actually use.\n */\n\n// Error type for WASI I/O\nclass WasiError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'WasiError';\n }\n}\n\n// Minimal stream implementation\nclass OutputStream {\n write(_contents: Uint8Array): bigint {\n // Silently discard output\n return BigInt(0);\n }\n\n blockingWriteAndFlush(_contents: Uint8Array): void {\n // No-op\n }\n\n blockingFlush(): void {\n // No-op\n }\n\n checkWrite(): bigint {\n return BigInt(1024 * 1024); // Allow large writes\n }\n\n subscribe(): void {\n // No-op\n }\n}\n\nclass InputStream {\n read(_len: bigint): Uint8Array {\n return new Uint8Array(0);\n }\n\n blockingRead(_len: bigint): Uint8Array {\n return new Uint8Array(0);\n }\n\n subscribe(): void {\n // No-op\n }\n}\n\n// Create the WASI import object expected by jco-generated modules\nexport function createWasiImports() {\n const stdout = new OutputStream();\n const stderr = new OutputStream();\n const stdin = new InputStream();\n\n // WASI interface implementations\n const environment = {\n getEnvironment: (): Array<[string, string]> => [],\n getArguments: (): string[] => [],\n };\n\n const exit = {\n exit: (status: { tag: string; val?: number }): void => {\n if (status.tag === 'err') {\n throw new WasiError(`WASI exit with error: ${status.val}`);\n }\n },\n };\n\n const stdinIface = { getStdin: () => stdin };\n const stdoutIface = { getStdout: () => stdout };\n const stderrIface = { getStderr: () => stderr };\n\n const wallClock = {\n now: (): { seconds: bigint; nanoseconds: number } => {\n const ms = Date.now();\n return {\n seconds: BigInt(Math.floor(ms / 1000)),\n nanoseconds: (ms % 1000) * 1_000_000,\n };\n },\n resolution: (): { seconds: bigint; nanoseconds: number } => {\n return { seconds: BigInt(0), nanoseconds: 1_000_000 };\n },\n };\n\n const filesystemTypes = {\n Descriptor: class {},\n DirectoryEntryStream: class {},\n filesystemErrorCode: () => null,\n };\n\n const preopens = {\n getDirectories: (): Array<[unknown, string]> => [],\n };\n\n const ioError = { Error: WasiError };\n const streams = { InputStream, OutputStream };\n\n const random = {\n getRandomBytes: (len: bigint): Uint8Array => {\n const bytes = new Uint8Array(Number(len));\n crypto.getRandomValues(bytes);\n return bytes;\n },\n getRandomU64: (): bigint => {\n const bytes = new Uint8Array(8);\n crypto.getRandomValues(bytes);\n const view = new DataView(bytes.buffer);\n return view.getBigUint64(0, true);\n },\n };\n\n // Return both versioned (@0.2.3) and unversioned imports for compatibility\n return {\n // Unversioned (used by published grammars)\n 'wasi:cli/environment': environment,\n 'wasi:cli/exit': exit,\n 'wasi:cli/stdin': stdinIface,\n 'wasi:cli/stdout': stdoutIface,\n 'wasi:cli/stderr': stderrIface,\n 'wasi:clocks/wall-clock': wallClock,\n 'wasi:filesystem/types': filesystemTypes,\n 'wasi:filesystem/preopens': preopens,\n 'wasi:io/error': ioError,\n 'wasi:io/streams': streams,\n 'wasi:random/random': random,\n\n // Versioned @0.2.3 (for newer builds)\n 'wasi:cli/environment@0.2.3': environment,\n 'wasi:cli/exit@0.2.3': exit,\n 'wasi:cli/stdin@0.2.3': stdinIface,\n 'wasi:cli/stdout@0.2.3': stdoutIface,\n 'wasi:cli/stderr@0.2.3': stderrIface,\n 'wasi:clocks/wall-clock@0.2.3': wallClock,\n 'wasi:filesystem/types@0.2.3': filesystemTypes,\n 'wasi:filesystem/preopens@0.2.3': preopens,\n 'wasi:io/error@0.2.3': ioError,\n 'wasi:io/streams@0.2.3': streams,\n 'wasi:random/random@0.2.3': random,\n };\n}\n\n// Grammar types import (the plugin exports these)\nexport const grammarTypesImport = {\n 'arborium:grammar/types@0.1.0': {\n // Types are just interfaces, nothing to export\n },\n};\n","// AUTO-GENERATED by `cargo xtask gen-manifest` - DO NOT EDIT\n\n/** All available languages */\nexport const availableLanguages: string[] = [\n \"ada\",\n \"agda\",\n \"asciidoc\",\n \"asm\",\n \"awk\",\n \"bash\",\n \"batch\",\n \"c\",\n \"c-sharp\",\n \"caddy\",\n \"capnp\",\n \"clojure\",\n \"cmake\",\n \"commonlisp\",\n \"cpp\",\n \"css\",\n \"d\",\n \"dart\",\n \"devicetree\",\n \"diff\",\n \"dockerfile\",\n \"dot\",\n \"elisp\",\n \"elixir\",\n \"elm\",\n \"erlang\",\n \"fish\",\n \"fsharp\",\n \"gleam\",\n \"glsl\",\n \"go\",\n \"graphql\",\n \"haskell\",\n \"hcl\",\n \"hlsl\",\n \"html\",\n \"idris\",\n \"ini\",\n \"java\",\n \"javascript\",\n \"jinja2\",\n \"jq\",\n \"json\",\n \"julia\",\n \"kdl\",\n \"kotlin\",\n \"lean\",\n \"lua\",\n \"markdown\",\n \"matlab\",\n \"meson\",\n \"nginx\",\n \"ninja\",\n \"nix\",\n \"objc\",\n \"ocaml\",\n \"perl\",\n \"php\",\n \"postscript\",\n \"powershell\",\n \"prolog\",\n \"python\",\n \"query\",\n \"r\",\n \"rescript\",\n \"ron\",\n \"ruby\",\n \"rust\",\n \"scala\",\n \"scheme\",\n \"scss\",\n \"sparql\",\n \"sql\",\n \"ssh-config\",\n \"starlark\",\n \"svelte\",\n \"swift\",\n \"textproto\",\n \"thrift\",\n \"tlaplus\",\n \"toml\",\n \"tsx\",\n \"typescript\",\n \"typst\",\n \"uiua\",\n \"vb\",\n \"verilog\",\n \"vhdl\",\n \"vim\",\n \"vue\",\n \"x86asm\",\n \"xml\",\n \"yaml\",\n \"yuri\",\n \"zig\",\n \"zsh\",\n];","/**\n * Arborium loader - loads grammar plugins and highlights code.\n *\n * Architecture:\n * 1. Grammar registry is bundled at build time (no network request needed in production)\n * - Can be overridden via pluginsUrl config for local development\n * 2. Load grammar WIT components on demand from @arborium/<lang> packages\n * 3. Parse and highlight using the grammar's tree-sitter parser\n */\n\nimport { createWasiImports, grammarTypesImport } from \"./wasi-shims.js\";\nimport type { ParseResult, ArboriumConfig, Grammar, Span, Injection } from \"./types.js\";\nimport { availableLanguages } from \"./plugins-manifest.js\";\n\n// Default config\nexport const defaultConfig: Required<ArboriumConfig> = {\n manual: false,\n theme: \"one-dark\",\n selector: \"pre code\",\n cdn: \"jsdelivr\",\n version: \"1\", // Major version - allows patch/minor upgrades via CDN\n pluginsUrl: \"\", // Empty means use bundled manifest\n hostUrl: \"\", // Empty means use CDN based on version\n};\n\n// Rust host module (loaded on demand)\ninterface HostModule {\n highlight: (language: string, source: string) => string;\n isLanguageAvailable: (language: string) => boolean;\n}\nlet hostModule: HostModule | null = null;\nlet hostLoadPromise: Promise<HostModule | null> | null = null;\n\n// Merged config\nlet config: Required<ArboriumConfig> = { ...defaultConfig };\n\n// Grammar plugins cache\nconst grammarCache = new Map<string, GrammarPlugin>();\n\n// Languages we know are available (bundled at build time)\nconst knownLanguages: Set<string> = new Set(availableLanguages);\n\n// For local development: can override with pluginsUrl to load from dev server\ninterface LocalManifest {\n entries: Array<{\n language: string;\n local_js: string;\n local_wasm: string;\n }>;\n}\nlet localManifest: LocalManifest | null = null;\nlet localManifestPromise: Promise<void> | null = null;\n\n/** Load local manifest if pluginsUrl is configured (for dev server) */\nasync function ensureLocalManifest(): Promise<void> {\n if (!config.pluginsUrl) {\n return;\n }\n\n if (localManifestPromise) {\n return localManifestPromise;\n }\n\n localManifestPromise = (async () => {\n console.debug(`[arborium] Loading local plugins manifest from: ${config.pluginsUrl}`);\n const response = await fetch(config.pluginsUrl);\n if (!response.ok) {\n throw new Error(`Failed to load plugins.json: ${response.status}`);\n }\n localManifest = await response.json();\n console.debug(`[arborium] Loaded local manifest with ${localManifest?.entries.length} entries`);\n })();\n\n return localManifestPromise;\n}\n\n/** Get the CDN URL for a grammar's JS file */\nfunction getGrammarJsUrl(language: string): string {\n // If we have a local manifest (dev mode), use the local path\n if (localManifest) {\n const entry = localManifest.entries.find((e) => e.language === language);\n if (entry) {\n return entry.local_js;\n }\n }\n\n // Production: derive from language name using @1 (major version)\n const cdn = config.cdn;\n let baseUrl: string;\n if (cdn === \"jsdelivr\") {\n baseUrl = \"https://cdn.jsdelivr.net/npm\";\n } else if (cdn === \"unpkg\") {\n baseUrl = \"https://unpkg.com\";\n } else {\n baseUrl = cdn;\n }\n return `${baseUrl}/@arborium/${language}@1/grammar.js`;\n}\n\n/** WIT Result type as returned by jco-generated code */\ntype WitResult<T, E> = { tag: \"ok\"; val: T } | { tag: \"err\"; val: E };\n\n/** Plugin interface as exported by jco-generated WIT components */\ninterface JcoPlugin {\n languageId(): string;\n injectionLanguages(): string[];\n createSession(): number;\n freeSession(session: number): void;\n setText(session: number, text: string): void;\n parse(session: number): WitResult<ParseResult, { message: string }>;\n}\n\n/** A loaded grammar plugin (WIT component) */\ninterface GrammarPlugin {\n languageId: string;\n injectionLanguages: string[];\n parse: (text: string) => ParseResult;\n}\n\n/** Load a grammar plugin */\nasync function loadGrammarPlugin(language: string): Promise<GrammarPlugin | null> {\n // Check cache\n const cached = grammarCache.get(language);\n if (cached) {\n console.debug(`[arborium] Grammar '${language}' found in cache`);\n return cached;\n }\n\n // Load local manifest if in dev mode\n await ensureLocalManifest();\n\n // Check if language is known\n if (\n !knownLanguages.has(language) &&\n !localManifest?.entries.some((e) => e.language === language)\n ) {\n console.debug(`[arborium] Grammar '${language}' not available`);\n return null;\n }\n\n try {\n // Get the URL for the grammar JS (CDN or local depending on config)\n const jsUrl = getGrammarJsUrl(language);\n const baseUrl = jsUrl.substring(0, jsUrl.lastIndexOf(\"/\"));\n\n console.debug(`[arborium] Loading grammar '${language}' from ${jsUrl}`);\n // Dynamically import the JS module\n const module = await import(/* @vite-ignore */ jsUrl);\n\n // Create a getCoreModule function that fetches WASM files by path\n const getCoreModule = async (path: string): Promise<WebAssembly.Module> => {\n const wasmUrl = `${baseUrl}/${path}`;\n const response = await fetch(wasmUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch WASM ${path}: ${response.status}`);\n }\n const bytes = await response.arrayBuffer();\n return WebAssembly.compile(bytes);\n };\n\n // Create WASI imports\n const wasiImports = createWasiImports();\n const imports = {\n ...wasiImports,\n ...grammarTypesImport,\n };\n\n // Instantiate the jco-generated component\n const instance = await module.instantiate(getCoreModule, imports);\n\n // Get the plugin interface\n const jcoPlugin = (instance.plugin || instance[\"arborium:grammar/plugin@0.1.0\"]) as JcoPlugin;\n if (!jcoPlugin) {\n console.error(`Grammar '${language}' missing plugin interface`);\n return null;\n }\n\n // Wrap as GrammarPlugin with session-based parsing\n const plugin: GrammarPlugin = {\n languageId: language,\n injectionLanguages: jcoPlugin.injectionLanguages?.() ?? [],\n parse: (text: string) => {\n const session = jcoPlugin.createSession();\n try {\n jcoPlugin.setText(session, text);\n const result = jcoPlugin.parse(session);\n\n // Handle various result shapes from jco\n // Some versions return { tag: 'ok', val: ParseResult }\n // Others might return ParseResult directly\n if (result.tag === \"err\") {\n const err = result.val as { message?: string };\n console.error(`[arborium] Parse error: ${err?.message}`);\n return { spans: [], injections: [] };\n }\n\n // Extract the actual value - could be result.val or result itself\n const val = result.tag === \"ok\" ? result.val : result;\n if (!val || typeof val !== \"object\") {\n console.error(`[arborium] Unexpected parse result:`, result);\n return { spans: [], injections: [] };\n }\n\n // Access spans/injections with type coercion\n const parsed = val as { spans?: Span[]; injections?: Injection[] };\n return {\n spans: parsed.spans || [],\n injections: parsed.injections || [],\n };\n } finally {\n jcoPlugin.freeSession(session);\n }\n },\n };\n\n grammarCache.set(language, plugin);\n console.debug(`[arborium] Grammar '${language}' loaded successfully`);\n return plugin;\n } catch (e) {\n console.error(`[arborium] Failed to load grammar '${language}':`, e);\n return null;\n }\n}\n\n// Handle to plugin mapping for the host interface\nconst handleToPlugin = new Map<number, GrammarPlugin>();\nlet nextHandle = 1;\n\n/** Setup window.arboriumHost for the Rust host to call into */\nfunction setupHostInterface(): void {\n (window as any).arboriumHost = {\n /** Check if a language is available (sync) */\n isLanguageAvailable(language: string): boolean {\n return knownLanguages.has(language) || grammarCache.has(language);\n },\n\n /** Load a grammar and return a handle (async) */\n async loadGrammar(language: string): Promise<number> {\n const plugin = await loadGrammarPlugin(language);\n if (!plugin) return 0; // 0 = not found\n\n // Check if we already have a handle\n for (const [handle, p] of handleToPlugin) {\n if (p === plugin) return handle;\n }\n\n // Create new handle\n const handle = nextHandle++;\n handleToPlugin.set(handle, plugin);\n return handle;\n },\n\n /** Parse text using a grammar handle (sync) */\n parse(handle: number, text: string): ParseResult {\n const plugin = handleToPlugin.get(handle);\n if (!plugin) return { spans: [], injections: [] };\n return plugin.parse(text);\n },\n };\n}\n\n/** Get the host URL based on config */\nfunction getHostUrl(): string {\n if (config.hostUrl) {\n return config.hostUrl;\n }\n // Use CDN\n const cdn = config.cdn;\n const version = config.version;\n let baseUrl: string;\n if (cdn === \"jsdelivr\") {\n baseUrl = \"https://cdn.jsdelivr.net/npm\";\n } else if (cdn === \"unpkg\") {\n baseUrl = \"https://unpkg.com\";\n } else {\n baseUrl = cdn;\n }\n const versionSuffix = version === \"latest\" ? \"\" : `@${version}`;\n return `${baseUrl}/@arborium/arborium${versionSuffix}/dist`;\n}\n\n/** Load the Rust host module */\nasync function loadHost(): Promise<HostModule | null> {\n if (hostModule) return hostModule;\n if (hostLoadPromise) return hostLoadPromise;\n\n hostLoadPromise = (async () => {\n // Setup the interface the host imports\n setupHostInterface();\n\n const hostUrl = getHostUrl();\n const jsUrl = `${hostUrl}/arborium_host.js`;\n const wasmUrl = `${hostUrl}/arborium_host_bg.wasm`;\n\n console.debug(`[arborium] Loading host from ${jsUrl}`);\n try {\n const module = await import(/* @vite-ignore */ jsUrl);\n await module.default(wasmUrl);\n\n hostModule = {\n highlight: module.highlight,\n isLanguageAvailable: module.isLanguageAvailable,\n };\n console.debug(`[arborium] Host loaded successfully`);\n return hostModule;\n } catch (e) {\n console.error(\"[arborium] Failed to load host:\", e);\n return null;\n }\n })();\n\n return hostLoadPromise;\n}\n\n/** Highlight source code */\nexport async function highlight(\n language: string,\n source: string,\n _config?: ArboriumConfig,\n): Promise<string> {\n // Try to use the Rust host (handles injections properly)\n const host = await loadHost();\n if (host) {\n try {\n return host.highlight(language, source);\n } catch (e) {\n console.warn(\"Host highlight failed, falling back to JS:\", e);\n }\n }\n\n // Fallback to JS-only highlighting (no injection support)\n const plugin = await loadGrammarPlugin(language);\n if (!plugin) {\n return escapeHtml(source);\n }\n\n const result = plugin.parse(source);\n return spansToHtml(source, result.spans);\n}\n\n/** Load a grammar for direct use */\nexport async function loadGrammar(\n language: string,\n _config?: ArboriumConfig,\n): Promise<Grammar | null> {\n const plugin = await loadGrammarPlugin(language);\n if (!plugin) return null;\n\n return {\n languageId: () => plugin.languageId,\n injectionLanguages: () => plugin.injectionLanguages,\n highlight: async (source: string) => {\n const result = plugin.parse(source);\n return spansToHtml(source, result.spans);\n },\n parse: (source: string) => plugin.parse(source),\n dispose: () => {\n // No-op for now, plugins are cached\n },\n };\n}\n\n/** Convert spans to HTML */\nexport function spansToHtml(source: string, spans: Span[]): string {\n // Sort spans by start position\n const sorted = [...spans].sort((a, b) => a.start - b.start);\n\n let html = \"\";\n let pos = 0;\n\n for (const span of sorted) {\n // Skip overlapping spans\n if (span.start < pos) continue;\n\n // Add text before span\n if (span.start > pos) {\n html += escapeHtml(source.slice(pos, span.start));\n }\n\n // Get tag for capture\n const tag = getTagForCapture(span.capture);\n const text = escapeHtml(source.slice(span.start, span.end));\n\n if (tag) {\n html += `<a-${tag}>${text}</a-${tag}>`;\n } else {\n html += text;\n }\n\n pos = span.end;\n }\n\n // Add remaining text\n if (pos < source.length) {\n html += escapeHtml(source.slice(pos));\n }\n\n return html;\n}\n\n/** Get the short tag for a capture name */\nfunction getTagForCapture(capture: string): string | null {\n if (capture.startsWith(\"keyword\") || capture === \"include\" || capture === \"conditional\") {\n return \"k\";\n }\n if (capture.startsWith(\"function\") || capture.startsWith(\"method\")) {\n return \"f\";\n }\n if (capture.startsWith(\"string\") || capture === \"character\") {\n return \"s\";\n }\n if (capture.startsWith(\"comment\")) {\n return \"c\";\n }\n if (capture.startsWith(\"type\")) {\n return \"t\";\n }\n if (capture.startsWith(\"variable\")) {\n return \"v\";\n }\n if (capture.startsWith(\"number\") || capture === \"float\") {\n return \"n\";\n }\n if (capture.startsWith(\"operator\")) {\n return \"o\";\n }\n if (capture.startsWith(\"punctuation\")) {\n return \"p\";\n }\n if (capture.startsWith(\"tag\")) {\n return \"tg\";\n }\n if (capture.startsWith(\"attribute\")) {\n return \"at\";\n }\n return null;\n}\n\n/** Escape HTML special characters */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\n/** Get current config, optionally merging with overrides */\nexport function getConfig(overrides?: Partial<ArboriumConfig>): Required<ArboriumConfig> {\n if (overrides) {\n return { ...config, ...overrides };\n }\n return { ...config };\n}\n\n/** Set/merge config */\nexport function setConfig(newConfig: Partial<ArboriumConfig>): void {\n config = { ...config, ...newConfig };\n}\n\n/** Check if a language is available */\nexport async function isLanguageAvailable(language: string): Promise<boolean> {\n await ensureLocalManifest();\n return (\n knownLanguages.has(language) ||\n (localManifest?.entries.some((e) => e.language === language) ?? false)\n );\n}\n\n/** Get list of available languages */\nexport async function getAvailableLanguages(): Promise<string[]> {\n await ensureLocalManifest();\n // In dev mode, use local manifest if available\n if (localManifest) {\n return localManifest.entries.map((e) => e.language);\n }\n return Array.from(knownLanguages);\n}\n","/**\n * Simple language detection heuristics.\n * Not meant to be comprehensive - just catches common cases.\n */\n\n/** Shebang patterns */\nconst SHEBANG_PATTERNS: Array<[RegExp, string]> = [\n [/^#!.*\\bpython[23]?\\b/, 'python'],\n [/^#!.*\\bnode\\b/, 'javascript'],\n [/^#!.*\\bdeno\\b/, 'typescript'],\n [/^#!.*\\bbun\\b/, 'typescript'],\n [/^#!.*\\bruby\\b/, 'ruby'],\n [/^#!.*\\bperl\\b/, 'perl'],\n [/^#!.*\\bphp\\b/, 'php'],\n [/^#!.*\\bbash\\b/, 'bash'],\n [/^#!.*\\bzsh\\b/, 'zsh'],\n [/^#!.*\\bsh\\b/, 'bash'],\n [/^#!.*\\blua\\b/, 'lua'],\n [/^#!.*\\bawk\\b/, 'awk'],\n];\n\n/** Keyword fingerprints - first few unique keywords that identify a language */\nconst KEYWORD_FINGERPRINTS: Array<[RegExp, string]> = [\n // Rust - distinctive keywords\n [/\\b(fn|impl|trait|pub\\s+fn|let\\s+mut|&mut|->)\\b/, 'rust'],\n\n // Go - distinctive keywords\n [/\\b(func|package\\s+\\w+|import\\s+\\(|go\\s+func|chan\\s+\\w+)\\b/, 'go'],\n\n // Python - distinctive patterns\n [/\\b(def\\s+\\w+\\s*\\(|import\\s+\\w+|from\\s+\\w+\\s+import|class\\s+\\w+:)\\b/, 'python'],\n\n // TypeScript - distinctive type annotations\n [/:\\s*(string|number|boolean|void)\\b|\\binterface\\s+\\w+\\s*\\{/, 'typescript'],\n\n // JavaScript - distinctive patterns (after TS check)\n [/\\b(const|let|var)\\s+\\w+\\s*=|function\\s+\\w+\\s*\\(|=>\\s*\\{/, 'javascript'],\n\n // Ruby - distinctive keywords\n [/\\b(def\\s+\\w+|end\\b|do\\s*\\|.*\\||puts\\s+|require\\s+['\"])\\b/, 'ruby'],\n\n // Java - distinctive patterns\n [/\\b(public\\s+class|private\\s+\\w+|System\\.out\\.println)\\b/, 'java'],\n\n // C++ - distinctive patterns\n [/\\b(#include\\s*<|std::|template\\s*<|nullptr|cout\\s*<<)\\b/, 'cpp'],\n\n // C - distinctive patterns (after C++ check)\n [/\\b(#include\\s*[<\"]|printf\\s*\\(|int\\s+main\\s*\\(|void\\s+\\w+\\s*\\()\\b/, 'c'],\n\n // C# - distinctive patterns\n [/\\b(namespace\\s+\\w+|using\\s+System|public\\s+static\\s+void)\\b/, 'c-sharp'],\n\n // PHP - distinctive patterns\n [/<\\?php|\\$\\w+\\s*=/, 'php'],\n\n // Swift - distinctive patterns\n [/\\b(func\\s+\\w+|var\\s+\\w+:\\s*\\w+|let\\s+\\w+:\\s*\\w+|@objc)\\b/, 'swift'],\n\n // Kotlin - distinctive patterns\n [/\\b(fun\\s+\\w+|val\\s+\\w+|var\\s+\\w+:|data\\s+class)\\b/, 'kotlin'],\n\n // Scala - distinctive patterns\n [/\\b(def\\s+\\w+|val\\s+\\w+|var\\s+\\w+|object\\s+\\w+|case\\s+class)\\b/, 'scala'],\n\n // Haskell - distinctive patterns\n [/\\b(module\\s+\\w+|import\\s+qualified|data\\s+\\w+\\s*=|::\\s*\\w+\\s*->)\\b/, 'haskell'],\n\n // Elixir - distinctive patterns\n [/\\b(defmodule\\s+\\w+|def\\s+\\w+|defp\\s+\\w+|\\|>)\\b/, 'elixir'],\n\n // Lua - distinctive patterns\n [/\\b(local\\s+\\w+\\s*=|function\\s+\\w+\\.\\w+|require\\s*\\()\\b/, 'lua'],\n\n // SQL - distinctive patterns\n [/\\b(SELECT\\s+.*\\s+FROM|INSERT\\s+INTO|CREATE\\s+TABLE|ALTER\\s+TABLE)\\b/i, 'sql'],\n\n // Shell/Bash - distinctive patterns\n [/\\b(if\\s+\\[\\s*|then\\b|fi\\b|echo\\s+[\"']|export\\s+\\w+=)\\b/, 'bash'],\n\n // YAML - distinctive patterns\n [/^\\s*[\\w-]+:\\s*[\\w\\-\"'[{]|^---\\s*$/, 'yaml'],\n\n // JSON - distinctive patterns\n [/^\\s*\\{[\\s\\S]*\"[\\w-]+\":\\s*/, 'json'],\n\n // TOML - distinctive patterns\n [/^\\s*\\[[\\w.-]+\\]\\s*$|^\\s*\\w+\\s*=\\s*[\"'\\d\\[]/, 'toml'],\n\n // HTML - distinctive patterns\n [/<(!DOCTYPE|html|head|body|div|span|p|a\\s)/i, 'html'],\n\n // CSS - distinctive patterns\n [/^\\s*[\\w.#@][\\w\\s,#.:>+~-]*\\{[^}]*\\}|@media\\s|@import\\s/, 'css'],\n\n // Markdown - distinctive patterns\n [/^#{1,6}\\s+\\w|^\\s*[-*+]\\s+\\w|^\\s*\\d+\\.\\s+\\w|```\\w*\\n/, 'markdown'],\n\n // XML - distinctive patterns\n [/<\\?xml|<[\\w:-]+\\s+xmlns/, 'xml'],\n\n // Dockerfile\n [/^FROM\\s+\\w+|^RUN\\s+|^COPY\\s+|^ENTRYPOINT\\s+/m, 'dockerfile'],\n\n // Nginx config\n [/\\b(server\\s*\\{|location\\s+[\\/~]|proxy_pass\\s+)\\b/, 'nginx'],\n\n // Zig\n [/\\b(pub\\s+fn|const\\s+\\w+\\s*=|@import\\(|comptime)\\b/, 'zig'],\n];\n\n/**\n * Detect the language of a code snippet.\n * Returns null if detection fails.\n */\nexport function detectLanguage(source: string): string | null {\n // Check shebang first (most reliable)\n const firstLine = source.split('\\n')[0];\n for (const [pattern, language] of SHEBANG_PATTERNS) {\n if (pattern.test(firstLine)) {\n return language;\n }\n }\n\n // Check keyword fingerprints\n for (const [pattern, language] of KEYWORD_FINGERPRINTS) {\n if (pattern.test(source)) {\n return language;\n }\n }\n\n return null;\n}\n\n/**\n * Extract language from class name.\n * Supports multiple patterns:\n * - \"language-rust\" -> \"rust\" (standard)\n * - \"lang-rust\" -> \"rust\" (common alternative)\n * - \"rust\" -> \"rust\" (docs.rs style, bare language name)\n */\nexport function extractLanguageFromClass(className: string): string | null {\n // Try \"language-*\" pattern first (most specific)\n const langMatch = className.match(/\\blanguage-(\\w+)\\b/);\n if (langMatch) return langMatch[1];\n\n // Try \"lang-*\" pattern\n const shortMatch = className.match(/\\blang-(\\w+)\\b/);\n if (shortMatch) return shortMatch[1];\n\n // Try bare language names (for docs.rs compatibility)\n // Only match known language names to avoid false positives\n const knownLanguages = new Set([\n 'rust', 'javascript', 'typescript', 'python', 'ruby', 'go', 'java',\n 'c', 'cpp', 'csharp', 'php', 'swift', 'kotlin', 'scala', 'haskell',\n 'elixir', 'lua', 'sql', 'bash', 'shell', 'yaml', 'json', 'toml',\n 'html', 'css', 'xml', 'markdown', 'dockerfile', 'nginx', 'zig',\n 'text', 'plaintext', 'console', 'sh',\n ]);\n\n for (const cls of className.split(/\\s+/)) {\n if (knownLanguages.has(cls.toLowerCase())) {\n return cls.toLowerCase();\n }\n }\n\n return null;\n}\n\n/**\n * Normalize language identifier (handle aliases)\n */\nexport function normalizeLanguage(lang: string): string {\n const aliases: Record<string, string> = {\n js: 'javascript',\n ts: 'typescript',\n py: 'python',\n rb: 'ruby',\n rs: 'rust',\n sh: 'bash',\n shell: 'bash',\n yml: 'yaml',\n cs: 'c-sharp',\n csharp: 'c-sharp',\n 'c++': 'cpp',\n 'c#': 'c-sharp',\n 'f#': 'fsharp',\n dockerfile: 'dockerfile',\n docker: 'dockerfile',\n makefile: 'make',\n plaintext: 'text',\n plain: 'text',\n txt: 'text',\n };\n\n const lower = lang.toLowerCase();\n return aliases[lower] || lower;\n}\n"],"names":["WasiError","message","OutputStream","_contents","InputStream","_len","createWasiImports","stdout","stderr","stdin","environment","exit","status","stdinIface","stdoutIface","stderrIface","wallClock","ms","filesystemTypes","preopens","ioError","streams","random","len","bytes","grammarTypesImport","availableLanguages","defaultConfig","hostModule","hostLoadPromise","config","grammarCache","knownLanguages","localManifest","localManifestPromise","ensureLocalManifest","response","getGrammarJsUrl","language","entry","e","cdn","baseUrl","loadGrammarPlugin","cached","jsUrl","module","getCoreModule","path","wasmUrl","imports","instance","jcoPlugin","plugin","text","session","result","err","val","parsed","handleToPlugin","nextHandle","setupHostInterface","handle","p","getHostUrl","version","versionSuffix","loadHost","hostUrl","highlight","source","_config","host","escapeHtml","spansToHtml","loadGrammar","spans","sorted","b","html","pos","span","tag","getTagForCapture","capture","getConfig","overrides","SHEBANG_PATTERNS","KEYWORD_FINGERPRINTS","detectLanguage","firstLine","pattern","extractLanguageFromClass","className","langMatch","shortMatch","cls","normalizeLanguage","lang","aliases","lower"],"mappings":"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"}
@@ -1,14 +1,2 @@
1
- export interface PluginEntry {
2
- language: string;
3
- package: string;
4
- version: string;
5
- cdn_js: string;
6
- cdn_wasm: string;
7
- local_js: string;
8
- local_wasm: string;
9
- }
10
- export interface PluginsManifest {
11
- generated_at: string;
12
- entries: PluginEntry[];
13
- }
14
- export declare const pluginsManifest: PluginsManifest;
1
+ /** All available languages */
2
+ export declare const availableLanguages: string[];
package/package.json CHANGED
@@ -79,12 +79,12 @@
79
79
  "build:iife": "vite build --config vite.config.iife.ts",
80
80
  "copy:host": "cp ../../demo/pkg/arborium_host.js ../../demo/pkg/arborium_host_bg.wasm dist/",
81
81
  "dev": "vite",
82
- "gen:manifest": "cd ../.. && cargo xtask gen-manifest --version $(node -p \"require('./packages/arborium/package.json').version\")",
82
+ "gen:manifest": "cd ../.. && cargo xtask gen-manifest",
83
83
  "prepublishOnly": "npm run gen:manifest && npm run build && test -f dist/arborium.iife.js || (echo 'ERROR: dist/arborium.iife.js missing!' && exit 1)",
84
84
  "preview": "vite preview",
85
85
  "typecheck": "tsc --noEmit"
86
86
  },
87
87
  "type": "module",
88
88
  "types": "./dist/arborium.d.ts",
89
- "version": "1.0.5"
89
+ "version": "1.0.8"
90
90
  }