@stream-mdx/worker 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,19 @@
1
+ # @stream-mdx/worker
2
+
3
+ ## 0.0.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 9e94660: Docs and release-quality improvements: ship package READMEs/CHANGELOGs, add pack+install smoke tests, expose MDX parity helper entrypoints, and add a deployable docs site workflow.
8
+ - Updated dependencies [9e94660]
9
+ - @stream-mdx/core@0.0.2
10
+ - @stream-mdx/plugins@0.0.2
11
+
12
+ ## 0.0.1
13
+
14
+ ### Patch Changes
15
+
16
+ - Release maintenance: CI/build fixes, missing runtime deps (e.g. `rehype-katex`), and improved docs/README wiring for the `stream-mdx` package page.
17
+ - Updated dependencies
18
+ - @stream-mdx/core@0.0.1
19
+ - @stream-mdx/plugins@0.0.1
package/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # `@stream-mdx/worker`
2
2
 
3
- Web Worker entry point for the streaming renderer. Handles markdown parsing (Lezer), inline enrichment, Shiki highlighting, MDX detection, and patch emission. Consumers rarely interact with this package directly unless they need explicit control over worker instantiation or CSP compliance.
3
+ Worker client utilities and hosted worker bundle used by StreamMDX.
4
+
5
+ Most consumers interact with this package indirectly via `<StreamingMarkdown />`. You only need `@stream-mdx/worker` directly if you want explicit control over worker instantiation, MDX compilation parity helpers, or strict CSP setups.
4
6
 
5
7
  ## Install
6
8
 
@@ -8,53 +10,33 @@ Web Worker entry point for the streaming renderer. Handles markdown parsing (Lez
8
10
  npm install @stream-mdx/worker
9
11
  ```
10
12
 
11
- ## Usage
12
-
13
- ```ts
14
- import { MarkdownWorkerClient } from "@stream-mdx/worker";
13
+ ## Hosted worker bundle (recommended)
15
14
 
16
- const client = new MarkdownWorkerClient({
17
- // For CSP-restricted environments, host the worker and point to it here:
18
- workerUrl: "/workers/markdown-worker.js",
19
- });
15
+ For production, host the worker bundle from static assets (avoids `blob:` CSP requirements):
20
16
 
21
- client.onMessage((msg) => {
22
- if (msg.type === "PATCH") {
23
- // apply patches
24
- }
25
- });
26
-
27
- client.init("# Hello");
17
+ ```bash
18
+ mkdir -p public/workers
19
+ cp node_modules/@stream-mdx/worker/dist/hosted/markdown-worker.js public/workers/markdown-worker.js
28
20
  ```
29
21
 
30
- `MarkdownWorkerClient` will try `createDefaultWorker()` first (Blob/inline), then fall back to a hosted worker URL (`/workers/markdown-worker.js` by default).
22
+ Then point StreamMDX at it:
31
23
 
32
- > Keep `docPlugins` in sync with the renderer when enabling math+MDX. Follow the [cookbook recipe](../../docs/STREAMING_MARKDOWN_PLUGINS_COOKBOOK.md#5-math--mdx-workerrenderer-registration); the worker and React packages now ship tests enforcing it.
33
-
34
- ## Message unions
35
-
36
- | Type | Direction | Payload |
37
- | --- | --- | --- |
38
- | `INIT` | Main → Worker | `{ text?: string; stream?: boolean; prewarmLangs?: string[]; plugins?: PluginConfig }` |
39
- | `APPEND` | Main → Worker | `{ chunk: string }` |
40
- | `FINALIZE` | Main → Worker | Flush + emit remaining patches. |
41
- | `RESET` | Main → Worker | Clear state (used on restart). |
42
- | `PATCH` | Worker → Main | `{ tx, at, patches: Patch[], notes }` |
43
- | `METRICS` | Worker → Main | Parse/highlight timings, block stats. |
44
- | `INITIALIZED`, `ERROR`, `DEBUG` | Worker → Main | Lifecycle events. |
24
+ ```tsx
25
+ <StreamingMarkdown worker="/workers/markdown-worker.js" />
26
+ ```
45
27
 
46
- Exact shapes live in `@stream-mdx/core` (`WorkerMessageIn`, `WorkerMessageOut`).
28
+ ## MDX compilation parity helper
47
29
 
48
- ## Hosting guidance
30
+ If you compile MDX on the server (e.g. Next.js API route), use the same compilation logic as the worker:
49
31
 
50
- - **Blob (default):** easiest for local dev, but CSP must allow `blob:` execution.
51
- - **Hosted URL:** build the hosted worker bundle and copy it into your app’s static assets (e.g. `public/workers/markdown-worker.js`).
52
- - **Build hosted worker:** from the repo root, run `npm run worker:build`.
32
+ ```ts
33
+ import { compileMdxContent } from "@stream-mdx/worker/mdx-compile";
34
+ ```
53
35
 
54
- For CSP-restricted environments, prehost the worker and set `Cross-Origin-Embedder-Policy` / `Cross-Origin-Opener-Policy` headers if you rely on SharedArrayBuffers.
36
+ See `docs/REACT_INTEGRATION_GUIDE.md` for the full wiring and parity notes.
55
37
 
56
- ## Troubleshooting
38
+ ## Docs
57
39
 
58
- - **`setStreamLimit` missing** ensure you updated the demo automation shim; the worker no longer exports legacy control messages.
59
- - **Import errors in worker bundle** – verify your bundler targets `type: "module"` workers and preserves ESM syntax. When in doubt, use the prebuilt `public/workers/markdown-worker.js`.
60
- - **MDX compilation issues** – match the worker’s plugin registry with the React side, and confirm you set `mdxCompileMode="worker"` if you expect in-worker compilation.
40
+ - React integration guide: `docs/REACT_INTEGRATION_GUIDE.md`
41
+ - Security model / CSP: `docs/SECURITY_MODEL.md`
42
+ - Plugins & custom worker bundles: `docs/STREAMING_MARKDOWN_PLUGINS_COOKBOOK.md`
@@ -2030,4 +2030,3 @@ self.onmessage = (e) => {
2030
2030
  messageQueue = task;
2031
2031
  return task;
2032
2032
  };
2033
- //# sourceMappingURL=markdown-worker.js.map
package/dist/index.cjs CHANGED
@@ -246,4 +246,3 @@ var MarkdownWorkerClient = class {
246
246
  createDefaultWorker,
247
247
  releaseDefaultWorker
248
248
  });
249
- //# sourceMappingURL=index.cjs.map
package/dist/index.mjs CHANGED
@@ -217,4 +217,3 @@ export {
217
217
  createDefaultWorker,
218
218
  releaseDefaultWorker
219
219
  };
220
- //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/mdx-compile.ts
31
+ var mdx_compile_exports = {};
32
+ __export(mdx_compile_exports, {
33
+ compileMdxContent: () => compileMdxContent
34
+ });
35
+ module.exports = __toCommonJS(mdx_compile_exports);
36
+ var import_mdx = require("@mdx-js/mdx");
37
+ var import_rehype_katex = __toESM(require("rehype-katex"), 1);
38
+ var import_rehype_slug = __toESM(require("rehype-slug"), 1);
39
+ var import_remark_gfm = __toESM(require("remark-gfm"), 1);
40
+ var import_remark_math = __toESM(require("remark-math"), 1);
41
+ function collectMdxDependencies(source) {
42
+ const dependencies = /* @__PURE__ */ new Set();
43
+ const importRegex = /(?:import|export)\s+[^'"]*?\sfrom\s+['"]([^'"]+)['"]/g;
44
+ let match;
45
+ while (true) {
46
+ match = importRegex.exec(source);
47
+ if (match === null) {
48
+ break;
49
+ }
50
+ dependencies.add(match[1]);
51
+ }
52
+ return Array.from(dependencies);
53
+ }
54
+ async function compileMdxContent(source) {
55
+ const isDev = typeof process !== "undefined" && typeof process.env !== "undefined" && process.env?.NODE_ENV === "development";
56
+ const compiled = await (0, import_mdx.compile)(source, {
57
+ outputFormat: "function-body",
58
+ development: isDev,
59
+ remarkPlugins: [import_remark_gfm.default, import_remark_math.default],
60
+ rehypePlugins: [
61
+ import_rehype_slug.default,
62
+ [
63
+ import_rehype_katex.default,
64
+ {
65
+ throwOnError: false,
66
+ errorColor: "#cc0000",
67
+ strict: false
68
+ }
69
+ ]
70
+ ],
71
+ jsxImportSource: "react"
72
+ });
73
+ return {
74
+ code: String(compiled),
75
+ dependencies: collectMdxDependencies(source)
76
+ };
77
+ }
78
+ // Annotate the CommonJS export names for ESM import in node:
79
+ 0 && (module.exports = {
80
+ compileMdxContent
81
+ });
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Shared MDX compilation helper used by both the worker (mdxCompileMode="worker")
3
+ * and the server-side MDX compile endpoint.
4
+ *
5
+ * The goal is to keep the remark/rehype pipeline identical so that server and
6
+ * worker compilation strategies produce equivalent component code and HTML.
7
+ */
8
+ declare function compileMdxContent(source: string): Promise<{
9
+ code: string;
10
+ dependencies: string[];
11
+ }>;
12
+
13
+ export { compileMdxContent };
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Shared MDX compilation helper used by both the worker (mdxCompileMode="worker")
3
+ * and the server-side MDX compile endpoint.
4
+ *
5
+ * The goal is to keep the remark/rehype pipeline identical so that server and
6
+ * worker compilation strategies produce equivalent component code and HTML.
7
+ */
8
+ declare function compileMdxContent(source: string): Promise<{
9
+ code: string;
10
+ dependencies: string[];
11
+ }>;
12
+
13
+ export { compileMdxContent };
@@ -0,0 +1,46 @@
1
+ // src/mdx-compile.ts
2
+ import { compile as compileMdx } from "@mdx-js/mdx";
3
+ import rehypeKatex from "rehype-katex";
4
+ import rehypeSlug from "rehype-slug";
5
+ import remarkGfm from "remark-gfm";
6
+ import remarkMath from "remark-math";
7
+ function collectMdxDependencies(source) {
8
+ const dependencies = /* @__PURE__ */ new Set();
9
+ const importRegex = /(?:import|export)\s+[^'"]*?\sfrom\s+['"]([^'"]+)['"]/g;
10
+ let match;
11
+ while (true) {
12
+ match = importRegex.exec(source);
13
+ if (match === null) {
14
+ break;
15
+ }
16
+ dependencies.add(match[1]);
17
+ }
18
+ return Array.from(dependencies);
19
+ }
20
+ async function compileMdxContent(source) {
21
+ const isDev = typeof process !== "undefined" && typeof process.env !== "undefined" && process.env?.NODE_ENV === "development";
22
+ const compiled = await compileMdx(source, {
23
+ outputFormat: "function-body",
24
+ development: isDev,
25
+ remarkPlugins: [remarkGfm, remarkMath],
26
+ rehypePlugins: [
27
+ rehypeSlug,
28
+ [
29
+ rehypeKatex,
30
+ {
31
+ throwOnError: false,
32
+ errorColor: "#cc0000",
33
+ strict: false
34
+ }
35
+ ]
36
+ ],
37
+ jsxImportSource: "react"
38
+ });
39
+ return {
40
+ code: String(compiled),
41
+ dependencies: collectMdxDependencies(source)
42
+ };
43
+ }
44
+ export {
45
+ compileMdxContent
46
+ };
@@ -22,4 +22,3 @@ __reExport(custom_matcher_exports, require("@stream-mdx/core/streaming/custom-ma
22
22
  0 && (module.exports = {
23
23
  ...require("@stream-mdx/core/streaming/custom-matcher")
24
24
  });
25
- //# sourceMappingURL=custom-matcher.cjs.map
@@ -1,3 +1,2 @@
1
1
  // src/streaming/custom-matcher.ts
2
2
  export * from "@stream-mdx/core/streaming/custom-matcher";
3
- //# sourceMappingURL=custom-matcher.mjs.map
@@ -242,4 +242,3 @@ var MarkdownWorkerClient = class {
242
242
  0 && (module.exports = {
243
243
  MarkdownWorkerClient
244
244
  });
245
- //# sourceMappingURL=worker-client.cjs.map
@@ -53,6 +53,7 @@ declare class MarkdownWorkerClient {
53
53
  mdx?: boolean;
54
54
  tables?: boolean;
55
55
  callouts?: boolean;
56
+ math?: boolean;
56
57
  }, mdxOptions?: {
57
58
  compileMode?: "server" | "worker";
58
59
  }): void;
@@ -53,6 +53,7 @@ declare class MarkdownWorkerClient {
53
53
  mdx?: boolean;
54
54
  tables?: boolean;
55
55
  callouts?: boolean;
56
+ math?: boolean;
56
57
  }, mdxOptions?: {
57
58
  compileMode?: "server" | "worker";
58
59
  }): void;
@@ -215,4 +215,3 @@ var MarkdownWorkerClient = class {
215
215
  export {
216
216
  MarkdownWorkerClient
217
217
  };
218
- //# sourceMappingURL=worker-client.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stream-mdx/worker",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "Worker client utilities and shared worker helpers for the Streaming Markdown V2 pipeline",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -26,6 +26,11 @@
26
26
  "import": "./dist/worker-client.mjs",
27
27
  "require": "./dist/worker-client.cjs"
28
28
  },
29
+ "./mdx-compile": {
30
+ "types": "./dist/mdx-compile.d.ts",
31
+ "import": "./dist/mdx-compile.mjs",
32
+ "require": "./dist/mdx-compile.cjs"
33
+ },
29
34
  "./streaming/custom-matcher": {
30
35
  "types": "./dist/streaming/custom-matcher.d.ts",
31
36
  "import": "./dist/streaming/custom-matcher.mjs",
@@ -33,7 +38,9 @@
33
38
  }
34
39
  },
35
40
  "files": [
36
- "dist"
41
+ "dist",
42
+ "README.md",
43
+ "CHANGELOG.md"
37
44
  ],
38
45
  "sideEffects": [
39
46
  "src/worker-dom-stub.ts"
@@ -49,8 +56,8 @@
49
56
  "@lezer/common": "^1.2.3",
50
57
  "@lezer/lr": "^1.4.2",
51
58
  "@lezer/markdown": "^1.3.0",
52
- "@stream-mdx/core": "0.0.1",
53
- "@stream-mdx/plugins": "0.0.1",
59
+ "@stream-mdx/core": "0.0.2",
60
+ "@stream-mdx/plugins": "0.0.2",
54
61
  "@mdx-js/mdx": "^3.1.0",
55
62
  "@shikijs/engine-javascript": "^1.29.2",
56
63
  "@shikijs/engine-oniguruma": "^1.29.2",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/worker-dom-stub.ts","../../src/worker.ts","../../src/parser/block-types.ts","../../src/perf/patch-heuristics.ts","../../src/mdx-compile.ts"],"sourcesContent":["import * as characterEntities from \"character-entities\";\n\ndeclare global {\n // eslint-disable-next-line no-var\n var document:\n | {\n createElement: (tag: string) => { innerHTML: string; textContent: string };\n compatMode?: \"CSS1Compat\" | \"BackCompat\";\n }\n | undefined;\n}\n\nif (typeof document === \"undefined\") {\n const entityMap = characterEntities as unknown as Record<string, string>;\n (globalThis as typeof globalThis & { document?: typeof document }).document = {\n compatMode: \"CSS1Compat\",\n createElement() {\n return {\n _inner: \"\",\n set innerHTML(value: string) {\n this._inner = value;\n },\n get innerHTML() {\n return this._inner;\n },\n get textContent() {\n const match = /^&([^;]+);$/.exec(this._inner);\n if (match) {\n const entity = entityMap[match[1]];\n if (typeof entity === \"string\") {\n return entity;\n }\n }\n return this._inner;\n },\n } as { innerHTML: string; textContent: string; _inner?: string };\n },\n };\n}\n\n// Minimal DOMParser stub for worker environments. This avoids ReferenceError in\n// dependencies that probe for DOMParser (e.g., DOMPurify or highlight helpers)\n// while keeping the implementation lightweight. It provides enough shape for\n// querySelector/querySelectorAll and basic text extraction.\nif (typeof (globalThis as { DOMParser?: unknown }).DOMParser === \"undefined\") {\n class DOMParserStub {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n parseFromString(content: string, _type?: string) {\n const text = content ?? \"\";\n const noop = () => null;\n const emptyList = () => [] as unknown[];\n return {\n textContent: text,\n innerHTML: text,\n documentElement: { textContent: text, innerHTML: text },\n body: {\n innerHTML: text,\n textContent: text,\n firstChild: null,\n querySelector: noop,\n querySelectorAll: emptyList,\n appendChild: noop,\n removeChild: noop,\n },\n createElement() {\n return {\n innerHTML: \"\",\n textContent: \"\",\n querySelector: noop,\n querySelectorAll: emptyList,\n appendChild: noop,\n removeChild: noop,\n };\n },\n querySelector: noop,\n querySelectorAll: emptyList,\n };\n }\n }\n (globalThis as typeof globalThis & { DOMParser?: unknown }).DOMParser = DOMParserStub as unknown as typeof DOMParser;\n}\n","// Web Worker for V2 Markdown parsing and enrichment\n// Handles Lezer parsing, inline processing, and syntax highlighting\n\nimport \"./worker-dom-stub\";\n\nimport type {\n Block,\n CompiledMdxModule,\n InlineNode,\n NodeSnapshot,\n Patch,\n PatchMetrics,\n PerformanceMetrics,\n ProtectedRange,\n WorkerErrorPayload,\n WorkerIn,\n WorkerOut,\n WorkerPhase,\n} from \"@stream-mdx/core\";\n\nimport type { Tree } from \"@lezer/common\";\nimport { parser as mdParser } from \"@lezer/markdown\";\nimport { createJavaScriptRegexEngine } from \"@shikijs/engine-javascript\";\nimport rehypeSlug from \"rehype-slug\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\nimport { createHighlighter } from \"shiki\";\n\nimport {\n PATCH_ROOT_ID,\n PerformanceTimer,\n blocksStructurallyEqual,\n cloneBlock,\n createBlockSnapshot,\n detectMDX,\n extractMixedContentSegments,\n generateBlockId,\n normalizeBlockquoteText,\n parseCodeFenceInfo,\n removeHeadingMarkers,\n} from \"@stream-mdx/core\";\nimport { InlineParser, dedentIndentedCode, sanitizeHtmlInWorker, stripCodeFence } from \"@stream-mdx/core\";\nimport { computeHeavyPatchBudget } from \"@stream-mdx/core\";\nimport { isHeavyPatch } from \"@stream-mdx/core/perf/patch-batching\";\nimport { CalloutsPlugin, HTMLBlockPlugin, MDXDetectionPlugin, TablesPlugin, globalDocumentPluginRegistry, registerFootnotesPlugin } from \"@stream-mdx/plugins\";\nimport type { DocumentState } from \"@stream-mdx/plugins/document\";\nimport { isBlockLevelNode, mapLezerNodeToBlockType } from \"./parser/block-types\";\nimport { computeParagraphPatchLimit } from \"./perf/patch-heuristics\";\n\n// Worker state\nlet highlighter: Awaited<ReturnType<typeof createHighlighter>> | null = null;\nlet blocks: Block[] = [];\nlet lastTree: Tree | null = null;\nlet currentContent = \"\";\nlet inlineParser: InlineParser;\nlet performanceTimer: PerformanceTimer;\nconst documentPluginState: DocumentState = {};\nlet txCounter = 0;\nconst workerGrammarEngine: \"js\" | \"wasm\" = \"js\";\nlet workerCredits = 1;\nconst MAX_DEFERRED_PATCHES = 400;\nlet deferredPatchQueue: Patch[] = [];\nconst MAX_DEFERRED_FLUSH_PATCHES = 120;\nconst CODE_HIGHLIGHT_CACHE = new Map<string, { html: string; lang: string }>();\nconst MAX_CODE_HIGHLIGHT_CACHE_ENTRIES = 200;\ntype WorkerMdxMode = \"server\" | \"worker\";\nlet mdxCompileMode: WorkerMdxMode = \"server\";\nconst WORKER_MDX_CACHE = new Map<string, CompiledMdxModule>();\nconst WORKER_MDX_INFLIGHT = new Map<string, Promise<CompiledMdxModule>>();\nconst MAX_WORKER_MDX_CACHE_ENTRIES = 128;\nlet loggedMdxSkipCount = 0;\nconst MAX_MDX_SKIP_LOGS = 20;\n\n// Debug toggles (controlled via env or global flag to avoid noisy consoles in dev)\nfunction isDebugEnabled(flag: \"mdx\" | \"worker\"): boolean {\n try {\n if (typeof process !== \"undefined\" && process.env) {\n if (flag === \"mdx\" && process.env.NEXT_PUBLIC_STREAMING_DEBUG_MDX === \"1\") return true;\n if (flag === \"worker\" && process.env.NEXT_PUBLIC_STREAMING_DEBUG_WORKER === \"1\") return true;\n }\n } catch {\n // ignore env read errors\n }\n try {\n const g = globalThis as { __STREAMING_DEBUG__?: { mdx?: boolean; worker?: boolean } };\n if (flag === \"mdx\" && g.__STREAMING_DEBUG__?.mdx) return true;\n if (flag === \"worker\" && g.__STREAMING_DEBUG__?.worker) return true;\n } catch {\n // ignore global read errors\n }\n return false;\n}\nconst DEBUG_MDX = isDebugEnabled(\"mdx\");\n\nconst sharedTextEncoder: TextEncoder | null = typeof TextEncoder !== \"undefined\" ? new TextEncoder() : null;\n\nfunction now(): number {\n return typeof performance !== \"undefined\" && typeof performance.now === \"function\" ? performance.now() : Date.now();\n}\n\nfunction roundMetric(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return Math.round(value * 1000) / 1000;\n}\n\nclass WorkerMetricsCollector {\n private readonly grammarEngine: \"js\" | \"wasm\";\n private readonly startedAt: number;\n private parseStart: number | null = null;\n private diffStart: number | null = null;\n private serializeStart: number | null = null;\n private tx?: number;\n\n parseMs = 0;\n enrichMs = 0;\n diffMs = 0;\n serializeMs = 0;\n shikiMs = 0;\n mdxDetectMs = 0;\n patchBytes = 0;\n patchCount = 0;\n queueDepth = 0;\n blocksProduced = 0;\n private readonly blockTypeCounts = new Map<string, number>();\n private readonly blockTypeDurations = new Map<string, number>();\n private readonly blockTypeSizes = new Map<string, number>();\n private readonly highlightByLanguage = new Map<string, { time: number; count: number }>();\n appendLineBatchCount = 0;\n appendLineTotalLines = 0;\n appendLineMaxLines = 0;\n\n constructor(grammarEngine: \"js\" | \"wasm\") {\n this.grammarEngine = grammarEngine;\n this.startedAt = now();\n }\n\n markParseStart(): void {\n this.parseStart = now();\n }\n\n markParseEnd(): void {\n if (this.parseStart === null) return;\n this.parseMs += Math.max(0, now() - this.parseStart);\n this.parseStart = null;\n }\n\n recordEnrich(duration: number | null | undefined): void {\n if (!Number.isFinite(duration ?? Number.NaN)) return;\n this.enrichMs += Math.max(0, Number(duration));\n }\n\n recordShiki(duration: number | null | undefined): void {\n if (!Number.isFinite(duration ?? Number.NaN)) return;\n this.shikiMs += Math.max(0, Number(duration));\n }\n\n recordMdxDetect(duration: number | null | undefined): void {\n if (!Number.isFinite(duration ?? Number.NaN)) return;\n this.mdxDetectMs += Math.max(0, Number(duration));\n }\n\n countBlockType(type: string): void {\n if (!type) return;\n this.blockTypeCounts.set(type, (this.blockTypeCounts.get(type) ?? 0) + 1);\n }\n\n recordBlockSize(type: string, size: number | null | undefined): void {\n if (!type || !Number.isFinite(size ?? Number.NaN)) return;\n const current = this.blockTypeSizes.get(type) ?? 0;\n this.blockTypeSizes.set(type, current + Math.max(0, Number(size)));\n }\n\n recordBlockEnrich(type: string, duration: number | null | undefined): void {\n if (!type || !Number.isFinite(duration ?? Number.NaN)) return;\n const previous = this.blockTypeDurations.get(type) ?? 0;\n this.blockTypeDurations.set(type, previous + Math.max(0, Number(duration)));\n }\n\n recordHighlightForLanguage(lang: string, duration: number | null | undefined): void {\n if (!lang || !Number.isFinite(duration ?? Number.NaN)) return;\n const entry = this.highlightByLanguage.get(lang) ?? { time: 0, count: 0 };\n entry.time += Math.max(0, Number(duration));\n entry.count += 1;\n this.highlightByLanguage.set(lang, entry);\n }\n\n recordAppendLines(lineCount: number | null | undefined): void {\n if (!Number.isFinite(lineCount ?? Number.NaN)) return;\n const normalized = Math.max(0, Math.floor(Number(lineCount)));\n if (normalized <= 0) return;\n this.appendLineBatchCount += 1;\n this.appendLineTotalLines += normalized;\n if (normalized > this.appendLineMaxLines) {\n this.appendLineMaxLines = normalized;\n }\n }\n\n markDiffStart(): void {\n this.diffStart = now();\n }\n\n markDiffEnd(): void {\n if (this.diffStart === null) return;\n this.diffMs += Math.max(0, now() - this.diffStart);\n this.diffStart = null;\n }\n\n beginSerialize(): void {\n this.serializeStart = now();\n }\n\n endSerialize(): void {\n if (this.serializeStart === null) return;\n this.serializeMs += Math.max(0, now() - this.serializeStart);\n this.serializeStart = null;\n }\n\n finalizePatch(tx: number, patchCount: number, queueDepth: number, patchBytes: number): void {\n this.tx = tx;\n this.patchCount = patchCount;\n this.queueDepth = queueDepth;\n this.patchBytes = patchBytes;\n }\n\n setBlocksProduced(count: number): void {\n this.blocksProduced = count;\n }\n\n toPatchMetrics(changedBlocks: number): PatchMetrics {\n return {\n patchCount: this.patchCount,\n changedBlocks,\n diffTime: roundMetric(this.diffMs),\n parseTime: roundMetric(this.parseMs),\n enrichTime: this.enrichMs ? roundMetric(this.enrichMs) : undefined,\n queueDepth: this.queueDepth || undefined,\n patchBytes: this.patchBytes || undefined,\n appendLineBatches: this.appendLineBatchCount || undefined,\n appendLineTotalLines: this.appendLineTotalLines || undefined,\n appendLineMaxLines: this.appendLineMaxLines || undefined,\n };\n }\n\n toPerformanceMetrics(): PerformanceMetrics {\n return {\n tx: this.tx,\n timestamp: this.startedAt,\n parseMs: roundMetric(this.parseMs),\n parseTime: roundMetric(this.parseMs),\n enrichMs: this.enrichMs ? roundMetric(this.enrichMs) : undefined,\n diffMs: this.diffMs ? roundMetric(this.diffMs) : undefined,\n serializeMs: this.serializeMs ? roundMetric(this.serializeMs) : undefined,\n highlightTime: this.shikiMs ? roundMetric(this.shikiMs) : undefined,\n shikiMs: this.shikiMs ? roundMetric(this.shikiMs) : undefined,\n mdxDetectMs: this.mdxDetectMs ? roundMetric(this.mdxDetectMs) : undefined,\n patchBytes: this.patchBytes || undefined,\n patchCount: this.patchCount || undefined,\n queueDepth: this.queueDepth || undefined,\n blocksProduced: this.blocksProduced || undefined,\n grammarEngine: this.grammarEngine,\n blockCountByType: mapToNumberRecord(this.blockTypeCounts),\n blockEnrichMsByType: mapToNumberRecord(this.blockTypeDurations, true),\n blockSizeByType: mapToNumberRecord(this.blockTypeSizes),\n highlightByLanguage: mapToHighlightRecord(this.highlightByLanguage),\n appendLineBatches: this.appendLineBatchCount || undefined,\n appendLineTotalLines: this.appendLineTotalLines || undefined,\n appendLineMaxLines: this.appendLineMaxLines || undefined,\n };\n }\n}\n\nlet activeMetricsCollector: WorkerMetricsCollector | null = null;\n\nfunction setActiveMetricsCollector(collector: WorkerMetricsCollector | null): void {\n activeMetricsCollector = collector;\n}\n\nfunction getActiveMetricsCollector(): WorkerMetricsCollector | null {\n return activeMetricsCollector;\n}\n\nfunction estimatePatchSize(patches: Patch[]): number {\n if (!sharedTextEncoder) return 0;\n try {\n return sharedTextEncoder.encode(JSON.stringify(patches)).length;\n } catch {\n return 0;\n }\n}\n\nfunction countChangedBlocksFromPatches(patches: Patch[]): number {\n if (!patches || patches.length === 0) return 0;\n const ids = new Set<string>();\n for (const patch of patches) {\n const blockId = patch.at?.blockId;\n if (blockId) {\n ids.add(blockId);\n }\n }\n return ids.size;\n}\n\nfunction partitionPatchesForCredits(patches: Patch[], maxImmediate?: number): Patch[] {\n let combined: Patch[] = patches;\n if (deferredPatchQueue.length > 0) {\n combined = deferredPatchQueue.concat(patches);\n deferredPatchQueue = [];\n }\n if (combined.length === 0) {\n return [];\n }\n\n const immediate: Patch[] = [];\n const deferred: Patch[] = [];\n\n let heavyBudget = computeHeavyPatchBudget(workerCredits);\n\n for (const patch of combined) {\n const heavy = isHeavyPatch(patch);\n if (heavy) {\n if (heavyBudget <= 0) {\n if (deferred.length < MAX_DEFERRED_PATCHES) {\n deferred.push(patch);\n continue;\n }\n } else {\n heavyBudget -= 1;\n }\n }\n immediate.push(patch);\n }\n\n if (typeof maxImmediate === \"number\" && immediate.length > maxImmediate) {\n const overflow = immediate.splice(maxImmediate);\n deferredPatchQueue = overflow.concat(deferred);\n } else {\n deferredPatchQueue = deferred;\n }\n return immediate;\n}\n\nfunction flushDeferredPatches() {\n if (workerCredits <= 0 || deferredPatchQueue.length === 0) {\n return;\n }\n const immediate = partitionPatchesForCredits([], MAX_DEFERRED_FLUSH_PATCHES);\n if (immediate.length === 0) {\n return;\n }\n\n const metricsCollector = new WorkerMetricsCollector(workerGrammarEngine);\n metricsCollector.setBlocksProduced(blocks.length);\n const tx = ++txCounter;\n const patchBytes = estimatePatchSize(immediate);\n metricsCollector.finalizePatch(tx, immediate.length, deferredPatchQueue.length, patchBytes);\n const changedBlocks = countChangedBlocksFromPatches(immediate);\n const patchMetrics = metricsCollector.toPatchMetrics(changedBlocks);\n\n postMessage({\n type: \"PATCH\",\n tx,\n patches: immediate,\n metrics: patchMetrics,\n } as WorkerOut);\n\n emitMetricsSample(metricsCollector);\n if (getActiveMetricsCollector() === metricsCollector) {\n setActiveMetricsCollector(null);\n }\n}\n\nfunction emitMetricsSample(collector: WorkerMetricsCollector | null): void {\n if (!collector) return;\n const metrics = collector.toPerformanceMetrics();\n if (!metrics) return;\n postMessage({\n type: \"METRICS\",\n metrics,\n } as WorkerOut);\n}\n\nfunction mapToNumberRecord(map: Map<string, number>, roundValues = false): Record<string, number> {\n const result: Record<string, number> = {};\n for (const [key, value] of map.entries()) {\n if (!Number.isFinite(value)) continue;\n if (value === 0) continue;\n result[key] = roundValues ? roundMetric(value) : value;\n }\n return result;\n}\n\nfunction mapToHighlightRecord(map: Map<string, { time: number; count: number }>): Record<string, { count: number; totalMs: number; avgMs: number }> {\n const result: Record<string, { count: number; totalMs: number; avgMs: number }> = {};\n for (const [key, value] of map.entries()) {\n if (!value || value.count <= 0 || !Number.isFinite(value.time)) continue;\n const total = roundMetric(value.time);\n result[key] = {\n count: value.count,\n totalMs: total,\n avgMs: roundMetric(total / value.count),\n };\n }\n return result;\n}\n\n/**\n * Safe inline parsing for streaming content that may have incomplete expressions\n */\nfunction parseInlineStreamingSafe(content: string): InlineNode[] {\n // Fast parity checks (avoid regex allocations on hot path).\n let dollarCount = 0;\n let backtickCount = 0;\n let starCount = 0;\n let doubleStarCount = 0;\n\n for (let i = 0; i < content.length; i++) {\n const code = content.charCodeAt(i);\n // '$'\n if (code === 36) {\n dollarCount += 1;\n continue;\n }\n // '`'\n if (code === 96) {\n backtickCount += 1;\n continue;\n }\n // '*'\n if (code === 42) {\n if (i + 1 < content.length && content.charCodeAt(i + 1) === 42) {\n doubleStarCount += 1;\n starCount += 2;\n i += 1;\n } else {\n starCount += 1;\n }\n }\n }\n\n const hasIncompleteMath = dollarCount % 2 !== 0;\n if (hasIncompleteMath) {\n return [{ kind: \"text\", text: content }];\n }\n\n const hasIncompleteCode = backtickCount % 2 !== 0;\n const hasIncompleteStrong = doubleStarCount % 2 !== 0;\n const singleStarCount = starCount - doubleStarCount * 2;\n const hasIncompleteEmphasis = singleStarCount % 2 !== 0;\n\n if (hasIncompleteCode || hasIncompleteStrong || hasIncompleteEmphasis) {\n return [{ kind: \"text\", text: content }];\n }\n\n // Safe to parse with full inline parser; avoid caching intermediate streaming states.\n return inlineParser.parse(content, { cache: false });\n}\n\n/**\n * Initialize the worker\n */\nasync function initialize(\n initialContent = \"\",\n prewarmLangs: string[] = [],\n docPlugins?: {\n footnotes?: boolean;\n html?: boolean;\n mdx?: boolean;\n tables?: boolean;\n callouts?: boolean;\n math?: boolean;\n },\n mdxOptions?: { compileMode?: WorkerMdxMode },\n) {\n performanceTimer = new PerformanceTimer();\n inlineParser = new InlineParser();\n // Make inline parser available to document plugins (e.g., for footnote definition parsing)\n documentPluginState.inlineParser = inlineParser;\n blocks = [];\n lastTree = null;\n currentContent = \"\";\n deferredPatchQueue = [];\n\n mdxCompileMode = mdxOptions?.compileMode ?? \"server\";\n try {\n // Helpful telemetry for demo/dev runs to confirm how MDX is compiled.\n if (DEBUG_MDX) {\n console.debug(\"[markdown-worker] init\", { mdxCompileMode });\n }\n } catch {\n // ignore logging errors\n }\n clearWorkerMdxCaches();\n\n // Register document-phase plugins (once) based on flags\n const enable = {\n footnotes: docPlugins?.footnotes ?? true,\n html: docPlugins?.html ?? true,\n mdx: docPlugins?.mdx ?? true,\n tables: docPlugins?.tables ?? true,\n callouts: docPlugins?.callouts ?? false,\n math: docPlugins?.math ?? true,\n };\n\n if (enable.footnotes) registerFootnotesPlugin();\n if (enable.tables) globalDocumentPluginRegistry.register(TablesPlugin);\n if (enable.callouts) globalDocumentPluginRegistry.register(CalloutsPlugin);\n if (enable.html) globalDocumentPluginRegistry.register(HTMLBlockPlugin);\n if (enable.mdx) globalDocumentPluginRegistry.register(MDXDetectionPlugin);\n\n performanceTimer.mark(\"highlighter-init\");\n\n // Core languages that should always be available\n const coreLangs = [\"javascript\", \"typescript\", \"json\", \"text\", \"markdown\"];\n const initialLangs = [...coreLangs, ...prewarmLangs];\n\n // Initialize Shiki with JS engine for browser compatibility\n highlighter = await createHighlighter({\n engine: createJavaScriptRegexEngine(),\n langs: initialLangs,\n themes: [\"github-dark\", \"github-light\"],\n });\n\n const highlighterTime = performanceTimer.measure(\"highlighter-init\");\n\n // Parse initial content if provided\n if (initialContent) {\n currentContent = initialContent;\n const result = await parseAll(initialContent);\n blocks = result.blocks;\n lastTree = result.lastTree;\n }\n\n txCounter = 0;\n postMessage({\n type: \"INITIALIZED\",\n blocks,\n } as WorkerOut);\n\n if (blocks.length > 0) {\n await emitDocumentPatch(blocks);\n }\n}\n\n/**\n * Handle append operations for streaming\n */\nasync function handleAppend(text: string) {\n performanceTimer.mark(\"append-operation\");\n\n const metricsCollector = new WorkerMetricsCollector(workerGrammarEngine);\n setActiveMetricsCollector(metricsCollector);\n\n await appendAndReparse(text, metricsCollector);\n const hadPatchMetrics = metricsCollector.patchCount > 0;\n\n const totalTime = performanceTimer.measure(\"append-operation\");\n\n if (getActiveMetricsCollector() === metricsCollector) {\n setActiveMetricsCollector(null);\n }\n\n // Maintain legacy parse timing for compatibility\n if (!hadPatchMetrics && totalTime !== null && Number.isFinite(totalTime)) {\n postMessage({\n type: \"METRICS\",\n metrics: {\n parseMs: roundMetric(totalTime),\n parseTime: roundMetric(totalTime),\n blocksProduced: blocks.length,\n grammarEngine: workerGrammarEngine,\n } as PerformanceMetrics,\n } as WorkerOut);\n }\n}\n\n/**\n * Parse entire content (for initialization or static rendering)\n */\ntype ParseOptions = {\n /**\n * Treat all blocks as finalized for enrichment + document plugins.\n * Used by FINALIZE so the tail block runs full inline parsing and\n * synthetic document-phase plugins (e.g. footnotes) can append blocks.\n */\n forceFinalize?: boolean;\n};\n\nasync function parseAll(content: string, options: ParseOptions = {}): Promise<{ blocks: Block[]; lastTree: Tree }> {\n performanceTimer.mark(\"parse-all\");\n const metrics = getActiveMetricsCollector();\n metrics?.markParseStart();\n\n const tree = mdParser.parse(content);\n let extractedBlocks = await extractBlocks(tree, content, options);\n\n // Run document-phase plugins for aggregation and synthetic blocks\n extractedBlocks = runDocumentPlugins(extractedBlocks, content);\n\n performanceTimer.measure(\"parse-all\");\n metrics?.markParseEnd();\n metrics?.setBlocksProduced(extractedBlocks.length);\n\n return {\n blocks: extractedBlocks,\n lastTree: tree,\n };\n}\n\n/**\n * Incremental parsing with Lezer fragments\n */\nasync function appendAndReparse(appendedText: string, metrics?: WorkerMetricsCollector): Promise<void> {\n performanceTimer.mark(\"incremental-parse\");\n metrics?.markParseStart();\n\n const newContent = currentContent + appendedText;\n const changeRanges = computeChangedRanges(currentContent, newContent);\n\n // Use Lezer incremental parsing with fragments\n const newTree = lastTree ? mdParser.parse(newContent, lastTree.fragments) : mdParser.parse(newContent);\n\n // Find the changed region\n let changedBlocks = await extractBlocks(newTree, newContent);\n changedBlocks = runDocumentPlugins(changedBlocks, newContent);\n const prevBlocks = blocks;\n\n // Update our state\n blocks = changedBlocks;\n lastTree = newTree;\n currentContent = newContent;\n\n performanceTimer.measure(\"incremental-parse\");\n metrics?.markParseEnd();\n metrics?.setBlocksProduced(blocks.length);\n\n await emitBlockDiffPatches(prevBlocks, changedBlocks, changeRanges, metrics);\n\n // Legacy UPDATE message is no longer emitted; patch batches cover all updates.\n}\n\n/**\n * Extract blocks from Lezer tree with fallback\n */\nasync function extractBlocks(tree: Tree, content: string, options: ParseOptions = {}): Promise<Block[]> {\n try {\n const blocks: Block[] = [];\n const cursor = tree.cursor();\n\n // Only consider top-level children of the document node\n if (cursor.firstChild()) {\n do {\n const nodeType = cursor.type.name;\n const from = cursor.from;\n const to = cursor.to;\n const raw = content.slice(from, to);\n\n if (isBlockLevelNode(nodeType)) {\n const blockType = mapLezerNodeToBlockType(nodeType);\n const block = await createBlock(blockType, raw, from, to, content, options);\n\n // Only add non-empty blocks\n if (block && raw.trim()) {\n blocks.push(block);\n }\n }\n } while (cursor.nextSibling());\n }\n\n // Fallback: if Lezer didn't extract any blocks, use simple line-based parsing\n if (blocks.length === 0) {\n return await extractBlocksSimple(content, options);\n }\n\n return blocks;\n } catch (error) {\n const details = error instanceof Error ? { name: error.name, message: error.message, stack: error.stack } : error;\n console.warn(\"Lezer parsing failed, falling back to simple parsing:\", details);\n return await extractBlocksSimple(content, options);\n }\n}\n\n/**\n * Simple fallback block extraction\n */\nasync function extractBlocksSimple(content: string, options: ParseOptions = {}): Promise<Block[]> {\n const blocks: Block[] = [];\n const lines = content.split(\"\\n\");\n let currentParagraph: string[] = [];\n let currentPos = 0;\n\n const finalizeParagraph = async () => {\n if (currentParagraph.length > 0) {\n const raw = currentParagraph.join(\"\\n\");\n const from = currentPos - raw.length;\n const to = currentPos;\n\n // Determine block type\n let blockType = \"paragraph\";\n if (raw.match(/^#{1,6}\\s+/)) {\n blockType = \"heading\";\n } else if (raw.match(/^```/)) {\n blockType = \"code\";\n } else if (raw.match(/^>/)) {\n blockType = \"blockquote\";\n } else if (raw.match(/^[-*+]\\s+|^\\d+\\.\\s+/)) {\n blockType = \"list\";\n }\n\n const block = await createBlock(blockType, raw, from, to, content, options);\n if (block) {\n blocks.push(block);\n }\n currentParagraph = [];\n }\n };\n\n for (const line of lines) {\n currentPos += line.length + 1; // +1 for newline\n\n if (line.trim() === \"\") {\n await finalizeParagraph();\n } else {\n currentParagraph.push(line);\n }\n }\n\n // Finalize last paragraph\n await finalizeParagraph();\n\n return blocks;\n}\n\n/**\n * Check if Lezer node is block-level\n */\n/**\n * Create a block with enrichment\n */\nasync function createBlock(type: string, raw: string, from: number, to: number, fullContent: string, options: ParseOptions = {}): Promise<Block | null> {\n if (!raw.trim()) return null;\n\n const id = generateBlockId(`${from}:${type}`, type);\n\n // Determine if this is the last block (dirty tail)\n const isFinalized = options.forceFinalize ? true : to < fullContent.length - 1;\n\n const block: Block = {\n id,\n type,\n isFinalized,\n payload: {\n raw,\n range: { from, to },\n },\n };\n\n // Apply enrichment based on block type\n await enrichBlock(block);\n\n return block;\n}\n\n/**\n * Enrich blocks with inline parsing, highlighting, etc.\n */\nasync function enrichBlock(block: Block) {\n performanceTimer.mark(\"enrich-block\");\n const metrics = getActiveMetricsCollector();\n metrics?.countBlockType(block.type);\n const rawLength = typeof block.payload.raw === \"string\" ? block.payload.raw.length : 0;\n metrics?.recordBlockSize(block.type, rawLength);\n\n switch (block.type) {\n case \"heading\": {\n const rawHeading = typeof block.payload.raw === \"string\" ? block.payload.raw : \"\";\n const normalizedHeading = removeHeadingMarkers(rawHeading);\n const headingLevel = Math.min(Math.max(rawHeading.match(/^#{1,6}/)?.[0].length ?? 1, 1), 6);\n block.payload.meta = {\n ...(block.payload.meta ?? {}),\n headingLevel,\n headingText: normalizedHeading,\n };\n if (block.isFinalized) {\n block.payload.raw = normalizedHeading;\n block.payload.inline = inlineParser.parse(normalizedHeading);\n } else {\n block.payload.inline = parseInlineStreamingSafe(normalizedHeading);\n }\n break;\n }\n\n case \"blockquote\": {\n const normalized = normalizeBlockquoteText(block.payload.raw ?? \"\");\n block.payload.raw = normalized;\n const segments = extractMixedContentSegments(normalized, undefined, (value) => inlineParser.parse(value));\n const currentMeta = (block.payload.meta ?? {}) as Record<string, unknown>;\n const nextMeta: Record<string, unknown> = {\n ...currentMeta,\n normalizedText: normalized,\n };\n if (segments.length > 0) {\n nextMeta.mixedSegments = segments;\n } else {\n nextMeta.mixedSegments = undefined;\n }\n if (Object.keys(nextMeta).length > 0) {\n block.payload.meta = nextMeta;\n } else {\n block.payload.meta = undefined;\n }\n\n if (block.isFinalized) {\n block.payload.inline = inlineParser.parse(normalized);\n } else {\n block.payload.inline = parseInlineStreamingSafe(normalized);\n }\n break;\n }\n\n case \"paragraph\": {\n const rawParagraph = typeof block.payload.raw === \"string\" ? block.payload.raw : \"\";\n // Parse inline content, but be careful with incomplete expressions during streaming\n const inlineParse = block.isFinalized ? (value: string) => inlineParser.parse(value) : parseInlineStreamingSafe;\n block.payload.inline = inlineParse(rawParagraph);\n\n const currentMeta = (block.payload.meta ?? {}) as Record<string, unknown>;\n const nextMeta: Record<string, unknown> = { ...currentMeta };\n let metaChanged = false;\n\n const mathRanges = collectMathProtectedRanges(rawParagraph);\n if (mathRanges.length > 0) {\n nextMeta.protectedRanges = mathRanges;\n metaChanged = true;\n } else if (Object.prototype.hasOwnProperty.call(nextMeta, \"protectedRanges\")) {\n nextMeta.protectedRanges = undefined;\n metaChanged = true;\n }\n\n const shouldExtractSegments = typeof rawParagraph === \"string\" && (rawParagraph.includes(\"<\") || rawParagraph.includes(\"{\"));\n if (shouldExtractSegments) {\n const baseOffset = typeof block.payload.range?.from === \"number\" ? block.payload.range.from : undefined;\n const segments = extractMixedContentSegments(rawParagraph, baseOffset, (value) => inlineParse(value));\n if (segments.length > 0) {\n nextMeta.mixedSegments = segments;\n metaChanged = true;\n } else if (Object.prototype.hasOwnProperty.call(nextMeta, \"mixedSegments\")) {\n nextMeta.mixedSegments = undefined;\n metaChanged = true;\n }\n } else if (Object.prototype.hasOwnProperty.call(nextMeta, \"mixedSegments\")) {\n nextMeta.mixedSegments = undefined;\n metaChanged = true;\n }\n\n if (metaChanged) {\n if (Object.keys(nextMeta).length > 0) {\n block.payload.meta = nextMeta;\n } else {\n block.payload.meta = undefined;\n }\n } else if (!block.payload.meta || Object.keys(block.payload.meta).length === 0) {\n block.payload.meta = undefined;\n }\n break;\n }\n\n case \"code\":\n await enrichCodeBlock(block);\n break;\n\n case \"html\": {\n const sanitized = sanitizeHtmlInWorker(block.payload.raw);\n block.payload.sanitizedHtml = sanitized;\n block.payload.meta = { ...(block.payload.meta || {}), sanitized: true };\n break;\n }\n\n case \"list\":\n enrichListBlock(block);\n break;\n }\n\n // Check for MDX content (paragraph and HTML blocks can both carry MDX/JSX)\n if (block.type === \"paragraph\" || block.type === \"html\") {\n const maybeMeta = block.payload.meta as Record<string, unknown> | undefined;\n const protectedRanges = Array.isArray(maybeMeta?.protectedRanges) ? (maybeMeta?.protectedRanges as ProtectedRange[]) : undefined;\n const blockRange = block.payload.range;\n const baseOffset = typeof blockRange?.from === \"number\" ? blockRange.from : 0;\n const normalizedRanges =\n protectedRanges && protectedRanges.length > 0\n ? protectedRanges.map((range) => ({\n ...range,\n from: baseOffset + range.from,\n to: baseOffset + range.to,\n }))\n : undefined;\n const mdxOptions =\n normalizedRanges && normalizedRanges.length > 0 ? { protectedRanges: normalizedRanges, baseOffset } : baseOffset ? { baseOffset } : undefined;\n const mdxDetectStart = now();\n let shouldConvertToMDX = detectMDX(block.payload.raw, mdxOptions);\n metrics?.recordMdxDetect(now() - mdxDetectStart);\n if (shouldConvertToMDX && protectedRanges && protectedRanges.length > 0) {\n const exprPattern = /\\{[^{}]+\\}/g;\n let match: RegExpExecArray | null;\n while (true) {\n match = exprPattern.exec(block.payload.raw);\n if (match === null) {\n break;\n }\n const start = match.index;\n const end = start + match[0].length;\n const covered = protectedRanges.some((range) => range.from <= start && range.to >= end);\n if (!covered) {\n shouldConvertToMDX = true;\n break;\n }\n shouldConvertToMDX = false;\n }\n }\n if (shouldConvertToMDX) {\n if (DEBUG_MDX) {\n try {\n console.debug(\"[markdown-worker] mdx detected\", { blockId: block.id, originalType: block.type });\n } catch {\n // ignore logging errors\n }\n }\n const originalType = block.type;\n block.payload.meta = { ...block.payload.meta, originalType };\n block.type = \"mdx\";\n } else if (DEBUG_MDX && loggedMdxSkipCount < MAX_MDX_SKIP_LOGS) {\n if (block.payload.raw && block.payload.raw.includes(\"<Preview\")) {\n loggedMdxSkipCount += 1;\n try {\n console.debug(\"[markdown-worker] mdx detection skipped\", {\n blockId: block.id,\n originalType: block.type,\n len: block.payload.raw.length,\n protected: Array.isArray((block.payload.meta as any)?.protectedRanges) ? (block.payload.meta as any).protectedRanges.length : 0,\n sample: block.payload.raw.slice(0, 120),\n });\n } catch {\n // ignore logging errors\n }\n }\n }\n }\n\n await updateMdxCompilationState(block);\n\n const enrichDuration = performanceTimer.measure(\"enrich-block\");\n metrics?.recordEnrich(enrichDuration);\n metrics?.recordBlockEnrich(block.type, enrichDuration);\n}\n\nfunction collectMathProtectedRanges(content: string): ProtectedRange[] {\n if (!content) return [];\n const ranges: ProtectedRange[] = [];\n const inlineStack: number[] = [];\n const displayStack: number[] = [];\n const length = content.length;\n\n let i = 0;\n while (i < length) {\n const char = content[i];\n if (char === \"\\\\\") {\n i += 2;\n continue;\n }\n if (char !== \"$\") {\n i++;\n continue;\n }\n\n const isDouble = i + 1 < length && content[i + 1] === \"$\";\n if (isDouble) {\n if (displayStack.length > 0) {\n const start = displayStack.pop() as number;\n ranges.push({ from: start, to: i + 2, kind: \"math-display\" });\n } else {\n displayStack.push(i);\n }\n i += 2;\n continue;\n }\n\n if (inlineStack.length > 0) {\n const start = inlineStack.pop() as number;\n ranges.push({ from: start, to: i + 1, kind: \"math-inline\" });\n } else {\n inlineStack.push(i);\n }\n i++;\n }\n\n return ranges;\n}\n\n/**\n * Enrich code blocks with syntax highlighting\n */\nasync function enrichCodeBlock(block: Block) {\n performanceTimer.mark(\"highlight-code\");\n const metrics = getActiveMetricsCollector();\n\n const raw = block.payload.raw ?? \"\";\n const { code, info, hadFence } = stripCodeFence(raw);\n const { lang, meta } = parseCodeFenceInfo(info);\n const requestedLanguage = lang || \"text\";\n const codeBody = hadFence ? code : dedentIndentedCode(raw);\n let resolvedLanguage = requestedLanguage;\n let cachedHighlight = getHighlightCacheEntry(requestedLanguage, codeBody);\n\n // Avoid expensive/highly-variable syntax highlighting while a code block is still streaming (dirty tail).\n // This keeps the worker from stalling on large/incomplete code fragments; highlighting is restored once finalized.\n if (!block.isFinalized) {\n block.payload.highlightedHtml = undefined;\n block.payload.meta = {\n ...meta,\n lang: resolvedLanguage,\n };\n return;\n }\n\n if (!cachedHighlight && highlighter && codeBody.trim()) {\n try {\n const loadedLangs = highlighter.getLoadedLanguages();\n if (!loadedLangs.includes(requestedLanguage)) {\n try {\n await highlighter.loadLanguage(requestedLanguage);\n } catch (loadError) {\n console.warn(`Failed to load language ${requestedLanguage}, falling back to text:`, loadError);\n }\n }\n\n resolvedLanguage = loadedLangs.includes(requestedLanguage) ? requestedLanguage : \"text\";\n const highlighted = highlighter.codeToHtml(codeBody, {\n lang: resolvedLanguage,\n themes: {\n dark: \"github-dark\",\n light: \"github-light\",\n },\n defaultColor: false,\n });\n\n const enhanced = enhanceHighlightedHtml(highlighted, resolvedLanguage);\n block.payload.highlightedHtml = enhanced;\n setHighlightCacheEntry(resolvedLanguage, codeBody, enhanced);\n if (resolvedLanguage !== requestedLanguage) {\n setHighlightCacheEntry(requestedLanguage, codeBody, enhanced);\n }\n cachedHighlight = getHighlightCacheEntry(resolvedLanguage, codeBody);\n } catch (error) {\n console.warn(\"Highlighting failed for\", requestedLanguage, error);\n resolvedLanguage = \"text\";\n }\n }\n\n if (cachedHighlight) {\n resolvedLanguage = cachedHighlight.lang;\n block.payload.highlightedHtml = cachedHighlight.html;\n }\n\n block.payload.meta = {\n ...meta,\n lang: resolvedLanguage,\n };\n\n const highlightDuration = performanceTimer.measure(\"highlight-code\");\n metrics?.recordShiki(highlightDuration);\n metrics?.recordHighlightForLanguage(resolvedLanguage, highlightDuration);\n}\n\nfunction makeHighlightCacheKey(language: string, code: string): string {\n return `${language}::${code}`;\n}\n\nfunction getHighlightCacheEntry(language: string, code: string) {\n if (!language || !code) return null;\n return CODE_HIGHLIGHT_CACHE.get(makeHighlightCacheKey(language, code)) ?? null;\n}\n\nfunction setHighlightCacheEntry(language: string, code: string, html: string) {\n if (!language || !code || typeof html !== \"string\") return;\n const key = makeHighlightCacheKey(language, code);\n CODE_HIGHLIGHT_CACHE.set(key, { html, lang: language });\n if (CODE_HIGHLIGHT_CACHE.size > MAX_CODE_HIGHLIGHT_CACHE_ENTRIES) {\n const oldest = CODE_HIGHLIGHT_CACHE.keys().next().value;\n if (oldest) {\n CODE_HIGHLIGHT_CACHE.delete(oldest);\n }\n }\n}\n\nfunction enhanceHighlightedHtml(html: string, language: string): string {\n if (!html) return html;\n\n // Ensure per-line spans carry data-line attributes\n let lineIndex = 0;\n const withLineNumbers = html.replace(/<span class=\"line\"/g, (match) => {\n if (/data-line=\"\\d+\"/.test(match)) {\n return match;\n }\n lineIndex += 1;\n return `${match} data-line=\"${lineIndex}\"`;\n });\n\n // Enhance <code> attributes with language and theme metadata\n const enhancedCode = withLineNumbers.replace(/<code([^>]*)>/, (match, attrs) => {\n const attrMap = parseAttributeString(attrs);\n attrMap[\"data-language\"] = language || \"text\";\n if (!attrMap[\"data-theme\"]) {\n attrMap[\"data-theme\"] = \"github-dark github-light\";\n }\n if (!attrMap.style) {\n attrMap.style = \"display: grid;\";\n } else if (!/display\\s*:/.test(attrMap.style)) {\n attrMap.style = `${attrMap.style.trim().replace(/;$/, \"\")};display: grid;`;\n }\n return `<code${serializeAttributes(attrMap)}>`;\n });\n\n // Attach data-language to outer <pre> if missing\n return enhancedCode.replace(/<pre([^>]*)>/, (match, attrs) => {\n const attrMap = parseAttributeString(attrs);\n attrMap[\"data-language\"] = language || \"text\";\n if (attrMap.tabindex !== undefined) {\n attrMap.tabindex = undefined;\n }\n attrMap.style = sanitizeShikiStyle(attrMap.style);\n if (attrMap.style === undefined || attrMap.style.length === 0) {\n attrMap.style = undefined;\n }\n return `<pre${serializeAttributes(attrMap)}>`;\n });\n}\n\nfunction parseAttributeString(fragment: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n if (!fragment) return attrs;\n const regex = /([a-zA-Z_:][\\w:.-]*)\\s*=\\s*\"([^\"]*)\"/g;\n let match: RegExpExecArray | null;\n while (true) {\n match = regex.exec(fragment);\n if (match === null) {\n break;\n }\n const [, name, value] = match;\n attrs[name] = value;\n }\n return attrs;\n}\n\nfunction serializeAttributes(attrs: Record<string, string>): string {\n return Object.entries(attrs)\n .map(([key, value]) => ` ${key}=\"${value}\"`)\n .join(\"\");\n}\n\nfunction sanitizeShikiStyle(style: string | undefined): string | undefined {\n const sanitized: string[] = [];\n\n if (style) {\n for (const rawEntry of style.split(\";\")) {\n const entry = rawEntry.trim();\n if (!entry) continue;\n const separatorIndex = entry.indexOf(\":\");\n if (separatorIndex === -1) continue;\n const name = entry.slice(0, separatorIndex).trim();\n const value = entry.slice(separatorIndex + 1).trim();\n const lowerName = name.toLowerCase();\n\n if (lowerName.startsWith(\"background\")) {\n continue;\n }\n\n if (lowerName === \"--shiki-dark-bg\" || lowerName === \"--shiki-light-bg\") {\n continue;\n }\n\n sanitized.push(`${name}:${value}`);\n }\n }\n\n // Always force transparent backgrounds so Shiki doesn't override surrounding palette.\n sanitized.push(\"--shiki-dark-bg: transparent\");\n sanitized.push(\"--shiki-light-bg: transparent\");\n\n return sanitized.length > 0 ? sanitized.join(\";\") : undefined;\n}\n\nfunction clearWorkerMdxCaches(): void {\n WORKER_MDX_CACHE.clear();\n WORKER_MDX_INFLIGHT.clear();\n}\n\n// MDX compile helper moved to a shared module so that worker and server-side\n// compilation use the same remark/rehype pipeline.\nimport { compileMdxContent } from \"./mdx-compile\";\n\nfunction cacheWorkerMdxModule(key: string, module: CompiledMdxModule): void {\n const stored: CompiledMdxModule = {\n ...module,\n dependencies: module.dependencies ? [...module.dependencies] : undefined,\n };\n if (!WORKER_MDX_CACHE.has(key) && WORKER_MDX_CACHE.size >= MAX_WORKER_MDX_CACHE_ENTRIES) {\n const oldest = WORKER_MDX_CACHE.keys().next().value;\n if (typeof oldest === \"string\") {\n WORKER_MDX_CACHE.delete(oldest);\n }\n }\n WORKER_MDX_CACHE.set(key, stored);\n}\n\nasync function getOrCompileMdxModuleForBlock(block: Block): Promise<CompiledMdxModule> {\n const cacheKey = block.id;\n const cached = WORKER_MDX_CACHE.get(cacheKey);\n if (cached) {\n return {\n ...cached,\n dependencies: cached.dependencies ? [...cached.dependencies] : undefined,\n };\n }\n\n const inflight = WORKER_MDX_INFLIGHT.get(cacheKey);\n if (inflight) {\n const result = await inflight;\n return {\n ...result,\n dependencies: result.dependencies ? [...result.dependencies] : undefined,\n };\n }\n\n const source = block.payload.raw ?? \"\";\n const compilePromise = (async () => {\n const { code, dependencies } = await compileMdxContent(source);\n const module: CompiledMdxModule = {\n id: `worker:${cacheKey}`,\n code,\n dependencies,\n source: \"worker\",\n };\n cacheWorkerMdxModule(cacheKey, module);\n return module;\n })();\n\n WORKER_MDX_INFLIGHT.set(cacheKey, compilePromise);\n try {\n const compiled = await compilePromise;\n return {\n ...compiled,\n dependencies: compiled.dependencies ? [...compiled.dependencies] : undefined,\n };\n } finally {\n WORKER_MDX_INFLIGHT.delete(cacheKey);\n }\n}\n\nasync function updateMdxCompilationState(block: Block): Promise<void> {\n try {\n if (DEBUG_MDX) {\n console.debug(\"[markdown-worker] mdx update\", { blockId: block.id, type: block.type, finalized: block.isFinalized, compileMode: mdxCompileMode });\n }\n } catch {\n // ignore logging errors\n }\n if (block.type !== \"mdx\") {\n if (\"compiledMdxModule\" in block.payload) {\n block.payload.compiledMdxModule = undefined;\n }\n return;\n }\n\n if (mdxCompileMode !== \"worker\") {\n if (\"compiledMdxModule\" in block.payload) {\n block.payload.compiledMdxModule = undefined;\n }\n return;\n }\n\n const baseMeta = (block.payload.meta ?? {}) as Record<string, unknown>;\n const pendingMeta: Record<string, unknown> = { ...baseMeta, mdxStatus: \"pending\" };\n if (\"mdxError\" in pendingMeta) {\n pendingMeta.mdxError = undefined;\n }\n block.payload.meta = pendingMeta;\n\n if (!block.isFinalized) {\n block.payload.compiledMdxModule = null;\n block.payload.compiledMdxRef = { id: \"pending\" };\n return;\n }\n\n try {\n const module = await getOrCompileMdxModuleForBlock(block);\n block.payload.compiledMdxModule = {\n ...module,\n dependencies: module.dependencies ? [...module.dependencies] : undefined,\n };\n block.payload.compiledMdxRef = { id: module.id };\n const nextMeta = {\n ...(block.payload.meta ?? {}),\n mdxStatus: \"compiled\",\n } as Record<string, unknown>;\n if (\"mdxError\" in nextMeta) {\n nextMeta.mdxError = undefined;\n }\n block.payload.meta = nextMeta;\n if (DEBUG_MDX) {\n try {\n console.debug(\"[markdown-worker] mdx compiled\", { blockId: block.id, id: module.id, deps: module.dependencies?.length ?? 0 });\n } catch {\n // ignore logging errors\n }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"MDX compilation failed\";\n block.payload.compiledMdxModule = null;\n block.payload.compiledMdxRef = undefined;\n const errorMeta = {\n ...(block.payload.meta ?? {}),\n mdxStatus: \"error\",\n mdxError: message,\n } as Record<string, unknown>;\n block.payload.meta = errorMeta;\n if (DEBUG_MDX) {\n try {\n console.error(\"[markdown-worker] mdx compile failed\", { blockId: block.id, error: message });\n } catch {\n // ignore logging errors\n }\n }\n }\n}\n\n/**\n * Enrich list blocks\n */\nfunction enrichListBlock(block: Block) {\n const lines = block.payload.raw.split(\"\\n\");\n const itemsRaw: string[] = [];\n let current: string[] | null = null;\n\n const bulletRe = /^[-*+]\\s+(.*)$/;\n const orderedRe = /^\\d+\\.\\s+(.*)$/;\n\n for (const line of lines) {\n const trimmed = line.trimEnd();\n const bare = trimmed.trimStart();\n const bulletMatch = bare.match(bulletRe);\n const orderedMatch = bare.match(orderedRe);\n\n if (bulletMatch || orderedMatch) {\n if (current) {\n itemsRaw.push(current.join(\"\\n\"));\n }\n const content = (bulletMatch ? bulletMatch[1] : orderedMatch?.[1]) ?? \"\";\n current = [content];\n } else if (current) {\n current.push(bare);\n }\n }\n\n if (current) {\n itemsRaw.push(current.join(\"\\n\"));\n }\n\n const items: InlineNode[][] = itemsRaw.map((raw) => inlineParser.parse(raw));\n const isOrdered = /^\\d+\\./.test(lines[0]?.trimStart() || \"\");\n block.payload.meta = { ordered: isOrdered, items };\n}\n\n/**\n * Run document-phase plugins (e.g., footnotes) to mutate blocks and append synthetic blocks.\n */\nfunction runDocumentPlugins(inputBlocks: Block[], content: string): Block[] {\n // Work on a shallow copy to avoid accidental mutation of caller arrays\n const blocks = inputBlocks.slice();\n const aggregatedProtected: ProtectedRange[] = [];\n for (const block of blocks) {\n const meta = block.payload.meta as Record<string, unknown> | undefined;\n const rawRanges = Array.isArray(meta?.protectedRanges) ? (meta.protectedRanges as ProtectedRange[]) : undefined;\n if (!rawRanges || rawRanges.length === 0) continue;\n const base = typeof block.payload.range?.from === \"number\" ? block.payload.range.from : null;\n if (base === null) continue;\n for (const range of rawRanges) {\n if (typeof range.from !== \"number\" || typeof range.to !== \"number\") continue;\n aggregatedProtected.push({\n ...range,\n from: base + range.from,\n to: base + range.to,\n });\n }\n }\n\n const { syntheticBlocks } = globalDocumentPluginRegistry.run({\n content,\n blocks,\n state: documentPluginState,\n protectedRanges: aggregatedProtected,\n });\n\n // Ensure only one synthetic footnotes block at the end: remove previous existing footnotes block(s)\n const filtered = blocks.filter((b) => b.type !== \"footnotes\");\n if (syntheticBlocks && syntheticBlocks.length > 0) {\n const tail = filtered[filtered.length - 1];\n const hasDirtyTail = tail ? !tail.isFinalized : false;\n if (hasDirtyTail) {\n return filtered;\n }\n filtered.push(...syntheticBlocks);\n }\n return filtered;\n}\n\n/**\n * Find first changed block index\n */\nfunction findFirstChangedBlock(oldBlocks: Block[], newBlocks: Block[]): number {\n let i = 0;\n while (i < Math.min(oldBlocks.length, newBlocks.length)) {\n const oldBlock = oldBlocks[i];\n const newBlock = newBlocks[i];\n const idChanged = oldBlock.id !== newBlock.id;\n const rawChanged = oldBlock.payload.raw !== newBlock.payload.raw;\n const finalChanged = oldBlock.isFinalized !== newBlock.isFinalized;\n if (idChanged || rawChanged || finalChanged) {\n break;\n }\n i++;\n }\n return i;\n}\n\nfunction isBlockLike(value: unknown): value is Block {\n if (!value || typeof value !== \"object\") return false;\n const candidate = value as { id?: unknown; type?: unknown; payload?: unknown };\n if (typeof candidate.id !== \"string\" || typeof candidate.type !== \"string\") return false;\n return typeof candidate.payload === \"object\" && candidate.payload !== null;\n}\n\nasync function enrichNestedCodeBlocks(snapshot: NodeSnapshot, allowHighlight: boolean): Promise<void> {\n if (!allowHighlight || !highlighter) {\n return;\n }\n const stack: NodeSnapshot[] = [snapshot];\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current) continue;\n\n const props = (current.props ?? {}) as Record<string, unknown>;\n const maybeBlock = props.block;\n if (isBlockLike(maybeBlock) && maybeBlock.type === \"code\") {\n const block = cloneBlock(maybeBlock);\n const hasHighlight = typeof block.payload.highlightedHtml === \"string\" && block.payload.highlightedHtml.trim().length > 0;\n if (!hasHighlight) {\n await enrichCodeBlock(block);\n const updated = createBlockSnapshot(block);\n current.type = updated.type;\n current.props = updated.props;\n current.meta = updated.meta;\n current.range = updated.range;\n current.children = updated.children;\n continue;\n }\n }\n\n const children = current.children ?? [];\n for (let idx = children.length - 1; idx >= 0; idx--) {\n const child = children[idx];\n if (child) {\n stack.push(child);\n }\n }\n }\n}\n\nasync function blockToNodeSnapshot(block: Block): Promise<NodeSnapshot> {\n const snapshot = createBlockSnapshot(cloneBlock(block));\n await enrichNestedCodeBlocks(snapshot, Boolean(block.isFinalized));\n return snapshot;\n}\n\nasync function emitDocumentPatch(currentBlocks: Block[]) {\n const patches: Patch[] = [];\n for (let index = 0; index < currentBlocks.length; index++) {\n const block = currentBlocks[index];\n if (!block) continue;\n patches.push({\n op: \"insertChild\",\n at: { blockId: PATCH_ROOT_ID },\n index,\n node: await blockToNodeSnapshot(block),\n });\n }\n if (patches.length > 0) {\n postMessage({\n type: \"PATCH\",\n tx: ++txCounter,\n patches,\n } as WorkerOut);\n }\n}\n\nasync function emitBlockDiffPatches(previousBlocks: Block[], nextBlocks: Block[], changedRanges: ContentChangeRange[], metrics?: WorkerMetricsCollector | null) {\n const patches: Patch[] = [];\n\n if (previousBlocks === nextBlocks) return;\n\n let prefix = 0;\n const maxPrefix = Math.min(previousBlocks.length, nextBlocks.length);\n while (prefix < maxPrefix && previousBlocks[prefix].id === nextBlocks[prefix].id) {\n prefix++;\n }\n\n let prevTail = previousBlocks.length - 1;\n let nextTail = nextBlocks.length - 1;\n while (prevTail >= prefix && nextTail >= prefix && previousBlocks[prevTail].id === nextBlocks[nextTail].id) {\n prevTail--;\n nextTail--;\n }\n\n const removeCount = prevTail >= prefix ? prevTail - prefix + 1 : 0;\n const addCount = nextTail >= prefix ? nextTail - prefix + 1 : 0;\n\n if (removeCount === addCount) {\n for (let offset = 0; offset < addCount; offset++) {\n const targetIndex = prefix + offset;\n patches.push({\n op: \"replaceChild\",\n at: { blockId: PATCH_ROOT_ID },\n index: targetIndex,\n node: await blockToNodeSnapshot(nextBlocks[targetIndex]),\n });\n }\n } else {\n for (let i = removeCount - 1; i >= 0; i--) {\n patches.push({\n op: \"deleteChild\",\n at: { blockId: PATCH_ROOT_ID },\n index: prefix + i,\n });\n }\n\n for (let offset = 0; offset < addCount; offset++) {\n const insertIndex = prefix + offset;\n const block = cloneBlock(nextBlocks[insertIndex]);\n patches.push({\n op: \"insertChild\",\n at: { blockId: PATCH_ROOT_ID },\n index: insertIndex,\n node: await blockToNodeSnapshot(block),\n });\n }\n }\n\n metrics?.markDiffStart();\n const { patches: contentPatches, changedBlockCount } = await diffBlockContent(previousBlocks, nextBlocks, changedRanges, metrics);\n metrics?.markDiffEnd();\n\n const combined = patches.concat(contentPatches);\n let paragraphLimit: number | null = null;\n if (workerCredits < 0.9) {\n const dynamicBase = workerCredits < 0.5 ? 48 : 96;\n const dynamicFinalize = workerCredits < 0.5 ? 40 : 64;\n paragraphLimit = computeParagraphPatchLimit(combined, {\n baseLimit: dynamicBase,\n finalizeLimit: dynamicFinalize,\n });\n }\n const immediatePatches = partitionPatchesForCredits(combined, paragraphLimit === null ? undefined : paragraphLimit);\n\n if (immediatePatches.length === 0) {\n if (metrics) {\n metrics.finalizePatch(txCounter, 0, deferredPatchQueue.length, 0);\n emitMetricsSample(metrics);\n if (getActiveMetricsCollector() === metrics) {\n setActiveMetricsCollector(null);\n }\n }\n return;\n }\n\n dispatchPatchBatch(immediatePatches, metrics);\n}\n\nfunction dispatchPatchBatch(patches: Patch[], metrics?: WorkerMetricsCollector | null) {\n if (!patches || patches.length === 0) {\n return;\n }\n\n const tx = ++txCounter;\n const patchBytes = metrics ? estimatePatchSize(patches) : 0;\n metrics?.finalizePatch(tx, patches.length, deferredPatchQueue.length, patchBytes);\n const changedBlockReport = countChangedBlocksFromPatches(patches);\n const patchMetrics: PatchMetrics = metrics\n ? metrics.toPatchMetrics(changedBlockReport)\n : {\n patchCount: patches.length,\n changedBlocks: changedBlockReport,\n };\n\n const message: WorkerOut = {\n type: \"PATCH\",\n tx,\n patches,\n metrics: patchMetrics,\n } as WorkerOut;\n\n metrics?.beginSerialize();\n postMessage(message);\n metrics?.endSerialize();\n emitMetricsSample(metrics ?? null);\n\n if (metrics && getActiveMetricsCollector() === metrics) {\n setActiveMetricsCollector(null);\n }\n}\n\nasync function diffBlockContent(\n previousBlocks: Block[],\n nextBlocks: Block[],\n changedRanges: ContentChangeRange[],\n metrics?: WorkerMetricsCollector | null,\n): Promise<{ patches: Patch[]; changedBlockCount: number }> {\n const patches: Patch[] = [];\n const prevMap = new Map(previousBlocks.map((block) => [block.id, block]));\n const changedBlockIds = collectChangedBlockIds(previousBlocks, nextBlocks, changedRanges);\n\n for (const nextBlock of nextBlocks) {\n const prevBlock = prevMap.get(nextBlock.id);\n if (!prevBlock) continue;\n if (prevBlock.type === \"mdx\" && nextBlock.type === \"mdx\") {\n preserveMdxMetadata(prevBlock, nextBlock);\n }\n if (changedBlockIds.size > 0 && !changedBlockIds.has(nextBlock.id) && blocksStructurallyEqual(prevBlock, nextBlock)) {\n continue;\n }\n if (changedBlockIds.size === 0 && blocksStructurallyEqual(prevBlock, nextBlock)) continue;\n\n if (nextBlock.type === \"html\") {\n const nextSanitized = nextBlock.payload.sanitizedHtml ?? sanitizeHtmlInWorker(nextBlock.payload.raw ?? \"\");\n const prevSanitized = prevBlock.payload.sanitizedHtml ?? \"\";\n if (prevSanitized !== nextSanitized || prevBlock.payload.raw !== nextBlock.payload.raw) {\n const cloned = cloneBlock(nextBlock);\n cloned.payload.sanitizedHtml = nextSanitized;\n patches.push({\n op: \"setHTML\",\n at: { blockId: nextBlock.id },\n html: nextSanitized,\n policy: \"markdown-renderer-v2\",\n block: cloned,\n meta: nextBlock.payload.meta ? { ...nextBlock.payload.meta } : undefined,\n sanitized: true,\n });\n }\n continue;\n }\n\n const prevSnapshot = await blockToNodeSnapshot(prevBlock);\n const nextSnapshot = await blockToNodeSnapshot(nextBlock);\n diffNodeSnapshot(nextBlock.id, prevSnapshot, nextSnapshot, patches, metrics);\n }\n\n return { patches, changedBlockCount: changedBlockIds.size };\n}\n\nfunction preserveMdxMetadata(previous: Block, next: Block) {\n const prevRaw = previous.payload.raw ?? \"\";\n const nextRaw = next.payload.raw ?? \"\";\n if (prevRaw !== nextRaw) {\n return;\n }\n\n if (previous.payload.compiledMdxRef && !next.payload.compiledMdxRef) {\n next.payload.compiledMdxRef = { ...previous.payload.compiledMdxRef };\n }\n if (previous.payload.compiledMdxModule && !next.payload.compiledMdxModule) {\n next.payload.compiledMdxModule = {\n ...previous.payload.compiledMdxModule,\n dependencies: previous.payload.compiledMdxModule.dependencies ? [...previous.payload.compiledMdxModule.dependencies] : undefined,\n };\n } else if (previous.payload.compiledMdxModule === null && typeof next.payload.compiledMdxModule === \"undefined\") {\n next.payload.compiledMdxModule = null;\n }\n\n const prevMeta = (previous.payload.meta ?? null) as {\n mdxStatus?: unknown;\n mdxError?: unknown;\n } | null;\n if (!prevMeta) {\n return;\n }\n\n const currentMeta = (next.payload.meta ?? undefined) as { mdxStatus?: unknown; mdxError?: unknown } | undefined;\n const mergedMeta: Record<string, unknown> = currentMeta ? { ...currentMeta } : {};\n let metaChanged = false;\n\n if (typeof prevMeta.mdxStatus === \"string\" && mergedMeta.mdxStatus === undefined) {\n mergedMeta.mdxStatus = prevMeta.mdxStatus;\n metaChanged = true;\n }\n\n if (typeof prevMeta.mdxError === \"string\" && mergedMeta.mdxError === undefined) {\n mergedMeta.mdxError = prevMeta.mdxError;\n metaChanged = true;\n }\n\n if (metaChanged || !currentMeta) {\n next.payload.meta = mergedMeta;\n }\n}\n\nfunction diffNodeSnapshot(blockId: string, prevNode: NodeSnapshot, nextNode: NodeSnapshot, patches: Patch[], metrics?: WorkerMetricsCollector | null) {\n const prevProps = prevNode.props ?? {};\n const nextProps = nextNode.props ?? {};\n\n if (!shallowEqual(prevProps, nextProps)) {\n patches.push({\n op: \"setProps\",\n at: { blockId, nodeId: prevNode.id },\n props: nextProps ?? {},\n });\n }\n\n const prevChildren = prevNode.children ?? [];\n const nextChildren = nextNode.children ?? [];\n\n if (prevNode.type === \"list\" && nextNode.type === \"list\") {\n diffListChildren(blockId, prevNode, prevChildren, nextChildren, patches, metrics);\n return;\n }\n\n // Special handling for code blocks: detect pure append and emit appendLines.\n if (prevNode.type === \"code\" && nextNode.type === \"code\") {\n const commonLength = Math.min(prevChildren.length, nextChildren.length);\n let divergeIndex = 0;\n while (divergeIndex < commonLength && prevChildren[divergeIndex].id === nextChildren[divergeIndex].id) {\n diffNodeSnapshot(blockId, prevChildren[divergeIndex], nextChildren[divergeIndex], patches, metrics);\n divergeIndex++;\n }\n\n const onlyAppend =\n divergeIndex === prevChildren.length &&\n nextChildren.length >= prevChildren.length &&\n prevChildren.every((child, idx) => child.id === nextChildren[idx].id);\n\n if (onlyAppend && nextChildren.length > prevChildren.length) {\n const startIndex = prevChildren.length;\n const appended = nextChildren.slice(startIndex);\n patches.push({\n op: \"appendLines\",\n at: { blockId, nodeId: prevNode.id },\n startIndex,\n lines: appended.map((child) => {\n const text = typeof child.props?.text === \"string\" ? (child.props?.text as string) : \"\";\n return text;\n }),\n highlight: appended.map((child) => (typeof child.props?.html === \"string\" ? (child.props?.html as string) : null)),\n });\n metrics?.recordAppendLines(appended.length);\n return;\n }\n\n // Fall through to generic handling for other mutations (edits/deletes)\n }\n\n const minLen = Math.min(prevChildren.length, nextChildren.length);\n let prefix = 0;\n while (prefix < minLen && prevChildren[prefix].id === nextChildren[prefix].id) {\n diffNodeSnapshot(blockId, prevChildren[prefix], nextChildren[prefix], patches, metrics);\n prefix++;\n }\n\n let suffix = 0;\n while (suffix < minLen - prefix && prevChildren[prevChildren.length - 1 - suffix].id === nextChildren[nextChildren.length - 1 - suffix].id) {\n const prevIdx = prevChildren.length - 1 - suffix;\n const nextIdx = nextChildren.length - 1 - suffix;\n diffNodeSnapshot(blockId, prevChildren[prevIdx], nextChildren[nextIdx], patches, metrics);\n suffix++;\n }\n\n const prevMid = prevChildren.slice(prefix, prevChildren.length - suffix);\n const nextMid = nextChildren.slice(prefix, nextChildren.length - suffix);\n\n if (prevMid.length === 0 && nextMid.length === 0) {\n return;\n }\n\n if (prevMid.length === nextMid.length && prevMid.length > 0) {\n const prevIds = prevMid.map((child) => child.id);\n const nextIds = nextMid.map((child) => child.id);\n if (haveSameMultiset(prevIds, nextIds)) {\n const currentOrder = prevIds.slice();\n const reorderOps: Array<{ from: number; to: number }> = [];\n for (let targetIdx = 0; targetIdx < nextIds.length; targetIdx++) {\n const desiredId = nextIds[targetIdx];\n if (currentOrder[targetIdx] === desiredId) {\n continue;\n }\n const sourceIdx = currentOrder.indexOf(desiredId);\n if (sourceIdx === -1) continue;\n reorderOps.push({\n from: prefix + sourceIdx,\n to: prefix + targetIdx,\n });\n const [moved] = currentOrder.splice(sourceIdx, 1);\n currentOrder.splice(targetIdx, 0, moved);\n }\n\n for (const op of reorderOps) {\n patches.push({\n op: \"reorder\",\n at: { blockId, nodeId: prevNode.id },\n from: op.from,\n to: op.to,\n count: 1,\n });\n }\n\n const prevMap = new Map(prevMid.map((child) => [child.id, child]));\n for (const child of nextMid) {\n const previous = prevMap.get(child.id);\n if (previous) {\n diffNodeSnapshot(blockId, previous, child, patches, metrics);\n }\n }\n return;\n }\n }\n\n for (let i = prevChildren.length - 1 - suffix; i >= prefix; i--) {\n patches.push({\n op: \"deleteChild\",\n at: { blockId, nodeId: prevNode.id },\n index: i,\n });\n }\n\n for (let i = prefix; i < nextChildren.length - suffix; i++) {\n patches.push({\n op: \"insertChild\",\n at: { blockId, nodeId: prevNode.id },\n index: i,\n node: nextChildren[i],\n });\n }\n}\n\nfunction shallowEqual(a: Record<string, unknown>, b: Record<string, unknown>): boolean {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (const key of keysA) {\n const valA = a[key];\n const valB = b[key];\n if (typeof valA === \"object\" || typeof valB === \"object\") {\n if (JSON.stringify(valA) !== JSON.stringify(valB)) return false;\n } else if (valA !== valB) {\n return false;\n }\n }\n return true;\n}\n\nfunction haveSameMultiset(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false;\n const counts = new Map<string, number>();\n for (const id of a) {\n counts.set(id, (counts.get(id) ?? 0) + 1);\n }\n for (const id of b) {\n const next = (counts.get(id) ?? 0) - 1;\n if (next < 0) return false;\n counts.set(id, next);\n }\n return Array.from(counts.values()).every((val) => val === 0);\n}\n\nfunction diffListChildren(\n blockId: string,\n listNode: NodeSnapshot,\n prevChildren: NodeSnapshot[],\n nextChildren: NodeSnapshot[],\n patches: Patch[],\n metrics?: WorkerMetricsCollector | null,\n) {\n const prevLength = prevChildren.length;\n const nextLength = nextChildren.length;\n\n if (prevLength === 0 && nextLength === 0) {\n return;\n }\n\n const commonLength = Math.min(prevLength, nextLength);\n\n // Diff shared prefix first to propagate nested updates.\n let prefix = 0;\n while (prefix < commonLength && prevChildren[prefix].id === nextChildren[prefix].id) {\n diffNodeSnapshot(blockId, prevChildren[prefix], nextChildren[prefix], patches, metrics);\n prefix++;\n }\n\n if (prefix === prevLength && prefix === nextLength) {\n return;\n }\n\n // Pure append: existing prefix matches and prev length exhausted.\n if (prefix === prevLength && nextLength > prevLength) {\n for (let i = prefix; i < nextLength; i++) {\n patches.push({\n op: \"insertChild\",\n at: { blockId, nodeId: listNode.id },\n index: i,\n node: nextChildren[i],\n });\n }\n return;\n }\n\n // Pure truncate from tail.\n if (prefix === nextLength && prevLength > nextLength) {\n for (let i = prevLength - 1; i >= nextLength; i--) {\n patches.push({\n op: \"deleteChild\",\n at: { blockId, nodeId: listNode.id },\n index: i,\n });\n }\n return;\n }\n\n // Compute suffix after trimming already handled prefix.\n let suffix = 0;\n while (suffix < commonLength - prefix && prevChildren[prevLength - 1 - suffix].id === nextChildren[nextLength - 1 - suffix].id) {\n const prevIdx = prevLength - 1 - suffix;\n const nextIdx = nextLength - 1 - suffix;\n diffNodeSnapshot(blockId, prevChildren[prevIdx], nextChildren[nextIdx], patches, metrics);\n suffix++;\n }\n\n const prevMidStart = prefix;\n const prevMidEnd = prevLength - suffix;\n const nextMidStart = prefix;\n const nextMidEnd = nextLength - suffix;\n\n const prevMidLen = Math.max(0, prevMidEnd - prevMidStart);\n const nextMidLen = Math.max(0, nextMidEnd - nextMidStart);\n\n if (prevMidLen === 0 && nextMidLen === 0) {\n return;\n }\n\n if (prevMidLen === 0 && nextMidLen > 0) {\n for (let i = nextMidStart; i < nextMidEnd; i++) {\n patches.push({\n op: \"insertChild\",\n at: { blockId, nodeId: listNode.id },\n index: i,\n node: nextChildren[i],\n });\n }\n return;\n }\n\n if (prevMidLen > 0 && nextMidLen === 0) {\n for (let i = prevMidEnd - 1; i >= prevMidStart; i--) {\n patches.push({\n op: \"deleteChild\",\n at: { blockId, nodeId: listNode.id },\n index: i,\n });\n }\n return;\n }\n\n // When both sides have mid-ranges, fall back to generic handling to account for true reorders/edits.\n const prevMid = prevChildren.slice(prevMidStart, prevMidEnd);\n const nextMid = nextChildren.slice(nextMidStart, nextMidEnd);\n\n const sharedMid = Math.min(prevMid.length, nextMid.length);\n let midPrefix = 0;\n while (midPrefix < sharedMid && prevMid[midPrefix].id === nextMid[midPrefix].id) {\n diffNodeSnapshot(blockId, prevMid[midPrefix], nextMid[midPrefix], patches, metrics);\n midPrefix++;\n }\n\n if (midPrefix === prevMid.length && midPrefix === nextMid.length) {\n return;\n }\n\n if (midPrefix === prevMid.length && nextMid.length > prevMid.length) {\n for (let i = nextMidStart + midPrefix; i < nextMidEnd; i++) {\n patches.push({\n op: \"insertChild\",\n at: { blockId, nodeId: listNode.id },\n index: i,\n node: nextChildren[i],\n });\n }\n return;\n }\n\n if (midPrefix === nextMid.length && prevMid.length > nextMid.length) {\n for (let i = prevMidEnd - 1; i >= prevMidStart + midPrefix; i--) {\n patches.push({\n op: \"deleteChild\",\n at: { blockId, nodeId: listNode.id },\n index: i,\n });\n }\n return;\n }\n\n const remainingPrevMid = prevMid.slice(midPrefix);\n const remainingNextMid = nextMid.slice(midPrefix);\n\n if (remainingPrevMid.length === remainingNextMid.length && remainingPrevMid.every((child, idx) => child.id === remainingNextMid[idx].id)) {\n for (let idx = 0; idx < remainingPrevMid.length; idx++) {\n diffNodeSnapshot(blockId, remainingPrevMid[idx], remainingNextMid[idx], patches, metrics);\n }\n return;\n }\n\n // Otherwise leverage delete/insert to reflect structural moves without reorder.\n for (let i = prevMidEnd - 1; i >= prevMidStart + midPrefix; i--) {\n patches.push({\n op: \"deleteChild\",\n at: { blockId, nodeId: listNode.id },\n index: i,\n });\n }\n\n for (let i = nextMidStart + midPrefix; i < nextMidEnd; i++) {\n patches.push({\n op: \"insertChild\",\n at: { blockId, nodeId: listNode.id },\n index: i,\n node: nextChildren[i],\n });\n }\n}\n\ninterface ContentChangeRange {\n fromA: number;\n toA: number;\n fromB: number;\n toB: number;\n}\n\nfunction computeChangedRanges(previous: string, next: string): ContentChangeRange[] {\n if (previous === next) {\n return [];\n }\n let from = 0;\n const minLen = Math.min(previous.length, next.length);\n while (from < minLen && previous.charCodeAt(from) === next.charCodeAt(from)) {\n from++;\n }\n\n let toA = previous.length;\n let toB = next.length;\n while (toA > from && toB > from && previous.charCodeAt(toA - 1) === next.charCodeAt(toB - 1)) {\n toA--;\n toB--;\n }\n\n return [\n {\n fromA: from,\n toA,\n fromB: from,\n toB,\n },\n ];\n}\n\nfunction collectChangedBlockIds(previousBlocks: Block[], nextBlocks: Block[], ranges: ContentChangeRange[]): Set<string> {\n const ids = new Set<string>();\n if (!ranges || ranges.length === 0) {\n return ids;\n }\n for (const range of ranges) {\n addIntersectingBlocks(ids, previousBlocks, range.fromA, range.toA);\n addIntersectingBlocks(ids, nextBlocks, range.fromB, range.toB);\n }\n return ids;\n}\n\nfunction addIntersectingBlocks(target: Set<string>, blocks: Block[], from: number, to: number) {\n if (from === to) {\n for (const block of blocks) {\n const range = block.payload.range;\n if (!range) continue;\n if (from >= range.from && from <= range.to) {\n target.add(block.id);\n break;\n }\n }\n return;\n }\n for (const block of blocks) {\n const range = block.payload.range;\n if (!range) continue;\n if (rangesIntersect(range.from, range.to, from, to)) {\n target.add(block.id);\n }\n }\n}\n\nfunction rangesIntersect(aFrom: number, aTo: number, bFrom: number, bTo: number): boolean {\n return Math.max(aFrom, bFrom) <= Math.min(aTo, bTo);\n}\n\nlet messageQueue: Promise<void> = Promise.resolve();\n\nfunction reportWorkerError(error: unknown, phase: WorkerPhase, meta?: Record<string, unknown>) {\n const payload: WorkerErrorPayload =\n error instanceof Error\n ? { name: error.name, message: error.message, stack: error.stack }\n : { message: typeof error === \"string\" ? error : JSON.stringify(error) };\n postMessage({\n type: \"ERROR\",\n phase,\n error: payload,\n meta,\n timestamp: Date.now(),\n } as WorkerOut);\n}\n\nasync function finalizeAllBlocks() {\n const metricsCollector = new WorkerMetricsCollector(workerGrammarEngine);\n setActiveMetricsCollector(metricsCollector);\n\n const prevBlocks = blocks.map((block) => cloneBlock(block));\n const finalizePatches: Patch[] = [];\n const finalizeTargets = new Set<string>();\n for (const block of blocks) {\n if (!block.isFinalized) {\n block.isFinalized = true;\n finalizeTargets.add(block.id);\n finalizePatches.push({\n op: \"finalize\",\n at: { blockId: block.id },\n });\n }\n }\n\n if (finalizePatches.length > 0) {\n postMessage({\n type: \"PATCH\",\n tx: ++txCounter,\n patches: finalizePatches,\n } as WorkerOut);\n }\n\n const { blocks: reparsedBlocks, lastTree: reparsedTree } = await parseAll(currentContent, { forceFinalize: true });\n for (const block of reparsedBlocks) {\n block.isFinalized = true;\n await updateMdxCompilationState(block);\n }\n\n blocks = reparsedBlocks;\n lastTree = reparsedTree;\n metricsCollector.setBlocksProduced(blocks.length);\n\n const fullRange = [\n {\n fromA: 0,\n toA: currentContent.length,\n fromB: 0,\n toB: currentContent.length,\n },\n ];\n await emitBlockDiffPatches(prevBlocks, blocks, fullRange, metricsCollector);\n\n if (prevBlocks && prevBlocks.length > 0) {\n const finalizeSetProps: Patch[] = [];\n for (const block of blocks) {\n if (!block.isFinalized || !finalizeTargets.has(block.id)) continue;\n finalizeSetProps.push({\n op: \"setProps\",\n at: { blockId: block.id, nodeId: block.id },\n props: {\n block: cloneBlock(block),\n },\n });\n }\n if (finalizeSetProps.length > 0) {\n dispatchPatchBatch(finalizeSetProps, metricsCollector);\n }\n }\n\n if (getActiveMetricsCollector() === metricsCollector) {\n setActiveMetricsCollector(null);\n }\n}\n\ninterface MdxStatusUpdate {\n compiledRef?: { id: string };\n status: \"compiled\" | \"error\";\n error?: string;\n}\n\nfunction handleMdxStatus(blockId: string, update: MdxStatusUpdate) {\n if (mdxCompileMode === \"worker\") {\n return;\n }\n const index = blocks.findIndex((b) => b.id === blockId);\n if (index === -1) return;\n\n const previous = blocks[index];\n const updated = cloneBlock(previous);\n updated.payload = {\n ...updated.payload,\n compiledMdxRef: update.compiledRef ?? updated.payload.compiledMdxRef,\n meta: {\n ...(updated.payload.meta ?? {}),\n mdxStatus: update.status,\n ...(update.error ? { mdxError: update.error } : {}),\n },\n };\n\n blocks[index] = updated;\n\n postMessage({\n type: \"PATCH\",\n tx: ++txCounter,\n patches: [\n {\n op: \"setProps\",\n at: { blockId },\n props: {\n block: updated,\n },\n },\n ],\n } as WorkerOut);\n}\n\nasync function processWorkerMessage(msg: WorkerIn) {\n switch (msg.type) {\n case \"INIT\":\n await initialize(msg.initialContent, msg.prewarmLangs ?? [], msg.docPlugins, msg.mdx);\n return;\n case \"APPEND\":\n await handleAppend(msg.text);\n return;\n case \"FINALIZE\":\n await finalizeAllBlocks();\n return;\n case \"MDX_COMPILED\":\n handleMdxStatus(msg.blockId, {\n compiledRef: { id: msg.compiledId },\n status: \"compiled\",\n });\n return;\n case \"MDX_ERROR\":\n handleMdxStatus(msg.blockId, {\n compiledRef: undefined,\n status: \"error\",\n error: msg.error,\n });\n return;\n case \"SET_CREDITS\":\n workerCredits = Math.max(0, Math.min(1, Number(msg.credits ?? 0)));\n if (workerCredits > 0) {\n flushDeferredPatches();\n }\n return;\n default:\n console.warn(\"Unknown message type:\", msg);\n }\n}\n\n// Worker message handler (serialized to avoid state races across async awaits).\nself.onmessage = (e: MessageEvent<WorkerIn>) => {\n const msg = e.data;\n const task = messageQueue\n .then(async () => {\n try {\n await processWorkerMessage(msg);\n } catch (error) {\n console.error(\"Worker error:\", error);\n reportWorkerError(error, msg.type, { phase: msg.type });\n }\n })\n .catch((error) => {\n console.error(\"Worker queue error:\", error);\n reportWorkerError(error, msg.type, { phase: msg.type, queue: true });\n });\n messageQueue = task;\n return task;\n};\n","// Helpers for mapping Lezer node names to streaming markdown block types.\n// Extracted from worker.ts so the logic can be shared and unit tested.\n\nconst BLOCK_NODE_TYPES = new Set([\n \"Paragraph\",\n \"Blockquote\",\n \"FencedCode\",\n \"IndentedCode\",\n \"BulletList\",\n \"OrderedList\",\n \"HTMLBlock\",\n \"ThematicBreak\",\n \"ATXHeading\",\n \"SetextHeading\",\n]);\n\nfunction normalizeNodeName(nodeType: string): string {\n if (!nodeType) return \"\";\n if (nodeType.startsWith(\"ATXHeading\")) {\n return \"ATXHeading\";\n }\n if (nodeType.startsWith(\"SetextHeading\")) {\n return \"SetextHeading\";\n }\n return nodeType;\n}\n\nexport function isBlockLevelNode(nodeType: string): boolean {\n const normalized = normalizeNodeName(nodeType);\n if (normalized === \"BulletList\" || normalized === \"OrderedList\") {\n return true;\n }\n return BLOCK_NODE_TYPES.has(normalized);\n}\n\nexport function mapLezerNodeToBlockType(nodeType: string): string {\n const normalized = normalizeNodeName(nodeType);\n switch (normalized) {\n case \"ATXHeading\":\n case \"SetextHeading\":\n return \"heading\";\n case \"Paragraph\":\n return \"paragraph\";\n case \"FencedCode\":\n case \"IndentedCode\":\n return \"code\";\n case \"Blockquote\":\n return \"blockquote\";\n case \"BulletList\":\n case \"OrderedList\":\n return \"list\";\n case \"HTMLBlock\":\n return \"html\";\n case \"ThematicBreak\":\n return \"hr\";\n default:\n return \"paragraph\";\n }\n}\n","import type { Patch } from \"@stream-mdx/core\";\n\nfunction isParagraphBoundaryPatch(patch: Patch): boolean {\n if (patch.op === \"finalize\") {\n return true;\n }\n\n if (\n (patch.op === \"insertChild\" || patch.op === \"replaceChild\") &&\n patch.node &&\n typeof patch.node === \"object\" &&\n (patch.node as { type?: unknown }).type === \"paragraph\"\n ) {\n return true;\n }\n\n if (patch.op === \"setProps\" && typeof patch.at?.nodeId === \"string\" && patch.at.nodeId.includes(\"paragraph\")) {\n return true;\n }\n\n return false;\n}\n\nfunction countParagraphBoundaries(patches: Patch[]): number {\n let count = 0;\n for (const patch of patches) {\n if (isParagraphBoundaryPatch(patch)) {\n count += 1;\n }\n }\n return count;\n}\n\n/**\n * Determine whether we should cap the number of immediate patches emitted for\n * the current diff. Large patch bursts that include multiple paragraph or finalize\n * operations tend to stall the render queue; by clamping the immediate payload and\n * letting the deferred queue trickle we keep DOM cadence smoother without\n * starving the renderer.\n */\nexport function computeParagraphPatchLimit(\n patches: Patch[],\n {\n largePatchThreshold = 80,\n baseLimit = 64,\n finalizeLimit = 48,\n }: {\n largePatchThreshold?: number;\n baseLimit?: number;\n finalizeLimit?: number;\n } = {},\n): number | null {\n if (!Array.isArray(patches) || patches.length < largePatchThreshold) {\n return null;\n }\n\n const paragraphBoundaries = countParagraphBoundaries(patches);\n if (paragraphBoundaries === 0) {\n return null;\n }\n\n // If we already hit finalize patches, clamp harder so the DOM can commit a clean paragraph\n const hasFinalize = patches.some((patch) => patch.op === \"finalize\");\n if (hasFinalize) {\n return Math.min(Math.max(16, finalizeLimit), patches.length);\n }\n\n // Otherwise scale the limit based on how many boundaries we saw.\n // More boundaries → smaller burst to keep cadence predictable.\n const scaledLimit = Math.max(32, Math.min(baseLimit, baseLimit - (paragraphBoundaries - 1) * 8));\n return Math.min(scaledLimit, patches.length);\n}\n","import { compile as compileMdx } from \"@mdx-js/mdx\";\nimport rehypeKatex from \"rehype-katex\";\nimport rehypeSlug from \"rehype-slug\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\n\nfunction collectMdxDependencies(source: string): string[] {\n const dependencies = new Set<string>();\n const importRegex = /(?:import|export)\\s+[^'\"]*?\\sfrom\\s+['\"]([^'\"]+)['\"]/g;\n let match: RegExpExecArray | null;\n while (true) {\n match = importRegex.exec(source);\n if (match === null) {\n break;\n }\n dependencies.add(match[1]);\n }\n return Array.from(dependencies);\n}\n\n/**\n * Shared MDX compilation helper used by both the worker (mdxCompileMode=\"worker\")\n * and the server-side MDX compile endpoint.\n *\n * The goal is to keep the remark/rehype pipeline identical so that server and\n * worker compilation strategies produce equivalent component code and HTML.\n */\nexport async function compileMdxContent(source: string): Promise<{ code: string; dependencies: string[] }> {\n const isDev = typeof process !== \"undefined\" && typeof process.env !== \"undefined\" && process.env?.NODE_ENV === \"development\";\n\n const compiled = await compileMdx(source, {\n outputFormat: \"function-body\",\n development: isDev,\n remarkPlugins: [remarkGfm, remarkMath],\n rehypePlugins: [\n rehypeSlug,\n [\n rehypeKatex,\n {\n throwOnError: false,\n errorColor: \"#cc0000\",\n strict: false,\n },\n ],\n ],\n jsxImportSource: \"react\",\n });\n\n return {\n code: String(compiled),\n dependencies: collectMdxDependencies(source),\n };\n}\n"],"mappings":"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","names":["blocks","blocks"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts","../src/create-default-worker.ts","../src/worker-client.ts"],"sourcesContent":["export * from \"./worker-client\";\nexport * from \"./create-default-worker\";\n","const DEFAULT_WORKER_PATH = \"/workers/markdown-worker.js\";\n\nconst BLOB_REGISTRY = new WeakMap<Worker, string>();\n\nexport type DefaultWorkerMode = \"auto\" | \"hosted\" | \"blob\";\n\nexport interface CreateDefaultWorkerOptions {\n /**\n * Selects how the helper instantiates the worker.\n * - `auto` (default) tries to use inline source when available, then falls back to hosted URL.\n * - `hosted` always instantiates from the provided URL.\n * - `blob` requires `inlineSource` (or an inline `<script data-markdown-v2-worker-source>` element) and never touches the hosted URL.\n */\n mode?: DefaultWorkerMode;\n /**\n * Hosted worker URL. Defaults to `/workers/markdown-worker.js` or whatever is declared via\n * `<script data-markdown-v2-worker-url=\"...\">`.\n */\n url?: string | URL;\n /**\n * Inline worker source (module string) used when `mode` is `blob` or `auto`.\n */\n inlineSource?: string;\n /**\n * Override the worker name (shows up in devtools).\n */\n name?: string;\n /**\n * Credentials to use when instantiating a hosted worker.\n */\n credentials?: WorkerOptions[\"credentials\"];\n}\n\nexport function createDefaultWorker(options: CreateDefaultWorkerOptions = {}): Worker | null {\n if (typeof window === \"undefined\" || typeof Worker === \"undefined\") {\n return null;\n }\n\n const mode = options.mode ?? \"auto\";\n const workerName = options.name ?? \"markdown-v2\";\n const workerOptions: WorkerOptions = {\n type: \"module\",\n name: workerName,\n credentials: options.credentials ?? \"same-origin\",\n };\n\n const inlineSource = resolveInlineSource(options.inlineSource);\n\n if ((mode === \"auto\" || mode === \"blob\") && inlineSource) {\n const blobWorker = instantiateBlobWorker(inlineSource, workerOptions);\n if (blobWorker) {\n return blobWorker;\n }\n if (mode === \"blob\") {\n return null;\n }\n } else if (mode === \"blob\") {\n console.warn(\"[markdown-v2] Blob worker requested but no inline source was provided.\");\n return null;\n }\n\n const hostedUrl = resolveHostedUrl(options.url);\n try {\n return new Worker(hostedUrl, workerOptions);\n } catch (error) {\n console.error(\"[markdown-v2] Unable to instantiate hosted worker:\", error);\n return null;\n }\n}\n\nexport function releaseDefaultWorker(worker: Worker | null | undefined): void {\n if (!worker) return;\n const blobUrl = BLOB_REGISTRY.get(worker);\n if (blobUrl) {\n URL.revokeObjectURL(blobUrl);\n BLOB_REGISTRY.delete(worker);\n }\n}\n\nfunction instantiateBlobWorker(source: string, workerOptions: WorkerOptions): Worker | null {\n try {\n const blob = new Blob([source], { type: \"text/javascript\" });\n const blobUrl = URL.createObjectURL(blob);\n const worker = new Worker(blobUrl, workerOptions);\n BLOB_REGISTRY.set(worker, blobUrl);\n return worker;\n } catch (error) {\n console.warn(\"[markdown-v2] Failed to instantiate blob worker:\", error);\n return null;\n }\n}\n\nfunction resolveHostedUrl(explicit?: string | URL): string | URL {\n if (explicit) {\n return explicit;\n }\n if (typeof document !== \"undefined\") {\n const script = document.querySelector<HTMLScriptElement>('script[data-markdown-v2-worker-url]');\n if (script?.dataset?.markdownV2WorkerUrl) {\n return script.dataset.markdownV2WorkerUrl;\n }\n const meta = document.querySelector<HTMLMetaElement>('meta[name=\"markdown-v2:worker\"]');\n if (meta?.content) {\n return meta.content;\n }\n }\n return DEFAULT_WORKER_PATH;\n}\n\nfunction resolveInlineSource(explicit?: string): string | undefined {\n if (typeof explicit === \"string\" && explicit.trim().length > 0) {\n return explicit;\n }\n if (typeof document === \"undefined\") {\n return undefined;\n }\n const script = document.querySelector<HTMLScriptElement>('script[data-markdown-v2-worker-source]');\n const text = script?.textContent;\n return text && text.trim().length > 0 ? text : undefined;\n}\n","// V2 Worker Client for Markdown Renderer\n// Similar interface to the V1 streaming worker client\n\nimport type { WorkerIn, WorkerOut } from \"@stream-mdx/core\";\nimport { createDefaultWorker, releaseDefaultWorker, type CreateDefaultWorkerOptions } from \"./create-default-worker\";\n\nexport interface MarkdownWorkerClientOptions {\n worker?: Worker | (() => Worker);\n workerUrl?: string | URL;\n name?: string;\n defaultWorker?: CreateDefaultWorkerOptions;\n}\n\nexport class MarkdownWorkerClient {\n private worker?: Worker;\n private readonly ownsWorker: boolean;\n private listeners = new Set<(msg: WorkerOut) => void>();\n private messageListener?: (event: MessageEvent<WorkerOut>) => void;\n private errorListener?: (event: ErrorEvent) => void;\n private messageErrorListener?: (event: MessageEvent<unknown>) => void;\n private cleanupCallbacks: Array<() => void> = [];\n\n constructor(options: MarkdownWorkerClientOptions = {}) {\n let owned = false;\n if (typeof window !== \"undefined\" && typeof Worker !== \"undefined\") {\n try {\n const worker = this.createWorkerInstance(options);\n if (worker) {\n owned = !options.worker;\n this.worker = worker;\n this.messageListener = (ev: MessageEvent<WorkerOut>) => {\n for (const listener of this.listeners) {\n listener(ev.data);\n }\n };\n this.errorListener = (error: Event) => {\n if (error instanceof ErrorEvent) {\n const stack = error.error && typeof error.error === \"object\" ? (error.error as Error).stack : undefined;\n console.error(\"V2 Markdown Worker error:\", error.message, \"at\", error.filename, `${error.lineno}:${error.colno}`, stack ?? \"<no-stack>\");\n } else {\n console.error(\"V2 Markdown Worker error:\", error);\n }\n };\n this.messageErrorListener = (event: MessageEvent<unknown>) => {\n console.error(\"V2 Markdown Worker message error:\", event.data);\n };\n this.worker.addEventListener(\"message\", this.messageListener);\n this.worker.addEventListener(\"error\", this.errorListener);\n this.worker.addEventListener(\"messageerror\", this.messageErrorListener);\n }\n } catch (error) {\n console.warn(\"Failed to create V2 Markdown Worker:\", error);\n }\n }\n this.ownsWorker = owned;\n }\n\n private createWorkerInstance(options: MarkdownWorkerClientOptions): Worker | undefined {\n const { worker, workerUrl, name, defaultWorker } = options;\n try {\n if (worker) {\n return typeof worker === \"function\" ? worker() : worker;\n }\n const auto = createDefaultWorker({\n ...defaultWorker,\n url: workerUrl ?? defaultWorker?.url,\n name: name ?? defaultWorker?.name,\n });\n if (auto) {\n this.cleanupCallbacks.push(() => releaseDefaultWorker(auto));\n return auto;\n }\n const script = workerUrl ?? \"/workers/markdown-worker.js\";\n return new Worker(script instanceof URL ? script : script, { type: \"module\", name: name ?? \"markdown-v2\" });\n } catch (error) {\n console.warn(\"Unable to instantiate markdown worker:\", error);\n return undefined;\n }\n }\n\n onMessage(cb: (msg: WorkerOut) => void) {\n this.listeners.add(cb);\n return () => this.listeners.delete(cb);\n }\n\n init(\n initialContent?: string,\n prewarmLangs?: string[],\n docPlugins?: { footnotes?: boolean; html?: boolean; mdx?: boolean; tables?: boolean; callouts?: boolean },\n mdxOptions?: { compileMode?: \"server\" | \"worker\" },\n ) {\n this.post({\n type: \"INIT\",\n initialContent,\n prewarmLangs,\n docPlugins,\n mdx: mdxOptions,\n } as WorkerIn);\n }\n\n append(text: string) {\n this.post({ type: \"APPEND\", text });\n }\n\n finalize() {\n this.post({ type: \"FINALIZE\" } as WorkerIn);\n }\n\n setCredits(credits: number) {\n const value = Math.max(0, Math.min(1, credits));\n this.post({ type: \"SET_CREDITS\", credits: value } as WorkerIn);\n }\n\n setMdxCompiled(blockId: string, compiledId: string) {\n this.post({ type: \"MDX_COMPILED\", blockId, compiledId } as WorkerIn);\n }\n\n setMdxError(blockId: string, error?: string) {\n this.post({ type: \"MDX_ERROR\", blockId, error } as WorkerIn);\n }\n\n terminate(options: { force?: boolean } = {}) {\n if (this.worker) {\n if (this.messageListener) {\n this.worker.removeEventListener(\"message\", this.messageListener);\n }\n if (this.errorListener) {\n this.worker.removeEventListener(\"error\", this.errorListener);\n }\n if (this.messageErrorListener) {\n this.worker.removeEventListener(\"messageerror\", this.messageErrorListener);\n }\n const shouldTerminate = options.force ?? this.ownsWorker;\n if (shouldTerminate && typeof this.worker.terminate === \"function\") {\n this.worker.terminate();\n }\n }\n this.worker = undefined;\n this.messageListener = undefined;\n this.errorListener = undefined;\n this.messageErrorListener = undefined;\n this.listeners.clear();\n if (this.cleanupCallbacks.length > 0) {\n for (const cleanup of this.cleanupCallbacks.splice(0, this.cleanupCallbacks.length)) {\n try {\n cleanup();\n } catch (error) {\n console.warn(\"Failed to clean up worker resources\", error);\n }\n }\n }\n }\n\n getWorker(): Worker | undefined {\n return this.worker;\n }\n\n private post(msg: WorkerIn) {\n if (this.worker) {\n this.worker.postMessage(msg);\n } else {\n console.warn(\"V2 Markdown Worker not available\");\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/create-default-worker.ts","../src/worker-client.ts"],"sourcesContent":["const DEFAULT_WORKER_PATH = \"/workers/markdown-worker.js\";\n\nconst BLOB_REGISTRY = new WeakMap<Worker, string>();\n\nexport type DefaultWorkerMode = \"auto\" | \"hosted\" | \"blob\";\n\nexport interface CreateDefaultWorkerOptions {\n /**\n * Selects how the helper instantiates the worker.\n * - `auto` (default) tries to use inline source when available, then falls back to hosted URL.\n * - `hosted` always instantiates from the provided URL.\n * - `blob` requires `inlineSource` (or an inline `<script data-markdown-v2-worker-source>` element) and never touches the hosted URL.\n */\n mode?: DefaultWorkerMode;\n /**\n * Hosted worker URL. Defaults to `/workers/markdown-worker.js` or whatever is declared via\n * `<script data-markdown-v2-worker-url=\"...\">`.\n */\n url?: string | URL;\n /**\n * Inline worker source (module string) used when `mode` is `blob` or `auto`.\n */\n inlineSource?: string;\n /**\n * Override the worker name (shows up in devtools).\n */\n name?: string;\n /**\n * Credentials to use when instantiating a hosted worker.\n */\n credentials?: WorkerOptions[\"credentials\"];\n}\n\nexport function createDefaultWorker(options: CreateDefaultWorkerOptions = {}): Worker | null {\n if (typeof window === \"undefined\" || typeof Worker === \"undefined\") {\n return null;\n }\n\n const mode = options.mode ?? \"auto\";\n const workerName = options.name ?? \"markdown-v2\";\n const workerOptions: WorkerOptions = {\n type: \"module\",\n name: workerName,\n credentials: options.credentials ?? \"same-origin\",\n };\n\n const inlineSource = resolveInlineSource(options.inlineSource);\n\n if ((mode === \"auto\" || mode === \"blob\") && inlineSource) {\n const blobWorker = instantiateBlobWorker(inlineSource, workerOptions);\n if (blobWorker) {\n return blobWorker;\n }\n if (mode === \"blob\") {\n return null;\n }\n } else if (mode === \"blob\") {\n console.warn(\"[markdown-v2] Blob worker requested but no inline source was provided.\");\n return null;\n }\n\n const hostedUrl = resolveHostedUrl(options.url);\n try {\n return new Worker(hostedUrl, workerOptions);\n } catch (error) {\n console.error(\"[markdown-v2] Unable to instantiate hosted worker:\", error);\n return null;\n }\n}\n\nexport function releaseDefaultWorker(worker: Worker | null | undefined): void {\n if (!worker) return;\n const blobUrl = BLOB_REGISTRY.get(worker);\n if (blobUrl) {\n URL.revokeObjectURL(blobUrl);\n BLOB_REGISTRY.delete(worker);\n }\n}\n\nfunction instantiateBlobWorker(source: string, workerOptions: WorkerOptions): Worker | null {\n try {\n const blob = new Blob([source], { type: \"text/javascript\" });\n const blobUrl = URL.createObjectURL(blob);\n const worker = new Worker(blobUrl, workerOptions);\n BLOB_REGISTRY.set(worker, blobUrl);\n return worker;\n } catch (error) {\n console.warn(\"[markdown-v2] Failed to instantiate blob worker:\", error);\n return null;\n }\n}\n\nfunction resolveHostedUrl(explicit?: string | URL): string | URL {\n if (explicit) {\n return explicit;\n }\n if (typeof document !== \"undefined\") {\n const script = document.querySelector<HTMLScriptElement>('script[data-markdown-v2-worker-url]');\n if (script?.dataset?.markdownV2WorkerUrl) {\n return script.dataset.markdownV2WorkerUrl;\n }\n const meta = document.querySelector<HTMLMetaElement>('meta[name=\"markdown-v2:worker\"]');\n if (meta?.content) {\n return meta.content;\n }\n }\n return DEFAULT_WORKER_PATH;\n}\n\nfunction resolveInlineSource(explicit?: string): string | undefined {\n if (typeof explicit === \"string\" && explicit.trim().length > 0) {\n return explicit;\n }\n if (typeof document === \"undefined\") {\n return undefined;\n }\n const script = document.querySelector<HTMLScriptElement>('script[data-markdown-v2-worker-source]');\n const text = script?.textContent;\n return text && text.trim().length > 0 ? text : undefined;\n}\n","// V2 Worker Client for Markdown Renderer\n// Similar interface to the V1 streaming worker client\n\nimport type { WorkerIn, WorkerOut } from \"@stream-mdx/core\";\nimport { createDefaultWorker, releaseDefaultWorker, type CreateDefaultWorkerOptions } from \"./create-default-worker\";\n\nexport interface MarkdownWorkerClientOptions {\n worker?: Worker | (() => Worker);\n workerUrl?: string | URL;\n name?: string;\n defaultWorker?: CreateDefaultWorkerOptions;\n}\n\nexport class MarkdownWorkerClient {\n private worker?: Worker;\n private readonly ownsWorker: boolean;\n private listeners = new Set<(msg: WorkerOut) => void>();\n private messageListener?: (event: MessageEvent<WorkerOut>) => void;\n private errorListener?: (event: ErrorEvent) => void;\n private messageErrorListener?: (event: MessageEvent<unknown>) => void;\n private cleanupCallbacks: Array<() => void> = [];\n\n constructor(options: MarkdownWorkerClientOptions = {}) {\n let owned = false;\n if (typeof window !== \"undefined\" && typeof Worker !== \"undefined\") {\n try {\n const worker = this.createWorkerInstance(options);\n if (worker) {\n owned = !options.worker;\n this.worker = worker;\n this.messageListener = (ev: MessageEvent<WorkerOut>) => {\n for (const listener of this.listeners) {\n listener(ev.data);\n }\n };\n this.errorListener = (error: Event) => {\n if (error instanceof ErrorEvent) {\n const stack = error.error && typeof error.error === \"object\" ? (error.error as Error).stack : undefined;\n console.error(\"V2 Markdown Worker error:\", error.message, \"at\", error.filename, `${error.lineno}:${error.colno}`, stack ?? \"<no-stack>\");\n } else {\n console.error(\"V2 Markdown Worker error:\", error);\n }\n };\n this.messageErrorListener = (event: MessageEvent<unknown>) => {\n console.error(\"V2 Markdown Worker message error:\", event.data);\n };\n this.worker.addEventListener(\"message\", this.messageListener);\n this.worker.addEventListener(\"error\", this.errorListener);\n this.worker.addEventListener(\"messageerror\", this.messageErrorListener);\n }\n } catch (error) {\n console.warn(\"Failed to create V2 Markdown Worker:\", error);\n }\n }\n this.ownsWorker = owned;\n }\n\n private createWorkerInstance(options: MarkdownWorkerClientOptions): Worker | undefined {\n const { worker, workerUrl, name, defaultWorker } = options;\n try {\n if (worker) {\n return typeof worker === \"function\" ? worker() : worker;\n }\n const auto = createDefaultWorker({\n ...defaultWorker,\n url: workerUrl ?? defaultWorker?.url,\n name: name ?? defaultWorker?.name,\n });\n if (auto) {\n this.cleanupCallbacks.push(() => releaseDefaultWorker(auto));\n return auto;\n }\n const script = workerUrl ?? \"/workers/markdown-worker.js\";\n return new Worker(script instanceof URL ? script : script, { type: \"module\", name: name ?? \"markdown-v2\" });\n } catch (error) {\n console.warn(\"Unable to instantiate markdown worker:\", error);\n return undefined;\n }\n }\n\n onMessage(cb: (msg: WorkerOut) => void) {\n this.listeners.add(cb);\n return () => this.listeners.delete(cb);\n }\n\n init(\n initialContent?: string,\n prewarmLangs?: string[],\n docPlugins?: { footnotes?: boolean; html?: boolean; mdx?: boolean; tables?: boolean; callouts?: boolean },\n mdxOptions?: { compileMode?: \"server\" | \"worker\" },\n ) {\n this.post({\n type: \"INIT\",\n initialContent,\n prewarmLangs,\n docPlugins,\n mdx: mdxOptions,\n } as WorkerIn);\n }\n\n append(text: string) {\n this.post({ type: \"APPEND\", text });\n }\n\n finalize() {\n this.post({ type: \"FINALIZE\" } as WorkerIn);\n }\n\n setCredits(credits: number) {\n const value = Math.max(0, Math.min(1, credits));\n this.post({ type: \"SET_CREDITS\", credits: value } as WorkerIn);\n }\n\n setMdxCompiled(blockId: string, compiledId: string) {\n this.post({ type: \"MDX_COMPILED\", blockId, compiledId } as WorkerIn);\n }\n\n setMdxError(blockId: string, error?: string) {\n this.post({ type: \"MDX_ERROR\", blockId, error } as WorkerIn);\n }\n\n terminate(options: { force?: boolean } = {}) {\n if (this.worker) {\n if (this.messageListener) {\n this.worker.removeEventListener(\"message\", this.messageListener);\n }\n if (this.errorListener) {\n this.worker.removeEventListener(\"error\", this.errorListener);\n }\n if (this.messageErrorListener) {\n this.worker.removeEventListener(\"messageerror\", this.messageErrorListener);\n }\n const shouldTerminate = options.force ?? this.ownsWorker;\n if (shouldTerminate && typeof this.worker.terminate === \"function\") {\n this.worker.terminate();\n }\n }\n this.worker = undefined;\n this.messageListener = undefined;\n this.errorListener = undefined;\n this.messageErrorListener = undefined;\n this.listeners.clear();\n if (this.cleanupCallbacks.length > 0) {\n for (const cleanup of this.cleanupCallbacks.splice(0, this.cleanupCallbacks.length)) {\n try {\n cleanup();\n } catch (error) {\n console.warn(\"Failed to clean up worker resources\", error);\n }\n }\n }\n }\n\n getWorker(): Worker | undefined {\n return this.worker;\n }\n\n private post(msg: WorkerIn) {\n if (this.worker) {\n this.worker.postMessage(msg);\n } else {\n console.warn(\"V2 Markdown Worker not available\");\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/streaming/custom-matcher.ts"],"sourcesContent":["export * from \"@stream-mdx/core/streaming/custom-matcher\";\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA,mCAAc,sDAAd;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/streaming/custom-matcher.ts"],"sourcesContent":["export * from \"@stream-mdx/core/streaming/custom-matcher\";\n"],"mappings":";AAAA,cAAc;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/worker-client.ts","../src/create-default-worker.ts"],"sourcesContent":["// V2 Worker Client for Markdown Renderer\n// Similar interface to the V1 streaming worker client\n\nimport type { WorkerIn, WorkerOut } from \"@stream-mdx/core\";\nimport { createDefaultWorker, releaseDefaultWorker, type CreateDefaultWorkerOptions } from \"./create-default-worker\";\n\nexport interface MarkdownWorkerClientOptions {\n worker?: Worker | (() => Worker);\n workerUrl?: string | URL;\n name?: string;\n defaultWorker?: CreateDefaultWorkerOptions;\n}\n\nexport class MarkdownWorkerClient {\n private worker?: Worker;\n private readonly ownsWorker: boolean;\n private listeners = new Set<(msg: WorkerOut) => void>();\n private messageListener?: (event: MessageEvent<WorkerOut>) => void;\n private errorListener?: (event: ErrorEvent) => void;\n private messageErrorListener?: (event: MessageEvent<unknown>) => void;\n private cleanupCallbacks: Array<() => void> = [];\n\n constructor(options: MarkdownWorkerClientOptions = {}) {\n let owned = false;\n if (typeof window !== \"undefined\" && typeof Worker !== \"undefined\") {\n try {\n const worker = this.createWorkerInstance(options);\n if (worker) {\n owned = !options.worker;\n this.worker = worker;\n this.messageListener = (ev: MessageEvent<WorkerOut>) => {\n for (const listener of this.listeners) {\n listener(ev.data);\n }\n };\n this.errorListener = (error: Event) => {\n if (error instanceof ErrorEvent) {\n const stack = error.error && typeof error.error === \"object\" ? (error.error as Error).stack : undefined;\n console.error(\"V2 Markdown Worker error:\", error.message, \"at\", error.filename, `${error.lineno}:${error.colno}`, stack ?? \"<no-stack>\");\n } else {\n console.error(\"V2 Markdown Worker error:\", error);\n }\n };\n this.messageErrorListener = (event: MessageEvent<unknown>) => {\n console.error(\"V2 Markdown Worker message error:\", event.data);\n };\n this.worker.addEventListener(\"message\", this.messageListener);\n this.worker.addEventListener(\"error\", this.errorListener);\n this.worker.addEventListener(\"messageerror\", this.messageErrorListener);\n }\n } catch (error) {\n console.warn(\"Failed to create V2 Markdown Worker:\", error);\n }\n }\n this.ownsWorker = owned;\n }\n\n private createWorkerInstance(options: MarkdownWorkerClientOptions): Worker | undefined {\n const { worker, workerUrl, name, defaultWorker } = options;\n try {\n if (worker) {\n return typeof worker === \"function\" ? worker() : worker;\n }\n const auto = createDefaultWorker({\n ...defaultWorker,\n url: workerUrl ?? defaultWorker?.url,\n name: name ?? defaultWorker?.name,\n });\n if (auto) {\n this.cleanupCallbacks.push(() => releaseDefaultWorker(auto));\n return auto;\n }\n const script = workerUrl ?? \"/workers/markdown-worker.js\";\n return new Worker(script instanceof URL ? script : script, { type: \"module\", name: name ?? \"markdown-v2\" });\n } catch (error) {\n console.warn(\"Unable to instantiate markdown worker:\", error);\n return undefined;\n }\n }\n\n onMessage(cb: (msg: WorkerOut) => void) {\n this.listeners.add(cb);\n return () => this.listeners.delete(cb);\n }\n\n init(\n initialContent?: string,\n prewarmLangs?: string[],\n docPlugins?: { footnotes?: boolean; html?: boolean; mdx?: boolean; tables?: boolean; callouts?: boolean },\n mdxOptions?: { compileMode?: \"server\" | \"worker\" },\n ) {\n this.post({\n type: \"INIT\",\n initialContent,\n prewarmLangs,\n docPlugins,\n mdx: mdxOptions,\n } as WorkerIn);\n }\n\n append(text: string) {\n this.post({ type: \"APPEND\", text });\n }\n\n finalize() {\n this.post({ type: \"FINALIZE\" } as WorkerIn);\n }\n\n setCredits(credits: number) {\n const value = Math.max(0, Math.min(1, credits));\n this.post({ type: \"SET_CREDITS\", credits: value } as WorkerIn);\n }\n\n setMdxCompiled(blockId: string, compiledId: string) {\n this.post({ type: \"MDX_COMPILED\", blockId, compiledId } as WorkerIn);\n }\n\n setMdxError(blockId: string, error?: string) {\n this.post({ type: \"MDX_ERROR\", blockId, error } as WorkerIn);\n }\n\n terminate(options: { force?: boolean } = {}) {\n if (this.worker) {\n if (this.messageListener) {\n this.worker.removeEventListener(\"message\", this.messageListener);\n }\n if (this.errorListener) {\n this.worker.removeEventListener(\"error\", this.errorListener);\n }\n if (this.messageErrorListener) {\n this.worker.removeEventListener(\"messageerror\", this.messageErrorListener);\n }\n const shouldTerminate = options.force ?? this.ownsWorker;\n if (shouldTerminate && typeof this.worker.terminate === \"function\") {\n this.worker.terminate();\n }\n }\n this.worker = undefined;\n this.messageListener = undefined;\n this.errorListener = undefined;\n this.messageErrorListener = undefined;\n this.listeners.clear();\n if (this.cleanupCallbacks.length > 0) {\n for (const cleanup of this.cleanupCallbacks.splice(0, this.cleanupCallbacks.length)) {\n try {\n cleanup();\n } catch (error) {\n console.warn(\"Failed to clean up worker resources\", error);\n }\n }\n }\n }\n\n getWorker(): Worker | undefined {\n return this.worker;\n }\n\n private post(msg: WorkerIn) {\n if (this.worker) {\n this.worker.postMessage(msg);\n } else {\n console.warn(\"V2 Markdown Worker not available\");\n }\n }\n}\n","const DEFAULT_WORKER_PATH = \"/workers/markdown-worker.js\";\n\nconst BLOB_REGISTRY = new WeakMap<Worker, string>();\n\nexport type DefaultWorkerMode = \"auto\" | \"hosted\" | \"blob\";\n\nexport interface CreateDefaultWorkerOptions {\n /**\n * Selects how the helper instantiates the worker.\n * - `auto` (default) tries to use inline source when available, then falls back to hosted URL.\n * - `hosted` always instantiates from the provided URL.\n * - `blob` requires `inlineSource` (or an inline `<script data-markdown-v2-worker-source>` element) and never touches the hosted URL.\n */\n mode?: DefaultWorkerMode;\n /**\n * Hosted worker URL. Defaults to `/workers/markdown-worker.js` or whatever is declared via\n * `<script data-markdown-v2-worker-url=\"...\">`.\n */\n url?: string | URL;\n /**\n * Inline worker source (module string) used when `mode` is `blob` or `auto`.\n */\n inlineSource?: string;\n /**\n * Override the worker name (shows up in devtools).\n */\n name?: string;\n /**\n * Credentials to use when instantiating a hosted worker.\n */\n credentials?: WorkerOptions[\"credentials\"];\n}\n\nexport function createDefaultWorker(options: CreateDefaultWorkerOptions = {}): Worker | null {\n if (typeof window === \"undefined\" || typeof Worker === \"undefined\") {\n return null;\n }\n\n const mode = options.mode ?? \"auto\";\n const workerName = options.name ?? \"markdown-v2\";\n const workerOptions: WorkerOptions = {\n type: \"module\",\n name: workerName,\n credentials: options.credentials ?? \"same-origin\",\n };\n\n const inlineSource = resolveInlineSource(options.inlineSource);\n\n if ((mode === \"auto\" || mode === \"blob\") && inlineSource) {\n const blobWorker = instantiateBlobWorker(inlineSource, workerOptions);\n if (blobWorker) {\n return blobWorker;\n }\n if (mode === \"blob\") {\n return null;\n }\n } else if (mode === \"blob\") {\n console.warn(\"[markdown-v2] Blob worker requested but no inline source was provided.\");\n return null;\n }\n\n const hostedUrl = resolveHostedUrl(options.url);\n try {\n return new Worker(hostedUrl, workerOptions);\n } catch (error) {\n console.error(\"[markdown-v2] Unable to instantiate hosted worker:\", error);\n return null;\n }\n}\n\nexport function releaseDefaultWorker(worker: Worker | null | undefined): void {\n if (!worker) return;\n const blobUrl = BLOB_REGISTRY.get(worker);\n if (blobUrl) {\n URL.revokeObjectURL(blobUrl);\n BLOB_REGISTRY.delete(worker);\n }\n}\n\nfunction instantiateBlobWorker(source: string, workerOptions: WorkerOptions): Worker | null {\n try {\n const blob = new Blob([source], { type: \"text/javascript\" });\n const blobUrl = URL.createObjectURL(blob);\n const worker = new Worker(blobUrl, workerOptions);\n BLOB_REGISTRY.set(worker, blobUrl);\n return worker;\n } catch (error) {\n console.warn(\"[markdown-v2] Failed to instantiate blob worker:\", error);\n return null;\n }\n}\n\nfunction resolveHostedUrl(explicit?: string | URL): string | URL {\n if (explicit) {\n return explicit;\n }\n if (typeof document !== \"undefined\") {\n const script = document.querySelector<HTMLScriptElement>('script[data-markdown-v2-worker-url]');\n if (script?.dataset?.markdownV2WorkerUrl) {\n return script.dataset.markdownV2WorkerUrl;\n }\n const meta = document.querySelector<HTMLMetaElement>('meta[name=\"markdown-v2:worker\"]');\n if (meta?.content) {\n return meta.content;\n }\n }\n return DEFAULT_WORKER_PATH;\n}\n\nfunction resolveInlineSource(explicit?: string): string | undefined {\n if (typeof explicit === \"string\" && explicit.trim().length > 0) {\n return explicit;\n }\n if (typeof document === \"undefined\") {\n return undefined;\n }\n const script = document.querySelector<HTMLScriptElement>('script[data-markdown-v2-worker-source]');\n const text = script?.textContent;\n return text && text.trim().length > 0 ? text : undefined;\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/create-default-worker.ts","../src/worker-client.ts"],"sourcesContent":["const DEFAULT_WORKER_PATH = \"/workers/markdown-worker.js\";\n\nconst BLOB_REGISTRY = new WeakMap<Worker, string>();\n\nexport type DefaultWorkerMode = \"auto\" | \"hosted\" | \"blob\";\n\nexport interface CreateDefaultWorkerOptions {\n /**\n * Selects how the helper instantiates the worker.\n * - `auto` (default) tries to use inline source when available, then falls back to hosted URL.\n * - `hosted` always instantiates from the provided URL.\n * - `blob` requires `inlineSource` (or an inline `<script data-markdown-v2-worker-source>` element) and never touches the hosted URL.\n */\n mode?: DefaultWorkerMode;\n /**\n * Hosted worker URL. Defaults to `/workers/markdown-worker.js` or whatever is declared via\n * `<script data-markdown-v2-worker-url=\"...\">`.\n */\n url?: string | URL;\n /**\n * Inline worker source (module string) used when `mode` is `blob` or `auto`.\n */\n inlineSource?: string;\n /**\n * Override the worker name (shows up in devtools).\n */\n name?: string;\n /**\n * Credentials to use when instantiating a hosted worker.\n */\n credentials?: WorkerOptions[\"credentials\"];\n}\n\nexport function createDefaultWorker(options: CreateDefaultWorkerOptions = {}): Worker | null {\n if (typeof window === \"undefined\" || typeof Worker === \"undefined\") {\n return null;\n }\n\n const mode = options.mode ?? \"auto\";\n const workerName = options.name ?? \"markdown-v2\";\n const workerOptions: WorkerOptions = {\n type: \"module\",\n name: workerName,\n credentials: options.credentials ?? \"same-origin\",\n };\n\n const inlineSource = resolveInlineSource(options.inlineSource);\n\n if ((mode === \"auto\" || mode === \"blob\") && inlineSource) {\n const blobWorker = instantiateBlobWorker(inlineSource, workerOptions);\n if (blobWorker) {\n return blobWorker;\n }\n if (mode === \"blob\") {\n return null;\n }\n } else if (mode === \"blob\") {\n console.warn(\"[markdown-v2] Blob worker requested but no inline source was provided.\");\n return null;\n }\n\n const hostedUrl = resolveHostedUrl(options.url);\n try {\n return new Worker(hostedUrl, workerOptions);\n } catch (error) {\n console.error(\"[markdown-v2] Unable to instantiate hosted worker:\", error);\n return null;\n }\n}\n\nexport function releaseDefaultWorker(worker: Worker | null | undefined): void {\n if (!worker) return;\n const blobUrl = BLOB_REGISTRY.get(worker);\n if (blobUrl) {\n URL.revokeObjectURL(blobUrl);\n BLOB_REGISTRY.delete(worker);\n }\n}\n\nfunction instantiateBlobWorker(source: string, workerOptions: WorkerOptions): Worker | null {\n try {\n const blob = new Blob([source], { type: \"text/javascript\" });\n const blobUrl = URL.createObjectURL(blob);\n const worker = new Worker(blobUrl, workerOptions);\n BLOB_REGISTRY.set(worker, blobUrl);\n return worker;\n } catch (error) {\n console.warn(\"[markdown-v2] Failed to instantiate blob worker:\", error);\n return null;\n }\n}\n\nfunction resolveHostedUrl(explicit?: string | URL): string | URL {\n if (explicit) {\n return explicit;\n }\n if (typeof document !== \"undefined\") {\n const script = document.querySelector<HTMLScriptElement>('script[data-markdown-v2-worker-url]');\n if (script?.dataset?.markdownV2WorkerUrl) {\n return script.dataset.markdownV2WorkerUrl;\n }\n const meta = document.querySelector<HTMLMetaElement>('meta[name=\"markdown-v2:worker\"]');\n if (meta?.content) {\n return meta.content;\n }\n }\n return DEFAULT_WORKER_PATH;\n}\n\nfunction resolveInlineSource(explicit?: string): string | undefined {\n if (typeof explicit === \"string\" && explicit.trim().length > 0) {\n return explicit;\n }\n if (typeof document === \"undefined\") {\n return undefined;\n }\n const script = document.querySelector<HTMLScriptElement>('script[data-markdown-v2-worker-source]');\n const text = script?.textContent;\n return text && text.trim().length > 0 ? text : undefined;\n}\n","// V2 Worker Client for Markdown Renderer\n// Similar interface to the V1 streaming worker client\n\nimport type { WorkerIn, WorkerOut } from \"@stream-mdx/core\";\nimport { createDefaultWorker, releaseDefaultWorker, type CreateDefaultWorkerOptions } from \"./create-default-worker\";\n\nexport interface MarkdownWorkerClientOptions {\n worker?: Worker | (() => Worker);\n workerUrl?: string | URL;\n name?: string;\n defaultWorker?: CreateDefaultWorkerOptions;\n}\n\nexport class MarkdownWorkerClient {\n private worker?: Worker;\n private readonly ownsWorker: boolean;\n private listeners = new Set<(msg: WorkerOut) => void>();\n private messageListener?: (event: MessageEvent<WorkerOut>) => void;\n private errorListener?: (event: ErrorEvent) => void;\n private messageErrorListener?: (event: MessageEvent<unknown>) => void;\n private cleanupCallbacks: Array<() => void> = [];\n\n constructor(options: MarkdownWorkerClientOptions = {}) {\n let owned = false;\n if (typeof window !== \"undefined\" && typeof Worker !== \"undefined\") {\n try {\n const worker = this.createWorkerInstance(options);\n if (worker) {\n owned = !options.worker;\n this.worker = worker;\n this.messageListener = (ev: MessageEvent<WorkerOut>) => {\n for (const listener of this.listeners) {\n listener(ev.data);\n }\n };\n this.errorListener = (error: Event) => {\n if (error instanceof ErrorEvent) {\n const stack = error.error && typeof error.error === \"object\" ? (error.error as Error).stack : undefined;\n console.error(\"V2 Markdown Worker error:\", error.message, \"at\", error.filename, `${error.lineno}:${error.colno}`, stack ?? \"<no-stack>\");\n } else {\n console.error(\"V2 Markdown Worker error:\", error);\n }\n };\n this.messageErrorListener = (event: MessageEvent<unknown>) => {\n console.error(\"V2 Markdown Worker message error:\", event.data);\n };\n this.worker.addEventListener(\"message\", this.messageListener);\n this.worker.addEventListener(\"error\", this.errorListener);\n this.worker.addEventListener(\"messageerror\", this.messageErrorListener);\n }\n } catch (error) {\n console.warn(\"Failed to create V2 Markdown Worker:\", error);\n }\n }\n this.ownsWorker = owned;\n }\n\n private createWorkerInstance(options: MarkdownWorkerClientOptions): Worker | undefined {\n const { worker, workerUrl, name, defaultWorker } = options;\n try {\n if (worker) {\n return typeof worker === \"function\" ? worker() : worker;\n }\n const auto = createDefaultWorker({\n ...defaultWorker,\n url: workerUrl ?? defaultWorker?.url,\n name: name ?? defaultWorker?.name,\n });\n if (auto) {\n this.cleanupCallbacks.push(() => releaseDefaultWorker(auto));\n return auto;\n }\n const script = workerUrl ?? \"/workers/markdown-worker.js\";\n return new Worker(script instanceof URL ? script : script, { type: \"module\", name: name ?? \"markdown-v2\" });\n } catch (error) {\n console.warn(\"Unable to instantiate markdown worker:\", error);\n return undefined;\n }\n }\n\n onMessage(cb: (msg: WorkerOut) => void) {\n this.listeners.add(cb);\n return () => this.listeners.delete(cb);\n }\n\n init(\n initialContent?: string,\n prewarmLangs?: string[],\n docPlugins?: { footnotes?: boolean; html?: boolean; mdx?: boolean; tables?: boolean; callouts?: boolean },\n mdxOptions?: { compileMode?: \"server\" | \"worker\" },\n ) {\n this.post({\n type: \"INIT\",\n initialContent,\n prewarmLangs,\n docPlugins,\n mdx: mdxOptions,\n } as WorkerIn);\n }\n\n append(text: string) {\n this.post({ type: \"APPEND\", text });\n }\n\n finalize() {\n this.post({ type: \"FINALIZE\" } as WorkerIn);\n }\n\n setCredits(credits: number) {\n const value = Math.max(0, Math.min(1, credits));\n this.post({ type: \"SET_CREDITS\", credits: value } as WorkerIn);\n }\n\n setMdxCompiled(blockId: string, compiledId: string) {\n this.post({ type: \"MDX_COMPILED\", blockId, compiledId } as WorkerIn);\n }\n\n setMdxError(blockId: string, error?: string) {\n this.post({ type: \"MDX_ERROR\", blockId, error } as WorkerIn);\n }\n\n terminate(options: { force?: boolean } = {}) {\n if (this.worker) {\n if (this.messageListener) {\n this.worker.removeEventListener(\"message\", this.messageListener);\n }\n if (this.errorListener) {\n this.worker.removeEventListener(\"error\", this.errorListener);\n }\n if (this.messageErrorListener) {\n this.worker.removeEventListener(\"messageerror\", this.messageErrorListener);\n }\n const shouldTerminate = options.force ?? this.ownsWorker;\n if (shouldTerminate && typeof this.worker.terminate === \"function\") {\n this.worker.terminate();\n }\n }\n this.worker = undefined;\n this.messageListener = undefined;\n this.errorListener = undefined;\n this.messageErrorListener = undefined;\n this.listeners.clear();\n if (this.cleanupCallbacks.length > 0) {\n for (const cleanup of this.cleanupCallbacks.splice(0, this.cleanupCallbacks.length)) {\n try {\n cleanup();\n } catch (error) {\n console.warn(\"Failed to clean up worker resources\", error);\n }\n }\n }\n }\n\n getWorker(): Worker | undefined {\n return this.worker;\n }\n\n private post(msg: WorkerIn) {\n if (this.worker) {\n this.worker.postMessage(msg);\n } else {\n console.warn(\"V2 Markdown Worker not available\");\n }\n }\n}\n"],"mappings":";AAAA,IAAM,sBAAsB;AAE5B,IAAM,gBAAgB,oBAAI,QAAwB;AA+B3C,SAAS,oBAAoB,UAAsC,CAAC,GAAkB;AAC3F,MAAI,OAAO,WAAW,eAAe,OAAO,WAAW,aAAa;AAClE,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,aAAa,QAAQ,QAAQ;AACnC,QAAM,gBAA+B;AAAA,IACnC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,aAAa,QAAQ,eAAe;AAAA,EACtC;AAEA,QAAM,eAAe,oBAAoB,QAAQ,YAAY;AAE7D,OAAK,SAAS,UAAU,SAAS,WAAW,cAAc;AACxD,UAAM,aAAa,sBAAsB,cAAc,aAAa;AACpE,QAAI,YAAY;AACd,aAAO;AAAA,IACT;AACA,QAAI,SAAS,QAAQ;AACnB,aAAO;AAAA,IACT;AAAA,EACF,WAAW,SAAS,QAAQ;AAC1B,YAAQ,KAAK,wEAAwE;AACrF,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,iBAAiB,QAAQ,GAAG;AAC9C,MAAI;AACF,WAAO,IAAI,OAAO,WAAW,aAAa;AAAA,EAC5C,SAAS,OAAO;AACd,YAAQ,MAAM,sDAAsD,KAAK;AACzE,WAAO;AAAA,EACT;AACF;AAEO,SAAS,qBAAqB,QAAyC;AAC5E,MAAI,CAAC,OAAQ;AACb,QAAM,UAAU,cAAc,IAAI,MAAM;AACxC,MAAI,SAAS;AACX,QAAI,gBAAgB,OAAO;AAC3B,kBAAc,OAAO,MAAM;AAAA,EAC7B;AACF;AAEA,SAAS,sBAAsB,QAAgB,eAA6C;AAC1F,MAAI;AACF,UAAM,OAAO,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAC3D,UAAM,UAAU,IAAI,gBAAgB,IAAI;AACxC,UAAM,SAAS,IAAI,OAAO,SAAS,aAAa;AAChD,kBAAc,IAAI,QAAQ,OAAO;AACjC,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,KAAK,oDAAoD,KAAK;AACtE,WAAO;AAAA,EACT;AACF;AAEA,SAAS,iBAAiB,UAAuC;AAC/D,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,MAAI,OAAO,aAAa,aAAa;AACnC,UAAM,SAAS,SAAS,cAAiC,qCAAqC;AAC9F,QAAI,QAAQ,SAAS,qBAAqB;AACxC,aAAO,OAAO,QAAQ;AAAA,IACxB;AACA,UAAM,OAAO,SAAS,cAA+B,iCAAiC;AACtF,QAAI,MAAM,SAAS;AACjB,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,UAAuC;AAClE,MAAI,OAAO,aAAa,YAAY,SAAS,KAAK,EAAE,SAAS,GAAG;AAC9D,WAAO;AAAA,EACT;AACA,MAAI,OAAO,aAAa,aAAa;AACnC,WAAO;AAAA,EACT;AACA,QAAM,SAAS,SAAS,cAAiC,wCAAwC;AACjG,QAAM,OAAO,QAAQ;AACrB,SAAO,QAAQ,KAAK,KAAK,EAAE,SAAS,IAAI,OAAO;AACjD;;;AC1GO,IAAM,uBAAN,MAA2B;AAAA,EAShC,YAAY,UAAuC,CAAC,GAAG;AANvD,SAAQ,YAAY,oBAAI,IAA8B;AAItD,SAAQ,mBAAsC,CAAC;AAG7C,QAAI,QAAQ;AACZ,QAAI,OAAO,WAAW,eAAe,OAAO,WAAW,aAAa;AAClE,UAAI;AACF,cAAM,SAAS,KAAK,qBAAqB,OAAO;AAChD,YAAI,QAAQ;AACV,kBAAQ,CAAC,QAAQ;AACjB,eAAK,SAAS;AACd,eAAK,kBAAkB,CAAC,OAAgC;AACtD,uBAAW,YAAY,KAAK,WAAW;AACrC,uBAAS,GAAG,IAAI;AAAA,YAClB;AAAA,UACF;AACA,eAAK,gBAAgB,CAAC,UAAiB;AACrC,gBAAI,iBAAiB,YAAY;AAC/B,oBAAM,QAAQ,MAAM,SAAS,OAAO,MAAM,UAAU,WAAY,MAAM,MAAgB,QAAQ;AAC9F,sBAAQ,MAAM,6BAA6B,MAAM,SAAS,MAAM,MAAM,UAAU,GAAG,MAAM,MAAM,IAAI,MAAM,KAAK,IAAI,SAAS,YAAY;AAAA,YACzI,OAAO;AACL,sBAAQ,MAAM,6BAA6B,KAAK;AAAA,YAClD;AAAA,UACF;AACA,eAAK,uBAAuB,CAAC,UAAiC;AAC5D,oBAAQ,MAAM,qCAAqC,MAAM,IAAI;AAAA,UAC/D;AACA,eAAK,OAAO,iBAAiB,WAAW,KAAK,eAAe;AAC5D,eAAK,OAAO,iBAAiB,SAAS,KAAK,aAAa;AACxD,eAAK,OAAO,iBAAiB,gBAAgB,KAAK,oBAAoB;AAAA,QACxE;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,KAAK,wCAAwC,KAAK;AAAA,MAC5D;AAAA,IACF;AACA,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,qBAAqB,SAA0D;AACrF,UAAM,EAAE,QAAQ,WAAW,MAAM,cAAc,IAAI;AACnD,QAAI;AACF,UAAI,QAAQ;AACV,eAAO,OAAO,WAAW,aAAa,OAAO,IAAI;AAAA,MACnD;AACA,YAAM,OAAO,oBAAoB;AAAA,QAC/B,GAAG;AAAA,QACH,KAAK,aAAa,eAAe;AAAA,QACjC,MAAM,QAAQ,eAAe;AAAA,MAC/B,CAAC;AACD,UAAI,MAAM;AACR,aAAK,iBAAiB,KAAK,MAAM,qBAAqB,IAAI,CAAC;AAC3D,eAAO;AAAA,MACT;AACA,YAAM,SAAS,aAAa;AAC5B,aAAO,IAAI,OAAO,kBAAkB,MAAM,SAAS,QAAQ,EAAE,MAAM,UAAU,MAAM,QAAQ,cAAc,CAAC;AAAA,IAC5G,SAAS,OAAO;AACd,cAAQ,KAAK,0CAA0C,KAAK;AAC5D,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,UAAU,IAA8B;AACtC,SAAK,UAAU,IAAI,EAAE;AACrB,WAAO,MAAM,KAAK,UAAU,OAAO,EAAE;AAAA,EACvC;AAAA,EAEA,KACE,gBACA,cACA,YACA,YACA;AACA,SAAK,KAAK;AAAA,MACR,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK;AAAA,IACP,CAAa;AAAA,EACf;AAAA,EAEA,OAAO,MAAc;AACnB,SAAK,KAAK,EAAE,MAAM,UAAU,KAAK,CAAC;AAAA,EACpC;AAAA,EAEA,WAAW;AACT,SAAK,KAAK,EAAE,MAAM,WAAW,CAAa;AAAA,EAC5C;AAAA,EAEA,WAAW,SAAiB;AAC1B,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC;AAC9C,SAAK,KAAK,EAAE,MAAM,eAAe,SAAS,MAAM,CAAa;AAAA,EAC/D;AAAA,EAEA,eAAe,SAAiB,YAAoB;AAClD,SAAK,KAAK,EAAE,MAAM,gBAAgB,SAAS,WAAW,CAAa;AAAA,EACrE;AAAA,EAEA,YAAY,SAAiB,OAAgB;AAC3C,SAAK,KAAK,EAAE,MAAM,aAAa,SAAS,MAAM,CAAa;AAAA,EAC7D;AAAA,EAEA,UAAU,UAA+B,CAAC,GAAG;AAC3C,QAAI,KAAK,QAAQ;AACf,UAAI,KAAK,iBAAiB;AACxB,aAAK,OAAO,oBAAoB,WAAW,KAAK,eAAe;AAAA,MACjE;AACA,UAAI,KAAK,eAAe;AACtB,aAAK,OAAO,oBAAoB,SAAS,KAAK,aAAa;AAAA,MAC7D;AACA,UAAI,KAAK,sBAAsB;AAC7B,aAAK,OAAO,oBAAoB,gBAAgB,KAAK,oBAAoB;AAAA,MAC3E;AACA,YAAM,kBAAkB,QAAQ,SAAS,KAAK;AAC9C,UAAI,mBAAmB,OAAO,KAAK,OAAO,cAAc,YAAY;AAClE,aAAK,OAAO,UAAU;AAAA,MACxB;AAAA,IACF;AACA,SAAK,SAAS;AACd,SAAK,kBAAkB;AACvB,SAAK,gBAAgB;AACrB,SAAK,uBAAuB;AAC5B,SAAK,UAAU,MAAM;AACrB,QAAI,KAAK,iBAAiB,SAAS,GAAG;AACpC,iBAAW,WAAW,KAAK,iBAAiB,OAAO,GAAG,KAAK,iBAAiB,MAAM,GAAG;AACnF,YAAI;AACF,kBAAQ;AAAA,QACV,SAAS,OAAO;AACd,kBAAQ,KAAK,uCAAuC,KAAK;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAgC;AAC9B,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,KAAK,KAAe;AAC1B,QAAI,KAAK,QAAQ;AACf,WAAK,OAAO,YAAY,GAAG;AAAA,IAC7B,OAAO;AACL,cAAQ,KAAK,kCAAkC;AAAA,IACjD;AAAA,EACF;AACF;","names":[]}