feat(wasm): add Language.loadSync for synchronous loading

This commit is contained in:
Wilco Kruijer 2026-01-11 13:54:33 +01:00
parent 630fa52717
commit c0f5e88c6f
5 changed files with 63 additions and 6 deletions

View file

@ -1,13 +1,37 @@
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
import helper from './helper';
import type { LookaheadIterator, Language } from '../src';
import helper, { type LanguageName } from './helper';
import { LookaheadIterator, Language } from '../src';
import { Parser } from '../src';
import { readFile } from 'fs/promises';
let JavaScript: Language;
let Rust: Language;
let languageURL: (name: LanguageName) => string;
describe('Language', () => {
beforeAll(async () => ({ JavaScript, Rust } = await helper));
beforeAll(async () => ({ JavaScript, Rust, languageURL } = await helper));
describe('.loadSync', () => {
it('loads a language synchronously from a pre-compiled WebAssembly.Module', async () => {
const wasmPath = languageURL('javascript');
const wasmBytes = await readFile(wasmPath);
const wasmModule = await WebAssembly.compile(wasmBytes);
const lang = Language.loadSync(wasmModule);
expect(lang.name).toBe('javascript');
expect(lang.abiVersion).toBe(15);
// Verify the language actually works by parsing a snippet
const parser = new Parser();
parser.setLanguage(lang);
const tree = parser.parse('const x = 1;');
expect(tree).not.toBeNull();
expect(tree!.rootNode.type).toBe('program');
expect(tree!.rootNode.childCount).toBe(1);
expect(tree!.rootNode.firstChild!.type).toBe('lexical_declaration');
parser.delete();
});
});
describe('.name, .version', () => {
it('returns the name and version of the language', () => {