satteri 0.1.0

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.
Files changed (60) hide show
  1. package/README.md +7 -0
  2. package/browser.js +1 -0
  3. package/dist/command-buffer.d.ts +75 -0
  4. package/dist/command-buffer.js +231 -0
  5. package/dist/command-buffer.js.map +1 -0
  6. package/dist/compile.d.ts +22 -0
  7. package/dist/compile.js +144 -0
  8. package/dist/compile.js.map +1 -0
  9. package/dist/data-map.d.ts +10 -0
  10. package/dist/data-map.js +26 -0
  11. package/dist/data-map.js.map +1 -0
  12. package/dist/hast/hast-materializer.d.ts +11 -0
  13. package/dist/hast/hast-materializer.js +150 -0
  14. package/dist/hast/hast-materializer.js.map +1 -0
  15. package/dist/hast/hast-reader.d.ts +65 -0
  16. package/dist/hast/hast-reader.js +280 -0
  17. package/dist/hast/hast-reader.js.map +1 -0
  18. package/dist/hast/hast-visitor.d.ts +71 -0
  19. package/dist/hast/hast-visitor.js +537 -0
  20. package/dist/hast/hast-visitor.js.map +1 -0
  21. package/dist/hast-types.d.ts +5 -0
  22. package/dist/hast-types.js +2 -0
  23. package/dist/hast-types.js.map +1 -0
  24. package/dist/index.d.ts +6 -0
  25. package/dist/index.js +5 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/lazy-props.d.ts +10 -0
  28. package/dist/lazy-props.js +51 -0
  29. package/dist/lazy-props.js.map +1 -0
  30. package/dist/mdast/mdast-materializer.d.ts +9 -0
  31. package/dist/mdast/mdast-materializer.js +162 -0
  32. package/dist/mdast/mdast-materializer.js.map +1 -0
  33. package/dist/mdast/mdast-reader.d.ts +174 -0
  34. package/dist/mdast/mdast-reader.js +481 -0
  35. package/dist/mdast/mdast-reader.js.map +1 -0
  36. package/dist/mdast/mdast-visitor.d.ts +98 -0
  37. package/dist/mdast/mdast-visitor.js +543 -0
  38. package/dist/mdast/mdast-visitor.js.map +1 -0
  39. package/dist/mdast-types.d.ts +5 -0
  40. package/dist/mdast-types.js +2 -0
  41. package/dist/mdast-types.js.map +1 -0
  42. package/dist/pipeline.d.ts +29 -0
  43. package/dist/pipeline.js +87 -0
  44. package/dist/pipeline.js.map +1 -0
  45. package/dist/plugin.d.ts +12 -0
  46. package/dist/plugin.js +19 -0
  47. package/dist/plugin.js.map +1 -0
  48. package/dist/processor.d.ts +33 -0
  49. package/dist/processor.js +49 -0
  50. package/dist/processor.js.map +1 -0
  51. package/dist/types.d.ts +86 -0
  52. package/dist/types.js +6 -0
  53. package/dist/types.js.map +1 -0
  54. package/index.d.ts +109 -0
  55. package/index.js +604 -0
  56. package/package.json +60 -0
  57. package/satteri_napi.linux-x64-gnu.node +0 -0
  58. package/satteri_napi.wasi-browser.js +80 -0
  59. package/satteri_napi.wasi.cjs +132 -0
  60. package/wasi-worker.mjs +63 -0
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # satteri
2
+
3
+ TypeScript layer with readers, visitors, materializers, and plugin system for Sätteri, a high-performance Markdown and MDX processor.
4
+
5
+ > [!NOTE]
6
+ > **Work in progress** — this package is under active development.
7
+ > See the [Contributing Guide](../../CONTRIBUTING.md) if you want to get involved!
package/browser.js ADDED
@@ -0,0 +1 @@
1
+ export * from '@bruits/satteri-wasm32-wasi'
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Binary command buffer for efficient JS→Rust mutation serialization.
3
+ *
4
+ * Simple mutations (remove, setProperty) are encoded as compact binary commands.
5
+ * Structural mutations (insert, replace) carry payloads that can be raw strings
6
+ * (for Rust to re-parse) or JSON-serialized node trees.
7
+ *
8
+ * All multi-byte integers are little-endian to match native x86/ARM layout and
9
+ * avoid byte-swapping on the Rust side.
10
+ */
11
+ import type { MdastNode } from "./types.js";
12
+ type ReturnClass = "no_change" | "raw_markdown" | "raw_html" | "structured_node";
13
+ export declare function classifyReturn(value: unknown): ReturnClass;
14
+ export declare class CommandBuffer {
15
+ private buffer;
16
+ private view;
17
+ private bytes;
18
+ private offset;
19
+ constructor();
20
+ removeNode(nodeId: number): void;
21
+ /** Unified set-property for both MDAST and HAST nodes. */
22
+ setProperty(nodeId: number, key: string, value: unknown): void;
23
+ insertBefore(nodeId: number, newNode: MdastNode | {
24
+ raw: string;
25
+ } | {
26
+ rawHtml: string;
27
+ }): void;
28
+ insertAfter(nodeId: number, newNode: MdastNode | {
29
+ raw: string;
30
+ } | {
31
+ rawHtml: string;
32
+ }): void;
33
+ prependChild(nodeId: number, newNode: MdastNode | {
34
+ raw: string;
35
+ } | {
36
+ rawHtml: string;
37
+ }): void;
38
+ appendChild(nodeId: number, newNode: MdastNode | {
39
+ raw: string;
40
+ } | {
41
+ rawHtml: string;
42
+ }): void;
43
+ wrapNode(nodeId: number, parentNode: MdastNode | {
44
+ raw: string;
45
+ } | {
46
+ rawHtml: string;
47
+ }): void;
48
+ replace(nodeId: number, newNode: MdastNode | {
49
+ raw: string;
50
+ } | {
51
+ rawHtml: string;
52
+ }): void;
53
+ /** Write a REPLACE command with a pre-serialized JSON payload. */
54
+ replaceRawJson(nodeId: number, json: string): void;
55
+ /** Write any structural command with a pre-serialized JSON payload. */
56
+ insertBeforeRawJson(nodeId: number, json: string): void;
57
+ insertAfterRawJson(nodeId: number, json: string): void;
58
+ prependChildRawJson(nodeId: number, json: string): void;
59
+ appendChildRawJson(nodeId: number, json: string): void;
60
+ wrapNodeRawJson(nodeId: number, json: string): void;
61
+ private writeRawJsonCommand;
62
+ /** Return a Uint8Array view of the written bytes (no copy). */
63
+ getBuffer(): Uint8Array;
64
+ /** Number of bytes written so far. */
65
+ get length(): number;
66
+ /** Reset the buffer for reuse, releasing the old ArrayBuffer. */
67
+ reset(): void;
68
+ private writeStructuralCommand;
69
+ private ensureCapacity;
70
+ private grow;
71
+ private writeU8;
72
+ private writeU32;
73
+ private writeBytes;
74
+ }
75
+ export {};
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Binary command buffer for efficient JS→Rust mutation serialization.
3
+ *
4
+ * Simple mutations (remove, setProperty) are encoded as compact binary commands.
5
+ * Structural mutations (insert, replace) carry payloads that can be raw strings
6
+ * (for Rust to re-parse) or JSON-serialized node trees.
7
+ *
8
+ * All multi-byte integers are little-endian to match native x86/ARM layout and
9
+ * avoid byte-swapping on the Rust side.
10
+ */
11
+ // ---------------------------------------------------------------------------
12
+ // Command bytes (0x01–0x0F)
13
+ // ---------------------------------------------------------------------------
14
+ const CMD_REMOVE = 0x01;
15
+ const CMD_INSERT_BEFORE = 0x05;
16
+ const CMD_INSERT_AFTER = 0x06;
17
+ const CMD_PREPEND_CHILD = 0x07;
18
+ const CMD_APPEND_CHILD = 0x08;
19
+ const CMD_WRAP = 0x09;
20
+ const CMD_REPLACE = 0x0b;
21
+ const CMD_SET_PROPERTY = 0x0c;
22
+ // ---------------------------------------------------------------------------
23
+ // Payload types (0x10+, distinct range from commands)
24
+ // ---------------------------------------------------------------------------
25
+ const PAYLOAD_RAW_MARKDOWN = 0x10;
26
+ const PAYLOAD_RAW_HTML = 0x11;
27
+ const PAYLOAD_SERDE_JSON = 0x12;
28
+ // ---------------------------------------------------------------------------
29
+ // Value types for CMD_SET_PROPERTY (must match commands.rs PROP_* constants)
30
+ // ---------------------------------------------------------------------------
31
+ const PROP_STRING = 0;
32
+ const PROP_BOOL_TRUE = 1;
33
+ const PROP_BOOL_FALSE = 2;
34
+ const PROP_SPACE_SEP = 3;
35
+ const PROP_INT = 4;
36
+ const PROP_NULL = 5;
37
+ export function classifyReturn(value) {
38
+ if (value === undefined || value === null)
39
+ return "no_change";
40
+ const v = value;
41
+ if (typeof v.raw === "string")
42
+ return "raw_markdown";
43
+ if (typeof v.rawHtml === "string")
44
+ return "raw_html";
45
+ if (typeof v.type === "string")
46
+ return "structured_node";
47
+ throw new Error("Invalid return value from visitor: must have raw, rawHtml, or type");
48
+ }
49
+ // ---------------------------------------------------------------------------
50
+ // CommandBuffer
51
+ // ---------------------------------------------------------------------------
52
+ const INITIAL_SIZE = 4096;
53
+ const encoder = new TextEncoder();
54
+ const EMPTY_U8 = new Uint8Array(0);
55
+ export class CommandBuffer {
56
+ buffer;
57
+ view;
58
+ bytes;
59
+ offset = 0;
60
+ constructor() {
61
+ this.buffer = new ArrayBuffer(INITIAL_SIZE);
62
+ this.view = new DataView(this.buffer);
63
+ this.bytes = new Uint8Array(this.buffer);
64
+ }
65
+ // -- Public command methods -----------------------------------------------
66
+ removeNode(nodeId) {
67
+ this.ensureCapacity(5);
68
+ this.writeU8(CMD_REMOVE);
69
+ this.writeU32(nodeId);
70
+ }
71
+ /** Unified set-property for both MDAST and HAST nodes. */
72
+ setProperty(nodeId, key, value) {
73
+ const encodedName = encoder.encode(key);
74
+ let valueType;
75
+ let encodedValue;
76
+ if (value === null || value === undefined) {
77
+ valueType = PROP_NULL;
78
+ encodedValue = EMPTY_U8;
79
+ }
80
+ else if (value === true) {
81
+ valueType = PROP_BOOL_TRUE;
82
+ encodedValue = EMPTY_U8;
83
+ }
84
+ else if (value === false) {
85
+ valueType = PROP_BOOL_FALSE;
86
+ encodedValue = EMPTY_U8;
87
+ }
88
+ else if (typeof value === "number") {
89
+ valueType = PROP_INT;
90
+ encodedValue = encoder.encode(String(value));
91
+ }
92
+ else if (Array.isArray(value)) {
93
+ valueType = PROP_SPACE_SEP;
94
+ encodedValue = encoder.encode(value.join(" "));
95
+ }
96
+ else {
97
+ valueType = PROP_STRING;
98
+ encodedValue = encoder.encode(String(value));
99
+ }
100
+ // 1(cmd) + 4(nodeId) + 1(valueType) + 4(nameLen) + name + 4(valueLen) + value
101
+ this.ensureCapacity(14 + encodedName.length + encodedValue.length);
102
+ this.writeU8(CMD_SET_PROPERTY);
103
+ this.writeU32(nodeId);
104
+ this.writeU8(valueType);
105
+ this.writeU32(encodedName.length);
106
+ this.writeBytes(encodedName);
107
+ this.writeU32(encodedValue.length);
108
+ this.writeBytes(encodedValue);
109
+ }
110
+ insertBefore(nodeId, newNode) {
111
+ this.writeStructuralCommand(CMD_INSERT_BEFORE, nodeId, newNode);
112
+ }
113
+ insertAfter(nodeId, newNode) {
114
+ this.writeStructuralCommand(CMD_INSERT_AFTER, nodeId, newNode);
115
+ }
116
+ prependChild(nodeId, newNode) {
117
+ this.writeStructuralCommand(CMD_PREPEND_CHILD, nodeId, newNode);
118
+ }
119
+ appendChild(nodeId, newNode) {
120
+ this.writeStructuralCommand(CMD_APPEND_CHILD, nodeId, newNode);
121
+ }
122
+ wrapNode(nodeId, parentNode) {
123
+ this.writeStructuralCommand(CMD_WRAP, nodeId, parentNode);
124
+ }
125
+ replace(nodeId, newNode) {
126
+ this.writeStructuralCommand(CMD_REPLACE, nodeId, newNode);
127
+ }
128
+ /** Write a REPLACE command with a pre-serialized JSON payload. */
129
+ replaceRawJson(nodeId, json) {
130
+ this.writeRawJsonCommand(CMD_REPLACE, nodeId, json);
131
+ }
132
+ /** Write any structural command with a pre-serialized JSON payload. */
133
+ insertBeforeRawJson(nodeId, json) {
134
+ this.writeRawJsonCommand(CMD_INSERT_BEFORE, nodeId, json);
135
+ }
136
+ insertAfterRawJson(nodeId, json) {
137
+ this.writeRawJsonCommand(CMD_INSERT_AFTER, nodeId, json);
138
+ }
139
+ prependChildRawJson(nodeId, json) {
140
+ this.writeRawJsonCommand(CMD_PREPEND_CHILD, nodeId, json);
141
+ }
142
+ appendChildRawJson(nodeId, json) {
143
+ this.writeRawJsonCommand(CMD_APPEND_CHILD, nodeId, json);
144
+ }
145
+ wrapNodeRawJson(nodeId, json) {
146
+ this.writeRawJsonCommand(CMD_WRAP, nodeId, json);
147
+ }
148
+ writeRawJsonCommand(cmd, nodeId, json) {
149
+ const encoded = encoder.encode(json);
150
+ this.ensureCapacity(10 + encoded.length);
151
+ this.writeU8(cmd);
152
+ this.writeU32(nodeId);
153
+ this.writeU8(PAYLOAD_SERDE_JSON);
154
+ this.writeU32(encoded.length);
155
+ this.writeBytes(encoded);
156
+ }
157
+ // -- Result accessors -----------------------------------------------------
158
+ /** Return a Uint8Array view of the written bytes (no copy). */
159
+ getBuffer() {
160
+ return new Uint8Array(this.buffer, 0, this.offset);
161
+ }
162
+ /** Number of bytes written so far. */
163
+ get length() {
164
+ return this.offset;
165
+ }
166
+ /** Reset the buffer for reuse, releasing the old ArrayBuffer. */
167
+ reset() {
168
+ this.buffer = new ArrayBuffer(INITIAL_SIZE);
169
+ this.view = new DataView(this.buffer);
170
+ this.bytes = new Uint8Array(this.buffer);
171
+ this.offset = 0;
172
+ }
173
+ // -- Private helpers ------------------------------------------------------
174
+ writeStructuralCommand(cmd, nodeId, node) {
175
+ const v = node;
176
+ if (typeof v.raw === "string") {
177
+ const encoded = encoder.encode(v.raw);
178
+ this.ensureCapacity(10 + encoded.length); // 1(cmd) + 4(nodeId) + 1(payloadType) + 4(len) + payload
179
+ this.writeU8(cmd);
180
+ this.writeU32(nodeId);
181
+ this.writeU8(PAYLOAD_RAW_MARKDOWN);
182
+ this.writeU32(encoded.length);
183
+ this.writeBytes(encoded);
184
+ }
185
+ else if (typeof v.rawHtml === "string") {
186
+ const encoded = encoder.encode(v.rawHtml);
187
+ this.ensureCapacity(10 + encoded.length);
188
+ this.writeU8(cmd);
189
+ this.writeU32(nodeId);
190
+ this.writeU8(PAYLOAD_RAW_HTML);
191
+ this.writeU32(encoded.length);
192
+ this.writeBytes(encoded);
193
+ }
194
+ else {
195
+ // Structured node — serialize as JSON
196
+ const json = JSON.stringify(node);
197
+ const encoded = encoder.encode(json);
198
+ this.ensureCapacity(10 + encoded.length);
199
+ this.writeU8(cmd);
200
+ this.writeU32(nodeId);
201
+ this.writeU8(PAYLOAD_SERDE_JSON);
202
+ this.writeU32(encoded.length);
203
+ this.writeBytes(encoded);
204
+ }
205
+ }
206
+ ensureCapacity(needed) {
207
+ while (this.offset + needed > this.buffer.byteLength) {
208
+ this.grow();
209
+ }
210
+ }
211
+ grow() {
212
+ const newBuffer = new ArrayBuffer(this.buffer.byteLength * 2);
213
+ new Uint8Array(newBuffer).set(this.bytes);
214
+ this.buffer = newBuffer;
215
+ this.view = new DataView(this.buffer);
216
+ this.bytes = new Uint8Array(this.buffer);
217
+ }
218
+ writeU8(val) {
219
+ this.view.setUint8(this.offset, val);
220
+ this.offset += 1;
221
+ }
222
+ writeU32(val) {
223
+ this.view.setUint32(this.offset, val, true);
224
+ this.offset += 4;
225
+ }
226
+ writeBytes(data) {
227
+ this.bytes.set(data, this.offset);
228
+ this.offset += data.length;
229
+ }
230
+ }
231
+ //# sourceMappingURL=command-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-buffer.js","sourceRoot":"","sources":["../src/command-buffer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Top-level compile functions — the primary public API.
3
+ *
4
+ * Both MDAST and HAST arenas stay in Rust memory via opaque handles.
5
+ * Only matched nodes and mutation commands cross the NAPI boundary.
6
+ */
7
+ import type { MdastPluginDefinition, HastPluginDefinition } from "./plugin.js";
8
+ /** Configuration for static subtree collapsing during MDX compilation. */
9
+ export interface OptimizeStaticConfig {
10
+ component: string;
11
+ prop: string;
12
+ wrapPropValue?: boolean;
13
+ ignoreElements?: string[];
14
+ }
15
+ export interface CompileOptions {
16
+ mdastPlugins?: MdastPluginDefinition[];
17
+ hastPlugins?: HastPluginDefinition[];
18
+ optimizeStatic?: OptimizeStaticConfig;
19
+ filename?: string;
20
+ }
21
+ export declare function compileMarkdownToHtml(source: string, options?: CompileOptions): string | Promise<string>;
22
+ export declare function compileMdxToJs(source: string, options?: CompileOptions): string | Promise<string>;
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Top-level compile functions — the primary public API.
3
+ *
4
+ * Both MDAST and HAST arenas stay in Rust memory via opaque handles.
5
+ * Only matched nodes and mutation commands cross the NAPI boundary.
6
+ */
7
+ import { visitHastHandle, resolveSubscriptions } from "./hast/hast-visitor.js";
8
+ import { visitMdastHandle, resolveMdastSubscriptions, } from "./mdast/mdast-visitor.js";
9
+ import { parseToHtml, compileMdx, createHastHandle, createMdxHastHandle, renderHandle, compileHandle, applyCommandsToHandle, dropHandle, createMdastHandle, createMdxMdastHandle, applyCommandsToMdastHandle, convertMdastToHastHandle, applyCommandsAndConvertToHastHandle, getHandleSource, } from "../index.js";
10
+ // ---------------------------------------------------------------------------
11
+ // Helpers
12
+ // ---------------------------------------------------------------------------
13
+ function initPlugins(plugins) {
14
+ return plugins.map((def) => ({
15
+ instance: def.createOnce(),
16
+ name: def.name,
17
+ }));
18
+ }
19
+ function runMdastPluginsOnHandle(handle, plugins, filename) {
20
+ const instances = initPlugins(plugins);
21
+ let pendingCommands = null;
22
+ const source = getHandleSource(handle);
23
+ let i = 0;
24
+ const runNext = () => {
25
+ while (i < instances.length) {
26
+ const idx = i++;
27
+ const { instance } = instances[idx];
28
+ const subs = resolveMdastSubscriptions(instance);
29
+ const result = visitMdastHandle(handle, instance, subs, source, filename);
30
+ if (result instanceof Promise) {
31
+ return result.then((r) => {
32
+ applyMdastResult(r, idx, instances.length, handle);
33
+ return runNext();
34
+ });
35
+ }
36
+ applyMdastResult(result, idx, instances.length, handle);
37
+ }
38
+ return { handle, pendingCommands };
39
+ };
40
+ function applyMdastResult(result, idx, total, h) {
41
+ if (result.hasMutations) {
42
+ if (idx === total - 1) {
43
+ pendingCommands = result.commandBuffer;
44
+ }
45
+ else {
46
+ applyCommandsToMdastHandle(h, result.commandBuffer);
47
+ }
48
+ }
49
+ }
50
+ return runNext();
51
+ }
52
+ // ---------------------------------------------------------------------------
53
+ // HAST plugin runner (handle-based)
54
+ // ---------------------------------------------------------------------------
55
+ function runHastPluginsOnHandle(handle, plugins, source, filename) {
56
+ if (plugins.length === 0)
57
+ return;
58
+ const instances = initPlugins(plugins);
59
+ let i = 0;
60
+ const runNext = () => {
61
+ while (i < instances.length) {
62
+ const { instance } = instances[i];
63
+ i++;
64
+ const subs = resolveSubscriptions(instance);
65
+ const result = visitHastHandle(handle, instance, subs, source, filename);
66
+ if (result instanceof Promise) {
67
+ return result.then(runNext);
68
+ }
69
+ }
70
+ };
71
+ return runNext();
72
+ }
73
+ export function compileMarkdownToHtml(source, options = {}) {
74
+ const { mdastPlugins = [], hastPlugins = [], filename = "<unknown>" } = options;
75
+ if (mdastPlugins.length === 0 && hastPlugins.length === 0) {
76
+ return parseToHtml(source);
77
+ }
78
+ const handleResult = createHastHandleFromMdast(source, mdastPlugins, false, filename);
79
+ const finish = (hastHandle) => {
80
+ const asyncResult = runHastPluginsOnHandle(hastHandle, hastPlugins, source, filename);
81
+ if (asyncResult instanceof Promise) {
82
+ return asyncResult.then(() => {
83
+ const html = renderHandle(hastHandle);
84
+ dropHandle(hastHandle);
85
+ return html;
86
+ });
87
+ }
88
+ const html = renderHandle(hastHandle);
89
+ dropHandle(hastHandle);
90
+ return html;
91
+ };
92
+ if (handleResult instanceof Promise) {
93
+ return handleResult.then(finish);
94
+ }
95
+ return finish(handleResult);
96
+ }
97
+ export function compileMdxToJs(source, options = {}) {
98
+ const { mdastPlugins = [], hastPlugins = [], optimizeStatic, filename = "<unknown>" } = options;
99
+ const mdxOptions = optimizeStatic ? { optimizeStatic } : undefined;
100
+ if (mdastPlugins.length === 0 && hastPlugins.length === 0) {
101
+ return compileMdx(source, mdxOptions);
102
+ }
103
+ const handleResult = createHastHandleFromMdast(source, mdastPlugins, true, filename);
104
+ const finish = (hastHandle) => {
105
+ const asyncResult = runHastPluginsOnHandle(hastHandle, hastPlugins, source, filename);
106
+ if (asyncResult instanceof Promise) {
107
+ return asyncResult.then(() => {
108
+ const js = compileHandle(hastHandle, mdxOptions);
109
+ dropHandle(hastHandle);
110
+ return js;
111
+ });
112
+ }
113
+ const js = compileHandle(hastHandle, mdxOptions);
114
+ dropHandle(hastHandle);
115
+ return js;
116
+ };
117
+ if (handleResult instanceof Promise) {
118
+ return handleResult.then(finish);
119
+ }
120
+ return finish(handleResult);
121
+ }
122
+ // ---------------------------------------------------------------------------
123
+ // Pipeline: parse → mdast plugins → hast conversion → hast plugins
124
+ // All arenas stay in Rust. No intermediate buffer copies to JS.
125
+ // ---------------------------------------------------------------------------
126
+ /** Parse + mdast plugins + convert to HAST handle. */
127
+ function createHastHandleFromMdast(source, mdastPlugins, mdx, filename) {
128
+ if (mdastPlugins.length === 0) {
129
+ return mdx ? createMdxHastHandle(source) : createHastHandle(source);
130
+ }
131
+ const mdastHandle = mdx ? createMdxMdastHandle(source) : createMdastHandle(source);
132
+ const mdastResult = runMdastPluginsOnHandle(mdastHandle, mdastPlugins, filename);
133
+ const convert = (r) => {
134
+ if (r.pendingCommands) {
135
+ return applyCommandsAndConvertToHastHandle(r.handle, r.pendingCommands);
136
+ }
137
+ return convertMdastToHastHandle(r.handle);
138
+ };
139
+ if (mdastResult instanceof Promise) {
140
+ return mdastResult.then(convert);
141
+ }
142
+ return convert(mdastResult);
143
+ }
144
+ //# sourceMappingURL=compile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare class DataMap {
2
+ #private;
3
+ get(nodeId: number): Record<string, unknown> | null;
4
+ set(nodeId: number, value: Record<string, unknown>): void;
5
+ merge(nodeId: number, value: Record<string, unknown>): void;
6
+ has(nodeId: number): boolean;
7
+ delete(nodeId: number): void;
8
+ clear(): void;
9
+ get size(): number;
10
+ }
@@ -0,0 +1,26 @@
1
+ export class DataMap {
2
+ #map = new Map();
3
+ get(nodeId) {
4
+ return this.#map.get(nodeId) ?? null;
5
+ }
6
+ set(nodeId, value) {
7
+ this.#map.set(nodeId, value);
8
+ }
9
+ merge(nodeId, value) {
10
+ const existing = this.#map.get(nodeId);
11
+ this.#map.set(nodeId, existing ? { ...existing, ...value } : { ...value });
12
+ }
13
+ has(nodeId) {
14
+ return this.#map.has(nodeId);
15
+ }
16
+ delete(nodeId) {
17
+ this.#map.delete(nodeId);
18
+ }
19
+ clear() {
20
+ this.#map.clear();
21
+ }
22
+ get size() {
23
+ return this.#map.size;
24
+ }
25
+ }
26
+ //# sourceMappingURL=data-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-map.js","sourceRoot":"","sources":["../src/data-map.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,OAAO;IACT,IAAI,GAAG,IAAI,GAAG,EAAmC,CAAC;IAE3D,GAAG,CAAC,MAAc;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IACvC,CAAC;IAED,GAAG,CAAC,MAAc,EAAE,KAA8B;QAChD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,MAAc,EAAE,KAA8B;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,GAAG,CAAC,MAAc;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,MAAc;QACnB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import { HastReader } from "./hast-reader.js";
2
+ import type { HastNode } from "../types.js";
3
+ export type { HastNode };
4
+ /**
5
+ * Materialize a single HAST node from a binary buffer as a lazy JS object.
6
+ */
7
+ export declare function materializeHastNode(reader: HastReader, nodeId: number): HastNode;
8
+ /**
9
+ * Materialize the full HAST tree from root (nodeId=0).
10
+ */
11
+ export declare function materializeHastTree(reader: HastReader): HastNode;