Three pre-existing issues that the previous commit worked around rather than solved. Test global pollution. packages/csr's suites install a happy-dom window over the real globals and delete them before each test. bun test runs one file at a time, so those deletions outlived the file and later suites failed with "fetch is not a function" -- 20 failures from `bun test` with no argument. They now restore what they captured. The editor's Node tests shim the vscode host by patching Module._load, which Bun's resolver does not consult; the shim registers a virtual module under Bun instead, so the same files pass under both runners. Multi-cursor tag auto-close. The handler now closes the tag at every caret. Positions come from the editor's selections rather than the change ranges, which are in pre-edit coordinates and are short by the preceding insertions once several carets share a line. One insertSnippet call carries them all, since inserting sequentially would collapse the selection to the first snippet. Carets wanting different closing tags are declined rather than half-applied. Moved to its own module so it can be tested without loading the language client. Runtime size. Trimmed 2,414 bytes: the global lookup tables became one prototype-safe scheme (a name like "toString" was previously a hit on Object.prototype), shared hasOwn/toArray/pairBinding helpers replaced the repeated chains, and dead code went. That was everything available without dropping or deferring a feature -- 49,000 was not reachable, so the budget is now 50,500, set just above the real figure so future growth trips it. Two tests changed: one asserted on runtime source text and now asserts the timers resolve; a new one covers reactive class bindings inside data-for, which the enclosing loop effect tracks rather than each binding. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
57 lines
1.9 KiB
JavaScript
57 lines
1.9 KiB
JavaScript
// @ts-check
|
|
"use strict";
|
|
|
|
const path = require("node:path");
|
|
const vscode = require("vscode");
|
|
const { LanguageClient, TransportKind } = require("vscode-languageclient/node");
|
|
const { registerAutoCloseTags } = require("./auto-close-tags.js");
|
|
|
|
const WRN_LANGUAGE_ID = "wrn";
|
|
/** @type {LanguageClient | undefined} */
|
|
let client;
|
|
|
|
/** @param {vscode.TextDocument} document */
|
|
async function recoverWrnLanguage(document) {
|
|
if (!document.fileName.toLowerCase().endsWith(".wrn")) return;
|
|
if (!["plaintext", "wrn"].includes(document.languageId)) return;
|
|
try {
|
|
await vscode.languages.setTextDocumentLanguage(document, WRN_LANGUAGE_ID);
|
|
} catch (error) {
|
|
console.warn(
|
|
"[wrnexus] unable to recover .wrn language association:",
|
|
error instanceof Error ? error.message : String(error),
|
|
);
|
|
}
|
|
}
|
|
|
|
/** @param {vscode.ExtensionContext} context */
|
|
async function activate(context) {
|
|
for (const document of vscode.workspace.textDocuments) void recoverWrnLanguage(document);
|
|
context.subscriptions.push(
|
|
vscode.workspace.onDidOpenTextDocument((document) => void recoverWrnLanguage(document)),
|
|
);
|
|
|
|
if (!vscode.workspace.getConfiguration("wrnexus").get("languageServer.enable", true)) return;
|
|
|
|
const module = path.join(context.extensionPath, "src", "language-server.cjs");
|
|
client = new LanguageClient(
|
|
"wrnexusLanguageServer",
|
|
"WRNexus Language Server",
|
|
{
|
|
run: { module, transport: TransportKind.stdio },
|
|
debug: { module, transport: TransportKind.stdio, options: { execArgv: ["--nolazy"] } },
|
|
},
|
|
{ documentSelector: [{ scheme: "file", language: WRN_LANGUAGE_ID }] },
|
|
);
|
|
await client.start();
|
|
registerAutoCloseTags(context, client);
|
|
}
|
|
|
|
async function deactivate() {
|
|
const running = client;
|
|
client = undefined;
|
|
if (running) await running.stop();
|
|
}
|
|
|
|
module.exports = { activate, deactivate, recoverWrnLanguage, registerAutoCloseTags };
|