tenseleyflow/dlm-vsc / cec155b

Browse files

Add thorough extension tests: activation, commands, config, edge cases

Authored by mfwolffe <wolffemf@dukes.jmu.edu>
SHA
cec155b9cb7e8d22d5851fd51707101f9d5769c3
Parents
b1d46a6
Tree
bf9f0d1

12 changed files

StatusFile+-
A out-test/runTest.js 59 0
A out-test/runTest.js.map 1 0
A out-test/suite/extension.test.js 217 0
A out-test/suite/extension.test.js.map 1 0
A out-test/suite/index.js 61 0
A out-test/suite/index.js.map 1 0
M package-lock.json 1300 27
M package.json 42 10
A test/runTest.ts 25 0
A test/suite/extension.test.ts 211 0
A test/suite/index.ts 24 0
A test/tsconfig.json 17 0
out-test/runTest.jsadded
@@ -0,0 +1,59 @@
1
+"use strict";
2
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+    if (k2 === undefined) k2 = k;
4
+    var desc = Object.getOwnPropertyDescriptor(m, k);
5
+    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+      desc = { enumerable: true, get: function() { return m[k]; } };
7
+    }
8
+    Object.defineProperty(o, k2, desc);
9
+}) : (function(o, m, k, k2) {
10
+    if (k2 === undefined) k2 = k;
11
+    o[k2] = m[k];
12
+}));
13
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+}) : function(o, v) {
16
+    o["default"] = v;
17
+});
18
+var __importStar = (this && this.__importStar) || (function () {
19
+    var ownKeys = function(o) {
20
+        ownKeys = Object.getOwnPropertyNames || function (o) {
21
+            var ar = [];
22
+            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+            return ar;
24
+        };
25
+        return ownKeys(o);
26
+    };
27
+    return function (mod) {
28
+        if (mod && mod.__esModule) return mod;
29
+        var result = {};
30
+        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+        __setModuleDefault(result, mod);
32
+        return result;
33
+    };
34
+})();
35
+Object.defineProperty(exports, "__esModule", { value: true });
36
+const path = __importStar(require("path"));
37
+const test_electron_1 = require("@vscode/test-electron");
38
+async function main() {
39
+    try {
40
+        const extensionDevelopmentPath = path.resolve(__dirname, "../../");
41
+        const extensionTestsPath = path.resolve(__dirname, "./suite/index");
42
+        const testWorkspace = path.resolve(__dirname, "./fixtures");
43
+        await (0, test_electron_1.runTests)({
44
+            extensionDevelopmentPath,
45
+            extensionTestsPath,
46
+            launchArgs: [
47
+                testWorkspace,
48
+                "--disable-extensions",
49
+                "--disable-gpu",
50
+            ],
51
+        });
52
+    }
53
+    catch (err) {
54
+        console.error("Failed to run tests:", err);
55
+        process.exit(1);
56
+    }
57
+}
58
+main();
59
+//# sourceMappingURL=runTest.js.map
out-test/runTest.js.mapadded
@@ -0,0 +1,1 @@
1
+{"version":3,"file":"runTest.js","sourceRoot":"","sources":["../test/runTest.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAC7B,yDAAiD;AAEjD,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,wBAAwB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACnE,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QACpE,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAE5D,MAAM,IAAA,wBAAQ,EAAC;YACb,wBAAwB;YACxB,kBAAkB;YAClB,UAAU,EAAE;gBACV,aAAa;gBACb,sBAAsB;gBACtB,eAAe;aAChB;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
out-test/suite/extension.test.jsadded
@@ -0,0 +1,217 @@
1
+"use strict";
2
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+    if (k2 === undefined) k2 = k;
4
+    var desc = Object.getOwnPropertyDescriptor(m, k);
5
+    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+      desc = { enumerable: true, get: function() { return m[k]; } };
7
+    }
8
+    Object.defineProperty(o, k2, desc);
9
+}) : (function(o, m, k, k2) {
10
+    if (k2 === undefined) k2 = k;
11
+    o[k2] = m[k];
12
+}));
13
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+}) : function(o, v) {
16
+    o["default"] = v;
17
+});
18
+var __importStar = (this && this.__importStar) || (function () {
19
+    var ownKeys = function(o) {
20
+        ownKeys = Object.getOwnPropertyNames || function (o) {
21
+            var ar = [];
22
+            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+            return ar;
24
+        };
25
+        return ownKeys(o);
26
+    };
27
+    return function (mod) {
28
+        if (mod && mod.__esModule) return mod;
29
+        var result = {};
30
+        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+        __setModuleDefault(result, mod);
32
+        return result;
33
+    };
34
+})();
35
+Object.defineProperty(exports, "__esModule", { value: true });
36
+const assert = __importStar(require("assert"));
37
+const vscode = __importStar(require("vscode"));
38
+const path = __importStar(require("path"));
39
+const FIXTURE_DIR = path.resolve(__dirname, "../../test/fixtures");
40
+const SAMPLE_DLM = path.join(FIXTURE_DIR, "sample.dlm");
41
+suite("Extension Activation", () => {
42
+    test("extension is present in the registry", () => {
43
+        const ext = vscode.extensions.getExtension("tenseleyFlow.dlm-vsc");
44
+        // In dev mode the publisher may not match; check by scanning all extensions
45
+        const all = vscode.extensions.all.map((e) => e.id);
46
+        // The extension ID in dev is just the package name without publisher
47
+        assert.ok(all.some((id) => id.includes("dlm-vsc")), `dlm-vsc not found in extensions: ${all.join(", ")}`);
48
+    });
49
+    test("dlm language is registered", () => {
50
+        // Opening a .dlm file should associate with our language
51
+        const langs = vscode.extensions.all
52
+            .flatMap((e) => {
53
+            const langs = e.packageJSON?.contributes?.languages;
54
+            return Array.isArray(langs) ? langs : [];
55
+        })
56
+            .filter((l) => l.id === "dlm");
57
+        assert.ok(langs.length > 0, "dlm language not registered by any extension");
58
+    });
59
+    test("extension activates when opening a .dlm file", async () => {
60
+        const doc = await vscode.workspace.openTextDocument(SAMPLE_DLM);
61
+        await vscode.window.showTextDocument(doc);
62
+        // Give the extension a moment to activate
63
+        await sleep(2000);
64
+        const editor = vscode.window.activeTextEditor;
65
+        assert.ok(editor, "no active editor after opening .dlm file");
66
+        assert.strictEqual(editor.document.languageId, "dlm");
67
+    });
68
+});
69
+suite("Command Registration", () => {
70
+    const EXPECTED_COMMANDS = [
71
+        "dlm.train",
72
+        "dlm.export",
73
+        "dlm.synth",
74
+        "dlm.showHistory",
75
+        "dlm.openStore",
76
+        "dlm.insertInstruction",
77
+        "dlm.insertPreference",
78
+    ];
79
+    test("all 7 DLM commands are registered", async () => {
80
+        const allCommands = await vscode.commands.getCommands(true);
81
+        for (const cmd of EXPECTED_COMMANDS) {
82
+            assert.ok(allCommands.includes(cmd), `command ${cmd} not registered`);
83
+        }
84
+    });
85
+});
86
+suite("Language Configuration", () => {
87
+    test(".dlm files get dlm languageId", async () => {
88
+        const doc = await vscode.workspace.openTextDocument(SAMPLE_DLM);
89
+        assert.strictEqual(doc.languageId, "dlm");
90
+    });
91
+    test("non-.dlm files do not get dlm languageId", async () => {
92
+        const doc = await vscode.workspace.openTextDocument({
93
+            content: "hello world",
94
+            language: "plaintext",
95
+        });
96
+        assert.notStrictEqual(doc.languageId, "dlm");
97
+    });
98
+});
99
+suite("Document Content", () => {
100
+    test("sample fixture has valid frontmatter", async () => {
101
+        const doc = await vscode.workspace.openTextDocument(SAMPLE_DLM);
102
+        const text = doc.getText();
103
+        assert.ok(text.startsWith("---"), "file does not start with ---");
104
+        assert.ok(text.includes("dlm_id:"), "missing dlm_id");
105
+        assert.ok(text.includes("base_model:"), "missing base_model");
106
+        assert.ok(text.includes("dlm_version:"), "missing dlm_version");
107
+        // Count frontmatter delimiters
108
+        const lines = text.split("\n");
109
+        const delimCount = lines.filter((l) => l.trim() === "---").length;
110
+        assert.ok(delimCount >= 2, `expected at least 2 --- delimiters, got ${delimCount}`);
111
+    });
112
+    test("sample fixture has instruction sections", async () => {
113
+        const doc = await vscode.workspace.openTextDocument(SAMPLE_DLM);
114
+        const text = doc.getText();
115
+        const fences = text.split("\n").filter((l) => l.trim().startsWith("::instruction::"));
116
+        assert.ok(fences.length >= 2, `expected at least 2 instruction fences, got ${fences.length}`);
117
+    });
118
+});
119
+suite("Edge Cases", () => {
120
+    test("commands warn when no .dlm file is open", async () => {
121
+        // Open a non-.dlm file
122
+        const doc = await vscode.workspace.openTextDocument({
123
+            content: "not a dlm file",
124
+            language: "plaintext",
125
+        });
126
+        await vscode.window.showTextDocument(doc);
127
+        // These should not throw — they show a warning message instead
128
+        await vscode.commands.executeCommand("dlm.train");
129
+        await vscode.commands.executeCommand("dlm.export");
130
+        await vscode.commands.executeCommand("dlm.synth");
131
+        await vscode.commands.executeCommand("dlm.insertInstruction");
132
+    });
133
+    test("commands handle no active editor gracefully", async () => {
134
+        // Close all editors
135
+        await vscode.commands.executeCommand("workbench.action.closeAllEditors");
136
+        // These should not throw
137
+        await vscode.commands.executeCommand("dlm.train");
138
+        await vscode.commands.executeCommand("dlm.insertInstruction");
139
+    });
140
+    test("opening an empty file with .dlm extension", async () => {
141
+        const emptyUri = vscode.Uri.file(path.join(FIXTURE_DIR, "empty.dlm"));
142
+        try {
143
+            // Create a temporary empty .dlm
144
+            await vscode.workspace.fs.writeFile(emptyUri, Buffer.from(""));
145
+            const doc = await vscode.workspace.openTextDocument(emptyUri);
146
+            assert.strictEqual(doc.languageId, "dlm");
147
+            assert.strictEqual(doc.getText(), "");
148
+        }
149
+        finally {
150
+            try {
151
+                await vscode.workspace.fs.delete(emptyUri);
152
+            }
153
+            catch {
154
+                /* cleanup best-effort */
155
+            }
156
+        }
157
+    });
158
+    test("opening a .dlm with invalid frontmatter does not crash", async () => {
159
+        const badUri = vscode.Uri.file(path.join(FIXTURE_DIR, "bad.dlm"));
160
+        try {
161
+            await vscode.workspace.fs.writeFile(badUri, Buffer.from("not valid frontmatter\njust plain text\n"));
162
+            const doc = await vscode.workspace.openTextDocument(badUri);
163
+            await vscode.window.showTextDocument(doc);
164
+            assert.strictEqual(doc.languageId, "dlm");
165
+            // Extension should still be alive — commands should still be registered
166
+            const cmds = await vscode.commands.getCommands(true);
167
+            assert.ok(cmds.includes("dlm.train"));
168
+        }
169
+        finally {
170
+            try {
171
+                await vscode.workspace.fs.delete(badUri);
172
+            }
173
+            catch {
174
+                /* cleanup best-effort */
175
+            }
176
+        }
177
+    });
178
+});
179
+suite("Configuration", () => {
180
+    test("dlm.command setting exists with default", () => {
181
+        const config = vscode.workspace.getConfiguration("dlm");
182
+        const cmd = config.get("command");
183
+        assert.strictEqual(cmd, "uv run dlm");
184
+    });
185
+    test("dlm.lspPath setting exists with default", () => {
186
+        const config = vscode.workspace.getConfiguration("dlm");
187
+        const lsp = config.get("lspPath");
188
+        assert.strictEqual(lsp, "dlm-lsp");
189
+    });
190
+    test("dlm.home setting exists and defaults to empty", () => {
191
+        const config = vscode.workspace.getConfiguration("dlm");
192
+        const home = config.get("home");
193
+        assert.strictEqual(home, "");
194
+    });
195
+    test("dlm.watchOnSave setting exists and defaults to false", () => {
196
+        const config = vscode.workspace.getConfiguration("dlm");
197
+        const watch = config.get("watchOnSave");
198
+        assert.strictEqual(watch, false);
199
+    });
200
+});
201
+suite("Webview Provider", () => {
202
+    test("DLM side panel view is registered", () => {
203
+        // The view should be declared in the extension's contributes
204
+        const ext = vscode.extensions.all.find((e) => e.id.includes("dlm-vsc"));
205
+        if (ext) {
206
+            const views = ext.packageJSON?.contributes?.views?.["dlm-panel"];
207
+            assert.ok(Array.isArray(views), "dlm-panel views not declared");
208
+            const panel = views.find((v) => v.id === "dlm.sidePanel");
209
+            assert.ok(panel, "dlm.sidePanel view not found");
210
+            assert.strictEqual(panel.type, "webview");
211
+        }
212
+    });
213
+});
214
+function sleep(ms) {
215
+    return new Promise((resolve) => setTimeout(resolve, ms));
216
+}
217
+//# sourceMappingURL=extension.test.js.map
out-test/suite/extension.test.js.mapadded
@@ -0,0 +1,1 @@
1
+{"version":3,"file":"extension.test.js","sourceRoot":"","sources":["../../test/suite/extension.test.ts"],"names":[],"mappings":"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"}
out-test/suite/index.jsadded
@@ -0,0 +1,61 @@
1
+"use strict";
2
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+    if (k2 === undefined) k2 = k;
4
+    var desc = Object.getOwnPropertyDescriptor(m, k);
5
+    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+      desc = { enumerable: true, get: function() { return m[k]; } };
7
+    }
8
+    Object.defineProperty(o, k2, desc);
9
+}) : (function(o, m, k, k2) {
10
+    if (k2 === undefined) k2 = k;
11
+    o[k2] = m[k];
12
+}));
13
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+}) : function(o, v) {
16
+    o["default"] = v;
17
+});
18
+var __importStar = (this && this.__importStar) || (function () {
19
+    var ownKeys = function(o) {
20
+        ownKeys = Object.getOwnPropertyNames || function (o) {
21
+            var ar = [];
22
+            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+            return ar;
24
+        };
25
+        return ownKeys(o);
26
+    };
27
+    return function (mod) {
28
+        if (mod && mod.__esModule) return mod;
29
+        var result = {};
30
+        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+        __setModuleDefault(result, mod);
32
+        return result;
33
+    };
34
+})();
35
+var __importDefault = (this && this.__importDefault) || function (mod) {
36
+    return (mod && mod.__esModule) ? mod : { "default": mod };
37
+};
38
+Object.defineProperty(exports, "__esModule", { value: true });
39
+exports.run = run;
40
+const path = __importStar(require("path"));
41
+const mocha_1 = __importDefault(require("mocha"));
42
+const glob_1 = require("glob");
43
+async function run() {
44
+    const mocha = new mocha_1.default({ ui: "bdd", timeout: 30_000 });
45
+    const testsRoot = path.resolve(__dirname);
46
+    const files = await (0, glob_1.glob)("**/*.test.js", { cwd: testsRoot });
47
+    for (const f of files) {
48
+        mocha.addFile(path.resolve(testsRoot, f));
49
+    }
50
+    return new Promise((resolve, reject) => {
51
+        mocha.run((failures) => {
52
+            if (failures > 0) {
53
+                reject(new Error(`${failures} test(s) failed.`));
54
+            }
55
+            else {
56
+                resolve();
57
+            }
58
+        });
59
+    });
60
+}
61
+//# sourceMappingURL=index.js.map
out-test/suite/index.js.mapadded
@@ -0,0 +1,1 @@
1
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../test/suite/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,kBAmBC;AAvBD,2CAA6B;AAC7B,kDAA0B;AAC1B,+BAA4B;AAErB,KAAK,UAAU,GAAG;IACvB,MAAM,KAAK,GAAG,IAAI,eAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAExD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,IAAA,WAAI,EAAC,cAAc,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IAE7D,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YACrB,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,QAAQ,kBAAkB,CAAC,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
package-lock.jsonmodified
1621 lines changed — click to load
@@ -12,12 +12,17 @@
1212
         "vscode-languageclient": "^9.0.0"
1313
       },
1414
       "devDependencies": {
15
+        "@types/glob": "^8.1.0",
16
+        "@types/mocha": "^10.0.10",
1517
         "@types/node": "^20.0.0",
1618
         "@types/vscode": "^1.85.0",
1719
         "@typescript-eslint/eslint-plugin": "^7.0.0",
1820
         "@typescript-eslint/parser": "^7.0.0",
21
+        "@vscode/test-electron": "^2.5.2",
1922
         "esbuild": "^0.20.0",
2023
         "eslint": "^8.0.0",
24
+        "glob": "^13.0.6",
25
+        "mocha": "^11.7.5",
2126
         "typescript": "^5.4.0"
2227
       },
2328
       "engines": {
@@ -564,6 +569,109 @@
564569
       "dev": true,
565570
       "license": "BSD-3-Clause"
566571
     },
572
+    "node_modules/@isaacs/cliui": {
573
+      "version": "8.0.2",
574
+      "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
575
+      "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
576
+      "dev": true,
577
+      "license": "ISC",
578
+      "dependencies": {
579
+        "string-width": "^5.1.2",
580
+        "string-width-cjs": "npm:string-width@^4.2.0",
581
+        "strip-ansi": "^7.0.1",
582
+        "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
583
+        "wrap-ansi": "^8.1.0",
584
+        "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
585
+      },
586
+      "engines": {
587
+        "node": ">=12"
588
+      }
589
+    },
590
+    "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
591
+      "version": "6.2.2",
592
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
593
+      "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
594
+      "dev": true,
595
+      "license": "MIT",
596
+      "engines": {
597
+        "node": ">=12"
598
+      },
599
+      "funding": {
600
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
601
+      }
602
+    },
603
+    "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
604
+      "version": "6.2.3",
605
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
606
+      "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
607
+      "dev": true,
608
+      "license": "MIT",
609
+      "engines": {
610
+        "node": ">=12"
611
+      },
612
+      "funding": {
613
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
614
+      }
615
+    },
616
+    "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
617
+      "version": "9.2.2",
618
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
619
+      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
620
+      "dev": true,
621
+      "license": "MIT"
622
+    },
623
+    "node_modules/@isaacs/cliui/node_modules/string-width": {
624
+      "version": "5.1.2",
625
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
626
+      "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
627
+      "dev": true,
628
+      "license": "MIT",
629
+      "dependencies": {
630
+        "eastasianwidth": "^0.2.0",
631
+        "emoji-regex": "^9.2.2",
632
+        "strip-ansi": "^7.0.1"
633
+      },
634
+      "engines": {
635
+        "node": ">=12"
636
+      },
637
+      "funding": {
638
+        "url": "https://github.com/sponsors/sindresorhus"
639
+      }
640
+    },
641
+    "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
642
+      "version": "7.2.0",
643
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
644
+      "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
645
+      "dev": true,
646
+      "license": "MIT",
647
+      "dependencies": {
648
+        "ansi-regex": "^6.2.2"
649
+      },
650
+      "engines": {
651
+        "node": ">=12"
652
+      },
653
+      "funding": {
654
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
655
+      }
656
+    },
657
+    "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
658
+      "version": "8.1.0",
659
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
660
+      "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
661
+      "dev": true,
662
+      "license": "MIT",
663
+      "dependencies": {
664
+        "ansi-styles": "^6.1.0",
665
+        "string-width": "^5.0.1",
666
+        "strip-ansi": "^7.0.1"
667
+      },
668
+      "engines": {
669
+        "node": ">=12"
670
+      },
671
+      "funding": {
672
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
673
+      }
674
+    },
567675
     "node_modules/@nodelib/fs.scandir": {
568676
       "version": "2.1.5",
569677
       "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -602,6 +710,42 @@
602710
         "node": ">= 8"
603711
       }
604712
     },
713
+    "node_modules/@pkgjs/parseargs": {
714
+      "version": "0.11.0",
715
+      "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
716
+      "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
717
+      "dev": true,
718
+      "license": "MIT",
719
+      "optional": true,
720
+      "engines": {
721
+        "node": ">=14"
722
+      }
723
+    },
724
+    "node_modules/@types/glob": {
725
+      "version": "8.1.0",
726
+      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz",
727
+      "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==",
728
+      "dev": true,
729
+      "license": "MIT",
730
+      "dependencies": {
731
+        "@types/minimatch": "^5.1.2",
732
+        "@types/node": "*"
733
+      }
734
+    },
735
+    "node_modules/@types/minimatch": {
736
+      "version": "5.1.2",
737
+      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
738
+      "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==",
739
+      "dev": true,
740
+      "license": "MIT"
741
+    },
742
+    "node_modules/@types/mocha": {
743
+      "version": "10.0.10",
744
+      "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz",
745
+      "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==",
746
+      "dev": true,
747
+      "license": "MIT"
748
+    },
605749
     "node_modules/@types/node": {
606750
       "version": "20.19.39",
607751
       "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.39.tgz",
@@ -819,6 +963,23 @@
819963
       "dev": true,
820964
       "license": "ISC"
821965
     },
966
+    "node_modules/@vscode/test-electron": {
967
+      "version": "2.5.2",
968
+      "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.5.2.tgz",
969
+      "integrity": "sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==",
970
+      "dev": true,
971
+      "license": "MIT",
972
+      "dependencies": {
973
+        "http-proxy-agent": "^7.0.2",
974
+        "https-proxy-agent": "^7.0.5",
975
+        "jszip": "^3.10.1",
976
+        "ora": "^8.1.0",
977
+        "semver": "^7.6.2"
978
+      },
979
+      "engines": {
980
+        "node": ">=16"
981
+      }
982
+    },
822983
     "node_modules/acorn": {
823984
       "version": "8.16.0",
824985
       "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
@@ -842,6 +1003,16 @@
8421003
         "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
8431004
       }
8441005
     },
1006
+    "node_modules/agent-base": {
1007
+      "version": "7.1.4",
1008
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
1009
+      "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
1010
+      "dev": true,
1011
+      "license": "MIT",
1012
+      "engines": {
1013
+        "node": ">= 14"
1014
+      }
1015
+    },
8451016
     "node_modules/ajv": {
8461017
       "version": "6.15.0",
8471018
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
@@ -930,6 +1101,13 @@
9301101
         "node": ">=8"
9311102
       }
9321103
     },
1104
+    "node_modules/browser-stdout": {
1105
+      "version": "1.3.1",
1106
+      "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
1107
+      "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
1108
+      "dev": true,
1109
+      "license": "ISC"
1110
+    },
9331111
     "node_modules/callsites": {
9341112
       "version": "3.1.0",
9351113
       "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -940,6 +1118,19 @@
9401118
         "node": ">=6"
9411119
       }
9421120
     },
1121
+    "node_modules/camelcase": {
1122
+      "version": "6.3.0",
1123
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
1124
+      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
1125
+      "dev": true,
1126
+      "license": "MIT",
1127
+      "engines": {
1128
+        "node": ">=10"
1129
+      },
1130
+      "funding": {
1131
+        "url": "https://github.com/sponsors/sindresorhus"
1132
+      }
1133
+    },
9431134
     "node_modules/chalk": {
9441135
       "version": "4.1.2",
9451136
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@@ -957,6 +1148,88 @@
9571148
         "url": "https://github.com/chalk/chalk?sponsor=1"
9581149
       }
9591150
     },
1151
+    "node_modules/chokidar": {
1152
+      "version": "4.0.3",
1153
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
1154
+      "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
1155
+      "dev": true,
1156
+      "license": "MIT",
1157
+      "dependencies": {
1158
+        "readdirp": "^4.0.1"
1159
+      },
1160
+      "engines": {
1161
+        "node": ">= 14.16.0"
1162
+      },
1163
+      "funding": {
1164
+        "url": "https://paulmillr.com/funding/"
1165
+      }
1166
+    },
1167
+    "node_modules/cli-cursor": {
1168
+      "version": "5.0.0",
1169
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
1170
+      "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
1171
+      "dev": true,
1172
+      "license": "MIT",
1173
+      "dependencies": {
1174
+        "restore-cursor": "^5.0.0"
1175
+      },
1176
+      "engines": {
1177
+        "node": ">=18"
1178
+      },
1179
+      "funding": {
1180
+        "url": "https://github.com/sponsors/sindresorhus"
1181
+      }
1182
+    },
1183
+    "node_modules/cli-spinners": {
1184
+      "version": "2.9.2",
1185
+      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
1186
+      "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
1187
+      "dev": true,
1188
+      "license": "MIT",
1189
+      "engines": {
1190
+        "node": ">=6"
1191
+      },
1192
+      "funding": {
1193
+        "url": "https://github.com/sponsors/sindresorhus"
1194
+      }
1195
+    },
1196
+    "node_modules/cliui": {
1197
+      "version": "8.0.1",
1198
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
1199
+      "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
1200
+      "dev": true,
1201
+      "license": "ISC",
1202
+      "dependencies": {
1203
+        "string-width": "^4.2.0",
1204
+        "strip-ansi": "^6.0.1",
1205
+        "wrap-ansi": "^7.0.0"
1206
+      },
1207
+      "engines": {
1208
+        "node": ">=12"
1209
+      }
1210
+    },
1211
+    "node_modules/cliui/node_modules/emoji-regex": {
1212
+      "version": "8.0.0",
1213
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
1214
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
1215
+      "dev": true,
1216
+      "license": "MIT"
1217
+    },
1218
+    "node_modules/cliui/node_modules/string-width": {
1219
+      "version": "4.2.3",
1220
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
1221
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
1222
+      "dev": true,
1223
+      "license": "MIT",
1224
+      "dependencies": {
1225
+        "emoji-regex": "^8.0.0",
1226
+        "is-fullwidth-code-point": "^3.0.0",
1227
+        "strip-ansi": "^6.0.1"
1228
+      },
1229
+      "engines": {
1230
+        "node": ">=8"
1231
+      }
1232
+    },
9601233
     "node_modules/color-convert": {
9611234
       "version": "2.0.1",
9621235
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -984,6 +1257,13 @@
9841257
       "dev": true,
9851258
       "license": "MIT"
9861259
     },
1260
+    "node_modules/core-util-is": {
1261
+      "version": "1.0.3",
1262
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
1263
+      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
1264
+      "dev": true,
1265
+      "license": "MIT"
1266
+    },
9871267
     "node_modules/cross-spawn": {
9881268
       "version": "7.0.6",
9891269
       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
@@ -1017,6 +1297,19 @@
10171297
         }
10181298
       }
10191299
     },
1300
+    "node_modules/decamelize": {
1301
+      "version": "4.0.0",
1302
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
1303
+      "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
1304
+      "dev": true,
1305
+      "license": "MIT",
1306
+      "engines": {
1307
+        "node": ">=10"
1308
+      },
1309
+      "funding": {
1310
+        "url": "https://github.com/sponsors/sindresorhus"
1311
+      }
1312
+    },
10201313
     "node_modules/deep-is": {
10211314
       "version": "0.1.4",
10221315
       "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
@@ -1024,6 +1317,16 @@
10241317
       "dev": true,
10251318
       "license": "MIT"
10261319
     },
1320
+    "node_modules/diff": {
1321
+      "version": "7.0.0",
1322
+      "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz",
1323
+      "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==",
1324
+      "dev": true,
1325
+      "license": "BSD-3-Clause",
1326
+      "engines": {
1327
+        "node": ">=0.3.1"
1328
+      }
1329
+    },
10271330
     "node_modules/dir-glob": {
10281331
       "version": "3.0.1",
10291332
       "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -1050,6 +1353,20 @@
10501353
         "node": ">=6.0.0"
10511354
       }
10521355
     },
1356
+    "node_modules/eastasianwidth": {
1357
+      "version": "0.2.0",
1358
+      "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
1359
+      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
1360
+      "dev": true,
1361
+      "license": "MIT"
1362
+    },
1363
+    "node_modules/emoji-regex": {
1364
+      "version": "10.6.0",
1365
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
1366
+      "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
1367
+      "dev": true,
1368
+      "license": "MIT"
1369
+    },
10531370
     "node_modules/esbuild": {
10541371
       "version": "0.20.2",
10551372
       "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
@@ -1089,6 +1406,16 @@
10891406
         "@esbuild/win32-x64": "0.20.2"
10901407
       }
10911408
     },
1409
+    "node_modules/escalade": {
1410
+      "version": "3.2.0",
1411
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
1412
+      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
1413
+      "dev": true,
1414
+      "license": "MIT",
1415
+      "engines": {
1416
+        "node": ">=6"
1417
+      }
1418
+    },
10921419
     "node_modules/escape-string-regexp": {
10931420
       "version": "4.0.0",
10941421
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
@@ -1381,6 +1708,16 @@
13811708
         "url": "https://github.com/sponsors/sindresorhus"
13821709
       }
13831710
     },
1711
+    "node_modules/flat": {
1712
+      "version": "5.0.2",
1713
+      "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
1714
+      "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
1715
+      "dev": true,
1716
+      "license": "BSD-3-Clause",
1717
+      "bin": {
1718
+        "flat": "cli.js"
1719
+      }
1720
+    },
13841721
     "node_modules/flat-cache": {
13851722
       "version": "3.2.0",
13861723
       "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
@@ -1403,6 +1740,23 @@
14031740
       "dev": true,
14041741
       "license": "ISC"
14051742
     },
1743
+    "node_modules/foreground-child": {
1744
+      "version": "3.3.1",
1745
+      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
1746
+      "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
1747
+      "dev": true,
1748
+      "license": "ISC",
1749
+      "dependencies": {
1750
+        "cross-spawn": "^7.0.6",
1751
+        "signal-exit": "^4.0.1"
1752
+      },
1753
+      "engines": {
1754
+        "node": ">=14"
1755
+      },
1756
+      "funding": {
1757
+        "url": "https://github.com/sponsors/isaacs"
1758
+      }
1759
+    },
14061760
     "node_modules/fs.realpath": {
14071761
       "version": "1.0.0",
14081762
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -1410,23 +1764,42 @@
14101764
       "dev": true,
14111765
       "license": "ISC"
14121766
     },
1413
-    "node_modules/glob": {
1414
-      "version": "7.2.3",
1415
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
1416
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
1417
-      "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
1767
+    "node_modules/get-caller-file": {
1768
+      "version": "2.0.5",
1769
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
1770
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
14181771
       "dev": true,
14191772
       "license": "ISC",
1773
+      "engines": {
1774
+        "node": "6.* || 8.* || >= 10.*"
1775
+      }
1776
+    },
1777
+    "node_modules/get-east-asian-width": {
1778
+      "version": "1.5.0",
1779
+      "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz",
1780
+      "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==",
1781
+      "dev": true,
1782
+      "license": "MIT",
1783
+      "engines": {
1784
+        "node": ">=18"
1785
+      },
1786
+      "funding": {
1787
+        "url": "https://github.com/sponsors/sindresorhus"
1788
+      }
1789
+    },
1790
+    "node_modules/glob": {
1791
+      "version": "13.0.6",
1792
+      "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
1793
+      "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
1794
+      "dev": true,
1795
+      "license": "BlueOak-1.0.0",
14201796
       "dependencies": {
1421
-        "fs.realpath": "^1.0.0",
1422
-        "inflight": "^1.0.4",
1423
-        "inherits": "2",
1424
-        "minimatch": "^3.1.1",
1425
-        "once": "^1.3.0",
1426
-        "path-is-absolute": "^1.0.0"
1797
+        "minimatch": "^10.2.2",
1798
+        "minipass": "^7.1.3",
1799
+        "path-scurry": "^2.0.2"
14271800
       },
14281801
       "engines": {
1429
-        "node": "*"
1802
+        "node": "18 || 20 || >=22"
14301803
       },
14311804
       "funding": {
14321805
         "url": "https://github.com/sponsors/isaacs"
@@ -1445,32 +1818,74 @@
14451818
         "node": ">=10.13.0"
14461819
       }
14471820
     },
1821
+    "node_modules/glob/node_modules/balanced-match": {
1822
+      "version": "4.0.4",
1823
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
1824
+      "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
1825
+      "dev": true,
1826
+      "license": "MIT",
1827
+      "engines": {
1828
+        "node": "18 || 20 || >=22"
1829
+      }
1830
+    },
14481831
     "node_modules/glob/node_modules/brace-expansion": {
1449
-      "version": "1.1.14",
1450
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz",
1451
-      "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==",
1832
+      "version": "5.0.5",
1833
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
1834
+      "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
14521835
       "dev": true,
14531836
       "license": "MIT",
14541837
       "dependencies": {
1455
-        "balanced-match": "^1.0.0",
1456
-        "concat-map": "0.0.1"
1838
+        "balanced-match": "^4.0.2"
1839
+      },
1840
+      "engines": {
1841
+        "node": "18 || 20 || >=22"
1842
+      }
1843
+    },
1844
+    "node_modules/glob/node_modules/lru-cache": {
1845
+      "version": "11.3.5",
1846
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz",
1847
+      "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==",
1848
+      "dev": true,
1849
+      "license": "BlueOak-1.0.0",
1850
+      "engines": {
1851
+        "node": "20 || >=22"
14571852
       }
14581853
     },
14591854
     "node_modules/glob/node_modules/minimatch": {
1460
-      "version": "3.1.5",
1461
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
1462
-      "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
1855
+      "version": "10.2.5",
1856
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
1857
+      "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
14631858
       "dev": true,
1464
-      "license": "ISC",
1859
+      "license": "BlueOak-1.0.0",
14651860
       "dependencies": {
1466
-        "brace-expansion": "^1.1.7"
1861
+        "brace-expansion": "^5.0.5"
14671862
       },
14681863
       "engines": {
1469
-        "node": "*"
1864
+        "node": "18 || 20 || >=22"
1865
+      },
1866
+      "funding": {
1867
+        "url": "https://github.com/sponsors/isaacs"
14701868
       }
14711869
     },
1472
-    "node_modules/globals": {
1473
-      "version": "13.24.0",
1870
+    "node_modules/glob/node_modules/path-scurry": {
1871
+      "version": "2.0.2",
1872
+      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz",
1873
+      "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==",
1874
+      "dev": true,
1875
+      "license": "BlueOak-1.0.0",
1876
+      "dependencies": {
1877
+        "lru-cache": "^11.0.0",
1878
+        "minipass": "^7.1.2"
1879
+      },
1880
+      "engines": {
1881
+        "node": "18 || 20 || >=22"
1882
+      },
1883
+      "funding": {
1884
+        "url": "https://github.com/sponsors/isaacs"
1885
+      }
1886
+    },
1887
+    "node_modules/globals": {
1888
+      "version": "13.24.0",
14741889
       "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
14751890
       "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
14761891
       "dev": true,
@@ -1523,6 +1938,44 @@
15231938
         "node": ">=8"
15241939
       }
15251940
     },
1941
+    "node_modules/he": {
1942
+      "version": "1.2.0",
1943
+      "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
1944
+      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
1945
+      "dev": true,
1946
+      "license": "MIT",
1947
+      "bin": {
1948
+        "he": "bin/he"
1949
+      }
1950
+    },
1951
+    "node_modules/http-proxy-agent": {
1952
+      "version": "7.0.2",
1953
+      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
1954
+      "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
1955
+      "dev": true,
1956
+      "license": "MIT",
1957
+      "dependencies": {
1958
+        "agent-base": "^7.1.0",
1959
+        "debug": "^4.3.4"
1960
+      },
1961
+      "engines": {
1962
+        "node": ">= 14"
1963
+      }
1964
+    },
1965
+    "node_modules/https-proxy-agent": {
1966
+      "version": "7.0.6",
1967
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
1968
+      "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
1969
+      "dev": true,
1970
+      "license": "MIT",
1971
+      "dependencies": {
1972
+        "agent-base": "^7.1.2",
1973
+        "debug": "4"
1974
+      },
1975
+      "engines": {
1976
+        "node": ">= 14"
1977
+      }
1978
+    },
15261979
     "node_modules/ignore": {
15271980
       "version": "5.3.2",
15281981
       "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
@@ -1533,6 +1986,13 @@
15331986
         "node": ">= 4"
15341987
       }
15351988
     },
1989
+    "node_modules/immediate": {
1990
+      "version": "3.0.6",
1991
+      "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
1992
+      "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==",
1993
+      "dev": true,
1994
+      "license": "MIT"
1995
+    },
15361996
     "node_modules/import-fresh": {
15371997
       "version": "3.3.1",
15381998
       "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
@@ -1589,6 +2049,16 @@
15892049
         "node": ">=0.10.0"
15902050
       }
15912051
     },
2052
+    "node_modules/is-fullwidth-code-point": {
2053
+      "version": "3.0.0",
2054
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
2055
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
2056
+      "dev": true,
2057
+      "license": "MIT",
2058
+      "engines": {
2059
+        "node": ">=8"
2060
+      }
2061
+    },
15922062
     "node_modules/is-glob": {
15932063
       "version": "4.0.3",
15942064
       "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@@ -1602,6 +2072,19 @@
16022072
         "node": ">=0.10.0"
16032073
       }
16042074
     },
2075
+    "node_modules/is-interactive": {
2076
+      "version": "2.0.0",
2077
+      "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz",
2078
+      "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==",
2079
+      "dev": true,
2080
+      "license": "MIT",
2081
+      "engines": {
2082
+        "node": ">=12"
2083
+      },
2084
+      "funding": {
2085
+        "url": "https://github.com/sponsors/sindresorhus"
2086
+      }
2087
+    },
16052088
     "node_modules/is-number": {
16062089
       "version": "7.0.0",
16072090
       "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -1622,6 +2105,36 @@
16222105
         "node": ">=8"
16232106
       }
16242107
     },
2108
+    "node_modules/is-plain-obj": {
2109
+      "version": "2.1.0",
2110
+      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
2111
+      "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
2112
+      "dev": true,
2113
+      "license": "MIT",
2114
+      "engines": {
2115
+        "node": ">=8"
2116
+      }
2117
+    },
2118
+    "node_modules/is-unicode-supported": {
2119
+      "version": "0.1.0",
2120
+      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
2121
+      "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
2122
+      "dev": true,
2123
+      "license": "MIT",
2124
+      "engines": {
2125
+        "node": ">=10"
2126
+      },
2127
+      "funding": {
2128
+        "url": "https://github.com/sponsors/sindresorhus"
2129
+      }
2130
+    },
2131
+    "node_modules/isarray": {
2132
+      "version": "1.0.0",
2133
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
2134
+      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
2135
+      "dev": true,
2136
+      "license": "MIT"
2137
+    },
16252138
     "node_modules/isexe": {
16262139
       "version": "2.0.0",
16272140
       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -1629,6 +2142,22 @@
16292142
       "dev": true,
16302143
       "license": "ISC"
16312144
     },
2145
+    "node_modules/jackspeak": {
2146
+      "version": "3.4.3",
2147
+      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
2148
+      "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
2149
+      "dev": true,
2150
+      "license": "BlueOak-1.0.0",
2151
+      "dependencies": {
2152
+        "@isaacs/cliui": "^8.0.2"
2153
+      },
2154
+      "funding": {
2155
+        "url": "https://github.com/sponsors/isaacs"
2156
+      },
2157
+      "optionalDependencies": {
2158
+        "@pkgjs/parseargs": "^0.11.0"
2159
+      }
2160
+    },
16322161
     "node_modules/js-yaml": {
16332162
       "version": "4.1.1",
16342163
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
@@ -1663,6 +2192,19 @@
16632192
       "dev": true,
16642193
       "license": "MIT"
16652194
     },
2195
+    "node_modules/jszip": {
2196
+      "version": "3.10.1",
2197
+      "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
2198
+      "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
2199
+      "dev": true,
2200
+      "license": "(MIT OR GPL-3.0-or-later)",
2201
+      "dependencies": {
2202
+        "lie": "~3.3.0",
2203
+        "pako": "~1.0.2",
2204
+        "readable-stream": "~2.3.6",
2205
+        "setimmediate": "^1.0.5"
2206
+      }
2207
+    },
16662208
     "node_modules/keyv": {
16672209
       "version": "4.5.4",
16682210
       "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -1687,6 +2229,16 @@
16872229
         "node": ">= 0.8.0"
16882230
       }
16892231
     },
2232
+    "node_modules/lie": {
2233
+      "version": "3.3.0",
2234
+      "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
2235
+      "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
2236
+      "dev": true,
2237
+      "license": "MIT",
2238
+      "dependencies": {
2239
+        "immediate": "~3.0.5"
2240
+      }
2241
+    },
16902242
     "node_modules/locate-path": {
16912243
       "version": "6.0.0",
16922244
       "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -1710,6 +2262,30 @@
17102262
       "dev": true,
17112263
       "license": "MIT"
17122264
     },
2265
+    "node_modules/log-symbols": {
2266
+      "version": "4.1.0",
2267
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
2268
+      "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
2269
+      "dev": true,
2270
+      "license": "MIT",
2271
+      "dependencies": {
2272
+        "chalk": "^4.1.0",
2273
+        "is-unicode-supported": "^0.1.0"
2274
+      },
2275
+      "engines": {
2276
+        "node": ">=10"
2277
+      },
2278
+      "funding": {
2279
+        "url": "https://github.com/sponsors/sindresorhus"
2280
+      }
2281
+    },
2282
+    "node_modules/lru-cache": {
2283
+      "version": "10.4.3",
2284
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
2285
+      "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
2286
+      "dev": true,
2287
+      "license": "ISC"
2288
+    },
17132289
     "node_modules/merge2": {
17142290
       "version": "1.4.1",
17152291
       "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -1734,6 +2310,19 @@
17342310
         "node": ">=8.6"
17352311
       }
17362312
     },
2313
+    "node_modules/mimic-function": {
2314
+      "version": "5.0.1",
2315
+      "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
2316
+      "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==",
2317
+      "dev": true,
2318
+      "license": "MIT",
2319
+      "engines": {
2320
+        "node": ">=18"
2321
+      },
2322
+      "funding": {
2323
+        "url": "https://github.com/sponsors/sindresorhus"
2324
+      }
2325
+    },
17372326
     "node_modules/minimatch": {
17382327
       "version": "9.0.9",
17392328
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
@@ -1750,6 +2339,91 @@
17502339
         "url": "https://github.com/sponsors/isaacs"
17512340
       }
17522341
     },
2342
+    "node_modules/minipass": {
2343
+      "version": "7.1.3",
2344
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
2345
+      "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
2346
+      "dev": true,
2347
+      "license": "BlueOak-1.0.0",
2348
+      "engines": {
2349
+        "node": ">=16 || 14 >=14.17"
2350
+      }
2351
+    },
2352
+    "node_modules/mocha": {
2353
+      "version": "11.7.5",
2354
+      "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.5.tgz",
2355
+      "integrity": "sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==",
2356
+      "dev": true,
2357
+      "license": "MIT",
2358
+      "dependencies": {
2359
+        "browser-stdout": "^1.3.1",
2360
+        "chokidar": "^4.0.1",
2361
+        "debug": "^4.3.5",
2362
+        "diff": "^7.0.0",
2363
+        "escape-string-regexp": "^4.0.0",
2364
+        "find-up": "^5.0.0",
2365
+        "glob": "^10.4.5",
2366
+        "he": "^1.2.0",
2367
+        "is-path-inside": "^3.0.3",
2368
+        "js-yaml": "^4.1.0",
2369
+        "log-symbols": "^4.1.0",
2370
+        "minimatch": "^9.0.5",
2371
+        "ms": "^2.1.3",
2372
+        "picocolors": "^1.1.1",
2373
+        "serialize-javascript": "^6.0.2",
2374
+        "strip-json-comments": "^3.1.1",
2375
+        "supports-color": "^8.1.1",
2376
+        "workerpool": "^9.2.0",
2377
+        "yargs": "^17.7.2",
2378
+        "yargs-parser": "^21.1.1",
2379
+        "yargs-unparser": "^2.0.0"
2380
+      },
2381
+      "bin": {
2382
+        "_mocha": "bin/_mocha",
2383
+        "mocha": "bin/mocha.js"
2384
+      },
2385
+      "engines": {
2386
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2387
+      }
2388
+    },
2389
+    "node_modules/mocha/node_modules/glob": {
2390
+      "version": "10.5.0",
2391
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
2392
+      "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
2393
+      "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
2394
+      "dev": true,
2395
+      "license": "ISC",
2396
+      "dependencies": {
2397
+        "foreground-child": "^3.1.0",
2398
+        "jackspeak": "^3.1.2",
2399
+        "minimatch": "^9.0.4",
2400
+        "minipass": "^7.1.2",
2401
+        "package-json-from-dist": "^1.0.0",
2402
+        "path-scurry": "^1.11.1"
2403
+      },
2404
+      "bin": {
2405
+        "glob": "dist/esm/bin.mjs"
2406
+      },
2407
+      "funding": {
2408
+        "url": "https://github.com/sponsors/isaacs"
2409
+      }
2410
+    },
2411
+    "node_modules/mocha/node_modules/supports-color": {
2412
+      "version": "8.1.1",
2413
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
2414
+      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
2415
+      "dev": true,
2416
+      "license": "MIT",
2417
+      "dependencies": {
2418
+        "has-flag": "^4.0.0"
2419
+      },
2420
+      "engines": {
2421
+        "node": ">=10"
2422
+      },
2423
+      "funding": {
2424
+        "url": "https://github.com/chalk/supports-color?sponsor=1"
2425
+      }
2426
+    },
17532427
     "node_modules/ms": {
17542428
       "version": "2.1.3",
17552429
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -1774,6 +2448,22 @@
17742448
         "wrappy": "1"
17752449
       }
17762450
     },
2451
+    "node_modules/onetime": {
2452
+      "version": "7.0.0",
2453
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
2454
+      "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
2455
+      "dev": true,
2456
+      "license": "MIT",
2457
+      "dependencies": {
2458
+        "mimic-function": "^5.0.0"
2459
+      },
2460
+      "engines": {
2461
+        "node": ">=18"
2462
+      },
2463
+      "funding": {
2464
+        "url": "https://github.com/sponsors/sindresorhus"
2465
+      }
2466
+    },
17772467
     "node_modules/optionator": {
17782468
       "version": "0.9.4",
17792469
       "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
@@ -1792,6 +2482,115 @@
17922482
         "node": ">= 0.8.0"
17932483
       }
17942484
     },
2485
+    "node_modules/ora": {
2486
+      "version": "8.2.0",
2487
+      "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz",
2488
+      "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==",
2489
+      "dev": true,
2490
+      "license": "MIT",
2491
+      "dependencies": {
2492
+        "chalk": "^5.3.0",
2493
+        "cli-cursor": "^5.0.0",
2494
+        "cli-spinners": "^2.9.2",
2495
+        "is-interactive": "^2.0.0",
2496
+        "is-unicode-supported": "^2.0.0",
2497
+        "log-symbols": "^6.0.0",
2498
+        "stdin-discarder": "^0.2.2",
2499
+        "string-width": "^7.2.0",
2500
+        "strip-ansi": "^7.1.0"
2501
+      },
2502
+      "engines": {
2503
+        "node": ">=18"
2504
+      },
2505
+      "funding": {
2506
+        "url": "https://github.com/sponsors/sindresorhus"
2507
+      }
2508
+    },
2509
+    "node_modules/ora/node_modules/ansi-regex": {
2510
+      "version": "6.2.2",
2511
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
2512
+      "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
2513
+      "dev": true,
2514
+      "license": "MIT",
2515
+      "engines": {
2516
+        "node": ">=12"
2517
+      },
2518
+      "funding": {
2519
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
2520
+      }
2521
+    },
2522
+    "node_modules/ora/node_modules/chalk": {
2523
+      "version": "5.6.2",
2524
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
2525
+      "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
2526
+      "dev": true,
2527
+      "license": "MIT",
2528
+      "engines": {
2529
+        "node": "^12.17.0 || ^14.13 || >=16.0.0"
2530
+      },
2531
+      "funding": {
2532
+        "url": "https://github.com/chalk/chalk?sponsor=1"
2533
+      }
2534
+    },
2535
+    "node_modules/ora/node_modules/is-unicode-supported": {
2536
+      "version": "2.1.0",
2537
+      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz",
2538
+      "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==",
2539
+      "dev": true,
2540
+      "license": "MIT",
2541
+      "engines": {
2542
+        "node": ">=18"
2543
+      },
2544
+      "funding": {
2545
+        "url": "https://github.com/sponsors/sindresorhus"
2546
+      }
2547
+    },
2548
+    "node_modules/ora/node_modules/log-symbols": {
2549
+      "version": "6.0.0",
2550
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz",
2551
+      "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==",
2552
+      "dev": true,
2553
+      "license": "MIT",
2554
+      "dependencies": {
2555
+        "chalk": "^5.3.0",
2556
+        "is-unicode-supported": "^1.3.0"
2557
+      },
2558
+      "engines": {
2559
+        "node": ">=18"
2560
+      },
2561
+      "funding": {
2562
+        "url": "https://github.com/sponsors/sindresorhus"
2563
+      }
2564
+    },
2565
+    "node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported": {
2566
+      "version": "1.3.0",
2567
+      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz",
2568
+      "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==",
2569
+      "dev": true,
2570
+      "license": "MIT",
2571
+      "engines": {
2572
+        "node": ">=12"
2573
+      },
2574
+      "funding": {
2575
+        "url": "https://github.com/sponsors/sindresorhus"
2576
+      }
2577
+    },
2578
+    "node_modules/ora/node_modules/strip-ansi": {
2579
+      "version": "7.2.0",
2580
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
2581
+      "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
2582
+      "dev": true,
2583
+      "license": "MIT",
2584
+      "dependencies": {
2585
+        "ansi-regex": "^6.2.2"
2586
+      },
2587
+      "engines": {
2588
+        "node": ">=12"
2589
+      },
2590
+      "funding": {
2591
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
2592
+      }
2593
+    },
17952594
     "node_modules/p-limit": {
17962595
       "version": "3.1.0",
17972596
       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
@@ -1824,6 +2623,20 @@
18242623
         "url": "https://github.com/sponsors/sindresorhus"
18252624
       }
18262625
     },
2626
+    "node_modules/package-json-from-dist": {
2627
+      "version": "1.0.1",
2628
+      "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
2629
+      "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
2630
+      "dev": true,
2631
+      "license": "BlueOak-1.0.0"
2632
+    },
2633
+    "node_modules/pako": {
2634
+      "version": "1.0.11",
2635
+      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
2636
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
2637
+      "dev": true,
2638
+      "license": "(MIT AND Zlib)"
2639
+    },
18272640
     "node_modules/parent-module": {
18282641
       "version": "1.0.1",
18292642
       "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -1867,6 +2680,23 @@
18672680
         "node": ">=8"
18682681
       }
18692682
     },
2683
+    "node_modules/path-scurry": {
2684
+      "version": "1.11.1",
2685
+      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
2686
+      "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
2687
+      "dev": true,
2688
+      "license": "BlueOak-1.0.0",
2689
+      "dependencies": {
2690
+        "lru-cache": "^10.2.0",
2691
+        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
2692
+      },
2693
+      "engines": {
2694
+        "node": ">=16 || 14 >=14.18"
2695
+      },
2696
+      "funding": {
2697
+        "url": "https://github.com/sponsors/isaacs"
2698
+      }
2699
+    },
18702700
     "node_modules/path-type": {
18712701
       "version": "4.0.0",
18722702
       "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
@@ -1877,6 +2707,13 @@
18772707
         "node": ">=8"
18782708
       }
18792709
     },
2710
+    "node_modules/picocolors": {
2711
+      "version": "1.1.1",
2712
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
2713
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
2714
+      "dev": true,
2715
+      "license": "ISC"
2716
+    },
18802717
     "node_modules/picomatch": {
18812718
       "version": "2.3.2",
18822719
       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
@@ -1900,8 +2737,15 @@
19002737
         "node": ">= 0.8.0"
19012738
       }
19022739
     },
1903
-    "node_modules/punycode": {
1904
-      "version": "2.3.1",
2740
+    "node_modules/process-nextick-args": {
2741
+      "version": "2.0.1",
2742
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
2743
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
2744
+      "dev": true,
2745
+      "license": "MIT"
2746
+    },
2747
+    "node_modules/punycode": {
2748
+      "version": "2.3.1",
19052749
       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
19062750
       "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
19072751
       "dev": true,
@@ -1931,6 +2775,56 @@
19312775
       ],
19322776
       "license": "MIT"
19332777
     },
2778
+    "node_modules/randombytes": {
2779
+      "version": "2.1.0",
2780
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
2781
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
2782
+      "dev": true,
2783
+      "license": "MIT",
2784
+      "dependencies": {
2785
+        "safe-buffer": "^5.1.0"
2786
+      }
2787
+    },
2788
+    "node_modules/readable-stream": {
2789
+      "version": "2.3.8",
2790
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
2791
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
2792
+      "dev": true,
2793
+      "license": "MIT",
2794
+      "dependencies": {
2795
+        "core-util-is": "~1.0.0",
2796
+        "inherits": "~2.0.3",
2797
+        "isarray": "~1.0.0",
2798
+        "process-nextick-args": "~2.0.0",
2799
+        "safe-buffer": "~5.1.1",
2800
+        "string_decoder": "~1.1.1",
2801
+        "util-deprecate": "~1.0.1"
2802
+      }
2803
+    },
2804
+    "node_modules/readdirp": {
2805
+      "version": "4.1.2",
2806
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
2807
+      "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
2808
+      "dev": true,
2809
+      "license": "MIT",
2810
+      "engines": {
2811
+        "node": ">= 14.18.0"
2812
+      },
2813
+      "funding": {
2814
+        "type": "individual",
2815
+        "url": "https://paulmillr.com/funding/"
2816
+      }
2817
+    },
2818
+    "node_modules/require-directory": {
2819
+      "version": "2.1.1",
2820
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
2821
+      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
2822
+      "dev": true,
2823
+      "license": "MIT",
2824
+      "engines": {
2825
+        "node": ">=0.10.0"
2826
+      }
2827
+    },
19342828
     "node_modules/resolve-from": {
19352829
       "version": "4.0.0",
19362830
       "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@@ -1941,6 +2835,23 @@
19412835
         "node": ">=4"
19422836
       }
19432837
     },
2838
+    "node_modules/restore-cursor": {
2839
+      "version": "5.1.0",
2840
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
2841
+      "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
2842
+      "dev": true,
2843
+      "license": "MIT",
2844
+      "dependencies": {
2845
+        "onetime": "^7.0.0",
2846
+        "signal-exit": "^4.1.0"
2847
+      },
2848
+      "engines": {
2849
+        "node": ">=18"
2850
+      },
2851
+      "funding": {
2852
+        "url": "https://github.com/sponsors/sindresorhus"
2853
+      }
2854
+    },
19442855
     "node_modules/reusify": {
19452856
       "version": "1.1.0",
19462857
       "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
@@ -1969,6 +2880,52 @@
19692880
         "url": "https://github.com/sponsors/isaacs"
19702881
       }
19712882
     },
2883
+    "node_modules/rimraf/node_modules/brace-expansion": {
2884
+      "version": "1.1.14",
2885
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz",
2886
+      "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==",
2887
+      "dev": true,
2888
+      "license": "MIT",
2889
+      "dependencies": {
2890
+        "balanced-match": "^1.0.0",
2891
+        "concat-map": "0.0.1"
2892
+      }
2893
+    },
2894
+    "node_modules/rimraf/node_modules/glob": {
2895
+      "version": "7.2.3",
2896
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
2897
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
2898
+      "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
2899
+      "dev": true,
2900
+      "license": "ISC",
2901
+      "dependencies": {
2902
+        "fs.realpath": "^1.0.0",
2903
+        "inflight": "^1.0.4",
2904
+        "inherits": "2",
2905
+        "minimatch": "^3.1.1",
2906
+        "once": "^1.3.0",
2907
+        "path-is-absolute": "^1.0.0"
2908
+      },
2909
+      "engines": {
2910
+        "node": "*"
2911
+      },
2912
+      "funding": {
2913
+        "url": "https://github.com/sponsors/isaacs"
2914
+      }
2915
+    },
2916
+    "node_modules/rimraf/node_modules/minimatch": {
2917
+      "version": "3.1.5",
2918
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
2919
+      "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
2920
+      "dev": true,
2921
+      "license": "ISC",
2922
+      "dependencies": {
2923
+        "brace-expansion": "^1.1.7"
2924
+      },
2925
+      "engines": {
2926
+        "node": "*"
2927
+      }
2928
+    },
19722929
     "node_modules/run-parallel": {
19732930
       "version": "1.2.0",
19742931
       "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -1993,6 +2950,13 @@
19932950
         "queue-microtask": "^1.2.2"
19942951
       }
19952952
     },
2953
+    "node_modules/safe-buffer": {
2954
+      "version": "5.1.2",
2955
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
2956
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
2957
+      "dev": true,
2958
+      "license": "MIT"
2959
+    },
19962960
     "node_modules/semver": {
19972961
       "version": "7.7.4",
19982962
       "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
@@ -2005,6 +2969,23 @@
20052969
         "node": ">=10"
20062970
       }
20072971
     },
2972
+    "node_modules/serialize-javascript": {
2973
+      "version": "6.0.2",
2974
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
2975
+      "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
2976
+      "dev": true,
2977
+      "license": "BSD-3-Clause",
2978
+      "dependencies": {
2979
+        "randombytes": "^2.1.0"
2980
+      }
2981
+    },
2982
+    "node_modules/setimmediate": {
2983
+      "version": "1.0.5",
2984
+      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
2985
+      "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
2986
+      "dev": true,
2987
+      "license": "MIT"
2988
+    },
20082989
     "node_modules/shebang-command": {
20092990
       "version": "2.0.0",
20102991
       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -2028,6 +3009,19 @@
20283009
         "node": ">=8"
20293010
       }
20303011
     },
3012
+    "node_modules/signal-exit": {
3013
+      "version": "4.1.0",
3014
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
3015
+      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
3016
+      "dev": true,
3017
+      "license": "ISC",
3018
+      "engines": {
3019
+        "node": ">=14"
3020
+      },
3021
+      "funding": {
3022
+        "url": "https://github.com/sponsors/isaacs"
3023
+      }
3024
+    },
20313025
     "node_modules/slash": {
20323026
       "version": "3.0.0",
20333027
       "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
@@ -2038,6 +3032,99 @@
20383032
         "node": ">=8"
20393033
       }
20403034
     },
3035
+    "node_modules/stdin-discarder": {
3036
+      "version": "0.2.2",
3037
+      "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz",
3038
+      "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==",
3039
+      "dev": true,
3040
+      "license": "MIT",
3041
+      "engines": {
3042
+        "node": ">=18"
3043
+      },
3044
+      "funding": {
3045
+        "url": "https://github.com/sponsors/sindresorhus"
3046
+      }
3047
+    },
3048
+    "node_modules/string_decoder": {
3049
+      "version": "1.1.1",
3050
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
3051
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
3052
+      "dev": true,
3053
+      "license": "MIT",
3054
+      "dependencies": {
3055
+        "safe-buffer": "~5.1.0"
3056
+      }
3057
+    },
3058
+    "node_modules/string-width": {
3059
+      "version": "7.2.0",
3060
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
3061
+      "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
3062
+      "dev": true,
3063
+      "license": "MIT",
3064
+      "dependencies": {
3065
+        "emoji-regex": "^10.3.0",
3066
+        "get-east-asian-width": "^1.0.0",
3067
+        "strip-ansi": "^7.1.0"
3068
+      },
3069
+      "engines": {
3070
+        "node": ">=18"
3071
+      },
3072
+      "funding": {
3073
+        "url": "https://github.com/sponsors/sindresorhus"
3074
+      }
3075
+    },
3076
+    "node_modules/string-width-cjs": {
3077
+      "name": "string-width",
3078
+      "version": "4.2.3",
3079
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
3080
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
3081
+      "dev": true,
3082
+      "license": "MIT",
3083
+      "dependencies": {
3084
+        "emoji-regex": "^8.0.0",
3085
+        "is-fullwidth-code-point": "^3.0.0",
3086
+        "strip-ansi": "^6.0.1"
3087
+      },
3088
+      "engines": {
3089
+        "node": ">=8"
3090
+      }
3091
+    },
3092
+    "node_modules/string-width-cjs/node_modules/emoji-regex": {
3093
+      "version": "8.0.0",
3094
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
3095
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
3096
+      "dev": true,
3097
+      "license": "MIT"
3098
+    },
3099
+    "node_modules/string-width/node_modules/ansi-regex": {
3100
+      "version": "6.2.2",
3101
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
3102
+      "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
3103
+      "dev": true,
3104
+      "license": "MIT",
3105
+      "engines": {
3106
+        "node": ">=12"
3107
+      },
3108
+      "funding": {
3109
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
3110
+      }
3111
+    },
3112
+    "node_modules/string-width/node_modules/strip-ansi": {
3113
+      "version": "7.2.0",
3114
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
3115
+      "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
3116
+      "dev": true,
3117
+      "license": "MIT",
3118
+      "dependencies": {
3119
+        "ansi-regex": "^6.2.2"
3120
+      },
3121
+      "engines": {
3122
+        "node": ">=12"
3123
+      },
3124
+      "funding": {
3125
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
3126
+      }
3127
+    },
20413128
     "node_modules/strip-ansi": {
20423129
       "version": "6.0.1",
20433130
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -2051,6 +3138,20 @@
20513138
         "node": ">=8"
20523139
       }
20533140
     },
3141
+    "node_modules/strip-ansi-cjs": {
3142
+      "name": "strip-ansi",
3143
+      "version": "6.0.1",
3144
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
3145
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
3146
+      "dev": true,
3147
+      "license": "MIT",
3148
+      "dependencies": {
3149
+        "ansi-regex": "^5.0.1"
3150
+      },
3151
+      "engines": {
3152
+        "node": ">=8"
3153
+      }
3154
+    },
20543155
     "node_modules/strip-json-comments": {
20553156
       "version": "3.1.1",
20563157
       "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -2167,6 +3268,13 @@
21673268
         "punycode": "^2.1.0"
21683269
       }
21693270
     },
3271
+    "node_modules/util-deprecate": {
3272
+      "version": "1.0.2",
3273
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
3274
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
3275
+      "dev": true,
3276
+      "license": "MIT"
3277
+    },
21703278
     "node_modules/vscode-jsonrpc": {
21713279
       "version": "8.2.0",
21723280
       "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz",
@@ -2244,6 +3352,94 @@
22443352
         "node": ">=0.10.0"
22453353
       }
22463354
     },
3355
+    "node_modules/workerpool": {
3356
+      "version": "9.3.4",
3357
+      "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz",
3358
+      "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==",
3359
+      "dev": true,
3360
+      "license": "Apache-2.0"
3361
+    },
3362
+    "node_modules/wrap-ansi": {
3363
+      "version": "7.0.0",
3364
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
3365
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
3366
+      "dev": true,
3367
+      "license": "MIT",
3368
+      "dependencies": {
3369
+        "ansi-styles": "^4.0.0",
3370
+        "string-width": "^4.1.0",
3371
+        "strip-ansi": "^6.0.0"
3372
+      },
3373
+      "engines": {
3374
+        "node": ">=10"
3375
+      },
3376
+      "funding": {
3377
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
3378
+      }
3379
+    },
3380
+    "node_modules/wrap-ansi-cjs": {
3381
+      "name": "wrap-ansi",
3382
+      "version": "7.0.0",
3383
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
3384
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
3385
+      "dev": true,
3386
+      "license": "MIT",
3387
+      "dependencies": {
3388
+        "ansi-styles": "^4.0.0",
3389
+        "string-width": "^4.1.0",
3390
+        "strip-ansi": "^6.0.0"
3391
+      },
3392
+      "engines": {
3393
+        "node": ">=10"
3394
+      },
3395
+      "funding": {
3396
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
3397
+      }
3398
+    },
3399
+    "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
3400
+      "version": "8.0.0",
3401
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
3402
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
3403
+      "dev": true,
3404
+      "license": "MIT"
3405
+    },
3406
+    "node_modules/wrap-ansi-cjs/node_modules/string-width": {
3407
+      "version": "4.2.3",
3408
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
3409
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
3410
+      "dev": true,
3411
+      "license": "MIT",
3412
+      "dependencies": {
3413
+        "emoji-regex": "^8.0.0",
3414
+        "is-fullwidth-code-point": "^3.0.0",
3415
+        "strip-ansi": "^6.0.1"
3416
+      },
3417
+      "engines": {
3418
+        "node": ">=8"
3419
+      }
3420
+    },
3421
+    "node_modules/wrap-ansi/node_modules/emoji-regex": {
3422
+      "version": "8.0.0",
3423
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
3424
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
3425
+      "dev": true,
3426
+      "license": "MIT"
3427
+    },
3428
+    "node_modules/wrap-ansi/node_modules/string-width": {
3429
+      "version": "4.2.3",
3430
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
3431
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
3432
+      "dev": true,
3433
+      "license": "MIT",
3434
+      "dependencies": {
3435
+        "emoji-regex": "^8.0.0",
3436
+        "is-fullwidth-code-point": "^3.0.0",
3437
+        "strip-ansi": "^6.0.1"
3438
+      },
3439
+      "engines": {
3440
+        "node": ">=8"
3441
+      }
3442
+    },
22473443
     "node_modules/wrappy": {
22483444
       "version": "1.0.2",
22493445
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -2251,6 +3447,83 @@
22513447
       "dev": true,
22523448
       "license": "ISC"
22533449
     },
3450
+    "node_modules/y18n": {
3451
+      "version": "5.0.8",
3452
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
3453
+      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
3454
+      "dev": true,
3455
+      "license": "ISC",
3456
+      "engines": {
3457
+        "node": ">=10"
3458
+      }
3459
+    },
3460
+    "node_modules/yargs": {
3461
+      "version": "17.7.2",
3462
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
3463
+      "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
3464
+      "dev": true,
3465
+      "license": "MIT",
3466
+      "dependencies": {
3467
+        "cliui": "^8.0.1",
3468
+        "escalade": "^3.1.1",
3469
+        "get-caller-file": "^2.0.5",
3470
+        "require-directory": "^2.1.1",
3471
+        "string-width": "^4.2.3",
3472
+        "y18n": "^5.0.5",
3473
+        "yargs-parser": "^21.1.1"
3474
+      },
3475
+      "engines": {
3476
+        "node": ">=12"
3477
+      }
3478
+    },
3479
+    "node_modules/yargs-parser": {
3480
+      "version": "21.1.1",
3481
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
3482
+      "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
3483
+      "dev": true,
3484
+      "license": "ISC",
3485
+      "engines": {
3486
+        "node": ">=12"
3487
+      }
3488
+    },
3489
+    "node_modules/yargs-unparser": {
3490
+      "version": "2.0.0",
3491
+      "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
3492
+      "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
3493
+      "dev": true,
3494
+      "license": "MIT",
3495
+      "dependencies": {
3496
+        "camelcase": "^6.0.0",
3497
+        "decamelize": "^4.0.0",
3498
+        "flat": "^5.0.2",
3499
+        "is-plain-obj": "^2.1.0"
3500
+      },
3501
+      "engines": {
3502
+        "node": ">=10"
3503
+      }
3504
+    },
3505
+    "node_modules/yargs/node_modules/emoji-regex": {
3506
+      "version": "8.0.0",
3507
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
3508
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
3509
+      "dev": true,
3510
+      "license": "MIT"
3511
+    },
3512
+    "node_modules/yargs/node_modules/string-width": {
3513
+      "version": "4.2.3",
3514
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
3515
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
3516
+      "dev": true,
3517
+      "license": "MIT",
3518
+      "dependencies": {
3519
+        "emoji-regex": "^8.0.0",
3520
+        "is-fullwidth-code-point": "^3.0.0",
3521
+        "strip-ansi": "^6.0.1"
3522
+      },
3523
+      "engines": {
3524
+        "node": ">=8"
3525
+      }
3526
+    },
22543527
     "node_modules/yocto-queue": {
22553528
       "version": "0.1.0",
22563529
       "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
package.jsonmodified
@@ -24,8 +24,13 @@
2424
     "languages": [
2525
       {
2626
         "id": "dlm",
27
-        "aliases": ["DLM", "Document Language Model"],
28
-        "extensions": [".dlm"],
27
+        "aliases": [
28
+          "DLM",
29
+          "Document Language Model"
30
+        ],
31
+        "extensions": [
32
+          ".dlm"
33
+        ],
2934
         "configuration": "./language-configuration.json"
3035
       }
3136
     ],
@@ -55,13 +60,34 @@
5560
       ]
5661
     },
5762
     "commands": [
58
-      { "command": "dlm.train", "title": "DLM: Train Current Document" },
59
-      { "command": "dlm.export", "title": "DLM: Export" },
60
-      { "command": "dlm.synth", "title": "DLM: Synth Instructions" },
61
-      { "command": "dlm.showHistory", "title": "DLM: Show Run History" },
62
-      { "command": "dlm.openStore", "title": "DLM: Open Store Directory" },
63
-      { "command": "dlm.insertInstruction", "title": "DLM: Insert Instruction Section" },
64
-      { "command": "dlm.insertPreference", "title": "DLM: Insert Preference Section" }
63
+      {
64
+        "command": "dlm.train",
65
+        "title": "DLM: Train Current Document"
66
+      },
67
+      {
68
+        "command": "dlm.export",
69
+        "title": "DLM: Export"
70
+      },
71
+      {
72
+        "command": "dlm.synth",
73
+        "title": "DLM: Synth Instructions"
74
+      },
75
+      {
76
+        "command": "dlm.showHistory",
77
+        "title": "DLM: Show Run History"
78
+      },
79
+      {
80
+        "command": "dlm.openStore",
81
+        "title": "DLM: Open Store Directory"
82
+      },
83
+      {
84
+        "command": "dlm.insertInstruction",
85
+        "title": "DLM: Insert Instruction Section"
86
+      },
87
+      {
88
+        "command": "dlm.insertPreference",
89
+        "title": "DLM: Insert Preference Section"
90
+      }
6591
     ],
6692
     "configuration": {
6793
       "title": "DLM",
@@ -98,16 +124,22 @@
98124
     "build": "esbuild src/extension.ts --bundle --outdir=out --platform=node --external:vscode --format=cjs && esbuild src/panel/webview/index.ts --bundle --platform=browser --format=iife --outfile=out/panel.js",
99125
     "watch": "npm run build -- --watch",
100126
     "lint": "eslint src/",
101
-    "test": "echo 'TODO: wire vscode-test-electron'",
127
+    "pretest": "tsc -p test/tsconfig.json",
128
+    "test": "node out-test/runTest.js",
102129
     "package": "vsce package"
103130
   },
104131
   "devDependencies": {
132
+    "@types/glob": "^8.1.0",
133
+    "@types/mocha": "^10.0.10",
105134
     "@types/node": "^20.0.0",
106135
     "@types/vscode": "^1.85.0",
107136
     "@typescript-eslint/eslint-plugin": "^7.0.0",
108137
     "@typescript-eslint/parser": "^7.0.0",
138
+    "@vscode/test-electron": "^2.5.2",
109139
     "esbuild": "^0.20.0",
110140
     "eslint": "^8.0.0",
141
+    "glob": "^13.0.6",
142
+    "mocha": "^11.7.5",
111143
     "typescript": "^5.4.0"
112144
   },
113145
   "dependencies": {
test/runTest.tsadded
@@ -0,0 +1,25 @@
1
+import * as path from "path";
2
+import { runTests } from "@vscode/test-electron";
3
+
4
+async function main() {
5
+  try {
6
+    const extensionDevelopmentPath = path.resolve(__dirname, "../../");
7
+    const extensionTestsPath = path.resolve(__dirname, "./suite/index");
8
+    const testWorkspace = path.resolve(__dirname, "./fixtures");
9
+
10
+    await runTests({
11
+      extensionDevelopmentPath,
12
+      extensionTestsPath,
13
+      launchArgs: [
14
+        testWorkspace,
15
+        "--disable-extensions",
16
+        "--disable-gpu",
17
+      ],
18
+    });
19
+  } catch (err) {
20
+    console.error("Failed to run tests:", err);
21
+    process.exit(1);
22
+  }
23
+}
24
+
25
+main();
test/suite/extension.test.tsadded
@@ -0,0 +1,211 @@
1
+import * as assert from "assert";
2
+import * as vscode from "vscode";
3
+import * as path from "path";
4
+
5
+const FIXTURE_DIR = path.resolve(__dirname, "../../test/fixtures");
6
+const SAMPLE_DLM = path.join(FIXTURE_DIR, "sample.dlm");
7
+
8
+suite("Extension Activation", () => {
9
+  test("extension is present in the registry", () => {
10
+    const ext = vscode.extensions.getExtension("tenseleyFlow.dlm-vsc");
11
+    // In dev mode the publisher may not match; check by scanning all extensions
12
+    const all = vscode.extensions.all.map((e) => e.id);
13
+    // The extension ID in dev is just the package name without publisher
14
+    assert.ok(
15
+      all.some((id) => id.includes("dlm-vsc")),
16
+      `dlm-vsc not found in extensions: ${all.join(", ")}`
17
+    );
18
+  });
19
+
20
+  test("dlm language is registered", () => {
21
+    // Opening a .dlm file should associate with our language
22
+    const langs = vscode.extensions.all
23
+      .flatMap((e) => {
24
+        const langs = e.packageJSON?.contributes?.languages;
25
+        return Array.isArray(langs) ? langs : [];
26
+      })
27
+      .filter((l: { id?: string }) => l.id === "dlm");
28
+    assert.ok(langs.length > 0, "dlm language not registered by any extension");
29
+  });
30
+
31
+  test("extension activates when opening a .dlm file", async () => {
32
+    const doc = await vscode.workspace.openTextDocument(SAMPLE_DLM);
33
+    await vscode.window.showTextDocument(doc);
34
+
35
+    // Give the extension a moment to activate
36
+    await sleep(2000);
37
+
38
+    const editor = vscode.window.activeTextEditor;
39
+    assert.ok(editor, "no active editor after opening .dlm file");
40
+    assert.strictEqual(editor.document.languageId, "dlm");
41
+  });
42
+});
43
+
44
+suite("Command Registration", () => {
45
+  const EXPECTED_COMMANDS = [
46
+    "dlm.train",
47
+    "dlm.export",
48
+    "dlm.synth",
49
+    "dlm.showHistory",
50
+    "dlm.openStore",
51
+    "dlm.insertInstruction",
52
+    "dlm.insertPreference",
53
+  ];
54
+
55
+  test("all 7 DLM commands are registered", async () => {
56
+    const allCommands = await vscode.commands.getCommands(true);
57
+    for (const cmd of EXPECTED_COMMANDS) {
58
+      assert.ok(
59
+        allCommands.includes(cmd),
60
+        `command ${cmd} not registered`
61
+      );
62
+    }
63
+  });
64
+});
65
+
66
+suite("Language Configuration", () => {
67
+  test(".dlm files get dlm languageId", async () => {
68
+    const doc = await vscode.workspace.openTextDocument(SAMPLE_DLM);
69
+    assert.strictEqual(doc.languageId, "dlm");
70
+  });
71
+
72
+  test("non-.dlm files do not get dlm languageId", async () => {
73
+    const doc = await vscode.workspace.openTextDocument({
74
+      content: "hello world",
75
+      language: "plaintext",
76
+    });
77
+    assert.notStrictEqual(doc.languageId, "dlm");
78
+  });
79
+});
80
+
81
+suite("Document Content", () => {
82
+  test("sample fixture has valid frontmatter", async () => {
83
+    const doc = await vscode.workspace.openTextDocument(SAMPLE_DLM);
84
+    const text = doc.getText();
85
+    assert.ok(text.startsWith("---"), "file does not start with ---");
86
+    assert.ok(text.includes("dlm_id:"), "missing dlm_id");
87
+    assert.ok(text.includes("base_model:"), "missing base_model");
88
+    assert.ok(text.includes("dlm_version:"), "missing dlm_version");
89
+
90
+    // Count frontmatter delimiters
91
+    const lines = text.split("\n");
92
+    const delimCount = lines.filter((l) => l.trim() === "---").length;
93
+    assert.ok(delimCount >= 2, `expected at least 2 --- delimiters, got ${delimCount}`);
94
+  });
95
+
96
+  test("sample fixture has instruction sections", async () => {
97
+    const doc = await vscode.workspace.openTextDocument(SAMPLE_DLM);
98
+    const text = doc.getText();
99
+    const fences = text.split("\n").filter((l) => l.trim().startsWith("::instruction::"));
100
+    assert.ok(fences.length >= 2, `expected at least 2 instruction fences, got ${fences.length}`);
101
+  });
102
+});
103
+
104
+suite("Edge Cases", () => {
105
+  test("commands warn when no .dlm file is open", async () => {
106
+    // Open a non-.dlm file
107
+    const doc = await vscode.workspace.openTextDocument({
108
+      content: "not a dlm file",
109
+      language: "plaintext",
110
+    });
111
+    await vscode.window.showTextDocument(doc);
112
+
113
+    // These should not throw — they show a warning message instead
114
+    await vscode.commands.executeCommand("dlm.train");
115
+    await vscode.commands.executeCommand("dlm.export");
116
+    await vscode.commands.executeCommand("dlm.synth");
117
+    await vscode.commands.executeCommand("dlm.insertInstruction");
118
+  });
119
+
120
+  test("commands handle no active editor gracefully", async () => {
121
+    // Close all editors
122
+    await vscode.commands.executeCommand("workbench.action.closeAllEditors");
123
+
124
+    // These should not throw
125
+    await vscode.commands.executeCommand("dlm.train");
126
+    await vscode.commands.executeCommand("dlm.insertInstruction");
127
+  });
128
+
129
+  test("opening an empty file with .dlm extension", async () => {
130
+    const emptyUri = vscode.Uri.file(path.join(FIXTURE_DIR, "empty.dlm"));
131
+    try {
132
+      // Create a temporary empty .dlm
133
+      await vscode.workspace.fs.writeFile(emptyUri, Buffer.from(""));
134
+      const doc = await vscode.workspace.openTextDocument(emptyUri);
135
+      assert.strictEqual(doc.languageId, "dlm");
136
+      assert.strictEqual(doc.getText(), "");
137
+    } finally {
138
+      try {
139
+        await vscode.workspace.fs.delete(emptyUri);
140
+      } catch {
141
+        /* cleanup best-effort */
142
+      }
143
+    }
144
+  });
145
+
146
+  test("opening a .dlm with invalid frontmatter does not crash", async () => {
147
+    const badUri = vscode.Uri.file(path.join(FIXTURE_DIR, "bad.dlm"));
148
+    try {
149
+      await vscode.workspace.fs.writeFile(
150
+        badUri,
151
+        Buffer.from("not valid frontmatter\njust plain text\n")
152
+      );
153
+      const doc = await vscode.workspace.openTextDocument(badUri);
154
+      await vscode.window.showTextDocument(doc);
155
+      assert.strictEqual(doc.languageId, "dlm");
156
+      // Extension should still be alive — commands should still be registered
157
+      const cmds = await vscode.commands.getCommands(true);
158
+      assert.ok(cmds.includes("dlm.train"));
159
+    } finally {
160
+      try {
161
+        await vscode.workspace.fs.delete(badUri);
162
+      } catch {
163
+        /* cleanup best-effort */
164
+      }
165
+    }
166
+  });
167
+});
168
+
169
+suite("Configuration", () => {
170
+  test("dlm.command setting exists with default", () => {
171
+    const config = vscode.workspace.getConfiguration("dlm");
172
+    const cmd = config.get<string>("command");
173
+    assert.strictEqual(cmd, "uv run dlm");
174
+  });
175
+
176
+  test("dlm.lspPath setting exists with default", () => {
177
+    const config = vscode.workspace.getConfiguration("dlm");
178
+    const lsp = config.get<string>("lspPath");
179
+    assert.strictEqual(lsp, "dlm-lsp");
180
+  });
181
+
182
+  test("dlm.home setting exists and defaults to empty", () => {
183
+    const config = vscode.workspace.getConfiguration("dlm");
184
+    const home = config.get<string>("home");
185
+    assert.strictEqual(home, "");
186
+  });
187
+
188
+  test("dlm.watchOnSave setting exists and defaults to false", () => {
189
+    const config = vscode.workspace.getConfiguration("dlm");
190
+    const watch = config.get<boolean>("watchOnSave");
191
+    assert.strictEqual(watch, false);
192
+  });
193
+});
194
+
195
+suite("Webview Provider", () => {
196
+  test("DLM side panel view is registered", () => {
197
+    // The view should be declared in the extension's contributes
198
+    const ext = vscode.extensions.all.find((e) => e.id.includes("dlm-vsc"));
199
+    if (ext) {
200
+      const views = ext.packageJSON?.contributes?.views?.["dlm-panel"];
201
+      assert.ok(Array.isArray(views), "dlm-panel views not declared");
202
+      const panel = views.find((v: { id?: string }) => v.id === "dlm.sidePanel");
203
+      assert.ok(panel, "dlm.sidePanel view not found");
204
+      assert.strictEqual(panel.type, "webview");
205
+    }
206
+  });
207
+});
208
+
209
+function sleep(ms: number): Promise<void> {
210
+  return new Promise((resolve) => setTimeout(resolve, ms));
211
+}
test/suite/index.tsadded
@@ -0,0 +1,24 @@
1
+import * as path from "path";
2
+import Mocha from "mocha";
3
+import { glob } from "glob";
4
+
5
+export async function run(): Promise<void> {
6
+  const mocha = new Mocha({ ui: "bdd", timeout: 30_000 });
7
+
8
+  const testsRoot = path.resolve(__dirname);
9
+  const files = await glob("**/*.test.js", { cwd: testsRoot });
10
+
11
+  for (const f of files) {
12
+    mocha.addFile(path.resolve(testsRoot, f));
13
+  }
14
+
15
+  return new Promise<void>((resolve, reject) => {
16
+    mocha.run((failures) => {
17
+      if (failures > 0) {
18
+        reject(new Error(`${failures} test(s) failed.`));
19
+      } else {
20
+        resolve();
21
+      }
22
+    });
23
+  });
24
+}
test/tsconfig.jsonadded
@@ -0,0 +1,17 @@
1
+{
2
+  "compilerOptions": {
3
+    "target": "ES2022",
4
+    "module": "commonjs",
5
+    "lib": ["ES2022"],
6
+    "outDir": "../out-test",
7
+    "rootDir": ".",
8
+    "strict": true,
9
+    "esModuleInterop": true,
10
+    "skipLibCheck": true,
11
+    "forceConsistentCasingInFileNames": true,
12
+    "resolveJsonModule": true,
13
+    "sourceMap": true
14
+  },
15
+  "include": ["./**/*.ts"],
16
+  "exclude": ["../node_modules"]
17
+}