authorgravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-02-15 21:37:52-08:00
committergravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-02-16 00:51:53-08:00
log2cc147a320759892fbaef7f6c9430007e3db8888
tree115d8d19a30635ee7a6bfc664ec1c943d21d0085
parent58a283e05798c101249323984c79a9ba0c02d1cc
signaturebadge-check Signed by SSH key SHA256:xbd+BjjhyBfwk7GVoURf9Yx0gzDerHbvYv7SddNWmAs

feat: wasm build


16 files changed, 2670 insertions(+), 8 deletions(-)

.gitignore+2
...@@ -1,2 +1,4 @@...@@ -1,2 +1,4 @@
1/target1/target
2/lib/bindgen
3/lib/node_modules
2.tmp4.tmp
ARCHITECTURE.md+16
...@@ -1,5 +1,10 @@...@@ -1,5 +1,10 @@
1# architecture1# architecture
22
3## `src/`: rust code
4
5the rust code in `src` implements most of markodown. it exports a cli for
6testing. most of the tests are on the rust code
7
3- `src/lib.rs` - main library, primary function `transform`8- `src/lib.rs` - main library, primary function `transform`
4- `src/main.rs` - main cli9- `src/main.rs` - main cli
5- `src/typescript.rs` - wrappers around oxc parser to expose parsers for10- `src/typescript.rs` - wrappers around oxc parser to expose parsers for
...@@ -24,3 +29,14 @@ reprinted as text at the end. the set of rules:...@@ -24,3 +29,14 @@ reprinted as text at the end. the set of rules:
24 - `inline_tags.rs` parser for Marko tags inline29 - `inline_tags.rs` parser for Marko tags inline
2530
26these rules are configured in `plugin/mod.rs` in `add_all`.31these rules are configured in `plugin/mod.rs` in `add_all`.
32
33## `lib/`: javascript package
34
35published to jsr and then to npm. this is a thin wrapper on top of wasm-bindgen,
36with plugins for the web ecosystem!
37
38- `@clo/markodown` - primary import (`lib/mod.ts`)
39- `@clo/markodown/rollup.ts` - rollup or vite plugin (`lib/rollup.ts`)
40- `@clo/markodown/esbuild.ts` - esbuild or bun plugin (`lib/esbuild.ts`)
41
42these are tested with vitest: `cd lib && npx vitest`
Cargo.lock+69-1
...@@ -342,6 +342,16 @@ version = "1.0.17"...@@ -342,6 +342,16 @@ version = "1.0.17"
342source = "registry+https://github.com/rust-lang/crates.io-index"342source = "registry+https://github.com/rust-lang/crates.io-index"
343checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"343checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
344344
345[[package]]
346name = "js-sys"
347version = "0.3.85"
348source = "registry+https://github.com/rust-lang/crates.io-index"
349checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3"
350dependencies = [
351 "once_cell",
352 "wasm-bindgen",
353]
354
345[[package]]355[[package]]
346name = "libc"356name = "libc"
347version = "0.2.180"357version = "0.2.180"
...@@ -391,7 +401,7 @@ dependencies = [...@@ -391,7 +401,7 @@ dependencies = [
391401
392[[package]]402[[package]]
393name = "markodown"403name = "markodown"
394version = "0.1.0"404version = "1.0.0"
395dependencies = [405dependencies = [
396 "clap",406 "clap",
397 "markdown-it",407 "markdown-it",
...@@ -401,8 +411,10 @@ dependencies = [...@@ -401,8 +411,10 @@ dependencies = [
401 "oxc_parser",411 "oxc_parser",
402 "oxc_span",412 "oxc_span",
403 "serde",413 "serde",
414 "serde-wasm-bindgen",
404 "serde_json",415 "serde_json",
405 "serde_yml",416 "serde_yml",
417 "wasm-bindgen",
406]418]
407419
408[[package]]420[[package]]
...@@ -837,6 +849,17 @@ dependencies = [...@@ -837,6 +849,17 @@ dependencies = [
837 "serde_derive",849 "serde_derive",
838]850]
839851
852[[package]]
853name = "serde-wasm-bindgen"
854version = "0.6.5"
855source = "registry+https://github.com/rust-lang/crates.io-index"
856checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b"
857dependencies = [
858 "js-sys",
859 "serde",
860 "wasm-bindgen",
861]
862
840[[package]]863[[package]]
841name = "serde_core"864name = "serde_core"
842version = "1.0.228"865version = "1.0.228"
...@@ -1071,6 +1094,51 @@ version = "0.9.5"...@@ -1071,6 +1094,51 @@ version = "0.9.5"
1071source = "registry+https://github.com/rust-lang/crates.io-index"1094source = "registry+https://github.com/rust-lang/crates.io-index"
1072checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"1095checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
10731096
1097[[package]]
1098name = "wasm-bindgen"
1099version = "0.2.108"
1100source = "registry+https://github.com/rust-lang/crates.io-index"
1101checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566"
1102dependencies = [
1103 "cfg-if",
1104 "once_cell",
1105 "rustversion",
1106 "wasm-bindgen-macro",
1107 "wasm-bindgen-shared",
1108]
1109
1110[[package]]
1111name = "wasm-bindgen-macro"
1112version = "0.2.108"
1113source = "registry+https://github.com/rust-lang/crates.io-index"
1114checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608"
1115dependencies = [
1116 "quote",
1117 "wasm-bindgen-macro-support",
1118]
1119
1120[[package]]
1121name = "wasm-bindgen-macro-support"
1122version = "0.2.108"
1123source = "registry+https://github.com/rust-lang/crates.io-index"
1124checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55"
1125dependencies = [
1126 "bumpalo",
1127 "proc-macro2",
1128 "quote",
1129 "syn 2.0.114",
1130 "wasm-bindgen-shared",
1131]
1132
1133[[package]]
1134name = "wasm-bindgen-shared"
1135version = "0.2.108"
1136source = "registry+https://github.com/rust-lang/crates.io-index"
1137checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12"
1138dependencies = [
1139 "unicode-ident",
1140]
1141
1074[[package]]1142[[package]]
1075name = "windows-link"1143name = "windows-link"
1076version = "0.2.1"1144version = "0.2.1"
Cargo.toml+6-1
...@@ -1,6 +1,6 @@...@@ -1,6 +1,6 @@
1[package]1[package]
2name = "markodown"2name = "markodown"
3version = "0.1.0"3version = "1.0.0"
4edition = "2024"4edition = "2024"
55
6[lib]6[lib]
...@@ -17,3 +17,8 @@ oxc_parser = "0.96.0"...@@ -17,3 +17,8 @@ oxc_parser = "0.96.0"
17oxc_span = "0.96.0"17oxc_span = "0.96.0"
18serde_json = "1.0"18serde_json = "1.0"
19serde_yml = "0.0.12"19serde_yml = "0.0.12"
20wasm-bindgen = { version = "0.2" }
21serde-wasm-bindgen = "0.6.5"
22
23[rust-analyzer.cargo]
24features = ["wasm"]
lib/esbuild.ts created+87
...@@ -0,0 +1,87 @@
1import * as markodown from "./mod";
2import * as marko from "@marko/compiler";
3import type * as esbuild from "esbuild";
4import * as fs from "node:fs/promises";
5import * as path from "node:path";
6
7export type EsbuildPluginOptions =
8 & Omit<markodown.TransformOptions, "source" | "format">
9 & {
10 marko?: typeof marko;
11 markoOptions?: marko.Config;
12 };
13
14/**
15 * esbuild or Bun bundling plugin. Because Bun markets itself as compatible with
16 * plugins made for esbuild, this plugin is designed to work around differences
17 * in Bun's implementation to allow it to work. Bugs reported for subtle behavior
18 * mistakes that are not present when using `esbuild` will not be fixed.
19 */
20export default function esbuildPlugin(
21 options: EsbuildPluginOptions = {},
22): esbuild.Plugin {
23 const { compile } = options.marko ?? marko;
24 return {
25 name: "@clo/markodown/esbuild.ts",
26 async setup(b) {
27 b.onLoad(
28 { filter: /\.(?:mdo|mkd)$/ },
29 // NOTE: Bun doesn't pass `with`, so a default is needed
30 async ({ path: file, suffix, with: { type } = {} }) => {
31 if (type || suffix) {
32 // NOTE: Bun does not appear to support fallbacks with `null`
33 /* v8 ignore next -- @preserve */
34 // @ts-expect-error (third-party types not installed)
35 if (typeof Bun !== "undefined" && !b.esbuild?.build) {
36 return {
37 contents: (await fs.readFile(file)),
38 loader: path.extname(file).slice(1) as "tsx" | "ts",
39 };
40 }
41
42 return null;
43 }
44 const result = markodown.transform({
45 ...options,
46 source: await fs.readFile(file, "utf-8"),
47 });
48 if (!result.success) {
49 return {
50 errors: result.errors.map((err) => ({
51 text: err.message,
52 location: {
53 line: err.line,
54 column: err.column - 1,
55 },
56 notes: err.labels.map((note) => ({
57 text: note.message,
58 location: {
59 line: note.line,
60 column: note.column - 1,
61 length: note.width,
62 },
63 })),
64 })),
65 watchFiles: [file],
66 };
67 }
68
69 // TODO: source maps!
70 // TODO: parse marko errors
71 const { code, meta } = await marko.compile(
72 result.text,
73 file + ".marko",
74 options?.markoOptions ?? {},
75 );
76
77 return {
78 loader: "js",
79 contents: code,
80 watchFiles: meta.watchFiles,
81 resolveDir: path.dirname(file),
82 };
83 },
84 );
85 },
86 };
87}
lib/jsr.json created+4
...@@ -0,0 +1,4 @@
1{
2 "name": "@clo/markodown",
3 "version": "1.0.0-rc.1"
4}
lib/mod.test.ts created+127
...@@ -0,0 +1,127 @@
1import { describe, it, expect } from "vitest";
2import * as markodown from "./mod.ts";
3
4describe("transform", () => {
5 describe("success cases", () => {
6 it("transforms basic markdown", () => {
7 const result = markodown.transform({ source: "**hello world**" });
8 expect(result.success).toBe(true);
9 expect(result.errors).toEqual([]);
10 if (result.success) {
11 expect(result.text).toContain("<strong>hello world</strong>");
12 }
13 });
14
15 it("transforms headings", () => {
16 const result = markodown.transform({ source: "# Hello" });
17 expect(result.success).toBe(true);
18 if (result.success) {
19 expect(result.text).toContain("<h1>Hello</h1>");
20 }
21 });
22
23 it("transforms paragraphs", () => {
24 const result = markodown.transform({ source: "Hello\n\nWorld" });
25 expect(result.success).toBe(true);
26 if (result.success) {
27 expect(result.text).toContain("<p>Hello</p>");
28 expect(result.text).toContain("<p>World</p>");
29 }
30 });
31 });
32
33 describe("error handling", () => {
34 it("reports unclosed tag error with line and column", () => {
35 const result = markodown.transform({ source: "<div>\nhello" });
36 expect(result.success).toBe(false);
37 if (!result.success) {
38 expect(result.errors.length).toBeGreaterThan(0);
39 const error = result.errors[0];
40 expect(error.message).toContain("Unclosed tag");
41 expect(error.line).toBe(1);
42 expect(error.column).toBe(2); // after '<'
43 }
44 });
45
46 it("reports mismatched closing tag", () => {
47 const result = markodown.transform({ source: "<div>\nhello\n</span>" });
48 expect(result.success).toBe(false);
49 if (!result.success) {
50 expect(result.errors.length).toBeGreaterThan(0);
51 const error = result.errors[0];
52 expect(error.message).toContain("Mismatched closing tag");
53 // Should have labels for both open and close positions
54 expect(error.labels.length).toBe(2);
55 // First label: opened here
56 expect(error.labels[0].message).toBe("opened here");
57 expect(error.labels[0].line).toBe(1);
58 // Second label: closed here
59 expect(error.labels[1].message).toBe("closed here");
60 expect(error.labels[1].line).toBe(3);
61 }
62 });
63
64 it("reports closing tag without open", () => {
65 const result = markodown.transform({ source: "</div>" });
66 expect(result.success).toBe(false);
67 if (!result.success) {
68 expect(result.errors.length).toBeGreaterThan(0);
69 const error = result.errors[0];
70 expect(error.message).toContain("without matching open");
71 expect(error.line).toBe(1);
72 }
73 });
74
75 it("reports error on correct line for multiline input", () => {
76 const result = markodown.transform({
77 source: "line 1\nline 2\nline 3\n<unclosed>",
78 });
79 expect(result.success).toBe(false);
80 if (!result.success) {
81 expect(result.errors.length).toBeGreaterThan(0);
82 const error = result.errors[0];
83 expect(error.line).toBe(4); // error is on line 4
84 }
85 });
86
87 it("absorbs first label position into root error", () => {
88 // When there's a single label without message, its position
89 // should be absorbed into the root error's line/column
90 const result = markodown.transform({ source: "hello\n\n</>" });
91 expect(result.success).toBe(false);
92 if (!result.success) {
93 expect(result.errors.length).toBeGreaterThan(0);
94 const error = result.errors[0];
95 expect(error.line).toBe(3); // The </> is on line 3
96 // Single label without message should be absorbed (empty labels array)
97 expect(error.labels).toEqual([]);
98 }
99 });
100
101 it("forwards labels with messages", () => {
102 // When labels have messages, they should be forwarded
103 const result = markodown.transform({ source: "<foo>\n\n</bar>" });
104 expect(result.success).toBe(false);
105 if (!result.success) {
106 const error = result.errors[0];
107 // Labels with "opened here" and "closed here" should be forwarded
108 expect(error.labels.length).toBe(2);
109 expect(error.labels[0].message).toBeTruthy();
110 expect(error.labels[1].message).toBeTruthy();
111 }
112 });
113
114 it("includes width in labels", () => {
115 const result = markodown.transform({ source: "<div>\n</span>" });
116 expect(result.success).toBe(false);
117 if (!result.success) {
118 const error = result.errors[0];
119 expect(error.labels.length).toBe(2);
120 // "div" has width 3
121 expect(error.labels[0].width).toBe(3);
122 // "span" has width 4
123 expect(error.labels[1].width).toBe(4);
124 }
125 });
126 });
127});
lib/mod.ts created+73
...@@ -0,0 +1,73 @@
1import * as wasm from "./bindgen/markodown.js";
2import bytes from "./bindgen/wasm_bytes.js";
3
4wasm.initSync({ module: bytes });
5
6type Transformed = Success | Failure;
7
8export interface TransformOptions {
9 source: string;
10 /**
11 * Specify the allowed output formats. For simplicity, pass `marko`. By
12 * including `html`, you can opt into a faster codepath where plain HTML is
13 * returned to you as such, when no Marko features are used.
14 * @default ["marko"]
15 */
16 format?: Array<"marko" | "html">;
17 /** Wraps the component in another component. Enables Table of Contents generation */
18 layoutImport?: string;
19}
20
21export type OutputFormat = "marko" | "html";
22
23export interface Success {
24 success: true;
25 text: string;
26 errors: [];
27 outline: Header[] | null;
28}
29
30export interface Failure {
31 success: false;
32 text: null;
33 errors: TransformError[];
34 outline: Header[] | null;
35}
36
37export interface Header {
38 level: 1 | 2 | 3 | 4 | 5 | 6;
39 id: string;
40 html: string;
41}
42
43export interface TransformError {
44 message: string;
45 labels: LabelledSpan[];
46 line: number;
47 column: number;
48}
49
50export interface LabelledSpan {
51 message: string;
52 line: number;
53 column: number;
54 width: number;
55}
56
57export function transform(options: TransformOptions): Transformed {
58 const formats = options.format ?? ["marko"];
59 let forceFormat = null;
60 if (formats.includes("html") && !formats.includes("marko")) {
61 forceFormat = wasm.OutputFormat.Html;
62 } else if (formats.includes("marko") && !formats.includes("html")) {
63 forceFormat = wasm.OutputFormat.Marko;
64 } else if (!formats.includes("html") && !formats.includes("marko")) {
65 throw new Error("No supported formats in " + JSON.stringify(formats));
66 }
67
68 return wasm.transform(
69 options.source,
70 forceFormat,
71 options?.layoutImport,
72 );
73}
lib/package-lock.json created+1995
...@@ -0,0 +1,1995 @@
1{
2 "name": "lib",
3 "lockfileVersion": 3,
4 "requires": true,
5 "packages": {
6 "": {
7 "devDependencies": {
8 "@marko/compiler": "^5.39.55",
9 "@types/node": "^25.2.3",
10 "browserslist": "^4.28.1",
11 "esbuild": "^0.27.3",
12 "marko": "^5.38.24",
13 "vite": "^7.3.1",
14 "vitest": "^4.0.18"
15 }
16 },
17 "node_modules/@esbuild/aix-ppc64": {
18 "version": "0.27.3",
19 "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz",
20 "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==",
21 "cpu": [
22 "ppc64"
23 ],
24 "dev": true,
25 "license": "MIT",
26 "optional": true,
27 "os": [
28 "aix"
29 ],
30 "engines": {
31 "node": ">=18"
32 }
33 },
34 "node_modules/@esbuild/android-arm": {
35 "version": "0.27.3",
36 "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz",
37 "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==",
38 "cpu": [
39 "arm"
40 ],
41 "dev": true,
42 "license": "MIT",
43 "optional": true,
44 "os": [
45 "android"
46 ],
47 "engines": {
48 "node": ">=18"
49 }
50 },
51 "node_modules/@esbuild/android-arm64": {
52 "version": "0.27.3",
53 "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz",
54 "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==",
55 "cpu": [
56 "arm64"
57 ],
58 "dev": true,
59 "license": "MIT",
60 "optional": true,
61 "os": [
62 "android"
63 ],
64 "engines": {
65 "node": ">=18"
66 }
67 },
68 "node_modules/@esbuild/android-x64": {
69 "version": "0.27.3",
70 "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz",
71 "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==",
72 "cpu": [
73 "x64"
74 ],
75 "dev": true,
76 "license": "MIT",
77 "optional": true,
78 "os": [
79 "android"
80 ],
81 "engines": {
82 "node": ">=18"
83 }
84 },
85 "node_modules/@esbuild/darwin-arm64": {
86 "version": "0.27.3",
87 "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz",
88 "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==",
89 "cpu": [
90 "arm64"
91 ],
92 "dev": true,
93 "license": "MIT",
94 "optional": true,
95 "os": [
96 "darwin"
97 ],
98 "engines": {
99 "node": ">=18"
100 }
101 },
102 "node_modules/@esbuild/darwin-x64": {
103 "version": "0.27.3",
104 "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz",
105 "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==",
106 "cpu": [
107 "x64"
108 ],
109 "dev": true,
110 "license": "MIT",
111 "optional": true,
112 "os": [
113 "darwin"
114 ],
115 "engines": {
116 "node": ">=18"
117 }
118 },
119 "node_modules/@esbuild/freebsd-arm64": {
120 "version": "0.27.3",
121 "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz",
122 "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==",
123 "cpu": [
124 "arm64"
125 ],
126 "dev": true,
127 "license": "MIT",
128 "optional": true,
129 "os": [
130 "freebsd"
131 ],
132 "engines": {
133 "node": ">=18"
134 }
135 },
136 "node_modules/@esbuild/freebsd-x64": {
137 "version": "0.27.3",
138 "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz",
139 "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==",
140 "cpu": [
141 "x64"
142 ],
143 "dev": true,
144 "license": "MIT",
145 "optional": true,
146 "os": [
147 "freebsd"
148 ],
149 "engines": {
150 "node": ">=18"
151 }
152 },
153 "node_modules/@esbuild/linux-arm": {
154 "version": "0.27.3",
155 "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz",
156 "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==",
157 "cpu": [
158 "arm"
159 ],
160 "dev": true,
161 "license": "MIT",
162 "optional": true,
163 "os": [
164 "linux"
165 ],
166 "engines": {
167 "node": ">=18"
168 }
169 },
170 "node_modules/@esbuild/linux-arm64": {
171 "version": "0.27.3",
172 "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz",
173 "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==",
174 "cpu": [
175 "arm64"
176 ],
177 "dev": true,
178 "license": "MIT",
179 "optional": true,
180 "os": [
181 "linux"
182 ],
183 "engines": {
184 "node": ">=18"
185 }
186 },
187 "node_modules/@esbuild/linux-ia32": {
188 "version": "0.27.3",
189 "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz",
190 "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==",
191 "cpu": [
192 "ia32"
193 ],
194 "dev": true,
195 "license": "MIT",
196 "optional": true,
197 "os": [
198 "linux"
199 ],
200 "engines": {
201 "node": ">=18"
202 }
203 },
204 "node_modules/@esbuild/linux-loong64": {
205 "version": "0.27.3",
206 "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz",
207 "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==",
208 "cpu": [
209 "loong64"
210 ],
211 "dev": true,
212 "license": "MIT",
213 "optional": true,
214 "os": [
215 "linux"
216 ],
217 "engines": {
218 "node": ">=18"
219 }
220 },
221 "node_modules/@esbuild/linux-mips64el": {
222 "version": "0.27.3",
223 "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz",
224 "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==",
225 "cpu": [
226 "mips64el"
227 ],
228 "dev": true,
229 "license": "MIT",
230 "optional": true,
231 "os": [
232 "linux"
233 ],
234 "engines": {
235 "node": ">=18"
236 }
237 },
238 "node_modules/@esbuild/linux-ppc64": {
239 "version": "0.27.3",
240 "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz",
241 "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==",
242 "cpu": [
243 "ppc64"
244 ],
245 "dev": true,
246 "license": "MIT",
247 "optional": true,
248 "os": [
249 "linux"
250 ],
251 "engines": {
252 "node": ">=18"
253 }
254 },
255 "node_modules/@esbuild/linux-riscv64": {
256 "version": "0.27.3",
257 "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz",
258 "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==",
259 "cpu": [
260 "riscv64"
261 ],
262 "dev": true,
263 "license": "MIT",
264 "optional": true,
265 "os": [
266 "linux"
267 ],
268 "engines": {
269 "node": ">=18"
270 }
271 },
272 "node_modules/@esbuild/linux-s390x": {
273 "version": "0.27.3",
274 "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz",
275 "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==",
276 "cpu": [
277 "s390x"
278 ],
279 "dev": true,
280 "license": "MIT",
281 "optional": true,
282 "os": [
283 "linux"
284 ],
285 "engines": {
286 "node": ">=18"
287 }
288 },
289 "node_modules/@esbuild/linux-x64": {
290 "version": "0.27.3",
291 "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz",
292 "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==",
293 "cpu": [
294 "x64"
295 ],
296 "dev": true,
297 "license": "MIT",
298 "optional": true,
299 "os": [
300 "linux"
301 ],
302 "engines": {
303 "node": ">=18"
304 }
305 },
306 "node_modules/@esbuild/netbsd-arm64": {
307 "version": "0.27.3",
308 "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz",
309 "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==",
310 "cpu": [
311 "arm64"
312 ],
313 "dev": true,
314 "license": "MIT",
315 "optional": true,
316 "os": [
317 "netbsd"
318 ],
319 "engines": {
320 "node": ">=18"
321 }
322 },
323 "node_modules/@esbuild/netbsd-x64": {
324 "version": "0.27.3",
325 "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz",
326 "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==",
327 "cpu": [
328 "x64"
329 ],
330 "dev": true,
331 "license": "MIT",
332 "optional": true,
333 "os": [
334 "netbsd"
335 ],
336 "engines": {
337 "node": ">=18"
338 }
339 },
340 "node_modules/@esbuild/openbsd-arm64": {
341 "version": "0.27.3",
342 "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz",
343 "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==",
344 "cpu": [
345 "arm64"
346 ],
347 "dev": true,
348 "license": "MIT",
349 "optional": true,
350 "os": [
351 "openbsd"
352 ],
353 "engines": {
354 "node": ">=18"
355 }
356 },
357 "node_modules/@esbuild/openbsd-x64": {
358 "version": "0.27.3",
359 "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz",
360 "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==",
361 "cpu": [
362 "x64"
363 ],
364 "dev": true,
365 "license": "MIT",
366 "optional": true,
367 "os": [
368 "openbsd"
369 ],
370 "engines": {
371 "node": ">=18"
372 }
373 },
374 "node_modules/@esbuild/openharmony-arm64": {
375 "version": "0.27.3",
376 "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz",
377 "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==",
378 "cpu": [
379 "arm64"
380 ],
381 "dev": true,
382 "license": "MIT",
383 "optional": true,
384 "os": [
385 "openharmony"
386 ],
387 "engines": {
388 "node": ">=18"
389 }
390 },
391 "node_modules/@esbuild/sunos-x64": {
392 "version": "0.27.3",
393 "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz",
394 "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==",
395 "cpu": [
396 "x64"
397 ],
398 "dev": true,
399 "license": "MIT",
400 "optional": true,
401 "os": [
402 "sunos"
403 ],
404 "engines": {
405 "node": ">=18"
406 }
407 },
408 "node_modules/@esbuild/win32-arm64": {
409 "version": "0.27.3",
410 "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz",
411 "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==",
412 "cpu": [
413 "arm64"
414 ],
415 "dev": true,
416 "license": "MIT",
417 "optional": true,
418 "os": [
419 "win32"
420 ],
421 "engines": {
422 "node": ">=18"
423 }
424 },
425 "node_modules/@esbuild/win32-ia32": {
426 "version": "0.27.3",
427 "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz",
428 "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==",
429 "cpu": [
430 "ia32"
431 ],
432 "dev": true,
433 "license": "MIT",
434 "optional": true,
435 "os": [
436 "win32"
437 ],
438 "engines": {
439 "node": ">=18"
440 }
441 },
442 "node_modules/@esbuild/win32-x64": {
443 "version": "0.27.3",
444 "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz",
445 "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==",
446 "cpu": [
447 "x64"
448 ],
449 "dev": true,
450 "license": "MIT",
451 "optional": true,
452 "os": [
453 "win32"
454 ],
455 "engines": {
456 "node": ">=18"
457 }
458 },
459 "node_modules/@jridgewell/sourcemap-codec": {
460 "version": "1.5.5",
461 "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
462 "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
463 "dev": true,
464 "license": "MIT"
465 },
466 "node_modules/@luxass/strip-json-comments": {
467 "version": "1.4.0",
468 "resolved": "https://registry.npmjs.org/@luxass/strip-json-comments/-/strip-json-comments-1.4.0.tgz",
469 "integrity": "sha512-Zl343to4u/t8jz1q7R/1UY6hLX+344cwPLEXsIYthVwdU5zyjuVBGcpf2E24+QZkwFfRfmnHTcscreQzWn3hiA==",
470 "dev": true,
471 "license": "MIT",
472 "engines": {
473 "node": ">=18"
474 }
475 },
476 "node_modules/@marko/compiler": {
477 "version": "5.39.55",
478 "resolved": "https://registry.npmjs.org/@marko/compiler/-/compiler-5.39.55.tgz",
479 "integrity": "sha512-QHukS/gMzxKWcF5xALVAH1swVAudCXC5DA2DDC5r+TzBiQ0v+uz7D8oNlwxO2xjTRPu7AUukcufHscbhytcyGg==",
480 "dev": true,
481 "license": "MIT",
482 "dependencies": {
483 "@luxass/strip-json-comments": "^1.4.0",
484 "complain": "^1.6.1",
485 "he": "^1.2.0",
486 "htmljs-parser": "^5.7.4",
487 "jsesc": "^3.1.0",
488 "kleur": "^4.1.5",
489 "lasso-package-root": "^1.0.1",
490 "raptor-regexp": "^1.0.1",
491 "raptor-util": "^3.2.0",
492 "relative-import-path": "^1.0.0",
493 "resolve-from": "^5.0.0",
494 "self-closing-tags": "^1.0.1",
495 "source-map-support": "^0.5.21"
496 },
497 "engines": {
498 "node": "18 || 20 || >=22"
499 }
500 },
501 "node_modules/@marko/runtime-tags": {
502 "version": "6.0.145",
503 "resolved": "https://registry.npmjs.org/@marko/runtime-tags/-/runtime-tags-6.0.145.tgz",
504 "integrity": "sha512-3M65F25XylMRoitQZ7NmvSCk8IliBwhT8ay5AJaChJ55NvR9B2l2mnT0YcDvVQjqxKGUYU/xKfNmFYGcCj2RVA==",
505 "dev": true,
506 "license": "MIT",
507 "dependencies": {
508 "@marko/compiler": "^5.39.53",
509 "csstype": "^3.2.3",
510 "magic-string": "^0.30.21"
511 },
512 "engines": {
513 "node": "18 || 20 || >=22"
514 }
515 },
516 "node_modules/@rollup/rollup-android-arm-eabi": {
517 "version": "4.57.1",
518 "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz",
519 "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==",
520 "cpu": [
521 "arm"
522 ],
523 "dev": true,
524 "license": "MIT",
525 "optional": true,
526 "os": [
527 "android"
528 ]
529 },
530 "node_modules/@rollup/rollup-android-arm64": {
531 "version": "4.57.1",
532 "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz",
533 "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==",
534 "cpu": [
535 "arm64"
536 ],
537 "dev": true,
538 "license": "MIT",
539 "optional": true,
540 "os": [
541 "android"
542 ]
543 },
544 "node_modules/@rollup/rollup-darwin-arm64": {
545 "version": "4.57.1",
546 "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz",
547 "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==",
548 "cpu": [
549 "arm64"
550 ],
551 "dev": true,
552 "license": "MIT",
553 "optional": true,
554 "os": [
555 "darwin"
556 ]
557 },
558 "node_modules/@rollup/rollup-darwin-x64": {
559 "version": "4.57.1",
560 "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz",
561 "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==",
562 "cpu": [
563 "x64"
564 ],
565 "dev": true,
566 "license": "MIT",
567 "optional": true,
568 "os": [
569 "darwin"
570 ]
571 },
572 "node_modules/@rollup/rollup-freebsd-arm64": {
573 "version": "4.57.1",
574 "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz",
575 "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==",
576 "cpu": [
577 "arm64"
578 ],
579 "dev": true,
580 "license": "MIT",
581 "optional": true,
582 "os": [
583 "freebsd"
584 ]
585 },
586 "node_modules/@rollup/rollup-freebsd-x64": {
587 "version": "4.57.1",
588 "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz",
589 "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==",
590 "cpu": [
591 "x64"
592 ],
593 "dev": true,
594 "license": "MIT",
595 "optional": true,
596 "os": [
597 "freebsd"
598 ]
599 },
600 "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
601 "version": "4.57.1",
602 "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz",
603 "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==",
604 "cpu": [
605 "arm"
606 ],
607 "dev": true,
608 "license": "MIT",
609 "optional": true,
610 "os": [
611 "linux"
612 ]
613 },
614 "node_modules/@rollup/rollup-linux-arm-musleabihf": {
615 "version": "4.57.1",
616 "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz",
617 "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==",
618 "cpu": [
619 "arm"
620 ],
621 "dev": true,
622 "license": "MIT",
623 "optional": true,
624 "os": [
625 "linux"
626 ]
627 },
628 "node_modules/@rollup/rollup-linux-arm64-gnu": {
629 "version": "4.57.1",
630 "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz",
631 "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==",
632 "cpu": [
633 "arm64"
634 ],
635 "dev": true,
636 "license": "MIT",
637 "optional": true,
638 "os": [
639 "linux"
640 ]
641 },
642 "node_modules/@rollup/rollup-linux-arm64-musl": {
643 "version": "4.57.1",
644 "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz",
645 "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==",
646 "cpu": [
647 "arm64"
648 ],
649 "dev": true,
650 "license": "MIT",
651 "optional": true,
652 "os": [
653 "linux"
654 ]
655 },
656 "node_modules/@rollup/rollup-linux-loong64-gnu": {
657 "version": "4.57.1",
658 "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz",
659 "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==",
660 "cpu": [
661 "loong64"
662 ],
663 "dev": true,
664 "license": "MIT",
665 "optional": true,
666 "os": [
667 "linux"
668 ]
669 },
670 "node_modules/@rollup/rollup-linux-loong64-musl": {
671 "version": "4.57.1",
672 "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz",
673 "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==",
674 "cpu": [
675 "loong64"
676 ],
677 "dev": true,
678 "license": "MIT",
679 "optional": true,
680 "os": [
681 "linux"
682 ]
683 },
684 "node_modules/@rollup/rollup-linux-ppc64-gnu": {
685 "version": "4.57.1",
686 "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz",
687 "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==",
688 "cpu": [
689 "ppc64"
690 ],
691 "dev": true,
692 "license": "MIT",
693 "optional": true,
694 "os": [
695 "linux"
696 ]
697 },
698 "node_modules/@rollup/rollup-linux-ppc64-musl": {
699 "version": "4.57.1",
700 "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz",
701 "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==",
702 "cpu": [
703 "ppc64"
704 ],
705 "dev": true,
706 "license": "MIT",
707 "optional": true,
708 "os": [
709 "linux"
710 ]
711 },
712 "node_modules/@rollup/rollup-linux-riscv64-gnu": {
713 "version": "4.57.1",
714 "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz",
715 "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==",
716 "cpu": [
717 "riscv64"
718 ],
719 "dev": true,
720 "license": "MIT",
721 "optional": true,
722 "os": [
723 "linux"
724 ]
725 },
726 "node_modules/@rollup/rollup-linux-riscv64-musl": {
727 "version": "4.57.1",
728 "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz",
729 "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==",
730 "cpu": [
731 "riscv64"
732 ],
733 "dev": true,
734 "license": "MIT",
735 "optional": true,
736 "os": [
737 "linux"
738 ]
739 },
740 "node_modules/@rollup/rollup-linux-s390x-gnu": {
741 "version": "4.57.1",
742 "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz",
743 "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==",
744 "cpu": [
745 "s390x"
746 ],
747 "dev": true,
748 "license": "MIT",
749 "optional": true,
750 "os": [
751 "linux"
752 ]
753 },
754 "node_modules/@rollup/rollup-linux-x64-gnu": {
755 "version": "4.57.1",
756 "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz",
757 "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==",
758 "cpu": [
759 "x64"
760 ],
761 "dev": true,
762 "license": "MIT",
763 "optional": true,
764 "os": [
765 "linux"
766 ]
767 },
768 "node_modules/@rollup/rollup-linux-x64-musl": {
769 "version": "4.57.1",
770 "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz",
771 "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==",
772 "cpu": [
773 "x64"
774 ],
775 "dev": true,
776 "license": "MIT",
777 "optional": true,
778 "os": [
779 "linux"
780 ]
781 },
782 "node_modules/@rollup/rollup-openbsd-x64": {
783 "version": "4.57.1",
784 "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz",
785 "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==",
786 "cpu": [
787 "x64"
788 ],
789 "dev": true,
790 "license": "MIT",
791 "optional": true,
792 "os": [
793 "openbsd"
794 ]
795 },
796 "node_modules/@rollup/rollup-openharmony-arm64": {
797 "version": "4.57.1",
798 "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz",
799 "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==",
800 "cpu": [
801 "arm64"
802 ],
803 "dev": true,
804 "license": "MIT",
805 "optional": true,
806 "os": [
807 "openharmony"
808 ]
809 },
810 "node_modules/@rollup/rollup-win32-arm64-msvc": {
811 "version": "4.57.1",
812 "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz",
813 "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==",
814 "cpu": [
815 "arm64"
816 ],
817 "dev": true,
818 "license": "MIT",
819 "optional": true,
820 "os": [
821 "win32"
822 ]
823 },
824 "node_modules/@rollup/rollup-win32-ia32-msvc": {
825 "version": "4.57.1",
826 "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz",
827 "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==",
828 "cpu": [
829 "ia32"
830 ],
831 "dev": true,
832 "license": "MIT",
833 "optional": true,
834 "os": [
835 "win32"
836 ]
837 },
838 "node_modules/@rollup/rollup-win32-x64-gnu": {
839 "version": "4.57.1",
840 "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz",
841 "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==",
842 "cpu": [
843 "x64"
844 ],
845 "dev": true,
846 "license": "MIT",
847 "optional": true,
848 "os": [
849 "win32"
850 ]
851 },
852 "node_modules/@rollup/rollup-win32-x64-msvc": {
853 "version": "4.57.1",
854 "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz",
855 "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==",
856 "cpu": [
857 "x64"
858 ],
859 "dev": true,
860 "license": "MIT",
861 "optional": true,
862 "os": [
863 "win32"
864 ]
865 },
866 "node_modules/@standard-schema/spec": {
867 "version": "1.1.0",
868 "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
869 "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
870 "dev": true,
871 "license": "MIT"
872 },
873 "node_modules/@types/chai": {
874 "version": "5.2.3",
875 "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz",
876 "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==",
877 "dev": true,
878 "license": "MIT",
879 "dependencies": {
880 "@types/deep-eql": "*",
881 "assertion-error": "^2.0.1"
882 }
883 },
884 "node_modules/@types/chai/node_modules/assertion-error": {
885 "version": "2.0.1",
886 "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
887 "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
888 "dev": true,
889 "license": "MIT",
890 "engines": {
891 "node": ">=12"
892 }
893 },
894 "node_modules/@types/deep-eql": {
895 "version": "4.0.2",
896 "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
897 "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
898 "dev": true,
899 "license": "MIT"
900 },
901 "node_modules/@types/estree": {
902 "version": "1.0.8",
903 "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
904 "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
905 "dev": true,
906 "license": "MIT"
907 },
908 "node_modules/@types/node": {
909 "version": "25.2.3",
910 "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz",
911 "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==",
912 "dev": true,
913 "license": "MIT",
914 "peer": true,
915 "dependencies": {
916 "undici-types": "~7.16.0"
917 }
918 },
919 "node_modules/@vitest/expect": {
920 "version": "4.0.18",
921 "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.18.tgz",
922 "integrity": "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==",
923 "dev": true,
924 "license": "MIT",
925 "dependencies": {
926 "@standard-schema/spec": "^1.0.0",
927 "@types/chai": "^5.2.2",
928 "@vitest/spy": "4.0.18",
929 "@vitest/utils": "4.0.18",
930 "chai": "^6.2.1",
931 "tinyrainbow": "^3.0.3"
932 },
933 "funding": {
934 "url": "https://opencollective.com/vitest"
935 }
936 },
937 "node_modules/@vitest/expect/node_modules/chai": {
938 "version": "6.2.2",
939 "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz",
940 "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==",
941 "dev": true,
942 "license": "MIT",
943 "engines": {
944 "node": ">=18"
945 }
946 },
947 "node_modules/@vitest/mocker": {
948 "version": "4.0.18",
949 "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz",
950 "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==",
951 "dev": true,
952 "license": "MIT",
953 "dependencies": {
954 "@vitest/spy": "4.0.18",
955 "estree-walker": "^3.0.3",
956 "magic-string": "^0.30.21"
957 },
958 "funding": {
959 "url": "https://opencollective.com/vitest"
960 },
961 "peerDependencies": {
962 "msw": "^2.4.9",
963 "vite": "^6.0.0 || ^7.0.0-0"
964 },
965 "peerDependenciesMeta": {
966 "msw": {
967 "optional": true
968 },
969 "vite": {
970 "optional": true
971 }
972 }
973 },
974 "node_modules/@vitest/pretty-format": {
975 "version": "4.0.18",
976 "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz",
977 "integrity": "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==",
978 "dev": true,
979 "license": "MIT",
980 "dependencies": {
981 "tinyrainbow": "^3.0.3"
982 },
983 "funding": {
984 "url": "https://opencollective.com/vitest"
985 }
986 },
987 "node_modules/@vitest/runner": {
988 "version": "4.0.18",
989 "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.18.tgz",
990 "integrity": "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==",
991 "dev": true,
992 "license": "MIT",
993 "dependencies": {
994 "@vitest/utils": "4.0.18",
995 "pathe": "^2.0.3"
996 },
997 "funding": {
998 "url": "https://opencollective.com/vitest"
999 }
1000 },
1001 "node_modules/@vitest/snapshot": {
1002 "version": "4.0.18",
1003 "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.18.tgz",
1004 "integrity": "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==",
1005 "dev": true,
1006 "license": "MIT",
1007 "dependencies": {
1008 "@vitest/pretty-format": "4.0.18",
1009 "magic-string": "^0.30.21",
1010 "pathe": "^2.0.3"
1011 },
1012 "funding": {
1013 "url": "https://opencollective.com/vitest"
1014 }
1015 },
1016 "node_modules/@vitest/spy": {
1017 "version": "4.0.18",
1018 "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.18.tgz",
1019 "integrity": "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==",
1020 "dev": true,
1021 "license": "MIT",
1022 "funding": {
1023 "url": "https://opencollective.com/vitest"
1024 }
1025 },
1026 "node_modules/@vitest/utils": {
1027 "version": "4.0.18",
1028 "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.18.tgz",
1029 "integrity": "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==",
1030 "dev": true,
1031 "license": "MIT",
1032 "dependencies": {
1033 "@vitest/pretty-format": "4.0.18",
1034 "tinyrainbow": "^3.0.3"
1035 },
1036 "funding": {
1037 "url": "https://opencollective.com/vitest"
1038 }
1039 },
1040 "node_modules/app-module-path": {
1041 "version": "2.2.0",
1042 "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz",
1043 "integrity": "sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==",
1044 "dev": true,
1045 "license": "BSD-2-Clause"
1046 },
1047 "node_modules/argly": {
1048 "version": "1.2.0",
1049 "resolved": "https://registry.npmjs.org/argly/-/argly-1.2.0.tgz",
1050 "integrity": "sha512-+F3InkcH2XOGK7Jf/ZQis4cwZ4wbfmpBKo5J+SAA9bglT1gVd0e9hroHWarU076pJrAfs8JKuRPwDqwPBOKHnw==",
1051 "dev": true,
1052 "license": "MIT"
1053 },
1054 "node_modules/assertion-error": {
1055 "version": "1.1.0",
1056 "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
1057 "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
1058 "dev": true,
1059 "license": "MIT",
1060 "engines": {
1061 "node": "*"
1062 }
1063 },
1064 "node_modules/balanced-match": {
1065 "version": "1.0.2",
1066 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
1067 "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
1068 "dev": true,
1069 "license": "MIT"
1070 },
1071 "node_modules/baseline-browser-mapping": {
1072 "version": "2.9.19",
1073 "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz",
1074 "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==",
1075 "dev": true,
1076 "license": "Apache-2.0",
1077 "bin": {
1078 "baseline-browser-mapping": "dist/cli.js"
1079 }
1080 },
1081 "node_modules/brace-expansion": {
1082 "version": "2.0.2",
1083 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
1084 "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
1085 "dev": true,
1086 "license": "MIT",
1087 "dependencies": {
1088 "balanced-match": "^1.0.0"
1089 }
1090 },
1091 "node_modules/browser-refresh-client": {
1092 "version": "1.1.4",
1093 "resolved": "https://registry.npmjs.org/browser-refresh-client/-/browser-refresh-client-1.1.4.tgz",
1094 "integrity": "sha512-FM/UzMFsG7wJ1ocxCSl6U7qGAIWASEk+tlvfJLP2Pd1JfS4kQ1r4d5f+nNmQI8fB8sXSD8+u/mWErEkAMxUu3w==",
1095 "dev": true,
1096 "license": "MIT"
1097 },
1098 "node_modules/browserslist": {
1099 "version": "4.28.1",
1100 "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
1101 "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
1102 "dev": true,
1103 "funding": [
1104 {
1105 "type": "opencollective",
1106 "url": "https://opencollective.com/browserslist"
1107 },
1108 {
1109 "type": "tidelift",
1110 "url": "https://tidelift.com/funding/github/npm/browserslist"
1111 },
1112 {
1113 "type": "github",
1114 "url": "https://github.com/sponsors/ai"
1115 }
1116 ],
1117 "license": "MIT",
1118 "peer": true,
1119 "dependencies": {
1120 "baseline-browser-mapping": "^2.9.0",
1121 "caniuse-lite": "^1.0.30001759",
1122 "electron-to-chromium": "^1.5.263",
1123 "node-releases": "^2.0.27",
1124 "update-browserslist-db": "^1.2.0"
1125 },
1126 "bin": {
1127 "browserslist": "cli.js"
1128 },
1129 "engines": {
1130 "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
1131 }
1132 },
1133 "node_modules/buffer-from": {
1134 "version": "1.1.2",
1135 "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
1136 "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
1137 "dev": true,
1138 "license": "MIT"
1139 },
1140 "node_modules/caniuse-lite": {
1141 "version": "1.0.30001770",
1142 "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001770.tgz",
1143 "integrity": "sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==",
1144 "dev": true,
1145 "funding": [
1146 {
1147 "type": "opencollective",
1148 "url": "https://opencollective.com/browserslist"
1149 },
1150 {
1151 "type": "tidelift",
1152 "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
1153 },
1154 {
1155 "type": "github",
1156 "url": "https://github.com/sponsors/ai"
1157 }
1158 ],
1159 "license": "CC-BY-4.0"
1160 },
1161 "node_modules/chai": {
1162 "version": "3.5.0",
1163 "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz",
1164 "integrity": "sha512-eRYY0vPS2a9zt5w5Z0aCeWbrXTEyvk7u/Xf71EzNObrjSCPgMm1Nku/D/u2tiqHBX5j40wWhj54YJLtgn8g55A==",
1165 "dev": true,
1166 "license": "MIT",
1167 "dependencies": {
1168 "assertion-error": "^1.0.1",
1169 "deep-eql": "^0.1.3",
1170 "type-detect": "^1.0.0"
1171 },
1172 "engines": {
1173 "node": ">= 0.4.0"
1174 }
1175 },
1176 "node_modules/complain": {
1177 "version": "1.6.1",
1178 "resolved": "https://registry.npmjs.org/complain/-/complain-1.6.1.tgz",
1179 "integrity": "sha512-WsiVAbAPcPSwyC5k8g/PLceaW0MXJUw61KqBd9uiyDOSuDIC6Ho/EbyhdFjeV6wq44R2g/b8IFpvV/1ZyXiqUQ==",
1180 "dev": true,
1181 "license": "MIT",
1182 "dependencies": {
1183 "error-stack-parser": "^2.0.1"
1184 }
1185 },
1186 "node_modules/csstype": {
1187 "version": "3.2.3",
1188 "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
1189 "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
1190 "dev": true,
1191 "license": "MIT"
1192 },
1193 "node_modules/deep-eql": {
1194 "version": "0.1.3",
1195 "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
1196 "integrity": "sha512-6sEotTRGBFiNcqVoeHwnfopbSpi5NbH1VWJmYCVkmxMmaVTT0bUTrNaGyBwhgP4MZL012W/mkzIn3Da+iDYweg==",
1197 "dev": true,
1198 "license": "MIT",
1199 "dependencies": {
1200 "type-detect": "0.1.1"
1201 },
1202 "engines": {
1203 "node": "*"
1204 }
1205 },
1206 "node_modules/deep-eql/node_modules/type-detect": {
1207 "version": "0.1.1",
1208 "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz",
1209 "integrity": "sha512-5rqszGVwYgBoDkIm2oUtvkfZMQ0vk29iDMU0W2qCa3rG0vPDNczCMT4hV/bLBgLg8k8ri6+u3Zbt+S/14eMzlA==",
1210 "dev": true,
1211 "license": "MIT",
1212 "engines": {
1213 "node": "*"
1214 }
1215 },
1216 "node_modules/electron-to-chromium": {
1217 "version": "1.5.286",
1218 "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz",
1219 "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==",
1220 "dev": true,
1221 "license": "ISC"
1222 },
1223 "node_modules/error-stack-parser": {
1224 "version": "2.1.4",
1225 "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
1226 "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
1227 "dev": true,
1228 "license": "MIT",
1229 "dependencies": {
1230 "stackframe": "^1.3.4"
1231 }
1232 },
1233 "node_modules/es-module-lexer": {
1234 "version": "1.7.0",
1235 "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
1236 "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
1237 "dev": true,
1238 "license": "MIT"
1239 },
1240 "node_modules/esbuild": {
1241 "version": "0.27.3",
1242 "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz",
1243 "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==",
1244 "dev": true,
1245 "hasInstallScript": true,
1246 "license": "MIT",
1247 "bin": {
1248 "esbuild": "bin/esbuild"
1249 },
1250 "engines": {
1251 "node": ">=18"
1252 },
1253 "optionalDependencies": {
1254 "@esbuild/aix-ppc64": "0.27.3",
1255 "@esbuild/android-arm": "0.27.3",
1256 "@esbuild/android-arm64": "0.27.3",
1257 "@esbuild/android-x64": "0.27.3",
1258 "@esbuild/darwin-arm64": "0.27.3",
1259 "@esbuild/darwin-x64": "0.27.3",
1260 "@esbuild/freebsd-arm64": "0.27.3",
1261 "@esbuild/freebsd-x64": "0.27.3",
1262 "@esbuild/linux-arm": "0.27.3",
1263 "@esbuild/linux-arm64": "0.27.3",
1264 "@esbuild/linux-ia32": "0.27.3",
1265 "@esbuild/linux-loong64": "0.27.3",
1266 "@esbuild/linux-mips64el": "0.27.3",
1267 "@esbuild/linux-ppc64": "0.27.3",
1268 "@esbuild/linux-riscv64": "0.27.3",
1269 "@esbuild/linux-s390x": "0.27.3",
1270 "@esbuild/linux-x64": "0.27.3",
1271 "@esbuild/netbsd-arm64": "0.27.3",
1272 "@esbuild/netbsd-x64": "0.27.3",
1273 "@esbuild/openbsd-arm64": "0.27.3",
1274 "@esbuild/openbsd-x64": "0.27.3",
1275 "@esbuild/openharmony-arm64": "0.27.3",
1276 "@esbuild/sunos-x64": "0.27.3",
1277 "@esbuild/win32-arm64": "0.27.3",
1278 "@esbuild/win32-ia32": "0.27.3",
1279 "@esbuild/win32-x64": "0.27.3"
1280 }
1281 },
1282 "node_modules/escalade": {
1283 "version": "3.2.0",
1284 "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
1285 "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
1286 "dev": true,
1287 "license": "MIT",
1288 "engines": {
1289 "node": ">=6"
1290 }
1291 },
1292 "node_modules/estree-walker": {
1293 "version": "3.0.3",
1294 "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
1295 "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
1296 "dev": true,
1297 "license": "MIT",
1298 "dependencies": {
1299 "@types/estree": "^1.0.0"
1300 }
1301 },
1302 "node_modules/events-light": {
1303 "version": "1.0.5",
1304 "resolved": "https://registry.npmjs.org/events-light/-/events-light-1.0.5.tgz",
1305 "integrity": "sha512-jF51LJzg5W+tkJgfZbjlbFCLcyVFEtOjU+xMCBylrXG13X5XHvfp6lNGfyBLF9u1mRTpUsMVYqSDukvpZff1mQ==",
1306 "dev": true,
1307 "license": "MIT",
1308 "dependencies": {
1309 "chai": "^3.5.0"
1310 }
1311 },
1312 "node_modules/expect-type": {
1313 "version": "1.3.0",
1314 "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz",
1315 "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==",
1316 "dev": true,
1317 "license": "Apache-2.0",
1318 "engines": {
1319 "node": ">=12.0.0"
1320 }
1321 },
1322 "node_modules/fdir": {
1323 "version": "6.5.0",
1324 "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
1325 "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
1326 "dev": true,
1327 "license": "MIT",
1328 "engines": {
1329 "node": ">=12.0.0"
1330 },
1331 "peerDependencies": {
1332 "picomatch": "^3 || ^4"
1333 },
1334 "peerDependenciesMeta": {
1335 "picomatch": {
1336 "optional": true
1337 }
1338 }
1339 },
1340 "node_modules/fsevents": {
1341 "version": "2.3.3",
1342 "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1343 "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1344 "dev": true,
1345 "hasInstallScript": true,
1346 "license": "MIT",
1347 "optional": true,
1348 "os": [
1349 "darwin"
1350 ],
1351 "engines": {
1352 "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1353 }
1354 },
1355 "node_modules/he": {
1356 "version": "1.2.0",
1357 "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
1358 "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
1359 "dev": true,
1360 "license": "MIT",
1361 "bin": {
1362 "he": "bin/he"
1363 }
1364 },
1365 "node_modules/htmljs-parser": {
1366 "version": "5.10.0",
1367 "resolved": "https://registry.npmjs.org/htmljs-parser/-/htmljs-parser-5.10.0.tgz",
1368 "integrity": "sha512-5aAmTYhhiyBaBArw51R9c1m5BxqN3QBRpvhKRanWwTW1I59Y9YHvfGOBU12dfy7dPqgkwFKCUh0LX+ia34HHFw==",
1369 "dev": true,
1370 "license": "MIT"
1371 },
1372 "node_modules/jsesc": {
1373 "version": "3.1.0",
1374 "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
1375 "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
1376 "dev": true,
1377 "license": "MIT",
1378 "bin": {
1379 "jsesc": "bin/jsesc"
1380 },
1381 "engines": {
1382 "node": ">=6"
1383 }
1384 },
1385 "node_modules/kleur": {
1386 "version": "4.1.5",
1387 "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
1388 "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
1389 "dev": true,
1390 "license": "MIT",
1391 "engines": {
1392 "node": ">=6"
1393 }
1394 },
1395 "node_modules/lasso-caching-fs": {
1396 "version": "1.0.2",
1397 "resolved": "https://registry.npmjs.org/lasso-caching-fs/-/lasso-caching-fs-1.0.2.tgz",
1398 "integrity": "sha512-mudop0s8U3tLm3Fn9lhiZsiELpLeJToEo6RlDLdph7vWRxL9Sz0o+9WUw1IwlpCYXv/P0CLsMYWFgPwIKWEYvg==",
1399 "dev": true,
1400 "license": "Apache-2.0",
1401 "dependencies": {
1402 "raptor-async": "^1.1.2"
1403 }
1404 },
1405 "node_modules/lasso-package-root": {
1406 "version": "1.0.1",
1407 "resolved": "https://registry.npmjs.org/lasso-package-root/-/lasso-package-root-1.0.1.tgz",
1408 "integrity": "sha512-j6LnauNCldqSDvOxoKpD6sTzudPGMiwcZQbySoF9KvJ0lD9Dp2t6QZF8kC0jbUDHuQPiAo5RuQ/mC3AGXscUYA==",
1409 "dev": true,
1410 "license": "Apache-2.0",
1411 "dependencies": {
1412 "lasso-caching-fs": "^1.0.0"
1413 }
1414 },
1415 "node_modules/listener-tracker": {
1416 "version": "2.0.0",
1417 "resolved": "https://registry.npmjs.org/listener-tracker/-/listener-tracker-2.0.0.tgz",
1418 "integrity": "sha512-U6NLzBRyrAsJs9AAjuBYifXtNYnAIDPIp81rNpxNoypXBR7qi/LhsuUWX5399zuTg1sBEQyOnWDYFrBQ28vk/w==",
1419 "dev": true,
1420 "license": "Apache-2.0"
1421 },
1422 "node_modules/magic-string": {
1423 "version": "0.30.21",
1424 "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
1425 "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
1426 "dev": true,
1427 "license": "MIT",
1428 "dependencies": {
1429 "@jridgewell/sourcemap-codec": "^1.5.5"
1430 }
1431 },
1432 "node_modules/marko": {
1433 "version": "5.38.24",
1434 "resolved": "https://registry.npmjs.org/marko/-/marko-5.38.24.tgz",
1435 "integrity": "sha512-/F/ZiziJK8T+XMsbfF0/GkXBvqEAnVkZDWHw016Ey6qiFJcSpR/zE5AJ8cXLAqk9WTM4/gRo51wlm2XocpBajg==",
1436 "dev": true,
1437 "license": "MIT",
1438 "dependencies": {
1439 "@marko/compiler": "^5.39.53",
1440 "@marko/runtime-tags": "^6.0.145",
1441 "app-module-path": "^2.2.0",
1442 "argly": "^1.2.0",
1443 "browser-refresh-client": "1.1.4",
1444 "complain": "^1.6.1",
1445 "csstype": "^3.2.3",
1446 "events-light": "^1.0.5",
1447 "listener-tracker": "^2.0.0",
1448 "magic-string": "^0.30.21",
1449 "minimatch": "^9.0.5",
1450 "raptor-util": "^3.2.0",
1451 "resolve-from": "^5.0.0",
1452 "self-closing-tags": "^1.0.1",
1453 "warp10": "^2.1.0"
1454 },
1455 "bin": {
1456 "markoc": "bin/markoc"
1457 },
1458 "engines": {
1459 "node": "18 || 20 || >=22"
1460 }
1461 },
1462 "node_modules/minimatch": {
1463 "version": "9.0.5",
1464 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
1465 "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
1466 "dev": true,
1467 "license": "ISC",
1468 "dependencies": {
1469 "brace-expansion": "^2.0.1"
1470 },
1471 "engines": {
1472 "node": ">=16 || 14 >=14.17"
1473 },
1474 "funding": {
1475 "url": "https://github.com/sponsors/isaacs"
1476 }
1477 },
1478 "node_modules/nanoid": {
1479 "version": "3.3.11",
1480 "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
1481 "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
1482 "dev": true,
1483 "funding": [
1484 {
1485 "type": "github",
1486 "url": "https://github.com/sponsors/ai"
1487 }
1488 ],
1489 "license": "MIT",
1490 "bin": {
1491 "nanoid": "bin/nanoid.cjs"
1492 },
1493 "engines": {
1494 "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1495 }
1496 },
1497 "node_modules/node-releases": {
1498 "version": "2.0.27",
1499 "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
1500 "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
1501 "dev": true,
1502 "license": "MIT"
1503 },
1504 "node_modules/obug": {
1505 "version": "2.1.1",
1506 "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz",
1507 "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==",
1508 "dev": true,
1509 "funding": [
1510 "https://github.com/sponsors/sxzz",
1511 "https://opencollective.com/debug"
1512 ],
1513 "license": "MIT"
1514 },
1515 "node_modules/pathe": {
1516 "version": "2.0.3",
1517 "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
1518 "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
1519 "dev": true,
1520 "license": "MIT"
1521 },
1522 "node_modules/picocolors": {
1523 "version": "1.1.1",
1524 "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
1525 "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
1526 "dev": true,
1527 "license": "ISC"
1528 },
1529 "node_modules/picomatch": {
1530 "version": "4.0.3",
1531 "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
1532 "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
1533 "dev": true,
1534 "license": "MIT",
1535 "peer": true,
1536 "engines": {
1537 "node": ">=12"
1538 },
1539 "funding": {
1540 "url": "https://github.com/sponsors/jonschlinkert"
1541 }
1542 },
1543 "node_modules/postcss": {
1544 "version": "8.5.6",
1545 "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
1546 "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
1547 "dev": true,
1548 "funding": [
1549 {
1550 "type": "opencollective",
1551 "url": "https://opencollective.com/postcss/"
1552 },
1553 {
1554 "type": "tidelift",
1555 "url": "https://tidelift.com/funding/github/npm/postcss"
1556 },
1557 {
1558 "type": "github",
1559 "url": "https://github.com/sponsors/ai"
1560 }
1561 ],
1562 "license": "MIT",
1563 "dependencies": {
1564 "nanoid": "^3.3.11",
1565 "picocolors": "^1.1.1",
1566 "source-map-js": "^1.2.1"
1567 },
1568 "engines": {
1569 "node": "^10 || ^12 || >=14"
1570 }
1571 },
1572 "node_modules/raptor-async": {
1573 "version": "1.1.3",
1574 "resolved": "https://registry.npmjs.org/raptor-async/-/raptor-async-1.1.3.tgz",
1575 "integrity": "sha512-VZCxygWMjW9lKqnApK9D2QbfyzRn7ehiTqnXWwMCLBXANSy+xbnYfbX/5f8YX3bZXu+g+JESmqWPchIQrZj2ig==",
1576 "dev": true,
1577 "license": "Apache License v2.0"
1578 },
1579 "node_modules/raptor-regexp": {
1580 "version": "1.0.1",
1581 "resolved": "https://registry.npmjs.org/raptor-regexp/-/raptor-regexp-1.0.1.tgz",
1582 "integrity": "sha512-DqC7ViHJUs3jLIxJI1/HVvCu3yPJaP8CM7PGsHvjimg7yJ3lLOdCBxlPE0G2Q8OJgUA8Pe7nvhm6lcQ3hZepow==",
1583 "dev": true,
1584 "license": "Apache License v2.0"
1585 },
1586 "node_modules/raptor-util": {
1587 "version": "3.2.0",
1588 "resolved": "https://registry.npmjs.org/raptor-util/-/raptor-util-3.2.0.tgz",
1589 "integrity": "sha512-uEDMMkBCJvjTqYMBnJNxn+neiS6a0rhybQNA9RaexGor1uvKjwyHA5VcbZMZEuqXhKUWbL+WNS7PhuZVZNB7pw==",
1590 "dev": true,
1591 "license": "Apache-2.0"
1592 },
1593 "node_modules/relative-import-path": {
1594 "version": "1.0.0",
1595 "resolved": "https://registry.npmjs.org/relative-import-path/-/relative-import-path-1.0.0.tgz",
1596 "integrity": "sha512-ZvbtoduKQmD4PZeJPfH6Ql21qUWhaMxiHkIsH+FUnZqKDwNIXBtGg5zRZyHWomiGYk8n5+KMBPK7Mi4D0XWfNg==",
1597 "dev": true,
1598 "license": "MIT"
1599 },
1600 "node_modules/resolve-from": {
1601 "version": "5.0.0",
1602 "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
1603 "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
1604 "dev": true,
1605 "license": "MIT",
1606 "engines": {
1607 "node": ">=8"
1608 }
1609 },
1610 "node_modules/rollup": {
1611 "version": "4.57.1",
1612 "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz",
1613 "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==",
1614 "dev": true,
1615 "license": "MIT",
1616 "dependencies": {
1617 "@types/estree": "1.0.8"
1618 },
1619 "bin": {
1620 "rollup": "dist/bin/rollup"
1621 },
1622 "engines": {
1623 "node": ">=18.0.0",
1624 "npm": ">=8.0.0"
1625 },
1626 "optionalDependencies": {
1627 "@rollup/rollup-android-arm-eabi": "4.57.1",
1628 "@rollup/rollup-android-arm64": "4.57.1",
1629 "@rollup/rollup-darwin-arm64": "4.57.1",
1630 "@rollup/rollup-darwin-x64": "4.57.1",
1631 "@rollup/rollup-freebsd-arm64": "4.57.1",
1632 "@rollup/rollup-freebsd-x64": "4.57.1",
1633 "@rollup/rollup-linux-arm-gnueabihf": "4.57.1",
1634 "@rollup/rollup-linux-arm-musleabihf": "4.57.1",
1635 "@rollup/rollup-linux-arm64-gnu": "4.57.1",
1636 "@rollup/rollup-linux-arm64-musl": "4.57.1",
1637 "@rollup/rollup-linux-loong64-gnu": "4.57.1",
1638 "@rollup/rollup-linux-loong64-musl": "4.57.1",
1639 "@rollup/rollup-linux-ppc64-gnu": "4.57.1",
1640 "@rollup/rollup-linux-ppc64-musl": "4.57.1",
1641 "@rollup/rollup-linux-riscv64-gnu": "4.57.1",
1642 "@rollup/rollup-linux-riscv64-musl": "4.57.1",
1643 "@rollup/rollup-linux-s390x-gnu": "4.57.1",
1644 "@rollup/rollup-linux-x64-gnu": "4.57.1",
1645 "@rollup/rollup-linux-x64-musl": "4.57.1",
1646 "@rollup/rollup-openbsd-x64": "4.57.1",
1647 "@rollup/rollup-openharmony-arm64": "4.57.1",
1648 "@rollup/rollup-win32-arm64-msvc": "4.57.1",
1649 "@rollup/rollup-win32-ia32-msvc": "4.57.1",
1650 "@rollup/rollup-win32-x64-gnu": "4.57.1",
1651 "@rollup/rollup-win32-x64-msvc": "4.57.1",
1652 "fsevents": "~2.3.2"
1653 }
1654 },
1655 "node_modules/self-closing-tags": {
1656 "version": "1.0.1",
1657 "resolved": "https://registry.npmjs.org/self-closing-tags/-/self-closing-tags-1.0.1.tgz",
1658 "integrity": "sha512-7t6hNbYMxM+VHXTgJmxwgZgLGktuXtVVD5AivWzNTdJBM4DBjnDKDzkf2SrNjihaArpeJYNjxkELBu1evI4lQA==",
1659 "dev": true,
1660 "license": "MIT",
1661 "engines": {
1662 "node": ">=0.12.0"
1663 }
1664 },
1665 "node_modules/siginfo": {
1666 "version": "2.0.0",
1667 "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
1668 "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
1669 "dev": true,
1670 "license": "ISC"
1671 },
1672 "node_modules/source-map": {
1673 "version": "0.6.1",
1674 "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1675 "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1676 "dev": true,
1677 "license": "BSD-3-Clause",
1678 "engines": {
1679 "node": ">=0.10.0"
1680 }
1681 },
1682 "node_modules/source-map-js": {
1683 "version": "1.2.1",
1684 "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
1685 "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
1686 "dev": true,
1687 "license": "BSD-3-Clause",
1688 "engines": {
1689 "node": ">=0.10.0"
1690 }
1691 },
1692 "node_modules/source-map-support": {
1693 "version": "0.5.21",
1694 "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
1695 "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
1696 "dev": true,
1697 "license": "MIT",
1698 "dependencies": {
1699 "buffer-from": "^1.0.0",
1700 "source-map": "^0.6.0"
1701 }
1702 },
1703 "node_modules/stackback": {
1704 "version": "0.0.2",
1705 "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
1706 "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
1707 "dev": true,
1708 "license": "MIT"
1709 },
1710 "node_modules/stackframe": {
1711 "version": "1.3.4",
1712 "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
1713 "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
1714 "dev": true,
1715 "license": "MIT"
1716 },
1717 "node_modules/std-env": {
1718 "version": "3.10.0",
1719 "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz",
1720 "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==",
1721 "dev": true,
1722 "license": "MIT"
1723 },
1724 "node_modules/tinybench": {
1725 "version": "2.9.0",
1726 "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
1727 "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
1728 "dev": true,
1729 "license": "MIT"
1730 },
1731 "node_modules/tinyexec": {
1732 "version": "1.0.2",
1733 "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz",
1734 "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==",
1735 "dev": true,
1736 "license": "MIT",
1737 "engines": {
1738 "node": ">=18"
1739 }
1740 },
1741 "node_modules/tinyglobby": {
1742 "version": "0.2.15",
1743 "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
1744 "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
1745 "dev": true,
1746 "license": "MIT",
1747 "dependencies": {
1748 "fdir": "^6.5.0",
1749 "picomatch": "^4.0.3"
1750 },
1751 "engines": {
1752 "node": ">=12.0.0"
1753 },
1754 "funding": {
1755 "url": "https://github.com/sponsors/SuperchupuDev"
1756 }
1757 },
1758 "node_modules/tinyrainbow": {
1759 "version": "3.0.3",
1760 "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz",
1761 "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==",
1762 "dev": true,
1763 "license": "MIT",
1764 "engines": {
1765 "node": ">=14.0.0"
1766 }
1767 },
1768 "node_modules/type-detect": {
1769 "version": "1.0.0",
1770 "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz",
1771 "integrity": "sha512-f9Uv6ezcpvCQjJU0Zqbg+65qdcszv3qUQsZfjdRbWiZ7AMenrX1u0lNk9EoWWX6e1F+NULyg27mtdeZ5WhpljA==",
1772 "dev": true,
1773 "license": "MIT",
1774 "engines": {
1775 "node": "*"
1776 }
1777 },
1778 "node_modules/undici-types": {
1779 "version": "7.16.0",
1780 "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
1781 "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
1782 "dev": true,
1783 "license": "MIT"
1784 },
1785 "node_modules/update-browserslist-db": {
1786 "version": "1.2.3",
1787 "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
1788 "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
1789 "dev": true,
1790 "funding": [
1791 {
1792 "type": "opencollective",
1793 "url": "https://opencollective.com/browserslist"
1794 },
1795 {
1796 "type": "tidelift",
1797 "url": "https://tidelift.com/funding/github/npm/browserslist"
1798 },
1799 {
1800 "type": "github",
1801 "url": "https://github.com/sponsors/ai"
1802 }
1803 ],
1804 "license": "MIT",
1805 "dependencies": {
1806 "escalade": "^3.2.0",
1807 "picocolors": "^1.1.1"
1808 },
1809 "bin": {
1810 "update-browserslist-db": "cli.js"
1811 },
1812 "peerDependencies": {
1813 "browserslist": ">= 4.21.0"
1814 }
1815 },
1816 "node_modules/vite": {
1817 "version": "7.3.1",
1818 "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz",
1819 "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==",
1820 "dev": true,
1821 "license": "MIT",
1822 "peer": true,
1823 "dependencies": {
1824 "esbuild": "^0.27.0",
1825 "fdir": "^6.5.0",
1826 "picomatch": "^4.0.3",
1827 "postcss": "^8.5.6",
1828 "rollup": "^4.43.0",
1829 "tinyglobby": "^0.2.15"
1830 },
1831 "bin": {
1832 "vite": "bin/vite.js"
1833 },
1834 "engines": {
1835 "node": "^20.19.0 || >=22.12.0"
1836 },
1837 "funding": {
1838 "url": "https://github.com/vitejs/vite?sponsor=1"
1839 },
1840 "optionalDependencies": {
1841 "fsevents": "~2.3.3"
1842 },
1843 "peerDependencies": {
1844 "@types/node": "^20.19.0 || >=22.12.0",
1845 "jiti": ">=1.21.0",
1846 "less": "^4.0.0",
1847 "lightningcss": "^1.21.0",
1848 "sass": "^1.70.0",
1849 "sass-embedded": "^1.70.0",
1850 "stylus": ">=0.54.8",
1851 "sugarss": "^5.0.0",
1852 "terser": "^5.16.0",
1853 "tsx": "^4.8.1",
1854 "yaml": "^2.4.2"
1855 },
1856 "peerDependenciesMeta": {
1857 "@types/node": {
1858 "optional": true
1859 },
1860 "jiti": {
1861 "optional": true
1862 },
1863 "less": {
1864 "optional": true
1865 },
1866 "lightningcss": {
1867 "optional": true
1868 },
1869 "sass": {
1870 "optional": true
1871 },
1872 "sass-embedded": {
1873 "optional": true
1874 },
1875 "stylus": {
1876 "optional": true
1877 },
1878 "sugarss": {
1879 "optional": true
1880 },
1881 "terser": {
1882 "optional": true
1883 },
1884 "tsx": {
1885 "optional": true
1886 },
1887 "yaml": {
1888 "optional": true
1889 }
1890 }
1891 },
1892 "node_modules/vitest": {
1893 "version": "4.0.18",
1894 "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz",
1895 "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==",
1896 "dev": true,
1897 "license": "MIT",
1898 "dependencies": {
1899 "@vitest/expect": "4.0.18",
1900 "@vitest/mocker": "4.0.18",
1901 "@vitest/pretty-format": "4.0.18",
1902 "@vitest/runner": "4.0.18",
1903 "@vitest/snapshot": "4.0.18",
1904 "@vitest/spy": "4.0.18",
1905 "@vitest/utils": "4.0.18",
1906 "es-module-lexer": "^1.7.0",
1907 "expect-type": "^1.2.2",
1908 "magic-string": "^0.30.21",
1909 "obug": "^2.1.1",
1910 "pathe": "^2.0.3",
1911 "picomatch": "^4.0.3",
1912 "std-env": "^3.10.0",
1913 "tinybench": "^2.9.0",
1914 "tinyexec": "^1.0.2",
1915 "tinyglobby": "^0.2.15",
1916 "tinyrainbow": "^3.0.3",
1917 "vite": "^6.0.0 || ^7.0.0",
1918 "why-is-node-running": "^2.3.0"
1919 },
1920 "bin": {
1921 "vitest": "vitest.mjs"
1922 },
1923 "engines": {
1924 "node": "^20.0.0 || ^22.0.0 || >=24.0.0"
1925 },
1926 "funding": {
1927 "url": "https://opencollective.com/vitest"
1928 },
1929 "peerDependencies": {
1930 "@edge-runtime/vm": "*",
1931 "@opentelemetry/api": "^1.9.0",
1932 "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
1933 "@vitest/browser-playwright": "4.0.18",
1934 "@vitest/browser-preview": "4.0.18",
1935 "@vitest/browser-webdriverio": "4.0.18",
1936 "@vitest/ui": "4.0.18",
1937 "happy-dom": "*",
1938 "jsdom": "*"
1939 },
1940 "peerDependenciesMeta": {
1941 "@edge-runtime/vm": {
1942 "optional": true
1943 },
1944 "@opentelemetry/api": {
1945 "optional": true
1946 },
1947 "@types/node": {
1948 "optional": true
1949 },
1950 "@vitest/browser-playwright": {
1951 "optional": true
1952 },
1953 "@vitest/browser-preview": {
1954 "optional": true
1955 },
1956 "@vitest/browser-webdriverio": {
1957 "optional": true
1958 },
1959 "@vitest/ui": {
1960 "optional": true
1961 },
1962 "happy-dom": {
1963 "optional": true
1964 },
1965 "jsdom": {
1966 "optional": true
1967 }
1968 }
1969 },
1970 "node_modules/warp10": {
1971 "version": "2.1.0",
1972 "resolved": "https://registry.npmjs.org/warp10/-/warp10-2.1.0.tgz",
1973 "integrity": "sha512-krhkqzJdUxAZv2Cx0Gz6dN1r7TTrG9RDewkDHBbJQIqbNTCdB5ZUHVh7VkA4DgrKW4ZXPPUQKCwmI/3btDse9A==",
1974 "dev": true,
1975 "license": "MIT"
1976 },
1977 "node_modules/why-is-node-running": {
1978 "version": "2.3.0",
1979 "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
1980 "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
1981 "dev": true,
1982 "license": "MIT",
1983 "dependencies": {
1984 "siginfo": "^2.0.0",
1985 "stackback": "0.0.2"
1986 },
1987 "bin": {
1988 "why-is-node-running": "cli.js"
1989 },
1990 "engines": {
1991 "node": ">=8"
1992 }
1993 }
1994 }
1995}
lib/package.json created+11
...@@ -0,0 +1,11 @@
1{
2 "devDependencies": {
3 "@marko/compiler": "^5.39.55",
4 "@types/node": "^25.2.3",
5 "browserslist": "^4.28.1",
6 "esbuild": "^0.27.3",
7 "marko": "^5.38.24",
8 "vite": "^7.3.1",
9 "vitest": "^4.0.18"
10 }
11}
lib/rollup.ts created+65
...@@ -0,0 +1,65 @@
1import * as markodown from "./mod";
2import * as marko from "@marko/compiler";
3import type * as rollup from "rollup";
4
5export type RollupPluginOptions =
6 & Omit<markodown.TransformOptions, "source" | "format">
7 & {
8 marko?: typeof marko;
9 markoOptions?: marko.Config;
10 };
11
12/**
13 * Rollup bundling plugin for markodown files.
14 */
15export default function rollupPlugin(
16 options: RollupPluginOptions = {},
17): rollup.Plugin {
18 const { compileSync } = options.marko ?? marko;
19 return {
20 name: "@clo/markodown/rollup.ts",
21 load: {
22 filter: { id: /\.(?:mdo|mkd)|-md\.marko$/ },
23 order: "pre",
24 async handler(id) {
25 const source = await this.fs.readFile(id, { encoding: "utf8" });
26 const result = markodown.transform({
27 ...options,
28 source,
29 });
30
31 if (!result.success) {
32 for (const err of result.errors) {
33 this.error({
34 message: err.message,
35 loc: {
36 file: id,
37 line: err.line,
38 column: err.column - 1,
39 },
40 });
41 }
42 return null;
43 }
44
45 console.log(result);
46
47 // TODO: source maps!
48 const { code, meta } = compileSync(
49 result.text,
50 id + ".marko",
51 {
52 sourceMaps: true,
53 ...options?.markoOptions,
54 },
55 );
56
57 for (const file of meta.watchFiles ?? []) {
58 this.addWatchFile(file);
59 }
60
61 return { code };
62 },
63 },
64 };
65}
src/lib.rs+50-3
...@@ -2,23 +2,34 @@ pub mod marko;...@@ -2,23 +2,34 @@ pub mod marko;
2pub mod plugin;2pub mod plugin;
3pub mod typescript;3pub mod typescript;
44
5use std::borrow::Cow;5pub mod wasm;
66
7use oxc_diagnostics::{LabeledSpan, OxcDiagnostic};7use oxc_diagnostics::{LabeledSpan, OxcDiagnostic};
8use plugin::tags::{MarkoClose, MarkoOpen};8use plugin::tags::{MarkoClose, MarkoOpen};
9use serde::Serialize;
10use serde_json;
11use std::borrow::Cow;
12use wasm_bindgen::prelude::wasm_bindgen;
913
10pub struct Output {14pub struct Output {
11 pub text: String,15 pub text: String,
12 pub format: OutputFormat,16 pub format: OutputFormat,
13}17}
1418
15#[derive(Debug, Clone, Copy, PartialEq, Eq)]19#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
20#[wasm_bindgen]
21#[serde(rename_all = "camelCase")]
16pub enum OutputFormat {22pub enum OutputFormat {
17 Html,23 Html,
18 Marko,24 Marko,
19}25}
2026
21pub fn transform(source: &str, force: Option<OutputFormat>) -> Result<Output, Vec<OxcDiagnostic>> {27pub fn transform(
28 source: &str,
29 force: Option<OutputFormat>,
30 layout_import: Option<String>,
31 self_path: Option<String>,
32) -> Result<Output, Vec<OxcDiagnostic>> {
22 // Pre-process to extract preamble (blank lines, imports) and frontmatter33 // Pre-process to extract preamble (blank lines, imports) and frontmatter
23 // This is needed because markdown-it skips blank lines before running block rules34 // This is needed because markdown-it skips blank lines before running block rules
24 let (preamble_output, remaining_source, preamble_offset) =35 let (preamble_output, remaining_source, preamble_offset) =
...@@ -71,13 +82,49 @@ pub fn transform(source: &str, force: Option<OutputFormat>) -> Result<Output, Ve...@@ -71,13 +82,49 @@ pub fn transform(source: &str, force: Option<OutputFormat>) -> Result<Output, Ve
71 )]);82 )]);
72 }83 }
7384
85 // Collect headings for TOC if layout_import is provided
86 let outline_json;
87 let headings = if layout_import.is_some() {
88 let collected = plugin::toc::collect_headings(&ast);
89 outline_json = Some(serde_json::to_string(&collected).unwrap_or_default());
90 collected
91 } else {
92 outline_json = None;
93 Vec::new()
94 };
95
74 let mut text = ast.render();96 let mut text = ast.render();
7597
98 // Inject heading IDs if we collected headings
99 if !headings.is_empty() {
100 text = plugin::toc::inject_heading_ids(&text, &headings);
101 }
102
76 // Prepend preamble output if we extracted it103 // Prepend preamble output if we extracted it
77 if let Some(preamble) = preamble_output {104 if let Some(preamble) = preamble_output {
78 text = preamble + &text;105 text = preamble + &text;
79 }106 }
80107
108 // Wrap with Layout component if layout_import is provided
109 if let (Some(layout_path), Some(outline)) = (layout_import, outline_json) {
110 if let Some(self_path) = self_path {
111 text = format!(
112 "import Layout__markodown__ from \"{}\";import * as self__markodown__ from \"{}\";\n\n<Layout__markodown__ module=self__markodown__ outline={}>\n{}</>",
113 layout_path,
114 self_path,
115 outline,
116 text
117 );
118 } else {
119 text = format!(
120 "import Layout__markodown__ from \"{}\";\n\n<Layout__markodown__ module=null outline={}>\n{}</>",
121 layout_path,
122 outline,
123 text
124 );
125 }
126 }
127
81 Ok(Output { text, format })128 Ok(Output { text, format })
82}129}
83130
src/main.rs+8-1
...@@ -23,6 +23,11 @@ struct Cli {...@@ -23,6 +23,11 @@ struct Cli {
23 /// Force the output format (auto-detected by default)23 /// Force the output format (auto-detected by default)
24 #[arg(long)]24 #[arg(long)]
25 output_format: Option<CliOutputFormat>,25 output_format: Option<CliOutputFormat>,
26
27 /// Layout component to wrap the output with. This component will recieve
28 /// the module and a generated table of contents.
29 #[arg(long)]
30 layout: Option<String>,
26}31}
2732
28fn main() {33fn main() {
...@@ -33,6 +38,8 @@ fn main() {...@@ -33,6 +38,8 @@ fn main() {
33 CliOutputFormat::Marko => OutputFormat::Marko,38 CliOutputFormat::Marko => OutputFormat::Marko,
34 });39 });
3540
41 let layout_import = cli.layout;
42
36 let source = match fs::read_to_string(&cli.file) {43 let source = match fs::read_to_string(&cli.file) {
37 Ok(s) => s,44 Ok(s) => s,
38 Err(e) => {45 Err(e) => {
...@@ -41,7 +48,7 @@ fn main() {...@@ -41,7 +48,7 @@ fn main() {
41 }48 }
42 };49 };
4350
44 match transform(&source, force) {51 match transform(&source, force, layout_import, None) {
45 Err(errors) => {52 Err(errors) => {
46 let handler = GraphicalReportHandler::new();53 let handler = GraphicalReportHandler::new();
47 for error in &errors {54 for error in &errors {
src/wasm.rs+121
...@@ -0,0 +1,121 @@...@@ -0,0 +1,121 @@
1use crate::OutputFormat;
2use oxc_diagnostics::OxcDiagnostic;
3use serde::Serialize;
4use wasm_bindgen::prelude::*;
5
6#[derive(Serialize)]
7struct TransformResult {
8 text: Option<String>,
9 success: bool,
10 format: Option<OutputFormat>,
11 errors: Vec<WasmDiagnostic>,
12}
13
14#[derive(Serialize)]
15struct WasmDiagnostic {
16 message: String,
17 labels: Vec<WasmLabel>,
18 line: u32,
19 column: u32,
20}
21
22#[derive(Serialize)]
23struct WasmLabel {
24 message: String,
25 line: u32,
26 column: u32,
27 width: u32,
28}
29
30/// Convert a byte offset to 1-indexed line and column numbers.
31fn offset_to_line_col(src: &str, offset: usize) -> (u32, u32) {
32 let mut line = 1u32;
33 let mut col = 1u32;
34 for (i, ch) in src.char_indices() {
35 if i >= offset {
36 break;
37 }
38 if ch == '\n' {
39 line += 1;
40 col = 1;
41 } else {
42 col += 1;
43 }
44 }
45 (line, col)
46}
47
48/// Convert an OxcDiagnostic to a WasmDiagnostic.
49/// - Takes the first label and absorbs its position into the root error.
50/// - If there are multiple labels or labels with text, forward them.
51fn convert_diagnostic(src: &str, diag: &OxcDiagnostic) -> WasmDiagnostic {
52 let labels = diag.labels.as_ref().map(|l| l.as_slice()).unwrap_or(&[]);
53
54 // Determine root line/column from first label, or default to 1:1
55 let (line, column) = if let Some(first) = labels.first() {
56 offset_to_line_col(src, first.offset())
57 } else {
58 (1, 1)
59 };
60
61 // Determine which labels to forward:
62 // - Skip the first label if it has no message (it's absorbed into root)
63 // - Forward all labels if first has a message, or if there are multiple
64 let forward_labels = if labels.is_empty() {
65 vec![]
66 } else {
67 let first_has_message = labels[0].label().is_some();
68 let has_multiple = labels.len() > 1;
69
70 if first_has_message || has_multiple {
71 // Forward all labels
72 labels
73 .iter()
74 .map(|label| {
75 let (l, c) = offset_to_line_col(src, label.offset());
76 WasmLabel {
77 message: label.label().unwrap_or_default().to_string(),
78 line: l,
79 column: c,
80 width: label.len() as u32,
81 }
82 })
83 .collect()
84 } else {
85 // First label has no message and is the only one - absorbed
86 vec![]
87 }
88 };
89
90 WasmDiagnostic {
91 message: diag.message.to_string(),
92 labels: forward_labels,
93 line,
94 column,
95 }
96}
97
98#[wasm_bindgen]
99pub fn transform(
100 src: &str,
101 force_format: Option<OutputFormat>,
102 layout_import: Option<String>,
103 self_path: Option<String>,
104) -> JsValue {
105 match crate::transform(src, force_format, layout_import, self_path) {
106 Ok(output) => serde_wasm_bindgen::to_value(&TransformResult {
107 text: Some(output.text),
108 success: true,
109 format: Some(output.format),
110 errors: vec![],
111 })
112 .expect("failed serialization"),
113 Err(errors) => serde_wasm_bindgen::to_value(&TransformResult {
114 text: None,
115 success: false,
116 format: None,
117 errors: errors.iter().map(|e| convert_diagnostic(src, e)).collect(),
118 })
119 .expect("failed serialization"),
120 }
121}
tests/fixtures.rs+2-2
...@@ -20,7 +20,7 @@ fn run_fixture(name: &str) {...@@ -20,7 +20,7 @@ fn run_fixture(name: &str) {
20 let expected = fs::read_to_string(&html_path)20 let expected = fs::read_to_string(&html_path)
21 .unwrap_or_else(|e| panic!("failed to read {}: {e}", html_path.display()));21 .unwrap_or_else(|e| panic!("failed to read {}: {e}", html_path.display()));
2222
23 let output = transform(&source, Some(OutputFormat::Html)).unwrap();23 let output = transform(&source, Some(OutputFormat::Html), None).unwrap();
2424
25 assert_eq!(25 assert_eq!(
26 output.format,26 output.format,
...@@ -40,7 +40,7 @@ fn run_fixture(name: &str) {...@@ -40,7 +40,7 @@ fn run_fixture(name: &str) {
40 let expected = fs::read_to_string(&marko_path)40 let expected = fs::read_to_string(&marko_path)
41 .unwrap_or_else(|e| panic!("failed to read {}: {e}", marko_path.display()));41 .unwrap_or_else(|e| panic!("failed to read {}: {e}", marko_path.display()));
4242
43 let output = transform(&source, Some(OutputFormat::Marko)).unwrap();43 let output = transform(&source, Some(OutputFormat::Marko), None).unwrap();
4444
45 assert_eq!(45 assert_eq!(
46 output.format,46 output.format,
wasm.sh created+34
...@@ -0,0 +1,34 @@
1#!/bin/sh
2set -e
3cd "$(dirname "$0")"
4
5echo "Building wasm..."
6
7rm -rf lib/bindgen
8
9cargo build --release --target wasm32-unknown-unknown --lib
10
11WASM="target/wasm32-unknown-unknown/release/markodown.wasm"
12
13echo "Generating JS bindings..."
14
15~/.cargo/bin/wasm-bindgen \
16 --target web \
17 --out-dir lib/bindgen \
18 --out-name markodown \
19 "$WASM"
20, wasm-opt -Os lib/bindgen/markodown_bg.wasm -o lib/bindgen/markodown_bg.wasm
21
22BASE64=$(base64 < "lib/bindgen/markodown_bg.wasm")
23
24cat > lib/bindgen/wasm_bytes.js << EOF
25/* @ts-self-types="./wasm_bytes.d.ts" */
26export default Uint8Array.from(atob("$BASE64"), c => c.charCodeAt(0));
27EOF
28cat > lib/bindgen/wasm_bytes.d.ts << EOF
29declare const string: string;
30export default string;
31EOF
32
33rm -f lib/bindgen/markodown_bg.wasm
34rm -f lib/bindgen/markodown_bg.wasm.d.ts