From 8eac5c5cb4543d7be8353b3f8d45b8c86554d44b Mon Sep 17 00:00:00 2001 From: Hare Date: Thu, 9 Jul 2026 21:25:04 +0900 Subject: [PATCH] Bundle language tools with CodeMirror package --- doc/manual/souce/components.md | 17 ++-- doc/manual/souce/development.md | 29 ++----- packages/decodal-codemirror/README.md | 24 +++++- packages/decodal-codemirror/jsr.json | 17 +++- packages/decodal-codemirror/package-lock.json | 6 +- packages/decodal-codemirror/package.json | 17 +++- packages/decodal-codemirror/src/format.d.ts | 17 ++++ packages/decodal-codemirror/src/format.js | 28 +++++++ .../decodal-codemirror/src/format.js.d.ts | 17 ++++ packages/decodal-codemirror/wasm/.gitignore | 1 + .../wasm}/decodal_language_tools.d.ts | 0 .../wasm}/decodal_language_tools.js | 0 .../wasm}/decodal_language_tools_bg.wasm | Bin .../wasm}/decodal_language_tools_bg.wasm.d.ts | 0 packages/decodal-language-tools/.gitignore | 1 - packages/decodal-language-tools/README.md | 39 --------- packages/decodal-language-tools/jsr.json | 15 ---- packages/decodal-language-tools/package.json | 27 ------- site/decodal-site/package-lock.json | 13 +-- site/decodal-site/package.json | 3 +- .../scripts/prepare-codemirror-wasm.mjs | 12 +++ .../prepare-language-tools-package.mjs | 76 ------------------ site/decodal-site/src/pages/index.astro | 7 +- site/decodal-site/src/scripts/playground.js | 8 +- 24 files changed, 155 insertions(+), 219 deletions(-) create mode 100644 packages/decodal-codemirror/src/format.d.ts create mode 100644 packages/decodal-codemirror/src/format.js create mode 100644 packages/decodal-codemirror/src/format.js.d.ts create mode 100644 packages/decodal-codemirror/wasm/.gitignore rename packages/{decodal-language-tools => decodal-codemirror/wasm}/decodal_language_tools.d.ts (100%) rename packages/{decodal-language-tools => decodal-codemirror/wasm}/decodal_language_tools.js (100%) rename packages/{decodal-language-tools => decodal-codemirror/wasm}/decodal_language_tools_bg.wasm (100%) rename packages/{decodal-language-tools => decodal-codemirror/wasm}/decodal_language_tools_bg.wasm.d.ts (100%) delete mode 100644 packages/decodal-language-tools/.gitignore delete mode 100644 packages/decodal-language-tools/README.md delete mode 100644 packages/decodal-language-tools/jsr.json delete mode 100644 packages/decodal-language-tools/package.json create mode 100644 site/decodal-site/scripts/prepare-codemirror-wasm.mjs delete mode 100644 site/decodal-site/scripts/prepare-language-tools-package.mjs diff --git a/doc/manual/souce/components.md b/doc/manual/souce/components.md index 92493c8..82a5670 100644 --- a/doc/manual/souce/components.md +++ b/doc/manual/souce/components.md @@ -41,26 +41,23 @@ The WebAssembly package is for execution, not syntax highlighting. ## Language tools -Source-level tooling lives in the Rust language tools crate and its generated JavaScript/WebAssembly package. +Source-level tooling lives in the Rust language tools crate. This component is responsible for operations that must preserve source text details such as comments and whitespace. +It is an internal crate used by the future Rust LSP and by the CodeMirror package's bundled formatter WebAssembly. Important paths: ```text crates/decodal-language-tools/ -packages/decodal-language-tools/ ``` -The npm package is `decodal-language-tools`. -The JSR package is `@hare/decodal-language-tools`. - -The current language tools package exposes the formatter. +The current language tools crate exposes the formatter. Future LSP functionality should build on the same source-level tooling layer rather than on the runtime core. ## Web editor components The Web playground editor uses CodeMirror 6 with a generated Lezer parser. -This is the source of syntax highlighting, folding, indentation, and editor syntax tree behavior in the browser UI. +This is the source of syntax highlighting, folding, indentation, editor syntax tree behavior, and the browser formatter command in the browser UI. Important paths: @@ -69,6 +66,8 @@ editors/lezer-decodal/decodal.grammar packages/decodal-codemirror/src/decodal.js packages/decodal-codemirror/src/decodal-parser.js packages/decodal-codemirror/src/decodal-parser.terms.js +packages/decodal-codemirror/src/format.js +packages/decodal-codemirror/wasm/ ``` The npm package is `decodal-codemirror`. @@ -112,8 +111,8 @@ Consumers that need syntax information should use the component that matches the - Rust execution and embedding: `decodal` - Browser execution: `decodal-wasm` -- Source formatting and future LSP tooling: `decodal-language-tools` -- Web editor syntax: Lezer / CodeMirror +- Web formatting and editor syntax: Lezer / CodeMirror +- Rust LSP internals: `decodal-language-tools` - General editor syntax: Tree-sitter This avoids having a separate token stream API whose behavior would have to be kept compatible with both runtime parsing and editor grammars. diff --git a/doc/manual/souce/development.md b/doc/manual/souce/development.md index 998d9bd..a34e392 100644 --- a/doc/manual/souce/development.md +++ b/doc/manual/souce/development.md @@ -25,7 +25,8 @@ cargo run -q -p decodal-cli --features regex -- examples/regex/main.dcdl The primary crates.io package is `decodal`, which contains the embeddable library. `decodal-derive` provides optional derive macros for Rust struct integration and is published only when the derive crate changes. Workspace support crates such as `decodal-cli`, the Rust source crate `decodal-wasm`, and `decodal-language-tools` are not published to crates.io. -The generated WebAssembly packages under `packages/decodal-wasm/` and `packages/decodal-language-tools/` are published to npm and JSR. +The generated WebAssembly package under `packages/decodal-wasm/` is published to npm and JSR. +The CodeMirror package bundles the generated formatter WebAssembly from `decodal-language-tools`. The project is dual licensed as `MIT OR Apache-2.0`. ```sh @@ -58,7 +59,7 @@ site/decodal-site/ ``` The site imports Markdown files from `doc/manual/souce/` and renders them as mdBook-style pages. -The playground loads `decodal-wasm` for evaluation and `decodal-language-tools` for source formatting. +The playground loads `decodal-wasm` for evaluation and `decodal-codemirror` for editor features and source formatting. Important files: @@ -74,8 +75,8 @@ packages/decodal-codemirror/src/decodal.js packages/decodal-codemirror/src/decodal-parser.js packages/decodal-wasm/decodal_wasm.js packages/decodal-wasm/decodal_wasm_bg.wasm -packages/decodal-language-tools/decodal_language_tools.js -packages/decodal-language-tools/decodal_language_tools_bg.wasm +packages/decodal-codemirror/wasm/decodal_language_tools.js +packages/decodal-codemirror/wasm/decodal_language_tools_bg.wasm crates/decodal-wasm/src/lib.rs crates/decodal-language-tools/src/lib.rs ``` @@ -91,7 +92,7 @@ npm run build `npm run build:wasm` builds both generated WebAssembly packages. `npm run build:runtime` writes generated runtime files into `packages/decodal-wasm/`. -`npm run build:tools` writes generated language tools files into `packages/decodal-language-tools/`. +`npm run build:tools` writes generated language tools files into `packages/decodal-codemirror/wasm/`. These generated files are committed so the site can be built without requiring every consumer to regenerate the wasm packages first. @@ -114,24 +115,6 @@ The npm package name is `decodal-wasm`. The JSR package name is `@hare/decodal-wasm`. JSR currently expects a single SPDX license identifier in `jsr.json`; the WebAssembly package metadata uses `MIT` while the Rust workspace remains dual licensed as `MIT OR Apache-2.0`. -Publish the generated language tools package from its package directory: - -```sh -cd packages/decodal-language-tools -npm publish -npx jsr publish -``` - -Run dry-runs first when preparing a release: - -```sh -npm pack --dry-run -npx jsr publish --dry-run -``` - -The npm package name is `decodal-language-tools`. -The JSR package name is `@hare/decodal-language-tools`. - The playground editor uses the `decodal-codemirror` package with the generated Lezer parser in `packages/decodal-codemirror/src/decodal-parser.js`. The canonical grammar is documented in `doc/manual/souce/language/grammar.md`; regenerate the Lezer parser when that grammar or `editors/lezer-decodal/decodal.grammar` changes. diff --git a/packages/decodal-codemirror/README.md b/packages/decodal-codemirror/README.md index 9442b28..8a610f4 100644 --- a/packages/decodal-codemirror/README.md +++ b/packages/decodal-codemirror/README.md @@ -2,8 +2,8 @@ CodeMirror 6 language support for Decodal. -This package provides the Lezer parser metadata, highlighting tags, indentation rules, and block folding used by the Decodal Web playground. -It does not include the Decodal runtime or WebAssembly evaluator. +This package provides the Lezer parser metadata, highlighting tags, indentation rules, block folding, and formatter command used by the Decodal Web playground. +It does not include the Decodal runtime evaluator. Use `decodal-wasm` when you want to evaluate Decodal in a browser. ## Install @@ -52,3 +52,23 @@ decodal({ highlight: false }) ``` Use this when you want the language support without the bundled highlight style. + +## Formatting + +The formatter is exposed as a separate subpath so plain syntax highlighting does not force callers to initialize WebAssembly. + +```js +import { + formatDecodal, + formatDecodalCommand, + initDecodalFormatter, +} from 'decodal-codemirror/format'; +import formatterWasm from 'decodal-codemirror/wasm/decodal_language_tools_bg.wasm?url'; + +await initDecodalFormatter(formatterWasm); + +const result = formatDecodal('Server={port=Int default 8080;};'); +if (result.ok) console.log(result.source); + +formatDecodalCommand(view); +``` diff --git a/packages/decodal-codemirror/jsr.json b/packages/decodal-codemirror/jsr.json index d865556..b278490 100644 --- a/packages/decodal-codemirror/jsr.json +++ b/packages/decodal-codemirror/jsr.json @@ -1,10 +1,16 @@ { "name": "@hare/decodal-codemirror", - "version": "0.1.3", + "version": "0.1.4", "license": "MIT", - "exports": "./src/mod.ts", + "exports": { + ".": "./src/mod.ts", + "./format": "./src/format.js", + "./parser": "./src/decodal-parser.js", + "./terms": "./src/decodal-parser.terms.js" + }, "imports": { "@codemirror/language": "npm:@codemirror/language@^6.12.4", + "@codemirror/view": "npm:@codemirror/view@^6.43.6", "@lezer/highlight": "npm:@lezer/highlight@^1.2.3", "@lezer/lr": "npm:@lezer/lr@^1.4.10" }, @@ -15,9 +21,16 @@ "src/decodal.js", "src/decodal.d.ts", "src/decodal.js.d.ts", + "src/format.js", + "src/format.d.ts", + "src/format.js.d.ts", "src/decodal-parser-jsr.js", "src/decodal-parser.js", "src/decodal-parser.terms.js", + "wasm/decodal_language_tools.js", + "wasm/decodal_language_tools.d.ts", + "wasm/decodal_language_tools_bg.wasm", + "wasm/decodal_language_tools_bg.wasm.d.ts", "package.json" ] } diff --git a/packages/decodal-codemirror/package-lock.json b/packages/decodal-codemirror/package-lock.json index 3f4a2e3..5c11976 100644 --- a/packages/decodal-codemirror/package-lock.json +++ b/packages/decodal-codemirror/package-lock.json @@ -1,20 +1,22 @@ { "name": "decodal-codemirror", - "version": "0.1.3", + "version": "0.1.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "decodal-codemirror", - "version": "0.1.3", + "version": "0.1.4", "license": "MIT OR Apache-2.0", "devDependencies": { "@codemirror/language": "^6.12.4", + "@codemirror/view": "^6.43.6", "@lezer/highlight": "^1.2.3", "@lezer/lr": "^1.4.10" }, "peerDependencies": { "@codemirror/language": "^6.12.4", + "@codemirror/view": "^6.43.6", "@lezer/highlight": "^1.2.3", "@lezer/lr": "^1.4.10" } diff --git a/packages/decodal-codemirror/package.json b/packages/decodal-codemirror/package.json index ce3f1b1..8ba712b 100644 --- a/packages/decodal-codemirror/package.json +++ b/packages/decodal-codemirror/package.json @@ -1,6 +1,6 @@ { "name": "decodal-codemirror", - "version": "0.1.3", + "version": "0.1.4", "description": "CodeMirror 6 language support for Decodal.", "type": "module", "license": "MIT OR Apache-2.0", @@ -14,13 +14,22 @@ "types": "./src/decodal.d.ts", "import": "./src/decodal.js" }, + "./format": { + "types": "./src/format.d.ts", + "import": "./src/format.js" + }, "./parser": "./src/decodal-parser.js", - "./terms": "./src/decodal-parser.terms.js" + "./terms": "./src/decodal-parser.terms.js", + "./wasm/decodal_language_tools_bg.wasm": "./wasm/decodal_language_tools_bg.wasm" }, "types": "./src/decodal.d.ts", "files": [ "README.md", - "src/" + "src/", + "wasm/decodal_language_tools.js", + "wasm/decodal_language_tools.d.ts", + "wasm/decodal_language_tools_bg.wasm", + "wasm/decodal_language_tools_bg.wasm.d.ts" ], "keywords": [ "decodal", @@ -29,11 +38,13 @@ ], "peerDependencies": { "@codemirror/language": "^6.12.4", + "@codemirror/view": "^6.43.6", "@lezer/highlight": "^1.2.3", "@lezer/lr": "^1.4.10" }, "devDependencies": { "@codemirror/language": "^6.12.4", + "@codemirror/view": "^6.43.6", "@lezer/highlight": "^1.2.3", "@lezer/lr": "^1.4.10" } diff --git a/packages/decodal-codemirror/src/format.d.ts b/packages/decodal-codemirror/src/format.d.ts new file mode 100644 index 0000000..e4920ee --- /dev/null +++ b/packages/decodal-codemirror/src/format.d.ts @@ -0,0 +1,17 @@ +import type { EditorView } from '@codemirror/view'; + +export interface FormatSuccess { + ok: true; + source: string; +} + +export interface FormatFailure { + ok: false; + error: string; +} + +export type FormatResult = FormatSuccess | FormatFailure; + +export declare function initDecodalFormatter(moduleOrPath?: RequestInfo | URL | Response | BufferSource | WebAssembly.Module): Promise; +export declare function formatDecodal(source: string): FormatResult; +export declare function formatDecodalCommand(view: EditorView): boolean; diff --git a/packages/decodal-codemirror/src/format.js b/packages/decodal-codemirror/src/format.js new file mode 100644 index 0000000..86bb72b --- /dev/null +++ b/packages/decodal-codemirror/src/format.js @@ -0,0 +1,28 @@ +import initLanguageTools, { formatSource } from '../wasm/decodal_language_tools.js'; + +let initialized = false; + +export async function initDecodalFormatter(moduleOrPath) { + await initLanguageTools(moduleOrPath); + initialized = true; +} + +export function formatDecodal(source) { + if (!initialized) { + return { ok: false, error: 'Decodal formatter is not initialized' }; + } + return JSON.parse(formatSource(source)); +} + +export function formatDecodalCommand(view) { + const result = formatDecodal(view.state.doc.toString()); + if (!result.ok) return false; + view.dispatch({ + changes: { + from: 0, + to: view.state.doc.length, + insert: result.source, + }, + }); + return true; +} diff --git a/packages/decodal-codemirror/src/format.js.d.ts b/packages/decodal-codemirror/src/format.js.d.ts new file mode 100644 index 0000000..e4920ee --- /dev/null +++ b/packages/decodal-codemirror/src/format.js.d.ts @@ -0,0 +1,17 @@ +import type { EditorView } from '@codemirror/view'; + +export interface FormatSuccess { + ok: true; + source: string; +} + +export interface FormatFailure { + ok: false; + error: string; +} + +export type FormatResult = FormatSuccess | FormatFailure; + +export declare function initDecodalFormatter(moduleOrPath?: RequestInfo | URL | Response | BufferSource | WebAssembly.Module): Promise; +export declare function formatDecodal(source: string): FormatResult; +export declare function formatDecodalCommand(view: EditorView): boolean; diff --git a/packages/decodal-codemirror/wasm/.gitignore b/packages/decodal-codemirror/wasm/.gitignore new file mode 100644 index 0000000..c45b1b0 --- /dev/null +++ b/packages/decodal-codemirror/wasm/.gitignore @@ -0,0 +1 @@ +# wasm-pack output is committed as part of decodal-codemirror. diff --git a/packages/decodal-language-tools/decodal_language_tools.d.ts b/packages/decodal-codemirror/wasm/decodal_language_tools.d.ts similarity index 100% rename from packages/decodal-language-tools/decodal_language_tools.d.ts rename to packages/decodal-codemirror/wasm/decodal_language_tools.d.ts diff --git a/packages/decodal-language-tools/decodal_language_tools.js b/packages/decodal-codemirror/wasm/decodal_language_tools.js similarity index 100% rename from packages/decodal-language-tools/decodal_language_tools.js rename to packages/decodal-codemirror/wasm/decodal_language_tools.js diff --git a/packages/decodal-language-tools/decodal_language_tools_bg.wasm b/packages/decodal-codemirror/wasm/decodal_language_tools_bg.wasm similarity index 100% rename from packages/decodal-language-tools/decodal_language_tools_bg.wasm rename to packages/decodal-codemirror/wasm/decodal_language_tools_bg.wasm diff --git a/packages/decodal-language-tools/decodal_language_tools_bg.wasm.d.ts b/packages/decodal-codemirror/wasm/decodal_language_tools_bg.wasm.d.ts similarity index 100% rename from packages/decodal-language-tools/decodal_language_tools_bg.wasm.d.ts rename to packages/decodal-codemirror/wasm/decodal_language_tools_bg.wasm.d.ts diff --git a/packages/decodal-language-tools/.gitignore b/packages/decodal-language-tools/.gitignore deleted file mode 100644 index 4b2f020..0000000 --- a/packages/decodal-language-tools/.gitignore +++ /dev/null @@ -1 +0,0 @@ -# wasm-pack output is committed for the browser language tools package. diff --git a/packages/decodal-language-tools/README.md b/packages/decodal-language-tools/README.md deleted file mode 100644 index edb0e34..0000000 --- a/packages/decodal-language-tools/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# decodal-language-tools - -Source-level language tooling for Decodal. - -This package is generated from the Rust crate in `crates/decodal-language-tools` with `wasm-pack`. -It currently exposes a comment-preserving formatter that is shared by the official playground and future editor/LSP tooling. - -Use `decodal-codemirror` separately when you need CodeMirror 6 language support. -Use `decodal-wasm` separately when you need to evaluate Decodal in a browser. - -## Install - -```sh -npm install decodal-language-tools -``` - -JSR: - -```sh -deno add jsr:@hare/decodal-language-tools -``` - -## Usage - -```js -import init, { formatSource } from 'decodal-language-tools'; - -await init(); - -const result = JSON.parse(formatSource('Server={# host\nhost=String default "localhost";};')); - -if (result.ok) { - console.log(result.source); -} else { - console.error(result.error); -} -``` - -The exported functions return JSON strings so callers can handle diagnostics without depending on Rust data structures. diff --git a/packages/decodal-language-tools/jsr.json b/packages/decodal-language-tools/jsr.json deleted file mode 100644 index bc89ddf..0000000 --- a/packages/decodal-language-tools/jsr.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "@hare/decodal-language-tools", - "version": "0.1.2", - "license": "MIT", - "exports": "./decodal_language_tools.js", - "publish": { - "include": [ - "README.md", - "decodal_language_tools.js", - "decodal_language_tools.d.ts", - "decodal_language_tools_bg.wasm", - "package.json" - ] - } -} diff --git a/packages/decodal-language-tools/package.json b/packages/decodal-language-tools/package.json deleted file mode 100644 index 1711d5d..0000000 --- a/packages/decodal-language-tools/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "decodal-language-tools", - "type": "module", - "description": "Source-level language tooling for Decodal.", - "version": "0.1.2", - "license": "MIT OR Apache-2.0", - "repository": { - "type": "git", - "url": "https://gitea.hareworks.net/Hare/Decodal" - }, - "files": [ - "decodal_language_tools_bg.wasm", - "decodal_language_tools.js", - "decodal_language_tools.d.ts" - ], - "main": "decodal_language_tools.js", - "types": "decodal_language_tools.d.ts", - "sideEffects": [ - "./snippets/*" - ], - "keywords": [ - "decodal", - "formatter", - "lsp", - "tree-sitter" - ] -} diff --git a/site/decodal-site/package-lock.json b/site/decodal-site/package-lock.json index 0be04dd..1ea6c40 100644 --- a/site/decodal-site/package-lock.json +++ b/site/decodal-site/package-lock.json @@ -16,7 +16,6 @@ "astro": "^4.16.18", "codemirror": "^6.0.2", "decodal-codemirror": "file:../../packages/decodal-codemirror", - "decodal-language-tools": "file:../../packages/decodal-language-tools", "decodal-wasm": "file:../../packages/decodal-wasm", "marked": "^12.0.2" }, @@ -26,23 +25,21 @@ } }, "../../packages/decodal-codemirror": { - "version": "0.1.3", + "version": "0.1.4", "license": "MIT OR Apache-2.0", "devDependencies": { "@codemirror/language": "^6.12.4", + "@codemirror/view": "^6.43.6", "@lezer/highlight": "^1.2.3", "@lezer/lr": "^1.4.10" }, "peerDependencies": { "@codemirror/language": "^6.12.4", + "@codemirror/view": "^6.43.6", "@lezer/highlight": "^1.2.3", "@lezer/lr": "^1.4.10" } }, - "../../packages/decodal-language-tools": { - "version": "0.1.2", - "license": "MIT OR Apache-2.0" - }, "../../packages/decodal-wasm": { "version": "0.1.2", "license": "MIT OR Apache-2.0" @@ -3265,10 +3262,6 @@ "resolved": "../../packages/decodal-codemirror", "link": true }, - "node_modules/decodal-language-tools": { - "resolved": "../../packages/decodal-language-tools", - "link": true - }, "node_modules/decodal-wasm": { "resolved": "../../packages/decodal-wasm", "link": true diff --git a/site/decodal-site/package.json b/site/decodal-site/package.json index 7acfbea..88ea20d 100644 --- a/site/decodal-site/package.json +++ b/site/decodal-site/package.json @@ -8,7 +8,7 @@ "build": "astro build", "preview": "astro preview --host 0.0.0.0", "build:runtime": "wasm-pack build ../../crates/decodal-wasm --target web --out-dir ../../packages/decodal-wasm --release && node scripts/prepare-wasm-package.mjs", - "build:tools": "wasm-pack build ../../crates/decodal-language-tools --target web --out-dir ../../packages/decodal-language-tools --release && node scripts/prepare-language-tools-package.mjs", + "build:tools": "wasm-pack build ../../crates/decodal-language-tools --target web --out-dir ../../packages/decodal-codemirror/wasm --release && node scripts/prepare-codemirror-wasm.mjs", "build:wasm": "npm run build:runtime && npm run build:tools", "build:packages": "npm run build:wasm", "deploy": "npm run build && node scripts/deploy-pages.mjs", @@ -23,7 +23,6 @@ "astro": "^4.16.18", "codemirror": "^6.0.2", "decodal-codemirror": "file:../../packages/decodal-codemirror", - "decodal-language-tools": "file:../../packages/decodal-language-tools", "decodal-wasm": "file:../../packages/decodal-wasm", "marked": "^12.0.2" }, diff --git a/site/decodal-site/scripts/prepare-codemirror-wasm.mjs b/site/decodal-site/scripts/prepare-codemirror-wasm.mjs new file mode 100644 index 0000000..df09ad0 --- /dev/null +++ b/site/decodal-site/scripts/prepare-codemirror-wasm.mjs @@ -0,0 +1,12 @@ +import { rmSync, writeFileSync } from 'node:fs'; +import { resolve } from 'node:path'; + +const wasmDir = resolve(import.meta.dirname, '../../../packages/decodal-codemirror/wasm'); + +rmSync(resolve(wasmDir, 'README.md'), { force: true }); +rmSync(resolve(wasmDir, 'package.json'), { force: true }); + +writeFileSync( + resolve(wasmDir, '.gitignore'), + '# wasm-pack output is committed as part of decodal-codemirror.\n', +); diff --git a/site/decodal-site/scripts/prepare-language-tools-package.mjs b/site/decodal-site/scripts/prepare-language-tools-package.mjs deleted file mode 100644 index 2ebceb1..0000000 --- a/site/decodal-site/scripts/prepare-language-tools-package.mjs +++ /dev/null @@ -1,76 +0,0 @@ -import { writeFileSync } from 'node:fs'; -import { resolve } from 'node:path'; - -const packageDir = resolve(import.meta.dirname, '../../../packages/decodal-language-tools'); - -writeFileSync( - resolve(packageDir, '.gitignore'), - '# wasm-pack output is committed for the browser language tools package.\n', -); - -writeFileSync( - resolve(packageDir, 'README.md'), - `# decodal-language-tools - -Source-level language tooling for Decodal. - -This package is generated from the Rust crate in \`crates/decodal-language-tools\` with \`wasm-pack\`. -It currently exposes a comment-preserving formatter that is shared by the official playground and future editor/LSP tooling. - -Use \`decodal-codemirror\` separately when you need CodeMirror 6 language support. -Use \`decodal-wasm\` separately when you need to evaluate Decodal in a browser. - -## Install - -\`\`\`sh -npm install decodal-language-tools -\`\`\` - -JSR: - -\`\`\`sh -deno add jsr:@hare/decodal-language-tools -\`\`\` - -## Usage - -\`\`\`js -import init, { formatSource } from 'decodal-language-tools'; - -await init(); - -const result = JSON.parse(formatSource('Server={# host\\nhost=String default "localhost";};')); - -if (result.ok) { - console.log(result.source); -} else { - console.error(result.error); -} -\`\`\` - -The exported functions return JSON strings so callers can handle diagnostics without depending on Rust data structures. -`, -); - -writeFileSync( - resolve(packageDir, 'jsr.json'), - JSON.stringify( - { - name: '@hare/decodal-language-tools', - version: '0.1.2', - license: 'MIT', - exports: './decodal_language_tools.js', - publish: { - include: [ - 'README.md', - 'decodal_language_tools.js', - 'decodal_language_tools.d.ts', - 'decodal_language_tools_bg.wasm', - 'package.json', - ], - }, - }, - null, - 2, - ) + '\n', -); diff --git a/site/decodal-site/src/pages/index.astro b/site/decodal-site/src/pages/index.astro index ff94456..e8d6d1d 100644 --- a/site/decodal-site/src/pages/index.astro +++ b/site/decodal-site/src/pages/index.astro @@ -33,8 +33,7 @@ Production = Server & {
  • decodal-wasm on jsr / npm
  • -
  • decodal-language-tools on jsr / npm
  • -
  • decodal-codemirror on jsr / npm
  • +
  • decodal-codemirror on jsr / npm
@@ -49,8 +48,8 @@ Production = Server & {

Where it runs

- Use the Rust crate for runtime embedding, the WASM package in browsers, language-tools for formatting, - CodeMirror/Lezer for the Web editor, and Tree-sitter for general editor integration. + Use the Rust crate for runtime embedding, the WASM package in browsers, CodeMirror/Lezer for Web editing + and formatting, and Tree-sitter for general editor integration.

diff --git a/site/decodal-site/src/scripts/playground.js b/site/decodal-site/src/scripts/playground.js index c606c49..7beebab 100644 --- a/site/decodal-site/src/scripts/playground.js +++ b/site/decodal-site/src/scripts/playground.js @@ -1,10 +1,10 @@ import initRuntime, { evaluateProject } from 'decodal-wasm'; import runtimeWasmUrl from 'decodal-wasm/decodal_wasm_bg.wasm?url'; -import initTools, { formatSource } from 'decodal-language-tools'; -import toolsWasmUrl from 'decodal-language-tools/decodal_language_tools_bg.wasm?url'; import { EditorView, basicSetup } from 'codemirror'; import { keymap } from '@codemirror/view'; import { decodal } from 'decodal-codemirror'; +import { formatDecodal, initDecodalFormatter } from 'decodal-codemirror/format'; +import toolsWasmUrl from 'decodal-codemirror/wasm/decodal_language_tools_bg.wasm?url'; import { playgroundExamples } from './playground-examples.js'; const STORAGE_KEY = 'decodal-playground-project-v2'; @@ -221,7 +221,7 @@ function execute() { } function formatActiveFile() { - const result = JSON.parse(formatSource(getEditorText())); + const result = formatDecodal(getEditorText()); if (!result.ok) { output.textContent = result.error; output.classList.add('error'); @@ -285,7 +285,7 @@ function compareNodes(a, b) { } try { - await Promise.all([initRuntime(runtimeWasmUrl), initTools(toolsWasmUrl)]); + await Promise.all([initRuntime(runtimeWasmUrl), initDecodalFormatter(toolsWasmUrl)]); run.disabled = false; formatButton.disabled = false; status.textContent = '';