Improve JSR package metadata

This commit is contained in:
2026-07-10 04:19:00 +09:00
parent 8eac5c5cb4
commit fc1f3e0b25
10 changed files with 213 additions and 19 deletions
+2 -3
View File
@@ -4,9 +4,7 @@
"license": "MIT", "license": "MIT",
"exports": { "exports": {
".": "./src/mod.ts", ".": "./src/mod.ts",
"./format": "./src/format.js", "./format": "./src/format.ts"
"./parser": "./src/decodal-parser.js",
"./terms": "./src/decodal-parser.terms.js"
}, },
"imports": { "imports": {
"@codemirror/language": "npm:@codemirror/language@^6.12.4", "@codemirror/language": "npm:@codemirror/language@^6.12.4",
@@ -18,6 +16,7 @@
"include": [ "include": [
"README.md", "README.md",
"src/mod.ts", "src/mod.ts",
"src/format.ts",
"src/decodal.js", "src/decodal.js",
"src/decodal.d.ts", "src/decodal.d.ts",
"src/decodal.js.d.ts", "src/decodal.js.d.ts",
+84
View File
@@ -0,0 +1,84 @@
/**
* Decodal source formatting helpers for CodeMirror integrations.
*
* The formatter is backed by WebAssembly generated from the internal Rust
* `decodal-language-tools` crate. Call {@link initDecodalFormatter} once before
* using {@link formatDecodal} or {@link formatDecodalCommand}.
*
* @module
*/
import type { EditorView } from 'npm:@codemirror/view@^6.43.6';
import initLanguageTools, { formatSource } from '../wasm/decodal_language_tools.js';
let initialized = false;
/** Successful formatter result. */
export interface FormatSuccess {
/** Indicates that formatting succeeded. */
ok: true;
/** The formatted Decodal source text. */
source: string;
}
/** Failed formatter result. */
export interface FormatFailure {
/** Indicates that formatting failed. */
ok: false;
/** Human-readable formatter error. */
error: string;
}
/** Result returned by {@link formatDecodal}. */
export type FormatResult = FormatSuccess | FormatFailure;
/**
* Initialize the bundled Decodal formatter WebAssembly module.
*
* Bundlers such as Vite should pass the package wasm asset URL explicitly:
*
* ```ts
* import wasmUrl from 'decodal-codemirror/wasm/decodal_language_tools_bg.wasm?url';
* await initDecodalFormatter(wasmUrl);
* ```
*
* @param moduleOrPath - Optional WebAssembly module, bytes, response, URL, or
* request accepted by wasm-bindgen's generated initializer.
*/
export async function initDecodalFormatter(
moduleOrPath?: RequestInfo | URL | Response | BufferSource | WebAssembly.Module,
): Promise<void> {
await initLanguageTools(moduleOrPath);
initialized = true;
}
/**
* Format a complete Decodal source document.
*
* @param source - Source text to format.
* @returns Either formatted source text or an error message.
*/
export function formatDecodal(source: string): FormatResult {
if (!initialized) {
return { ok: false, error: 'Decodal formatter is not initialized' };
}
return JSON.parse(formatSource(source)) as FormatResult;
}
/**
* CodeMirror command that formats the whole document in-place.
*
* @param view - The editor view whose document should be formatted.
* @returns `true` when the document was formatted, otherwise `false`.
*/
export function formatDecodalCommand(view: EditorView): boolean {
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;
}
+21
View File
@@ -1,3 +1,13 @@
/**
* CodeMirror 6 language support for Decodal.
*
* This module exports the Decodal language extension, parser metadata, and the
* bundled highlight style used by the official Decodal playground. Add
* {@link decodal} to a CodeMirror extension set to enable highlighting,
* indentation, and folding for Decodal documents.
*
* @module
*/
import { HighlightStyle, LRLanguage, LanguageSupport, foldNodeProp, indentNodeProp, syntaxHighlighting } from 'npm:@codemirror/language@^6.12.4'; import { HighlightStyle, LRLanguage, LanguageSupport, foldNodeProp, indentNodeProp, syntaxHighlighting } from 'npm:@codemirror/language@^6.12.4';
import { styleTags, tags as t } from 'npm:@lezer/highlight@^1.2.3'; import { styleTags, tags as t } from 'npm:@lezer/highlight@^1.2.3';
import { parser } from './decodal-parser-jsr.js'; import { parser } from './decodal-parser-jsr.js';
@@ -44,6 +54,7 @@ function foldDelimited(open: string, close: string) {
}; };
} }
/** Decodal LR language definition for CodeMirror 6. */
export const decodalLanguage: LRLanguage = LRLanguage.define({ export const decodalLanguage: LRLanguage = LRLanguage.define({
parser: parserWithMetadata, parser: parserWithMetadata,
languageData: { languageData: {
@@ -52,6 +63,7 @@ export const decodalLanguage: LRLanguage = LRLanguage.define({
}, },
}); });
/** Default Decodal highlight style used by the playground. */
export const decodalHighlightStyle: HighlightStyle = HighlightStyle.define([ export const decodalHighlightStyle: HighlightStyle = HighlightStyle.define([
{ tag: t.keyword, color: '#93c5fd', fontWeight: '700' }, { tag: t.keyword, color: '#93c5fd', fontWeight: '700' },
{ tag: t.variableName, color: 'inherit' }, { tag: t.variableName, color: 'inherit' },
@@ -64,10 +76,19 @@ export const decodalHighlightStyle: HighlightStyle = HighlightStyle.define([
{ tag: [t.brace, t.squareBracket, t.paren, t.punctuation], color: '#f9a8d4' }, { tag: [t.brace, t.squareBracket, t.paren, t.punctuation], color: '#f9a8d4' },
]); ]);
/** Options for {@link decodal}. */
export interface DecodalOptions { export interface DecodalOptions {
/** Include the bundled {@link decodalHighlightStyle}. Defaults to `true`. */
highlight?: boolean; highlight?: boolean;
} }
/**
* Create CodeMirror language support for Decodal.
*
* @param options - Optional language support options.
* @returns A CodeMirror extension bundle containing the Decodal language and,
* unless disabled, the default highlight style.
*/
export function decodal(options: DecodalOptions = {}): LanguageSupport { export function decodal(options: DecodalOptions = {}): LanguageSupport {
const { highlight = true } = options; const { highlight = true } = options;
return new LanguageSupport( return new LanguageSupport(
+2 -5
View File
@@ -26,11 +26,8 @@ import init, { evaluateProject } from 'decodal-wasm';
await init(); await init();
const result = evaluateProject(JSON.stringify({ const result = evaluateProject('main.dcdl', JSON.stringify({
entry: 'main.dcdl', 'main.dcdl': 'Server = { port = Int default 8080; };',
files: {
'main.dcdl': 'Server = { port = Int default 8080; };',
},
})); }));
console.log(JSON.parse(result)); console.log(JSON.parse(result));
+3 -2
View File
@@ -1,11 +1,12 @@
{ {
"name": "@hare/decodal-wasm", "name": "@hare/decodal-wasm",
"version": "0.1.2", "version": "0.1.3",
"license": "MIT", "license": "MIT",
"exports": "./decodal_wasm.js", "exports": "./mod.ts",
"publish": { "publish": {
"include": [ "include": [
"README.md", "README.md",
"mod.ts",
"decodal_wasm.js", "decodal_wasm.js",
"decodal_wasm.d.ts", "decodal_wasm.d.ts",
"decodal_wasm_bg.wasm", "decodal_wasm_bg.wasm",
+66
View File
@@ -0,0 +1,66 @@
/**
* Browser and JavaScript runtime bindings for the Decodal evaluator.
*
* This module wraps the wasm-bindgen output generated from the Rust
* `decodal-wasm` crate and exposes stable, documented entrypoints for JSR
* users. The exported evaluator functions return JSON strings.
*
* @module
*/
import initWasm, {
evaluate as evaluateImpl,
evaluateProject as evaluateProjectImpl,
initSync as initSyncImpl,
} from './decodal_wasm.js';
/** Input accepted by the wasm-bindgen initializer. */
export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;
/** Initialized Decodal WebAssembly exports. */
export interface InitOutput {
/** Linear memory exported by the WebAssembly module. */
readonly memory: WebAssembly.Memory;
readonly evaluate: (source: number, len: number) => [number, number, number, number];
readonly evaluateProject: (entry: number, entryLen: number, files: number, filesLen: number) => [number, number, number, number];
}
/**
* Initialize the Decodal WebAssembly runtime asynchronously.
*
* @param moduleOrPath - Optional WebAssembly module, bytes, response, URL, or request.
* @returns The initialized WebAssembly exports.
*/
export default async function initDecodalRuntime(moduleOrPath?: InitInput): Promise<InitOutput> {
return await initWasm(moduleOrPath) as InitOutput;
}
/**
* Initialize the Decodal WebAssembly runtime synchronously.
*
* @param module - Compiled module, bytes, or wasm-bindgen sync initialization input.
* @returns The initialized WebAssembly exports.
*/
export function initSync(module: WebAssembly.Module | BufferSource): InitOutput {
return initSyncImpl(module) as InitOutput;
}
/**
* Evaluate and materialize a single Decodal source string.
*
* @param source - Decodal source text.
* @returns A JSON string containing either `{ ok: true, output }` or `{ ok: false, error }`.
*/
export function evaluate(source: string): string {
return evaluateImpl(source);
}
/**
* Evaluate and materialize a virtual multi-file Decodal project.
*
* @param entry - Entry point file path to materialize.
* @param filesJson - JSON object mapping virtual file paths to source strings.
* @returns A JSON string containing either `{ ok: true, output }` or `{ ok: false, error }`.
*/
export function evaluateProject(entry: string, filesJson: string): string {
return evaluateProjectImpl(entry, filesJson);
}
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "decodal-wasm", "name": "decodal-wasm",
"type": "module", "type": "module",
"description": "WebAssembly wrapper for evaluating Decodal in browser playgrounds.", "description": "WebAssembly wrapper for evaluating Decodal in browser playgrounds.",
"version": "0.1.2", "version": "0.1.3",
"license": "MIT OR Apache-2.0", "license": "MIT OR Apache-2.0",
"repository": { "repository": {
"type": "git", "type": "git",
+1 -1
View File
@@ -41,7 +41,7 @@
} }
}, },
"../../packages/decodal-wasm": { "../../packages/decodal-wasm": {
"version": "0.1.2", "version": "0.1.3",
"license": "MIT OR Apache-2.0" "license": "MIT OR Apache-2.0"
}, },
"node_modules/@astrojs/check": { "node_modules/@astrojs/check": {
@@ -1,4 +1,4 @@
import { writeFileSync } from 'node:fs'; import { readFileSync, writeFileSync } from 'node:fs';
import { resolve } from 'node:path'; import { resolve } from 'node:path';
const packageDir = resolve(import.meta.dirname, '../../../packages/decodal-wasm'); const packageDir = resolve(import.meta.dirname, '../../../packages/decodal-wasm');
@@ -8,6 +8,11 @@ writeFileSync(
'# wasm-pack output is committed for the browser runtime package.\n', '# wasm-pack output is committed for the browser runtime package.\n',
); );
const packageJsonPath = resolve(packageDir, 'package.json');
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
packageJson.version = '0.1.3';
writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n');
writeFileSync( writeFileSync(
resolve(packageDir, 'README.md'), resolve(packageDir, 'README.md'),
`# decodal-wasm `# decodal-wasm
@@ -38,11 +43,8 @@ import init, { evaluateProject } from 'decodal-wasm';
await init(); await init();
const result = evaluateProject(JSON.stringify({ const result = evaluateProject('main.dcdl', JSON.stringify({
entry: 'main.dcdl', 'main.dcdl': 'Server = { port = Int default 8080; };',
files: {
'main.dcdl': 'Server = { port = Int default 8080; };',
},
})); }));
console.log(JSON.parse(result)); console.log(JSON.parse(result));
@@ -51,3 +53,27 @@ console.log(JSON.parse(result));
The exported functions return JSON strings so callers can handle diagnostics and successful results without depending on Rust data structures. The exported functions return JSON strings so callers can handle diagnostics and successful results without depending on Rust data structures.
`, `,
); );
writeFileSync(
resolve(packageDir, 'jsr.json'),
JSON.stringify(
{
name: '@hare/decodal-wasm',
version: '0.1.3',
license: 'MIT',
exports: './mod.ts',
publish: {
include: [
'README.md',
'mod.ts',
'decodal_wasm.js',
'decodal_wasm.d.ts',
'decodal_wasm_bg.wasm',
'package.json',
],
},
},
null,
2,
) + '\n',
);
+1 -1
View File
@@ -32,7 +32,7 @@ Production = Server & {
<strong>crates.io/crates/decodal</strong> <strong>crates.io/crates/decodal</strong>
</a> </a>
<ul class="package-list"> <ul class="package-list">
<li>decodal-wasm on <a href="https://jsr.io/@hare/decodal-wasm@0.1.2">jsr</a> / <a href="https://www.npmjs.com/package/decodal-wasm">npm</a></li> <li>decodal-wasm on <a href="https://jsr.io/@hare/decodal-wasm@0.1.3">jsr</a> / <a href="https://www.npmjs.com/package/decodal-wasm">npm</a></li>
<li>decodal-codemirror on <a href="https://jsr.io/@hare/decodal-codemirror@0.1.4">jsr</a> / <a href="https://www.npmjs.com/package/decodal-codemirror">npm</a></li> <li>decodal-codemirror on <a href="https://jsr.io/@hare/decodal-codemirror@0.1.4">jsr</a> / <a href="https://www.npmjs.com/package/decodal-codemirror">npm</a></li>
</ul> </ul>
</section> </section>