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
@@ -0,0 +1,150 @@
1
+ import { HastReader, HAST_ROOT, HAST_ELEMENT, HAST_TEXT, HAST_COMMENT, HAST_DOCTYPE, HAST_RAW, HAST_MDX_JSX_ELEMENT, HAST_MDX_JSX_TEXT_ELEMENT, HAST_MDX_FLOW_EXPRESSION, HAST_MDX_TEXT_EXPRESSION, HAST_MDX_ESM, } from "./hast-reader.js";
2
+ import { lazyProp, lazyGroup } from "../lazy-props.js";
3
+ function propsToRecord(props) {
4
+ const result = {};
5
+ for (const p of props) {
6
+ result[p.name] = p.value;
7
+ }
8
+ return result;
9
+ }
10
+ /**
11
+ * Materialize a single HAST node from a binary buffer as a lazy JS object.
12
+ */
13
+ export function materializeHastNode(reader, nodeId) {
14
+ const nodeType = reader.getNodeType(nodeId);
15
+ let typeName;
16
+ switch (nodeType) {
17
+ case HAST_ROOT:
18
+ typeName = "root";
19
+ break;
20
+ case HAST_ELEMENT:
21
+ typeName = "element";
22
+ break;
23
+ case HAST_TEXT:
24
+ typeName = "text";
25
+ break;
26
+ case HAST_COMMENT:
27
+ typeName = "comment";
28
+ break;
29
+ case HAST_DOCTYPE:
30
+ typeName = "doctype";
31
+ break;
32
+ case HAST_RAW:
33
+ typeName = "raw";
34
+ break;
35
+ case HAST_MDX_JSX_ELEMENT:
36
+ typeName = "mdxJsxFlowElement";
37
+ break;
38
+ case HAST_MDX_JSX_TEXT_ELEMENT:
39
+ typeName = "mdxJsxTextElement";
40
+ break;
41
+ case HAST_MDX_FLOW_EXPRESSION:
42
+ typeName = "mdxFlowExpression";
43
+ break;
44
+ case HAST_MDX_TEXT_EXPRESSION:
45
+ typeName = "mdxTextExpression";
46
+ break;
47
+ case HAST_MDX_ESM:
48
+ typeName = "mdxjsEsm";
49
+ break;
50
+ default:
51
+ typeName = `unknown(${nodeType})`;
52
+ break;
53
+ }
54
+ const node = { type: typeName };
55
+ // _nodeId: non-enumerable internal reference
56
+ Object.defineProperty(node, "_nodeId", {
57
+ value: nodeId,
58
+ writable: false,
59
+ configurable: true,
60
+ enumerable: false,
61
+ });
62
+ switch (nodeType) {
63
+ case HAST_ROOT:
64
+ // children: lazy getter
65
+ Object.defineProperty(node, "children", {
66
+ get() {
67
+ const childIds = reader.getChildIds(nodeId);
68
+ const children = childIds.map((id) => materializeHastNode(reader, id));
69
+ Object.defineProperty(this, "children", {
70
+ value: children,
71
+ writable: true,
72
+ configurable: true,
73
+ enumerable: true,
74
+ });
75
+ return children;
76
+ },
77
+ configurable: true,
78
+ enumerable: true,
79
+ });
80
+ break;
81
+ case HAST_ELEMENT: {
82
+ // tagName and properties: lazy, resolved together from one reader call
83
+ lazyGroup(node, ["tagName", "properties"], () => {
84
+ const { tagName, properties } = reader.getElementData(nodeId);
85
+ return { tagName, properties: propsToRecord(properties) };
86
+ });
87
+ // children: lazy
88
+ Object.defineProperty(node, "children", {
89
+ get() {
90
+ const childIds = reader.getChildIds(nodeId);
91
+ const children = childIds.map((id) => materializeHastNode(reader, id));
92
+ Object.defineProperty(this, "children", {
93
+ value: children,
94
+ writable: true,
95
+ configurable: true,
96
+ enumerable: true,
97
+ });
98
+ return children;
99
+ },
100
+ configurable: true,
101
+ enumerable: true,
102
+ });
103
+ break;
104
+ }
105
+ case HAST_TEXT:
106
+ case HAST_COMMENT:
107
+ case HAST_RAW:
108
+ Object.defineProperties(node, {
109
+ value: lazyProp("value", () => reader.getTextValue(nodeId)),
110
+ });
111
+ break;
112
+ case HAST_DOCTYPE:
113
+ // No extra properties
114
+ break;
115
+ case HAST_MDX_JSX_ELEMENT:
116
+ case HAST_MDX_JSX_TEXT_ELEMENT:
117
+ lazyGroup(node, ["name", "attributes"], () => reader.getMdxJsxElementData(nodeId));
118
+ Object.defineProperty(node, "children", {
119
+ get() {
120
+ const childIds = reader.getChildIds(nodeId);
121
+ const children = childIds.map((id) => materializeHastNode(reader, id));
122
+ Object.defineProperty(this, "children", {
123
+ value: children,
124
+ writable: true,
125
+ configurable: true,
126
+ enumerable: true,
127
+ });
128
+ return children;
129
+ },
130
+ configurable: true,
131
+ enumerable: true,
132
+ });
133
+ break;
134
+ case HAST_MDX_FLOW_EXPRESSION:
135
+ case HAST_MDX_TEXT_EXPRESSION:
136
+ case HAST_MDX_ESM:
137
+ Object.defineProperties(node, {
138
+ value: lazyProp("value", () => reader.getTextValue(nodeId)),
139
+ });
140
+ break;
141
+ }
142
+ return node;
143
+ }
144
+ /**
145
+ * Materialize the full HAST tree from root (nodeId=0).
146
+ */
147
+ export function materializeHastTree(reader) {
148
+ return materializeHastNode(reader, 0);
149
+ }
150
+ //# sourceMappingURL=hast-materializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hast-materializer.js","sourceRoot":"","sources":["../../src/hast/hast-materializer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import type { BufferHeader } from "../types.js";
2
+ import type { MdxJsxAttribute, MdxJsxExpressionAttribute } from "mdast-util-mdx-jsx";
3
+ export type { MdxJsxAttribute, MdxJsxExpressionAttribute };
4
+ export declare const HAST_ROOT = 0;
5
+ export declare const HAST_ELEMENT = 1;
6
+ export declare const HAST_TEXT = 2;
7
+ export declare const HAST_COMMENT = 3;
8
+ export declare const HAST_DOCTYPE = 4;
9
+ export declare const HAST_RAW = 5;
10
+ export declare const HAST_MDX_JSX_ELEMENT = 10;
11
+ export declare const HAST_MDX_JSX_TEXT_ELEMENT = 11;
12
+ export declare const HAST_MDX_FLOW_EXPRESSION = 12;
13
+ export declare const HAST_MDX_ESM = 13;
14
+ export declare const HAST_MDX_TEXT_EXPRESSION = 14;
15
+ export interface HastProperty {
16
+ name: string;
17
+ value: string | boolean | string[];
18
+ }
19
+ export declare class HastReader {
20
+ #private;
21
+ constructor(buffer: ArrayBuffer | Uint8Array);
22
+ get nodeCount(): number;
23
+ get header(): BufferHeader;
24
+ /** Get the full source string (string pool). */
25
+ getSource(): string;
26
+ /** Read a substring from the string pool by byte offset and length. */
27
+ getString(offset: number, len: number): string;
28
+ /** Get the node_type byte for a given node ID. */
29
+ getNodeType(nodeId: number): number;
30
+ /** Get child node IDs for a given node. */
31
+ getChildIds(nodeId: number): number[];
32
+ /** Push child node IDs directly onto a stack array (reverse order for depth-first). */
33
+ pushChildIds(nodeId: number, stack: number[]): void;
34
+ /** Get the raw type_data bytes for a node. */
35
+ getTypeData(nodeId: number): Uint8Array;
36
+ /**
37
+ * Get element data for a HAST_ELEMENT node.
38
+ *
39
+ * Element type_data layout:
40
+ * [tag_name: StringRef(8B)][prop_count: u32(4B)][_pad: u32(4B)] = 16-byte header
41
+ * then prop_count * 20 bytes:
42
+ * [name: StringRef(8B)][value_type: u8(1B)][_pad: [u8;3](3B)][value: StringRef(8B)]
43
+ */
44
+ getElementData(nodeId: number): {
45
+ tagName: string;
46
+ properties: HastProperty[];
47
+ };
48
+ /**
49
+ * Get MDX JSX element data: name and attributes.
50
+ *
51
+ * MDX JSX element type_data layout:
52
+ * [name: StringRef(8B)][attr_count: u32(4B)][_pad: u32(4B)] = 16-byte header
53
+ * then attr_count * 20 bytes:
54
+ * [kind: u8(1B)][_pad: [u8;3](3B)][name: StringRef(8B)][value: StringRef(8B)]
55
+ */
56
+ getMdxJsxElementData(nodeId: number): {
57
+ name: string | null;
58
+ attributes: (MdxJsxAttribute | MdxJsxExpressionAttribute)[];
59
+ };
60
+ /**
61
+ * Get the string value for HAST_TEXT, HAST_COMMENT, or HAST_RAW nodes.
62
+ * These store a single StringRef (8 bytes) as their type_data.
63
+ */
64
+ getTextValue(nodeId: number): string;
65
+ }
@@ -0,0 +1,280 @@
1
+ // HAST node type constants (must match node_types.rs)
2
+ export const HAST_ROOT = 0;
3
+ export const HAST_ELEMENT = 1;
4
+ export const HAST_TEXT = 2;
5
+ export const HAST_COMMENT = 3;
6
+ export const HAST_DOCTYPE = 4;
7
+ export const HAST_RAW = 5;
8
+ // MDX-specific HAST node types
9
+ export const HAST_MDX_JSX_ELEMENT = 10;
10
+ export const HAST_MDX_JSX_TEXT_ELEMENT = 11;
11
+ export const HAST_MDX_FLOW_EXPRESSION = 12;
12
+ export const HAST_MDX_ESM = 13;
13
+ export const HAST_MDX_TEXT_EXPRESSION = 14;
14
+ const PROP_STRING = 0;
15
+ const PROP_BOOL_TRUE = 1;
16
+ const PROP_BOOL_FALSE = 2;
17
+ const PROP_SPACE_SEP = 3;
18
+ const PROP_COMMA_SEP = 4;
19
+ // MDX JSX attribute kinds (must match node_types.rs)
20
+ const MDX_ATTR_BOOLEAN_PROP = 0;
21
+ const MDX_ATTR_LITERAL_PROP = 1;
22
+ const MDX_ATTR_EXPRESSION_PROP = 2;
23
+ const MDX_ATTR_SPREAD = 3;
24
+ // HastNode field offsets (same layout as MDAST — shared binary format)
25
+ // id: u32 @ 0
26
+ // node_type: u8 @ 4
27
+ // _pad: [u8; 3] @ 5
28
+ // parent: u32 @ 8
29
+ // ...
30
+ // children_start: u32 @ 36
31
+ // children_count: u32 @ 40
32
+ // data_offset: u32 @ 44
33
+ // data_len: u32 @ 48
34
+ // Total: 52 bytes
35
+ const FIELD = {
36
+ node_type: 4,
37
+ children_start: 36,
38
+ children_count: 40,
39
+ data_offset: 44,
40
+ data_len: 48,
41
+ };
42
+ // "MDAR" bytes: 4d 44 41 52; read as LE u32 = 0x5241444d
43
+ const MAGIC = 0x5241444d;
44
+ export class HastReader {
45
+ #view;
46
+ #header;
47
+ #textDecoder;
48
+ #sourceCache = null;
49
+ constructor(buffer) {
50
+ if (buffer instanceof Uint8Array) {
51
+ this.#view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
52
+ }
53
+ else {
54
+ this.#view = new DataView(buffer);
55
+ }
56
+ this.#textDecoder = new TextDecoder("utf-8");
57
+ this.#header = this.#readHeader();
58
+ }
59
+ #readHeader() {
60
+ const v = this.#view;
61
+ const magic = v.getUint32(0, true);
62
+ if (magic !== MAGIC) {
63
+ throw new Error(`Invalid HAST buffer: bad magic 0x${magic.toString(16)}`);
64
+ }
65
+ const version = v.getUint32(4, true);
66
+ if (version !== 1) {
67
+ throw new Error(`Unsupported HAST buffer version: ${version}`);
68
+ }
69
+ return {
70
+ version,
71
+ nodeStructSize: v.getUint32(8, true),
72
+ nodeCount: v.getUint32(12, true),
73
+ nodesOffset: v.getUint32(16, true),
74
+ childrenCount: v.getUint32(20, true),
75
+ childrenOffset: v.getUint32(24, true),
76
+ typeDataLen: v.getUint32(28, true),
77
+ typeDataOffset: v.getUint32(32, true),
78
+ sourceLen: v.getUint32(36, true),
79
+ sourceOffset: v.getUint32(40, true),
80
+ };
81
+ }
82
+ get nodeCount() {
83
+ return this.#header.nodeCount;
84
+ }
85
+ get header() {
86
+ return { ...this.#header };
87
+ }
88
+ /** Get the full source string (string pool). */
89
+ getSource() {
90
+ if (this.#sourceCache === null) {
91
+ const { sourceOffset, sourceLen } = this.#header;
92
+ const bytes = new Uint8Array(this.#view.buffer, this.#view.byteOffset + sourceOffset, sourceLen);
93
+ this.#sourceCache = this.#textDecoder.decode(bytes);
94
+ }
95
+ return this.#sourceCache;
96
+ }
97
+ /** Read a substring from the string pool by byte offset and length. */
98
+ getString(offset, len) {
99
+ if (len === 0)
100
+ return "";
101
+ const { sourceOffset } = this.#header;
102
+ const bytes = new Uint8Array(this.#view.buffer, this.#view.byteOffset + sourceOffset + offset, len);
103
+ return this.#textDecoder.decode(bytes);
104
+ }
105
+ /** Get the node_type byte for a given node ID. */
106
+ getNodeType(nodeId) {
107
+ const { nodesOffset, nodeStructSize } = this.#header;
108
+ return this.#view.getUint8(nodesOffset + nodeId * nodeStructSize + FIELD.node_type);
109
+ }
110
+ /** Get child node IDs for a given node. */
111
+ getChildIds(nodeId) {
112
+ const base = this.#header.nodesOffset + nodeId * this.#header.nodeStructSize;
113
+ const v = this.#view;
114
+ const childrenStart = v.getUint32(base + FIELD.children_start, true);
115
+ const childrenCount = v.getUint32(base + FIELD.children_count, true);
116
+ if (childrenCount === 0)
117
+ return [];
118
+ const { childrenOffset } = this.#header;
119
+ const ids = [];
120
+ for (let i = 0; i < childrenCount; i++) {
121
+ ids.push(v.getUint32(childrenOffset + (childrenStart + i) * 4, true));
122
+ }
123
+ return ids;
124
+ }
125
+ /** Push child node IDs directly onto a stack array (reverse order for depth-first). */
126
+ pushChildIds(nodeId, stack) {
127
+ const base = this.#header.nodesOffset + nodeId * this.#header.nodeStructSize;
128
+ const v = this.#view;
129
+ const childrenStart = v.getUint32(base + FIELD.children_start, true);
130
+ const childrenCount = v.getUint32(base + FIELD.children_count, true);
131
+ if (childrenCount === 0)
132
+ return;
133
+ const { childrenOffset } = this.#header;
134
+ for (let i = childrenCount - 1; i >= 0; i--) {
135
+ stack.push(v.getUint32(childrenOffset + (childrenStart + i) * 4, true));
136
+ }
137
+ }
138
+ /** Get the raw type_data bytes for a node. */
139
+ getTypeData(nodeId) {
140
+ const base = this.#header.nodesOffset + nodeId * this.#header.nodeStructSize;
141
+ const v = this.#view;
142
+ const dataOffset = v.getUint32(base + FIELD.data_offset, true);
143
+ const dataLen = v.getUint32(base + FIELD.data_len, true);
144
+ if (dataLen === 0)
145
+ return new Uint8Array(0);
146
+ return new Uint8Array(this.#view.buffer, this.#view.byteOffset + this.#header.typeDataOffset + dataOffset, dataLen);
147
+ }
148
+ /** Read a StringRef (offset: u32 LE, len: u32 LE) from a byte array at byteOffset. */
149
+ #readStringRef(data, byteOffset) {
150
+ const view = new DataView(data.buffer, data.byteOffset + byteOffset);
151
+ return {
152
+ offset: view.getUint32(0, true),
153
+ len: view.getUint32(4, true),
154
+ };
155
+ }
156
+ /**
157
+ * Get element data for a HAST_ELEMENT node.
158
+ *
159
+ * Element type_data layout:
160
+ * [tag_name: StringRef(8B)][prop_count: u32(4B)][_pad: u32(4B)] = 16-byte header
161
+ * then prop_count * 20 bytes:
162
+ * [name: StringRef(8B)][value_type: u8(1B)][_pad: [u8;3](3B)][value: StringRef(8B)]
163
+ */
164
+ getElementData(nodeId) {
165
+ const data = this.getTypeData(nodeId);
166
+ if (data.length < 16) {
167
+ return { tagName: "", properties: [] };
168
+ }
169
+ const tagRef = this.#readStringRef(data, 0);
170
+ const tagName = this.getString(tagRef.offset, tagRef.len);
171
+ const view = new DataView(data.buffer, data.byteOffset + 8);
172
+ const propCount = view.getUint32(0, true);
173
+ const properties = [];
174
+ for (let i = 0; i < propCount; i++) {
175
+ const base = 16 + i * 20;
176
+ const nameRef = this.#readStringRef(data, base);
177
+ const name = this.getString(nameRef.offset, nameRef.len);
178
+ const valueType = data[base + 8];
179
+ const valueRef = this.#readStringRef(data, base + 12);
180
+ switch (valueType) {
181
+ case PROP_BOOL_TRUE:
182
+ properties.push({ name, value: true });
183
+ break;
184
+ case PROP_BOOL_FALSE:
185
+ // skip false booleans
186
+ break;
187
+ case PROP_STRING:
188
+ properties.push({ name, value: this.getString(valueRef.offset, valueRef.len) });
189
+ break;
190
+ case PROP_SPACE_SEP: {
191
+ const raw = this.getString(valueRef.offset, valueRef.len);
192
+ properties.push({ name, value: raw.split(" ").filter((s) => s.length > 0) });
193
+ break;
194
+ }
195
+ case PROP_COMMA_SEP: {
196
+ const raw = this.getString(valueRef.offset, valueRef.len);
197
+ properties.push({
198
+ name,
199
+ value: raw
200
+ .split(",")
201
+ .map((s) => s.trim())
202
+ .filter((s) => s.length > 0),
203
+ });
204
+ break;
205
+ }
206
+ }
207
+ }
208
+ return { tagName, properties };
209
+ }
210
+ /**
211
+ * Get MDX JSX element data: name and attributes.
212
+ *
213
+ * MDX JSX element type_data layout:
214
+ * [name: StringRef(8B)][attr_count: u32(4B)][_pad: u32(4B)] = 16-byte header
215
+ * then attr_count * 20 bytes:
216
+ * [kind: u8(1B)][_pad: [u8;3](3B)][name: StringRef(8B)][value: StringRef(8B)]
217
+ */
218
+ getMdxJsxElementData(nodeId) {
219
+ const data = this.getTypeData(nodeId);
220
+ if (data.length < 16) {
221
+ return { name: null, attributes: [] };
222
+ }
223
+ const nameRef = this.#readStringRef(data, 0);
224
+ const name = nameRef.len > 0 ? this.getString(nameRef.offset, nameRef.len) : null;
225
+ const view = new DataView(data.buffer, data.byteOffset + 8);
226
+ const attrCount = view.getUint32(0, true);
227
+ const attributes = [];
228
+ for (let i = 0; i < attrCount; i++) {
229
+ const base = 16 + i * 20;
230
+ const kind = data[base];
231
+ const attrNameRef = this.#readStringRef(data, base + 4);
232
+ const attrValueRef = this.#readStringRef(data, base + 12);
233
+ switch (kind) {
234
+ case MDX_ATTR_BOOLEAN_PROP:
235
+ attributes.push({
236
+ type: "mdxJsxAttribute",
237
+ name: this.getString(attrNameRef.offset, attrNameRef.len),
238
+ value: null,
239
+ });
240
+ break;
241
+ case MDX_ATTR_LITERAL_PROP:
242
+ attributes.push({
243
+ type: "mdxJsxAttribute",
244
+ name: this.getString(attrNameRef.offset, attrNameRef.len),
245
+ value: this.getString(attrValueRef.offset, attrValueRef.len),
246
+ });
247
+ break;
248
+ case MDX_ATTR_EXPRESSION_PROP:
249
+ attributes.push({
250
+ type: "mdxJsxAttribute",
251
+ name: this.getString(attrNameRef.offset, attrNameRef.len),
252
+ value: {
253
+ type: "mdxJsxAttributeValueExpression",
254
+ value: this.getString(attrValueRef.offset, attrValueRef.len),
255
+ },
256
+ });
257
+ break;
258
+ case MDX_ATTR_SPREAD:
259
+ attributes.push({
260
+ type: "mdxJsxExpressionAttribute",
261
+ value: this.getString(attrValueRef.offset, attrValueRef.len),
262
+ });
263
+ break;
264
+ }
265
+ }
266
+ return { name, attributes };
267
+ }
268
+ /**
269
+ * Get the string value for HAST_TEXT, HAST_COMMENT, or HAST_RAW nodes.
270
+ * These store a single StringRef (8 bytes) as their type_data.
271
+ */
272
+ getTextValue(nodeId) {
273
+ const data = this.getTypeData(nodeId);
274
+ if (data.length < 8)
275
+ return "";
276
+ const ref = this.#readStringRef(data, 0);
277
+ return this.getString(ref.offset, ref.len);
278
+ }
279
+ }
280
+ //# sourceMappingURL=hast-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hast-reader.js","sourceRoot":"","sources":["../../src/hast/hast-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import { type HastNode } from "./hast-materializer.js";
2
+ import type { HastRaw } from "../types.js";
3
+ import type { Element, Text, Comment, Doctype } from "hast";
4
+ import type { MdxJsxFlowElementHast, MdxJsxTextElementHast } from "mdast-util-mdx-jsx";
5
+ import type { MdxFlowExpressionHast, MdxTextExpressionHast } from "mdast-util-mdx-expression";
6
+ import type { MdxjsEsmHast } from "mdast-util-mdxjs-esm";
7
+ export type HastHandle = any;
8
+ /** ESTree-compatible Program node returned by `parseExpression()`. */
9
+ export type EstreeProgram = Record<string, any>;
10
+ export interface HastDiagnostic {
11
+ message: string;
12
+ nodeId?: number | undefined;
13
+ severity: "error" | "warning" | "info";
14
+ }
15
+ export interface HastVisitorContext {
16
+ readonly source: string;
17
+ readonly filename: string;
18
+ removeNode(node: HastNode): void;
19
+ replaceNode(node: HastNode, newNode: HastNode): void;
20
+ insertBefore(node: HastNode, newNode: HastNode): void;
21
+ insertAfter(node: HastNode, newNode: HastNode): void;
22
+ wrapNode(node: HastNode, parentNode: HastNode): void;
23
+ prependChild(node: HastNode, childNode: HastNode): void;
24
+ appendChild(node: HastNode, childNode: HastNode): void;
25
+ setProperty(node: HastNode, key: string, value: unknown): void;
26
+ /** Collect the concatenated text of all descendant text nodes (like DOM textContent). */
27
+ textContent(node: HastNode): string;
28
+ report(opts: {
29
+ message: string;
30
+ node?: HastNode;
31
+ severity?: "error" | "warning" | "info";
32
+ }): void;
33
+ getDiagnostics(): HastDiagnostic[];
34
+ }
35
+ /** A filtered visitor: Rust filters by tag/component name, only matched nodes cross the boundary. */
36
+ export interface HastFilteredVisitor<N extends HastNode = HastNode> {
37
+ filter: string[];
38
+ visit(node: N, ctx: HastVisitorContext): HastNode | void | Promise<HastNode | void>;
39
+ }
40
+ type HastVisitorFn<N extends HastNode = HastNode> = (node: N, ctx: HastVisitorContext) => HastNode | void | Promise<HastNode | void>;
41
+ export interface HastVisitorInstance {
42
+ element?: HastFilteredVisitor<Element> | HastFilteredVisitor<Element>[];
43
+ mdxJsxFlowElement?: HastFilteredVisitor<MdxJsxFlowElementHast> | HastFilteredVisitor<MdxJsxFlowElementHast>[];
44
+ mdxJsxTextElement?: HastFilteredVisitor<MdxJsxTextElementHast> | HastFilteredVisitor<MdxJsxTextElementHast>[];
45
+ text?: HastVisitorFn<Text>;
46
+ comment?: HastVisitorFn<Comment>;
47
+ raw?: HastVisitorFn<HastRaw>;
48
+ doctype?: HastVisitorFn<Doctype>;
49
+ mdxFlowExpression?: HastVisitorFn<MdxFlowExpressionHast & {
50
+ parseExpression(): EstreeProgram | null;
51
+ }>;
52
+ mdxTextExpression?: HastVisitorFn<MdxTextExpressionHast & {
53
+ parseExpression(): EstreeProgram | null;
54
+ }>;
55
+ mdxjsEsm?: HastVisitorFn<MdxjsEsmHast>;
56
+ }
57
+ interface ResolvedSubscription {
58
+ nodeType: number;
59
+ tagFilter: string[];
60
+ visitFn: (node: HastNode, ctx: HastVisitorContext) => HastNode | void;
61
+ }
62
+ /** Resolve subscriptions from a plugin instance. */
63
+ export declare function resolveSubscriptions(plugin: HastVisitorInstance): ResolvedSubscription[];
64
+ /**
65
+ * Walk a handle's arena in Rust, dispatch matched nodes to JS visitor functions,
66
+ * and apply mutations back to the handle. No arena buffers cross NAPI.
67
+ *
68
+ * Returns void if all visitors are sync, or a Promise if any visitor is async.
69
+ */
70
+ export declare function visitHastHandle(handle: HastHandle, plugin: HastVisitorInstance, subs: ResolvedSubscription[], source: string, filename: string): void | Promise<void>;
71
+ export {};