@mdocui/core 0.1.4 → 0.2.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.
package/dist/index.cjs CHANGED
@@ -31,126 +31,6 @@ __export(index_exports, {
31
31
  });
32
32
  module.exports = __toCommonJS(index_exports);
33
33
 
34
- // src/tokenizer.ts
35
- var TokenizerState = /* @__PURE__ */ ((TokenizerState2) => {
36
- TokenizerState2["IN_PROSE"] = "IN_PROSE";
37
- TokenizerState2["IN_TAG"] = "IN_TAG";
38
- TokenizerState2["IN_STRING"] = "IN_STRING";
39
- return TokenizerState2;
40
- })(TokenizerState || {});
41
- var TokenType = /* @__PURE__ */ ((TokenType2) => {
42
- TokenType2["PROSE"] = "PROSE";
43
- TokenType2["TAG_OPEN"] = "TAG_OPEN";
44
- TokenType2["TAG_SELF_CLOSE"] = "TAG_SELF_CLOSE";
45
- TokenType2["TAG_CLOSE"] = "TAG_CLOSE";
46
- return TokenType2;
47
- })(TokenType || {});
48
- var Tokenizer = class {
49
- state = "IN_PROSE" /* IN_PROSE */;
50
- buffer = "";
51
- proseBuffer = "";
52
- stringChar = null;
53
- escaped = false;
54
- tokens = [];
55
- getState() {
56
- return this.state;
57
- }
58
- getBuffer() {
59
- return this.buffer;
60
- }
61
- write(chunk) {
62
- this.tokens = [];
63
- for (let i = 0; i < chunk.length; i++) {
64
- const char = chunk[i];
65
- const next = chunk[i + 1];
66
- switch (this.state) {
67
- case "IN_PROSE" /* IN_PROSE */:
68
- if (char === "{" && next === "%") {
69
- this.flushProse();
70
- this.buffer = "{%";
71
- this.state = "IN_TAG" /* IN_TAG */;
72
- i++;
73
- } else {
74
- this.proseBuffer += char;
75
- }
76
- break;
77
- case "IN_TAG" /* IN_TAG */:
78
- this.buffer += char;
79
- if (char === '"' || char === "'") {
80
- this.stringChar = char;
81
- this.escaped = false;
82
- this.state = "IN_STRING" /* IN_STRING */;
83
- } else if (char === "%" && next === "}") {
84
- this.buffer += "}";
85
- i++;
86
- this.emitTag();
87
- this.state = "IN_PROSE" /* IN_PROSE */;
88
- }
89
- break;
90
- case "IN_STRING" /* IN_STRING */:
91
- this.buffer += char;
92
- if (this.escaped) {
93
- this.escaped = false;
94
- } else if (char === "\\") {
95
- this.escaped = true;
96
- } else if (char === this.stringChar) {
97
- this.stringChar = null;
98
- this.state = "IN_TAG" /* IN_TAG */;
99
- }
100
- break;
101
- }
102
- }
103
- if (this.state === "IN_PROSE" /* IN_PROSE */) {
104
- this.flushProse();
105
- }
106
- return this.tokens;
107
- }
108
- flush() {
109
- this.tokens = [];
110
- if (this.state === "IN_TAG" /* IN_TAG */ || this.state === "IN_STRING" /* IN_STRING */) {
111
- this.proseBuffer += this.buffer;
112
- this.buffer = "";
113
- this.state = "IN_PROSE" /* IN_PROSE */;
114
- }
115
- this.flushProse();
116
- return this.tokens;
117
- }
118
- reset() {
119
- this.state = "IN_PROSE" /* IN_PROSE */;
120
- this.buffer = "";
121
- this.proseBuffer = "";
122
- this.stringChar = null;
123
- this.escaped = false;
124
- this.tokens = [];
125
- }
126
- flushProse() {
127
- if (this.proseBuffer.length > 0) {
128
- this.tokens.push({ type: "PROSE" /* PROSE */, raw: this.proseBuffer });
129
- this.proseBuffer = "";
130
- }
131
- }
132
- emitTag() {
133
- const raw = this.buffer;
134
- this.buffer = "";
135
- const inner = raw.slice(2, -2).trim();
136
- if (inner.length === 0) return;
137
- if (inner.startsWith("/")) {
138
- this.tokens.push({ type: "TAG_CLOSE" /* TAG_CLOSE */, raw, name: inner.slice(1).trim() });
139
- return;
140
- }
141
- const selfClosing = inner.endsWith("/");
142
- const content = selfClosing ? inner.slice(0, -1).trim() : inner;
143
- const spaceIdx = content.indexOf(" ");
144
- this.tokens.push({
145
- type: selfClosing ? "TAG_SELF_CLOSE" /* TAG_SELF_CLOSE */ : "TAG_OPEN" /* TAG_OPEN */,
146
- raw,
147
- name: spaceIdx === -1 ? content : content.slice(0, spaceIdx),
148
- attrs: spaceIdx === -1 ? "" : content.slice(spaceIdx + 1).trim(),
149
- selfClosing
150
- });
151
- }
152
- };
153
-
154
34
  // src/attributes.ts
155
35
  var UNSAFE_KEYS = /* @__PURE__ */ new Set(["__proto__", "constructor", "prototype"]);
156
36
  function parseAttributes(input) {
@@ -278,6 +158,126 @@ function coerce(raw) {
278
158
  return raw;
279
159
  }
280
160
 
161
+ // src/tokenizer.ts
162
+ var TokenizerState = /* @__PURE__ */ ((TokenizerState2) => {
163
+ TokenizerState2["IN_PROSE"] = "IN_PROSE";
164
+ TokenizerState2["IN_TAG"] = "IN_TAG";
165
+ TokenizerState2["IN_STRING"] = "IN_STRING";
166
+ return TokenizerState2;
167
+ })(TokenizerState || {});
168
+ var TokenType = /* @__PURE__ */ ((TokenType2) => {
169
+ TokenType2["PROSE"] = "PROSE";
170
+ TokenType2["TAG_OPEN"] = "TAG_OPEN";
171
+ TokenType2["TAG_SELF_CLOSE"] = "TAG_SELF_CLOSE";
172
+ TokenType2["TAG_CLOSE"] = "TAG_CLOSE";
173
+ return TokenType2;
174
+ })(TokenType || {});
175
+ var Tokenizer = class {
176
+ state = "IN_PROSE" /* IN_PROSE */;
177
+ buffer = "";
178
+ proseBuffer = "";
179
+ stringChar = null;
180
+ escaped = false;
181
+ tokens = [];
182
+ getState() {
183
+ return this.state;
184
+ }
185
+ getBuffer() {
186
+ return this.buffer;
187
+ }
188
+ write(chunk) {
189
+ this.tokens = [];
190
+ for (let i = 0; i < chunk.length; i++) {
191
+ const char = chunk[i];
192
+ const next = chunk[i + 1];
193
+ switch (this.state) {
194
+ case "IN_PROSE" /* IN_PROSE */:
195
+ if (char === "{" && next === "%") {
196
+ this.flushProse();
197
+ this.buffer = "{%";
198
+ this.state = "IN_TAG" /* IN_TAG */;
199
+ i++;
200
+ } else {
201
+ this.proseBuffer += char;
202
+ }
203
+ break;
204
+ case "IN_TAG" /* IN_TAG */:
205
+ this.buffer += char;
206
+ if (char === '"' || char === "'") {
207
+ this.stringChar = char;
208
+ this.escaped = false;
209
+ this.state = "IN_STRING" /* IN_STRING */;
210
+ } else if (char === "%" && next === "}") {
211
+ this.buffer += "}";
212
+ i++;
213
+ this.emitTag();
214
+ this.state = "IN_PROSE" /* IN_PROSE */;
215
+ }
216
+ break;
217
+ case "IN_STRING" /* IN_STRING */:
218
+ this.buffer += char;
219
+ if (this.escaped) {
220
+ this.escaped = false;
221
+ } else if (char === "\\") {
222
+ this.escaped = true;
223
+ } else if (char === this.stringChar) {
224
+ this.stringChar = null;
225
+ this.state = "IN_TAG" /* IN_TAG */;
226
+ }
227
+ break;
228
+ }
229
+ }
230
+ if (this.state === "IN_PROSE" /* IN_PROSE */) {
231
+ this.flushProse();
232
+ }
233
+ return this.tokens;
234
+ }
235
+ flush() {
236
+ this.tokens = [];
237
+ if (this.state === "IN_TAG" /* IN_TAG */ || this.state === "IN_STRING" /* IN_STRING */) {
238
+ this.proseBuffer += this.buffer;
239
+ this.buffer = "";
240
+ this.state = "IN_PROSE" /* IN_PROSE */;
241
+ }
242
+ this.flushProse();
243
+ return this.tokens;
244
+ }
245
+ reset() {
246
+ this.state = "IN_PROSE" /* IN_PROSE */;
247
+ this.buffer = "";
248
+ this.proseBuffer = "";
249
+ this.stringChar = null;
250
+ this.escaped = false;
251
+ this.tokens = [];
252
+ }
253
+ flushProse() {
254
+ if (this.proseBuffer.length > 0) {
255
+ this.tokens.push({ type: "PROSE" /* PROSE */, raw: this.proseBuffer });
256
+ this.proseBuffer = "";
257
+ }
258
+ }
259
+ emitTag() {
260
+ const raw = this.buffer;
261
+ this.buffer = "";
262
+ const inner = raw.slice(2, -2).trim();
263
+ if (inner.length === 0) return;
264
+ if (inner.startsWith("/")) {
265
+ this.tokens.push({ type: "TAG_CLOSE" /* TAG_CLOSE */, raw, name: inner.slice(1).trim() });
266
+ return;
267
+ }
268
+ const selfClosing = inner.endsWith("/");
269
+ const content = selfClosing ? inner.slice(0, -1).trim() : inner;
270
+ const spaceIdx = content.indexOf(" ");
271
+ this.tokens.push({
272
+ type: selfClosing ? "TAG_SELF_CLOSE" /* TAG_SELF_CLOSE */ : "TAG_OPEN" /* TAG_OPEN */,
273
+ raw,
274
+ name: spaceIdx === -1 ? content : content.slice(0, spaceIdx),
275
+ attrs: spaceIdx === -1 ? "" : content.slice(spaceIdx + 1).trim(),
276
+ selfClosing
277
+ });
278
+ }
279
+ };
280
+
281
281
  // src/parser.ts
282
282
  var StreamingParser = class {
283
283
  tokenizer = new Tokenizer();
@@ -472,53 +472,6 @@ var StreamingParser = class {
472
472
  }
473
473
  };
474
474
 
475
- // src/registry.ts
476
- function defineComponent(definition) {
477
- return definition;
478
- }
479
- var ComponentRegistry = class {
480
- components = /* @__PURE__ */ new Map();
481
- register(definition) {
482
- this.components.set(definition.name, definition);
483
- return this;
484
- }
485
- registerAll(definitions) {
486
- for (const def of definitions) this.register(def);
487
- return this;
488
- }
489
- get(name) {
490
- return this.components.get(name);
491
- }
492
- has(name) {
493
- return this.components.has(name);
494
- }
495
- names() {
496
- return [...this.components.keys()];
497
- }
498
- all() {
499
- return [...this.components.values()];
500
- }
501
- knownTags() {
502
- return new Set(this.components.keys());
503
- }
504
- validate(tagName, props) {
505
- const def = this.components.get(tagName);
506
- if (!def) {
507
- return { valid: false, errors: [`Unknown component: ${tagName}`] };
508
- }
509
- const result = def.props.safeParse(props);
510
- if (result.success) {
511
- return { valid: true, errors: [], props: result.data };
512
- }
513
- return {
514
- valid: false,
515
- errors: result.error.issues.map(
516
- (issue) => `${issue.path.join(".")}: ${issue.message}`
517
- )
518
- };
519
- }
520
- };
521
-
522
475
  // src/prompt.ts
523
476
  function generatePrompt(registry, options) {
524
477
  const sections = [];
@@ -627,6 +580,53 @@ function formatComponent(def) {
627
580
  }
628
581
  return lines.join("\n");
629
582
  }
583
+
584
+ // src/registry.ts
585
+ function defineComponent(definition) {
586
+ return definition;
587
+ }
588
+ var ComponentRegistry = class {
589
+ components = /* @__PURE__ */ new Map();
590
+ register(definition) {
591
+ this.components.set(definition.name, definition);
592
+ return this;
593
+ }
594
+ registerAll(definitions) {
595
+ for (const def of definitions) this.register(def);
596
+ return this;
597
+ }
598
+ get(name) {
599
+ return this.components.get(name);
600
+ }
601
+ has(name) {
602
+ return this.components.has(name);
603
+ }
604
+ names() {
605
+ return [...this.components.keys()];
606
+ }
607
+ all() {
608
+ return [...this.components.values()];
609
+ }
610
+ knownTags() {
611
+ return new Set(this.components.keys());
612
+ }
613
+ validate(tagName, props) {
614
+ const def = this.components.get(tagName);
615
+ if (!def) {
616
+ return { valid: false, errors: [`Unknown component: ${tagName}`] };
617
+ }
618
+ const result = def.props.safeParse(props);
619
+ if (result.success) {
620
+ return { valid: true, errors: [], props: result.data };
621
+ }
622
+ return {
623
+ valid: false,
624
+ errors: result.error.issues.map(
625
+ (issue) => `${issue.path.join(".")}: ${issue.message}`
626
+ )
627
+ };
628
+ }
629
+ };
630
630
  // Annotate the CommonJS export names for ESM import in node:
631
631
  0 && (module.exports = {
632
632
  ComponentRegistry,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/tokenizer.ts","../src/attributes.ts","../src/parser.ts","../src/registry.ts","../src/prompt.ts"],"sourcesContent":["// @mdocui/core — Streaming Markdoc parser for LLM generative UI\n\nexport { Tokenizer, TokenizerState, TokenType } from './tokenizer'\nexport type { Token } from './tokenizer'\nexport { StreamingParser } from './parser'\nexport type { ParserOptions } from './parser'\nexport { parseAttributes } from './attributes'\nexport { ComponentRegistry, defineComponent } from './registry'\nexport { generatePrompt } from './prompt'\nexport type {\n\tASTNode,\n\tActionEvent,\n\tComponentDefinition,\n\tComponentGroup,\n\tComponentNode,\n\tParseError,\n\tParseMeta,\n\tProseNode,\n\tPromptOptions,\n\tValidationResult,\n} from './types'\n","export enum TokenizerState {\n\tIN_PROSE = 'IN_PROSE',\n\tIN_TAG = 'IN_TAG',\n\tIN_STRING = 'IN_STRING',\n}\n\nexport enum TokenType {\n\tPROSE = 'PROSE',\n\tTAG_OPEN = 'TAG_OPEN',\n\tTAG_SELF_CLOSE = 'TAG_SELF_CLOSE',\n\tTAG_CLOSE = 'TAG_CLOSE',\n}\n\nexport interface Token {\n\ttype: TokenType\n\traw: string\n\tname?: string\n\tattrs?: string\n\tselfClosing?: boolean\n}\n\nexport class Tokenizer {\n\tprivate state: TokenizerState = TokenizerState.IN_PROSE\n\tprivate buffer = ''\n\tprivate proseBuffer = ''\n\tprivate stringChar: string | null = null\n\tprivate escaped = false\n\tprivate tokens: Token[] = []\n\n\tgetState(): TokenizerState {\n\t\treturn this.state\n\t}\n\n\tgetBuffer(): string {\n\t\treturn this.buffer\n\t}\n\n\twrite(chunk: string): Token[] {\n\t\tthis.tokens = []\n\n\t\tfor (let i = 0; i < chunk.length; i++) {\n\t\t\tconst char = chunk[i]\n\t\t\tconst next = chunk[i + 1]\n\n\t\t\tswitch (this.state) {\n\t\t\t\tcase TokenizerState.IN_PROSE:\n\t\t\t\t\tif (char === '{' && next === '%') {\n\t\t\t\t\t\tthis.flushProse()\n\t\t\t\t\t\tthis.buffer = '{%'\n\t\t\t\t\t\tthis.state = TokenizerState.IN_TAG\n\t\t\t\t\t\ti++\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.proseBuffer += char\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\n\t\t\t\tcase TokenizerState.IN_TAG:\n\t\t\t\t\tthis.buffer += char\n\t\t\t\t\tif (char === '\"' || char === \"'\") {\n\t\t\t\t\t\tthis.stringChar = char\n\t\t\t\t\t\tthis.escaped = false\n\t\t\t\t\t\tthis.state = TokenizerState.IN_STRING\n\t\t\t\t\t} else if (char === '%' && next === '}') {\n\t\t\t\t\t\tthis.buffer += '}'\n\t\t\t\t\t\ti++\n\t\t\t\t\t\tthis.emitTag()\n\t\t\t\t\t\tthis.state = TokenizerState.IN_PROSE\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\n\t\t\t\tcase TokenizerState.IN_STRING:\n\t\t\t\t\tthis.buffer += char\n\t\t\t\t\tif (this.escaped) {\n\t\t\t\t\t\tthis.escaped = false\n\t\t\t\t\t} else if (char === '\\\\') {\n\t\t\t\t\t\tthis.escaped = true\n\t\t\t\t\t} else if (char === this.stringChar) {\n\t\t\t\t\t\tthis.stringChar = null\n\t\t\t\t\t\tthis.state = TokenizerState.IN_TAG\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif (this.state === TokenizerState.IN_PROSE) {\n\t\t\tthis.flushProse()\n\t\t}\n\n\t\treturn this.tokens\n\t}\n\n\tflush(): Token[] {\n\t\tthis.tokens = []\n\n\t\tif (this.state === TokenizerState.IN_TAG || this.state === TokenizerState.IN_STRING) {\n\t\t\tthis.proseBuffer += this.buffer\n\t\t\tthis.buffer = ''\n\t\t\tthis.state = TokenizerState.IN_PROSE\n\t\t}\n\n\t\tthis.flushProse()\n\t\treturn this.tokens\n\t}\n\n\treset(): void {\n\t\tthis.state = TokenizerState.IN_PROSE\n\t\tthis.buffer = ''\n\t\tthis.proseBuffer = ''\n\t\tthis.stringChar = null\n\t\tthis.escaped = false\n\t\tthis.tokens = []\n\t}\n\n\tprivate flushProse(): void {\n\t\tif (this.proseBuffer.length > 0) {\n\t\t\tthis.tokens.push({ type: TokenType.PROSE, raw: this.proseBuffer })\n\t\t\tthis.proseBuffer = ''\n\t\t}\n\t}\n\n\tprivate emitTag(): void {\n\t\tconst raw = this.buffer\n\t\tthis.buffer = ''\n\n\t\tconst inner = raw.slice(2, -2).trim()\n\t\tif (inner.length === 0) return\n\n\t\tif (inner.startsWith('/')) {\n\t\t\tthis.tokens.push({ type: TokenType.TAG_CLOSE, raw, name: inner.slice(1).trim() })\n\t\t\treturn\n\t\t}\n\n\t\tconst selfClosing = inner.endsWith('/')\n\t\tconst content = selfClosing ? inner.slice(0, -1).trim() : inner\n\t\tconst spaceIdx = content.indexOf(' ')\n\n\t\tthis.tokens.push({\n\t\t\ttype: selfClosing ? TokenType.TAG_SELF_CLOSE : TokenType.TAG_OPEN,\n\t\t\traw,\n\t\t\tname: spaceIdx === -1 ? content : content.slice(0, spaceIdx),\n\t\t\tattrs: spaceIdx === -1 ? '' : content.slice(spaceIdx + 1).trim(),\n\t\t\tselfClosing,\n\t\t})\n\t}\n}\n","const UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype'])\n\nexport function parseAttributes(input: string): Record<string, unknown> {\n\tconst result = Object.create(null) as Record<string, unknown>\n\tlet i = 0\n\n\twhile (i < input.length) {\n\t\twhile (i < input.length && isWhitespace(input[i])) i++\n\t\tif (i >= input.length) break\n\n\t\tconst keyStart = i\n\t\twhile (i < input.length && input[i] !== '=' && !isWhitespace(input[i])) i++\n\t\tconst key = input.slice(keyStart, i)\n\t\tif (key.length === 0) break\n\n\t\tif (UNSAFE_KEYS.has(key)) {\n\t\t\t// skip past the value if there is one\n\t\t\twhile (i < input.length && isWhitespace(input[i])) i++\n\t\t\tif (i < input.length && input[i] === '=') {\n\t\t\t\ti++\n\t\t\t\ti = skipValue(input, i)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\twhile (i < input.length && isWhitespace(input[i])) i++\n\n\t\tif (i >= input.length || input[i] !== '=') {\n\t\t\tresult[key] = true\n\t\t\tcontinue\n\t\t}\n\t\ti++ // skip =\n\t\twhile (i < input.length && isWhitespace(input[i])) i++\n\n\t\tif (i >= input.length) {\n\t\t\tresult[key] = true\n\t\t\tbreak\n\t\t}\n\n\t\tconst char = input[i]\n\n\t\tif (char === '\"' || char === \"'\") {\n\t\t\tconst quote = char\n\t\t\ti++\n\t\t\tlet value = ''\n\t\t\twhile (i < input.length && input[i] !== quote) {\n\t\t\t\tif (input[i] === '\\\\' && i + 1 < input.length) {\n\t\t\t\t\tvalue += input[i + 1]\n\t\t\t\t\ti += 2\n\t\t\t\t} else {\n\t\t\t\t\tvalue += input[i]\n\t\t\t\t\ti++\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (i < input.length) i++ // skip closing quote\n\t\t\tresult[key] = value\n\t\t} else if (char === '[') {\n\t\t\tconst start = i\n\t\t\tlet depth = 1\n\t\t\ti++\n\t\t\tlet inStr = false\n\t\t\tlet strChar = ''\n\t\t\tlet escaped = false\n\t\t\twhile (i < input.length && depth > 0) {\n\t\t\t\tif (inStr) {\n\t\t\t\t\tif (escaped) {\n\t\t\t\t\t\tescaped = false\n\t\t\t\t\t} else if (input[i] === '\\\\') {\n\t\t\t\t\t\tescaped = true\n\t\t\t\t\t} else if (input[i] === strChar) {\n\t\t\t\t\t\tinStr = false\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (input[i] === '\"' || input[i] === \"'\") {\n\t\t\t\t\t\tinStr = true\n\t\t\t\t\t\tstrChar = input[i]\n\t\t\t\t\t} else if (input[i] === '[') {\n\t\t\t\t\t\tdepth++\n\t\t\t\t\t} else if (input[i] === ']') {\n\t\t\t\t\t\tdepth--\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ti++\n\t\t\t}\n\t\t\tconst raw = input.slice(start, i)\n\t\t\ttry {\n\t\t\t\tresult[key] = JSON.parse(raw)\n\t\t\t} catch {\n\t\t\t\tresult[key] = raw\n\t\t\t}\n\t\t} else {\n\t\t\tconst valStart = i\n\t\t\twhile (i < input.length && !isWhitespace(input[i])) i++\n\t\t\tconst raw = input.slice(valStart, i)\n\t\t\tresult[key] = coerce(raw)\n\t\t}\n\t}\n\n\treturn result\n}\n\nfunction skipValue(input: string, start: number): number {\n\tlet pos = start\n\twhile (pos < input.length && isWhitespace(input[pos])) pos++\n\tif (pos >= input.length) return pos\n\n\tconst ch = input[pos]\n\tif (ch === '\"' || ch === \"'\") {\n\t\tpos++\n\t\twhile (pos < input.length && input[pos] !== ch) {\n\t\t\tif (input[pos] === '\\\\') pos++\n\t\t\tpos++\n\t\t}\n\t\tif (pos < input.length) pos++\n\t} else if (ch === '[') {\n\t\tlet depth = 1\n\t\tpos++\n\t\twhile (pos < input.length && depth > 0) {\n\t\t\tif (input[pos] === '[') depth++\n\t\t\telse if (input[pos] === ']') depth--\n\t\t\tpos++\n\t\t}\n\t} else {\n\t\twhile (pos < input.length && !isWhitespace(input[pos])) pos++\n\t}\n\treturn pos\n}\n\nfunction isWhitespace(ch: string): boolean {\n\treturn ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r'\n}\n\nfunction coerce(raw: string): unknown {\n\tif (raw === 'true') return true\n\tif (raw === 'false') return false\n\tif (raw === 'null') return null\n\tconst num = Number(raw)\n\tif (!Number.isNaN(num) && raw.length > 0) return num\n\treturn raw\n}\n","import { parseAttributes } from './attributes'\nimport { TokenType, Tokenizer } from './tokenizer'\nimport type { Token } from './tokenizer'\nimport type { ASTNode, ComponentNode, ParseError, ParseMeta, ProseNode } from './types'\n\nexport interface ParserOptions {\n\tdropUnknown?: boolean\n\tknownTags?: Set<string>\n}\n\nexport class StreamingParser {\n\tprivate tokenizer = new Tokenizer()\n\tprivate completedNodes: ASTNode[] = []\n\tprivate bodyStack: BodyFrame[] = []\n\tprivate errors: ParseError[] = []\n\tprivate options: Required<ParserOptions>\n\n\tconstructor(options?: ParserOptions) {\n\t\tthis.options = {\n\t\t\tdropUnknown: options?.dropUnknown ?? true,\n\t\t\tknownTags: options?.knownTags ?? new Set(),\n\t\t}\n\t}\n\n\twrite(chunk: string): ASTNode[] {\n\t\tconst tokens = this.tokenizer.write(chunk)\n\t\tconst newNodes: ASTNode[] = []\n\n\t\tfor (const token of tokens) {\n\t\t\tnewNodes.push(...this.processToken(token))\n\t\t}\n\n\t\tthis.completedNodes.push(...newNodes)\n\t\treturn newNodes\n\t}\n\n\t/** Flush remaining buffers. Open body tags are force-closed. */\n\tflush(): ASTNode[] {\n\t\tconst remaining = this.tokenizer.flush()\n\t\tconst newNodes: ASTNode[] = []\n\n\t\tfor (const token of remaining) {\n\t\t\tnewNodes.push(...this.processToken(token))\n\t\t}\n\n\t\twhile (this.bodyStack.length > 0) {\n\t\t\tconst frame = this.popFrame()\n\t\t\tthis.errors.push({\n\t\t\t\tcode: 'unclosed',\n\t\t\t\ttagName: frame.name,\n\t\t\t\tmessage: `Tag \"{% ${frame.name} %}\" was never closed`,\n\t\t\t})\n\t\t\tconst node = this.buildComponentNode(frame)\n\t\t\tif (this.isInBody()) {\n\t\t\t\tthis.currentFrame().children.push(node)\n\t\t\t} else {\n\t\t\t\tnewNodes.push(node)\n\t\t\t}\n\t\t}\n\n\t\tthis.completedNodes.push(...newNodes)\n\t\treturn newNodes\n\t}\n\n\tgetNodes(): ASTNode[] {\n\t\treturn this.completedNodes\n\t}\n\n\tgetMeta(): ParseMeta {\n\t\treturn {\n\t\t\terrors: [...this.errors],\n\t\t\tnodeCount: this.completedNodes.length,\n\t\t\tisComplete: this.bodyStack.length === 0,\n\t\t}\n\t}\n\n\treset(): void {\n\t\tthis.tokenizer.reset()\n\t\tthis.completedNodes = []\n\t\tthis.bodyStack = []\n\t\tthis.errors = []\n\t}\n\n\tprivate processToken(token: Token): ASTNode[] {\n\t\tconst nodes: ASTNode[] = []\n\n\t\tswitch (token.type) {\n\t\t\tcase TokenType.PROSE:\n\t\t\t\tthis.handleProse(token.raw, nodes)\n\t\t\t\tbreak\n\t\t\tcase TokenType.TAG_SELF_CLOSE:\n\t\t\t\tthis.handleSelfClose(token, nodes)\n\t\t\t\tbreak\n\t\t\tcase TokenType.TAG_OPEN:\n\t\t\t\tthis.handleOpen(token)\n\t\t\t\tbreak\n\t\t\tcase TokenType.TAG_CLOSE:\n\t\t\t\tthis.handleClose(token, nodes)\n\t\t\t\tbreak\n\t\t}\n\n\t\treturn nodes\n\t}\n\n\tprivate handleProse(content: string, out: ASTNode[]): void {\n\t\tif (content.length === 0) return\n\n\t\tconst node: ProseNode = { type: 'prose', content }\n\t\tif (this.isInBody()) {\n\t\t\tthis.currentFrame().children.push(node)\n\t\t} else {\n\t\t\tout.push(node)\n\t\t}\n\t}\n\n\tprivate handleSelfClose(token: Token, out: ASTNode[]): void {\n\t\tconst name = token.name ?? ''\n\t\tif (!this.isKnown(name)) {\n\t\t\tthis.errors.push({\n\t\t\t\tcode: 'unknown_tag',\n\t\t\t\ttagName: name,\n\t\t\t\tmessage: `Unknown component: ${name}`,\n\t\t\t\traw: token.raw,\n\t\t\t})\n\t\t\tif (!this.options.dropUnknown) {\n\t\t\t\tthis.handleProse(token.raw, out)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst props = parseAttributes(token.attrs ?? '')\n\t\tconst node: ComponentNode = {\n\t\t\ttype: 'component',\n\t\t\tname,\n\t\t\tprops,\n\t\t\tchildren: [],\n\t\t\tselfClosing: true,\n\t\t}\n\n\t\tif (this.isInBody()) {\n\t\t\tthis.currentFrame().children.push(node)\n\t\t} else {\n\t\t\tout.push(node)\n\t\t}\n\t}\n\n\tprivate handleOpen(token: Token): void {\n\t\tconst name = token.name ?? ''\n\t\tif (!this.isKnown(name)) {\n\t\t\tthis.errors.push({\n\t\t\t\tcode: 'unknown_tag',\n\t\t\t\ttagName: name,\n\t\t\t\tmessage: `Unknown component: ${name}`,\n\t\t\t\traw: token.raw,\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\tthis.bodyStack.push({\n\t\t\tname,\n\t\t\tprops: parseAttributes(token.attrs ?? ''),\n\t\t\tchildren: [],\n\t\t})\n\t}\n\n\tprivate handleClose(token: Token, out: ASTNode[]): void {\n\t\tconst name = token.name ?? ''\n\n\t\tlet frameIdx = -1\n\t\tfor (let i = this.bodyStack.length - 1; i >= 0; i--) {\n\t\t\tif (this.bodyStack[i].name === name) {\n\t\t\t\tframeIdx = i\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif (frameIdx === -1) {\n\t\t\tthis.errors.push({\n\t\t\t\tcode: 'malformed',\n\t\t\t\ttagName: name,\n\t\t\t\tmessage: `Closing tag \"{% /${name} %}\" has no matching opening tag`,\n\t\t\t\traw: token.raw,\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\t// force-close anything nested above the matching opener\n\t\twhile (this.bodyStack.length > frameIdx + 1) {\n\t\t\tconst orphan = this.popFrame()\n\t\t\tthis.errors.push({\n\t\t\t\tcode: 'unclosed',\n\t\t\t\ttagName: orphan.name,\n\t\t\t\tmessage: `Tag \"{% ${orphan.name} %}\" was force-closed by \"{% /${name} %}\"`,\n\t\t\t})\n\t\t\tconst orphanNode = this.buildComponentNode(orphan)\n\t\t\tthis.bodyStack[this.bodyStack.length - 1].children.push(orphanNode)\n\t\t}\n\n\t\tconst frame = this.popFrame()\n\t\tconst node = this.buildComponentNode(frame)\n\n\t\tif (this.isInBody()) {\n\t\t\tthis.currentFrame().children.push(node)\n\t\t} else {\n\t\t\tout.push(node)\n\t\t}\n\t}\n\n\tprivate buildComponentNode(frame: BodyFrame): ComponentNode {\n\t\treturn {\n\t\t\ttype: 'component',\n\t\t\tname: frame.name,\n\t\t\tprops: frame.props,\n\t\t\tchildren: frame.children,\n\t\t\tselfClosing: false,\n\t\t}\n\t}\n\n\tprivate popFrame(): BodyFrame {\n\t\treturn this.bodyStack.pop() as BodyFrame\n\t}\n\n\tprivate isInBody(): boolean {\n\t\treturn this.bodyStack.length > 0\n\t}\n\n\tprivate currentFrame(): BodyFrame {\n\t\treturn this.bodyStack[this.bodyStack.length - 1]\n\t}\n\n\tprivate isKnown(name: string): boolean {\n\t\tif (this.options.knownTags.size === 0) return true\n\t\treturn this.options.knownTags.has(name)\n\t}\n}\n\ninterface BodyFrame {\n\tname: string\n\tprops: Record<string, unknown>\n\tchildren: ASTNode[]\n}\n","import type { z } from 'zod'\nimport type { ComponentDefinition, ValidationResult } from './types'\n\n/** Type helper — returns the definition unchanged. */\nexport function defineComponent(definition: ComponentDefinition): ComponentDefinition {\n\treturn definition\n}\n\nexport class ComponentRegistry {\n\tprivate components = new Map<string, ComponentDefinition>()\n\n\tregister(definition: ComponentDefinition): this {\n\t\tthis.components.set(definition.name, definition)\n\t\treturn this\n\t}\n\n\tregisterAll(definitions: ComponentDefinition[]): this {\n\t\tfor (const def of definitions) this.register(def)\n\t\treturn this\n\t}\n\n\tget(name: string): ComponentDefinition | undefined {\n\t\treturn this.components.get(name)\n\t}\n\n\thas(name: string): boolean {\n\t\treturn this.components.has(name)\n\t}\n\n\tnames(): string[] {\n\t\treturn [...this.components.keys()]\n\t}\n\n\tall(): ComponentDefinition[] {\n\t\treturn [...this.components.values()]\n\t}\n\n\tknownTags(): Set<string> {\n\t\treturn new Set(this.components.keys())\n\t}\n\n\tvalidate(tagName: string, props: Record<string, unknown>): ValidationResult {\n\t\tconst def = this.components.get(tagName)\n\t\tif (!def) {\n\t\t\treturn { valid: false, errors: [`Unknown component: ${tagName}`] }\n\t\t}\n\n\t\tconst result = def.props.safeParse(props)\n\t\tif (result.success) {\n\t\t\treturn { valid: true, errors: [], props: result.data as Record<string, unknown> }\n\t\t}\n\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\terrors: result.error.issues.map(\n\t\t\t\t(issue: z.ZodIssue) => `${issue.path.join('.')}: ${issue.message}`,\n\t\t\t),\n\t\t}\n\t}\n}\n","import type { ComponentRegistry } from './registry'\nimport type { ComponentDefinition, PromptOptions } from './types'\n\nexport function generatePrompt(registry: ComponentRegistry, options?: PromptOptions): string {\n\tconst sections: string[] = []\n\n\tif (options?.preamble) {\n\t\tsections.push(options.preamble, '')\n\t}\n\n\tsections.push(\n\t\t'You respond in mdocUI format.',\n\t\t'',\n\t\t'Write natural markdown prose. Embed UI components using Markdoc tag syntax.',\n\t\t'',\n\t\t'## TAG SYNTAX',\n\t\t'Self-closing: {% tagname attr=\"value\" attr2=123 /%}',\n\t\t'With body: {% tagname attr=\"value\" %}',\n\t\t' content here',\n\t\t' {% /tagname %}',\n\t\t'',\n\t\t'Never wrap tags in code fences.',\n\t\t'Never invent component names not listed below.',\n\t\t'Unknown tags will be silently dropped.',\n\t\t'',\n\t)\n\n\tconst defs = registry.all()\n\tif (defs.length > 0) {\n\t\tsections.push('## COMPONENTS', '')\n\n\t\tif (options?.groups && options.groups.length > 0) {\n\t\t\tconst grouped = new Set<string>()\n\n\t\t\tfor (const group of options.groups) {\n\t\t\t\tsections.push(`### ${group.name}`)\n\t\t\t\tif (group.notes) {\n\t\t\t\t\tfor (const note of group.notes) sections.push(`> ${note}`)\n\t\t\t\t}\n\t\t\t\tsections.push('')\n\t\t\t\tfor (const name of group.components) {\n\t\t\t\t\tconst def = registry.get(name)\n\t\t\t\t\tif (def) {\n\t\t\t\t\t\tsections.push(formatComponent(def), '')\n\t\t\t\t\t\tgrouped.add(name)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const def of defs) {\n\t\t\t\tif (!grouped.has(def.name)) sections.push(formatComponent(def), '')\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const def of defs) sections.push(formatComponent(def), '')\n\t\t}\n\t}\n\n\tsections.push(\n\t\t'## STREAMING GUIDELINE',\n\t\t'Write prose content before components.',\n\t\t'Users see text immediately while components load.',\n\t\t'',\n\t)\n\n\tif (options?.additionalRules && options.additionalRules.length > 0) {\n\t\tsections.push('## RULES')\n\t\tfor (const rule of options.additionalRules) sections.push(`- ${rule}`)\n\t\tsections.push('')\n\t}\n\n\tif (options?.examples && options.examples.length > 0) {\n\t\tsections.push('## EXAMPLE', '')\n\t\tfor (const example of options.examples) sections.push(example, '')\n\t}\n\n\treturn sections.join('\\n').trim()\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: Zod internals require dynamic access\ntype ZodDef = Record<string, any>\n\ninterface ZodField {\n\tisOptional: () => boolean\n\t_def: ZodDef\n}\n\nfunction resolveType(def: ZodDef): string {\n\tconst typeName = def.typeName as string | undefined\n\n\tif (typeName === 'ZodOptional' || typeName === 'ZodDefault') {\n\t\treturn resolveType(def.innerType?._def ?? {})\n\t}\n\n\tif (typeName === 'ZodEnum') {\n\t\tconst vals = (def.values as string[]) ?? []\n\t\treturn vals.map((v) => `\"${v}\"`).join(' | ')\n\t}\n\n\tif (typeName === 'ZodArray') {\n\t\tconst inner = resolveType(def.type?._def ?? {})\n\t\treturn `${inner}[]`\n\t}\n\n\tif (typeName === 'ZodString') return 'string'\n\tif (typeName === 'ZodNumber') return 'number'\n\tif (typeName === 'ZodBoolean') return 'boolean'\n\n\treturn ''\n}\n\nfunction formatComponent(def: ComponentDefinition): string {\n\tconst closing = def.children === 'none' ? ' /%}' : ' %}'\n\tconst shape = def.props.shape as Record<string, ZodField>\n\tconst propNames = Object.keys(shape)\n\n\tif (propNames.length === 0) {\n\t\tconst lines = [`{% ${def.name}${closing}`, ` ${def.description}`]\n\t\tif (def.children && def.children !== 'none') {\n\t\t\tlines.push(' (accepts body content)')\n\t\t}\n\t\treturn lines.join('\\n')\n\t}\n\n\tconst sig = propNames.map((name) => (shape[name].isOptional() ? `${name}?` : name)).join(' ')\n\tconst lines = [`{% ${def.name} ${sig}${closing}`, ` ${def.description}`]\n\n\tfor (const [name, field] of Object.entries(shape)) {\n\t\tconst desc = field._def.description ?? ''\n\t\tconst typeStr = resolveType(field._def)\n\t\tconst opt = field.isOptional() ? ' (optional)' : ''\n\t\tconst typeHint = typeStr ? ` — ${typeStr}` : ''\n\t\tlines.push(` ${name}${typeHint}: ${desc}${opt}`)\n\t}\n\n\tif (def.children && def.children !== 'none') {\n\t\tlines.push(' (accepts body content)')\n\t}\n\n\treturn lines.join('\\n')\n}\n"],"mappings":"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","names":["TokenizerState","TokenType","lines"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/attributes.ts","../src/tokenizer.ts","../src/parser.ts","../src/prompt.ts","../src/registry.ts"],"sourcesContent":["// @mdocui/core — Streaming Markdoc parser for LLM generative UI\n\nexport { parseAttributes } from './attributes'\nexport type { ParserOptions } from './parser'\nexport { StreamingParser } from './parser'\nexport { generatePrompt } from './prompt'\nexport { ComponentRegistry, defineComponent } from './registry'\nexport type { Token } from './tokenizer'\nexport { Tokenizer, TokenizerState, TokenType } from './tokenizer'\nexport type {\n\tActionEvent,\n\tASTNode,\n\tComponentDefinition,\n\tComponentGroup,\n\tComponentNode,\n\tParseError,\n\tParseMeta,\n\tPromptOptions,\n\tProseNode,\n\tValidationResult,\n} from './types'\n","const UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype'])\n\nexport function parseAttributes(input: string): Record<string, unknown> {\n\tconst result = Object.create(null) as Record<string, unknown>\n\tlet i = 0\n\n\twhile (i < input.length) {\n\t\twhile (i < input.length && isWhitespace(input[i])) i++\n\t\tif (i >= input.length) break\n\n\t\tconst keyStart = i\n\t\twhile (i < input.length && input[i] !== '=' && !isWhitespace(input[i])) i++\n\t\tconst key = input.slice(keyStart, i)\n\t\tif (key.length === 0) break\n\n\t\tif (UNSAFE_KEYS.has(key)) {\n\t\t\t// skip past the value if there is one\n\t\t\twhile (i < input.length && isWhitespace(input[i])) i++\n\t\t\tif (i < input.length && input[i] === '=') {\n\t\t\t\ti++\n\t\t\t\ti = skipValue(input, i)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\twhile (i < input.length && isWhitespace(input[i])) i++\n\n\t\tif (i >= input.length || input[i] !== '=') {\n\t\t\tresult[key] = true\n\t\t\tcontinue\n\t\t}\n\t\ti++ // skip =\n\t\twhile (i < input.length && isWhitespace(input[i])) i++\n\n\t\tif (i >= input.length) {\n\t\t\tresult[key] = true\n\t\t\tbreak\n\t\t}\n\n\t\tconst char = input[i]\n\n\t\tif (char === '\"' || char === \"'\") {\n\t\t\tconst quote = char\n\t\t\ti++\n\t\t\tlet value = ''\n\t\t\twhile (i < input.length && input[i] !== quote) {\n\t\t\t\tif (input[i] === '\\\\' && i + 1 < input.length) {\n\t\t\t\t\tvalue += input[i + 1]\n\t\t\t\t\ti += 2\n\t\t\t\t} else {\n\t\t\t\t\tvalue += input[i]\n\t\t\t\t\ti++\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (i < input.length) i++ // skip closing quote\n\t\t\tresult[key] = value\n\t\t} else if (char === '[') {\n\t\t\tconst start = i\n\t\t\tlet depth = 1\n\t\t\ti++\n\t\t\tlet inStr = false\n\t\t\tlet strChar = ''\n\t\t\tlet escaped = false\n\t\t\twhile (i < input.length && depth > 0) {\n\t\t\t\tif (inStr) {\n\t\t\t\t\tif (escaped) {\n\t\t\t\t\t\tescaped = false\n\t\t\t\t\t} else if (input[i] === '\\\\') {\n\t\t\t\t\t\tescaped = true\n\t\t\t\t\t} else if (input[i] === strChar) {\n\t\t\t\t\t\tinStr = false\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (input[i] === '\"' || input[i] === \"'\") {\n\t\t\t\t\t\tinStr = true\n\t\t\t\t\t\tstrChar = input[i]\n\t\t\t\t\t} else if (input[i] === '[') {\n\t\t\t\t\t\tdepth++\n\t\t\t\t\t} else if (input[i] === ']') {\n\t\t\t\t\t\tdepth--\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ti++\n\t\t\t}\n\t\t\tconst raw = input.slice(start, i)\n\t\t\ttry {\n\t\t\t\tresult[key] = JSON.parse(raw)\n\t\t\t} catch {\n\t\t\t\tresult[key] = raw\n\t\t\t}\n\t\t} else {\n\t\t\tconst valStart = i\n\t\t\twhile (i < input.length && !isWhitespace(input[i])) i++\n\t\t\tconst raw = input.slice(valStart, i)\n\t\t\tresult[key] = coerce(raw)\n\t\t}\n\t}\n\n\treturn result\n}\n\nfunction skipValue(input: string, start: number): number {\n\tlet pos = start\n\twhile (pos < input.length && isWhitespace(input[pos])) pos++\n\tif (pos >= input.length) return pos\n\n\tconst ch = input[pos]\n\tif (ch === '\"' || ch === \"'\") {\n\t\tpos++\n\t\twhile (pos < input.length && input[pos] !== ch) {\n\t\t\tif (input[pos] === '\\\\') pos++\n\t\t\tpos++\n\t\t}\n\t\tif (pos < input.length) pos++\n\t} else if (ch === '[') {\n\t\tlet depth = 1\n\t\tpos++\n\t\twhile (pos < input.length && depth > 0) {\n\t\t\tif (input[pos] === '[') depth++\n\t\t\telse if (input[pos] === ']') depth--\n\t\t\tpos++\n\t\t}\n\t} else {\n\t\twhile (pos < input.length && !isWhitespace(input[pos])) pos++\n\t}\n\treturn pos\n}\n\nfunction isWhitespace(ch: string): boolean {\n\treturn ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r'\n}\n\nfunction coerce(raw: string): unknown {\n\tif (raw === 'true') return true\n\tif (raw === 'false') return false\n\tif (raw === 'null') return null\n\tconst num = Number(raw)\n\tif (!Number.isNaN(num) && raw.length > 0) return num\n\treturn raw\n}\n","export enum TokenizerState {\n\tIN_PROSE = 'IN_PROSE',\n\tIN_TAG = 'IN_TAG',\n\tIN_STRING = 'IN_STRING',\n}\n\nexport enum TokenType {\n\tPROSE = 'PROSE',\n\tTAG_OPEN = 'TAG_OPEN',\n\tTAG_SELF_CLOSE = 'TAG_SELF_CLOSE',\n\tTAG_CLOSE = 'TAG_CLOSE',\n}\n\nexport interface Token {\n\ttype: TokenType\n\traw: string\n\tname?: string\n\tattrs?: string\n\tselfClosing?: boolean\n}\n\nexport class Tokenizer {\n\tprivate state: TokenizerState = TokenizerState.IN_PROSE\n\tprivate buffer = ''\n\tprivate proseBuffer = ''\n\tprivate stringChar: string | null = null\n\tprivate escaped = false\n\tprivate tokens: Token[] = []\n\n\tgetState(): TokenizerState {\n\t\treturn this.state\n\t}\n\n\tgetBuffer(): string {\n\t\treturn this.buffer\n\t}\n\n\twrite(chunk: string): Token[] {\n\t\tthis.tokens = []\n\n\t\tfor (let i = 0; i < chunk.length; i++) {\n\t\t\tconst char = chunk[i]\n\t\t\tconst next = chunk[i + 1]\n\n\t\t\tswitch (this.state) {\n\t\t\t\tcase TokenizerState.IN_PROSE:\n\t\t\t\t\tif (char === '{' && next === '%') {\n\t\t\t\t\t\tthis.flushProse()\n\t\t\t\t\t\tthis.buffer = '{%'\n\t\t\t\t\t\tthis.state = TokenizerState.IN_TAG\n\t\t\t\t\t\ti++\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.proseBuffer += char\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\n\t\t\t\tcase TokenizerState.IN_TAG:\n\t\t\t\t\tthis.buffer += char\n\t\t\t\t\tif (char === '\"' || char === \"'\") {\n\t\t\t\t\t\tthis.stringChar = char\n\t\t\t\t\t\tthis.escaped = false\n\t\t\t\t\t\tthis.state = TokenizerState.IN_STRING\n\t\t\t\t\t} else if (char === '%' && next === '}') {\n\t\t\t\t\t\tthis.buffer += '}'\n\t\t\t\t\t\ti++\n\t\t\t\t\t\tthis.emitTag()\n\t\t\t\t\t\tthis.state = TokenizerState.IN_PROSE\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\n\t\t\t\tcase TokenizerState.IN_STRING:\n\t\t\t\t\tthis.buffer += char\n\t\t\t\t\tif (this.escaped) {\n\t\t\t\t\t\tthis.escaped = false\n\t\t\t\t\t} else if (char === '\\\\') {\n\t\t\t\t\t\tthis.escaped = true\n\t\t\t\t\t} else if (char === this.stringChar) {\n\t\t\t\t\t\tthis.stringChar = null\n\t\t\t\t\t\tthis.state = TokenizerState.IN_TAG\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif (this.state === TokenizerState.IN_PROSE) {\n\t\t\tthis.flushProse()\n\t\t}\n\n\t\treturn this.tokens\n\t}\n\n\tflush(): Token[] {\n\t\tthis.tokens = []\n\n\t\tif (this.state === TokenizerState.IN_TAG || this.state === TokenizerState.IN_STRING) {\n\t\t\tthis.proseBuffer += this.buffer\n\t\t\tthis.buffer = ''\n\t\t\tthis.state = TokenizerState.IN_PROSE\n\t\t}\n\n\t\tthis.flushProse()\n\t\treturn this.tokens\n\t}\n\n\treset(): void {\n\t\tthis.state = TokenizerState.IN_PROSE\n\t\tthis.buffer = ''\n\t\tthis.proseBuffer = ''\n\t\tthis.stringChar = null\n\t\tthis.escaped = false\n\t\tthis.tokens = []\n\t}\n\n\tprivate flushProse(): void {\n\t\tif (this.proseBuffer.length > 0) {\n\t\t\tthis.tokens.push({ type: TokenType.PROSE, raw: this.proseBuffer })\n\t\t\tthis.proseBuffer = ''\n\t\t}\n\t}\n\n\tprivate emitTag(): void {\n\t\tconst raw = this.buffer\n\t\tthis.buffer = ''\n\n\t\tconst inner = raw.slice(2, -2).trim()\n\t\tif (inner.length === 0) return\n\n\t\tif (inner.startsWith('/')) {\n\t\t\tthis.tokens.push({ type: TokenType.TAG_CLOSE, raw, name: inner.slice(1).trim() })\n\t\t\treturn\n\t\t}\n\n\t\tconst selfClosing = inner.endsWith('/')\n\t\tconst content = selfClosing ? inner.slice(0, -1).trim() : inner\n\t\tconst spaceIdx = content.indexOf(' ')\n\n\t\tthis.tokens.push({\n\t\t\ttype: selfClosing ? TokenType.TAG_SELF_CLOSE : TokenType.TAG_OPEN,\n\t\t\traw,\n\t\t\tname: spaceIdx === -1 ? content : content.slice(0, spaceIdx),\n\t\t\tattrs: spaceIdx === -1 ? '' : content.slice(spaceIdx + 1).trim(),\n\t\t\tselfClosing,\n\t\t})\n\t}\n}\n","import { parseAttributes } from './attributes'\nimport type { Token } from './tokenizer'\nimport { Tokenizer, TokenType } from './tokenizer'\nimport type { ASTNode, ComponentNode, ParseError, ParseMeta, ProseNode } from './types'\n\nexport interface ParserOptions {\n\tdropUnknown?: boolean\n\tknownTags?: Set<string>\n}\n\nexport class StreamingParser {\n\tprivate tokenizer = new Tokenizer()\n\tprivate completedNodes: ASTNode[] = []\n\tprivate bodyStack: BodyFrame[] = []\n\tprivate errors: ParseError[] = []\n\tprivate options: Required<ParserOptions>\n\n\tconstructor(options?: ParserOptions) {\n\t\tthis.options = {\n\t\t\tdropUnknown: options?.dropUnknown ?? true,\n\t\t\tknownTags: options?.knownTags ?? new Set(),\n\t\t}\n\t}\n\n\twrite(chunk: string): ASTNode[] {\n\t\tconst tokens = this.tokenizer.write(chunk)\n\t\tconst newNodes: ASTNode[] = []\n\n\t\tfor (const token of tokens) {\n\t\t\tnewNodes.push(...this.processToken(token))\n\t\t}\n\n\t\tthis.completedNodes.push(...newNodes)\n\t\treturn newNodes\n\t}\n\n\t/** Flush remaining buffers. Open body tags are force-closed. */\n\tflush(): ASTNode[] {\n\t\tconst remaining = this.tokenizer.flush()\n\t\tconst newNodes: ASTNode[] = []\n\n\t\tfor (const token of remaining) {\n\t\t\tnewNodes.push(...this.processToken(token))\n\t\t}\n\n\t\twhile (this.bodyStack.length > 0) {\n\t\t\tconst frame = this.popFrame()\n\t\t\tthis.errors.push({\n\t\t\t\tcode: 'unclosed',\n\t\t\t\ttagName: frame.name,\n\t\t\t\tmessage: `Tag \"{% ${frame.name} %}\" was never closed`,\n\t\t\t})\n\t\t\tconst node = this.buildComponentNode(frame)\n\t\t\tif (this.isInBody()) {\n\t\t\t\tthis.currentFrame().children.push(node)\n\t\t\t} else {\n\t\t\t\tnewNodes.push(node)\n\t\t\t}\n\t\t}\n\n\t\tthis.completedNodes.push(...newNodes)\n\t\treturn newNodes\n\t}\n\n\tgetNodes(): ASTNode[] {\n\t\treturn this.completedNodes\n\t}\n\n\tgetMeta(): ParseMeta {\n\t\treturn {\n\t\t\terrors: [...this.errors],\n\t\t\tnodeCount: this.completedNodes.length,\n\t\t\tisComplete: this.bodyStack.length === 0,\n\t\t}\n\t}\n\n\treset(): void {\n\t\tthis.tokenizer.reset()\n\t\tthis.completedNodes = []\n\t\tthis.bodyStack = []\n\t\tthis.errors = []\n\t}\n\n\tprivate processToken(token: Token): ASTNode[] {\n\t\tconst nodes: ASTNode[] = []\n\n\t\tswitch (token.type) {\n\t\t\tcase TokenType.PROSE:\n\t\t\t\tthis.handleProse(token.raw, nodes)\n\t\t\t\tbreak\n\t\t\tcase TokenType.TAG_SELF_CLOSE:\n\t\t\t\tthis.handleSelfClose(token, nodes)\n\t\t\t\tbreak\n\t\t\tcase TokenType.TAG_OPEN:\n\t\t\t\tthis.handleOpen(token)\n\t\t\t\tbreak\n\t\t\tcase TokenType.TAG_CLOSE:\n\t\t\t\tthis.handleClose(token, nodes)\n\t\t\t\tbreak\n\t\t}\n\n\t\treturn nodes\n\t}\n\n\tprivate handleProse(content: string, out: ASTNode[]): void {\n\t\tif (content.length === 0) return\n\n\t\tconst node: ProseNode = { type: 'prose', content }\n\t\tif (this.isInBody()) {\n\t\t\tthis.currentFrame().children.push(node)\n\t\t} else {\n\t\t\tout.push(node)\n\t\t}\n\t}\n\n\tprivate handleSelfClose(token: Token, out: ASTNode[]): void {\n\t\tconst name = token.name ?? ''\n\t\tif (!this.isKnown(name)) {\n\t\t\tthis.errors.push({\n\t\t\t\tcode: 'unknown_tag',\n\t\t\t\ttagName: name,\n\t\t\t\tmessage: `Unknown component: ${name}`,\n\t\t\t\traw: token.raw,\n\t\t\t})\n\t\t\tif (!this.options.dropUnknown) {\n\t\t\t\tthis.handleProse(token.raw, out)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst props = parseAttributes(token.attrs ?? '')\n\t\tconst node: ComponentNode = {\n\t\t\ttype: 'component',\n\t\t\tname,\n\t\t\tprops,\n\t\t\tchildren: [],\n\t\t\tselfClosing: true,\n\t\t}\n\n\t\tif (this.isInBody()) {\n\t\t\tthis.currentFrame().children.push(node)\n\t\t} else {\n\t\t\tout.push(node)\n\t\t}\n\t}\n\n\tprivate handleOpen(token: Token): void {\n\t\tconst name = token.name ?? ''\n\t\tif (!this.isKnown(name)) {\n\t\t\tthis.errors.push({\n\t\t\t\tcode: 'unknown_tag',\n\t\t\t\ttagName: name,\n\t\t\t\tmessage: `Unknown component: ${name}`,\n\t\t\t\traw: token.raw,\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\tthis.bodyStack.push({\n\t\t\tname,\n\t\t\tprops: parseAttributes(token.attrs ?? ''),\n\t\t\tchildren: [],\n\t\t})\n\t}\n\n\tprivate handleClose(token: Token, out: ASTNode[]): void {\n\t\tconst name = token.name ?? ''\n\n\t\tlet frameIdx = -1\n\t\tfor (let i = this.bodyStack.length - 1; i >= 0; i--) {\n\t\t\tif (this.bodyStack[i].name === name) {\n\t\t\t\tframeIdx = i\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif (frameIdx === -1) {\n\t\t\tthis.errors.push({\n\t\t\t\tcode: 'malformed',\n\t\t\t\ttagName: name,\n\t\t\t\tmessage: `Closing tag \"{% /${name} %}\" has no matching opening tag`,\n\t\t\t\traw: token.raw,\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\t// force-close anything nested above the matching opener\n\t\twhile (this.bodyStack.length > frameIdx + 1) {\n\t\t\tconst orphan = this.popFrame()\n\t\t\tthis.errors.push({\n\t\t\t\tcode: 'unclosed',\n\t\t\t\ttagName: orphan.name,\n\t\t\t\tmessage: `Tag \"{% ${orphan.name} %}\" was force-closed by \"{% /${name} %}\"`,\n\t\t\t})\n\t\t\tconst orphanNode = this.buildComponentNode(orphan)\n\t\t\tthis.bodyStack[this.bodyStack.length - 1].children.push(orphanNode)\n\t\t}\n\n\t\tconst frame = this.popFrame()\n\t\tconst node = this.buildComponentNode(frame)\n\n\t\tif (this.isInBody()) {\n\t\t\tthis.currentFrame().children.push(node)\n\t\t} else {\n\t\t\tout.push(node)\n\t\t}\n\t}\n\n\tprivate buildComponentNode(frame: BodyFrame): ComponentNode {\n\t\treturn {\n\t\t\ttype: 'component',\n\t\t\tname: frame.name,\n\t\t\tprops: frame.props,\n\t\t\tchildren: frame.children,\n\t\t\tselfClosing: false,\n\t\t}\n\t}\n\n\tprivate popFrame(): BodyFrame {\n\t\treturn this.bodyStack.pop() as BodyFrame\n\t}\n\n\tprivate isInBody(): boolean {\n\t\treturn this.bodyStack.length > 0\n\t}\n\n\tprivate currentFrame(): BodyFrame {\n\t\treturn this.bodyStack[this.bodyStack.length - 1]\n\t}\n\n\tprivate isKnown(name: string): boolean {\n\t\tif (this.options.knownTags.size === 0) return true\n\t\treturn this.options.knownTags.has(name)\n\t}\n}\n\ninterface BodyFrame {\n\tname: string\n\tprops: Record<string, unknown>\n\tchildren: ASTNode[]\n}\n","import type { ComponentRegistry } from './registry'\nimport type { ComponentDefinition, PromptOptions } from './types'\n\nexport function generatePrompt(registry: ComponentRegistry, options?: PromptOptions): string {\n\tconst sections: string[] = []\n\n\tif (options?.preamble) {\n\t\tsections.push(options.preamble, '')\n\t}\n\n\tsections.push(\n\t\t'You respond in mdocUI format.',\n\t\t'',\n\t\t'Write natural markdown prose. Embed UI components using Markdoc tag syntax.',\n\t\t'',\n\t\t'## TAG SYNTAX',\n\t\t'Self-closing: {% tagname attr=\"value\" attr2=123 /%}',\n\t\t'With body: {% tagname attr=\"value\" %}',\n\t\t' content here',\n\t\t' {% /tagname %}',\n\t\t'',\n\t\t'Never wrap tags in code fences.',\n\t\t'Never invent component names not listed below.',\n\t\t'Unknown tags will be silently dropped.',\n\t\t'',\n\t)\n\n\tconst defs = registry.all()\n\tif (defs.length > 0) {\n\t\tsections.push('## COMPONENTS', '')\n\n\t\tif (options?.groups && options.groups.length > 0) {\n\t\t\tconst grouped = new Set<string>()\n\n\t\t\tfor (const group of options.groups) {\n\t\t\t\tsections.push(`### ${group.name}`)\n\t\t\t\tif (group.notes) {\n\t\t\t\t\tfor (const note of group.notes) sections.push(`> ${note}`)\n\t\t\t\t}\n\t\t\t\tsections.push('')\n\t\t\t\tfor (const name of group.components) {\n\t\t\t\t\tconst def = registry.get(name)\n\t\t\t\t\tif (def) {\n\t\t\t\t\t\tsections.push(formatComponent(def), '')\n\t\t\t\t\t\tgrouped.add(name)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const def of defs) {\n\t\t\t\tif (!grouped.has(def.name)) sections.push(formatComponent(def), '')\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const def of defs) sections.push(formatComponent(def), '')\n\t\t}\n\t}\n\n\tsections.push(\n\t\t'## STREAMING GUIDELINE',\n\t\t'Write prose content before components.',\n\t\t'Users see text immediately while components load.',\n\t\t'',\n\t)\n\n\tif (options?.additionalRules && options.additionalRules.length > 0) {\n\t\tsections.push('## RULES')\n\t\tfor (const rule of options.additionalRules) sections.push(`- ${rule}`)\n\t\tsections.push('')\n\t}\n\n\tif (options?.examples && options.examples.length > 0) {\n\t\tsections.push('## EXAMPLE', '')\n\t\tfor (const example of options.examples) sections.push(example, '')\n\t}\n\n\treturn sections.join('\\n').trim()\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: Zod internals require dynamic access\ntype ZodDef = Record<string, any>\n\ninterface ZodField {\n\tisOptional: () => boolean\n\t_def: ZodDef\n}\n\nfunction resolveType(def: ZodDef): string {\n\tconst typeName = def.typeName as string | undefined\n\n\tif (typeName === 'ZodOptional' || typeName === 'ZodDefault') {\n\t\treturn resolveType(def.innerType?._def ?? {})\n\t}\n\n\tif (typeName === 'ZodEnum') {\n\t\tconst vals = (def.values as string[]) ?? []\n\t\treturn vals.map((v) => `\"${v}\"`).join(' | ')\n\t}\n\n\tif (typeName === 'ZodArray') {\n\t\tconst inner = resolveType(def.type?._def ?? {})\n\t\treturn `${inner}[]`\n\t}\n\n\tif (typeName === 'ZodString') return 'string'\n\tif (typeName === 'ZodNumber') return 'number'\n\tif (typeName === 'ZodBoolean') return 'boolean'\n\n\treturn ''\n}\n\nfunction formatComponent(def: ComponentDefinition): string {\n\tconst closing = def.children === 'none' ? ' /%}' : ' %}'\n\tconst shape = def.props.shape as unknown as Record<string, ZodField>\n\tconst propNames = Object.keys(shape)\n\n\tif (propNames.length === 0) {\n\t\tconst lines = [`{% ${def.name}${closing}`, ` ${def.description}`]\n\t\tif (def.children && def.children !== 'none') {\n\t\t\tlines.push(' (accepts body content)')\n\t\t}\n\t\treturn lines.join('\\n')\n\t}\n\n\tconst sig = propNames.map((name) => (shape[name].isOptional() ? `${name}?` : name)).join(' ')\n\tconst lines = [`{% ${def.name} ${sig}${closing}`, ` ${def.description}`]\n\n\tfor (const [name, field] of Object.entries(shape)) {\n\t\tconst desc = field._def.description ?? ''\n\t\tconst typeStr = resolveType(field._def)\n\t\tconst opt = field.isOptional() ? ' (optional)' : ''\n\t\tconst typeHint = typeStr ? ` — ${typeStr}` : ''\n\t\tlines.push(` ${name}${typeHint}: ${desc}${opt}`)\n\t}\n\n\tif (def.children && def.children !== 'none') {\n\t\tlines.push(' (accepts body content)')\n\t}\n\n\treturn lines.join('\\n')\n}\n","import type { z } from 'zod'\nimport type { ComponentDefinition, ValidationResult } from './types'\n\n/** Type helper — returns the definition unchanged. */\nexport function defineComponent(definition: ComponentDefinition): ComponentDefinition {\n\treturn definition\n}\n\nexport class ComponentRegistry {\n\tprivate components = new Map<string, ComponentDefinition>()\n\n\tregister(definition: ComponentDefinition): this {\n\t\tthis.components.set(definition.name, definition)\n\t\treturn this\n\t}\n\n\tregisterAll(definitions: ComponentDefinition[]): this {\n\t\tfor (const def of definitions) this.register(def)\n\t\treturn this\n\t}\n\n\tget(name: string): ComponentDefinition | undefined {\n\t\treturn this.components.get(name)\n\t}\n\n\thas(name: string): boolean {\n\t\treturn this.components.has(name)\n\t}\n\n\tnames(): string[] {\n\t\treturn [...this.components.keys()]\n\t}\n\n\tall(): ComponentDefinition[] {\n\t\treturn [...this.components.values()]\n\t}\n\n\tknownTags(): Set<string> {\n\t\treturn new Set(this.components.keys())\n\t}\n\n\tvalidate(tagName: string, props: Record<string, unknown>): ValidationResult {\n\t\tconst def = this.components.get(tagName)\n\t\tif (!def) {\n\t\t\treturn { valid: false, errors: [`Unknown component: ${tagName}`] }\n\t\t}\n\n\t\tconst result = def.props.safeParse(props)\n\t\tif (result.success) {\n\t\t\treturn { valid: true, errors: [], props: result.data as Record<string, unknown> }\n\t\t}\n\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\terrors: result.error.issues.map(\n\t\t\t\t(issue: z.ZodIssue) => `${issue.path.join('.')}: ${issue.message}`,\n\t\t\t),\n\t\t}\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAM,cAAc,oBAAI,IAAI,CAAC,aAAa,eAAe,WAAW,CAAC;AAE9D,SAAS,gBAAgB,OAAwC;AACvE,QAAM,SAAS,uBAAO,OAAO,IAAI;AACjC,MAAI,IAAI;AAER,SAAO,IAAI,MAAM,QAAQ;AACxB,WAAO,IAAI,MAAM,UAAU,aAAa,MAAM,CAAC,CAAC,EAAG;AACnD,QAAI,KAAK,MAAM,OAAQ;AAEvB,UAAM,WAAW;AACjB,WAAO,IAAI,MAAM,UAAU,MAAM,CAAC,MAAM,OAAO,CAAC,aAAa,MAAM,CAAC,CAAC,EAAG;AACxE,UAAM,MAAM,MAAM,MAAM,UAAU,CAAC;AACnC,QAAI,IAAI,WAAW,EAAG;AAEtB,QAAI,YAAY,IAAI,GAAG,GAAG;AAEzB,aAAO,IAAI,MAAM,UAAU,aAAa,MAAM,CAAC,CAAC,EAAG;AACnD,UAAI,IAAI,MAAM,UAAU,MAAM,CAAC,MAAM,KAAK;AACzC;AACA,YAAI,UAAU,OAAO,CAAC;AAAA,MACvB;AACA;AAAA,IACD;AAEA,WAAO,IAAI,MAAM,UAAU,aAAa,MAAM,CAAC,CAAC,EAAG;AAEnD,QAAI,KAAK,MAAM,UAAU,MAAM,CAAC,MAAM,KAAK;AAC1C,aAAO,GAAG,IAAI;AACd;AAAA,IACD;AACA;AACA,WAAO,IAAI,MAAM,UAAU,aAAa,MAAM,CAAC,CAAC,EAAG;AAEnD,QAAI,KAAK,MAAM,QAAQ;AACtB,aAAO,GAAG,IAAI;AACd;AAAA,IACD;AAEA,UAAM,OAAO,MAAM,CAAC;AAEpB,QAAI,SAAS,OAAO,SAAS,KAAK;AACjC,YAAM,QAAQ;AACd;AACA,UAAI,QAAQ;AACZ,aAAO,IAAI,MAAM,UAAU,MAAM,CAAC,MAAM,OAAO;AAC9C,YAAI,MAAM,CAAC,MAAM,QAAQ,IAAI,IAAI,MAAM,QAAQ;AAC9C,mBAAS,MAAM,IAAI,CAAC;AACpB,eAAK;AAAA,QACN,OAAO;AACN,mBAAS,MAAM,CAAC;AAChB;AAAA,QACD;AAAA,MACD;AACA,UAAI,IAAI,MAAM,OAAQ;AACtB,aAAO,GAAG,IAAI;AAAA,IACf,WAAW,SAAS,KAAK;AACxB,YAAM,QAAQ;AACd,UAAI,QAAQ;AACZ;AACA,UAAI,QAAQ;AACZ,UAAI,UAAU;AACd,UAAI,UAAU;AACd,aAAO,IAAI,MAAM,UAAU,QAAQ,GAAG;AACrC,YAAI,OAAO;AACV,cAAI,SAAS;AACZ,sBAAU;AAAA,UACX,WAAW,MAAM,CAAC,MAAM,MAAM;AAC7B,sBAAU;AAAA,UACX,WAAW,MAAM,CAAC,MAAM,SAAS;AAChC,oBAAQ;AAAA,UACT;AAAA,QACD,OAAO;AACN,cAAI,MAAM,CAAC,MAAM,OAAO,MAAM,CAAC,MAAM,KAAK;AACzC,oBAAQ;AACR,sBAAU,MAAM,CAAC;AAAA,UAClB,WAAW,MAAM,CAAC,MAAM,KAAK;AAC5B;AAAA,UACD,WAAW,MAAM,CAAC,MAAM,KAAK;AAC5B;AAAA,UACD;AAAA,QACD;AACA;AAAA,MACD;AACA,YAAM,MAAM,MAAM,MAAM,OAAO,CAAC;AAChC,UAAI;AACH,eAAO,GAAG,IAAI,KAAK,MAAM,GAAG;AAAA,MAC7B,QAAQ;AACP,eAAO,GAAG,IAAI;AAAA,MACf;AAAA,IACD,OAAO;AACN,YAAM,WAAW;AACjB,aAAO,IAAI,MAAM,UAAU,CAAC,aAAa,MAAM,CAAC,CAAC,EAAG;AACpD,YAAM,MAAM,MAAM,MAAM,UAAU,CAAC;AACnC,aAAO,GAAG,IAAI,OAAO,GAAG;AAAA,IACzB;AAAA,EACD;AAEA,SAAO;AACR;AAEA,SAAS,UAAU,OAAe,OAAuB;AACxD,MAAI,MAAM;AACV,SAAO,MAAM,MAAM,UAAU,aAAa,MAAM,GAAG,CAAC,EAAG;AACvD,MAAI,OAAO,MAAM,OAAQ,QAAO;AAEhC,QAAM,KAAK,MAAM,GAAG;AACpB,MAAI,OAAO,OAAO,OAAO,KAAK;AAC7B;AACA,WAAO,MAAM,MAAM,UAAU,MAAM,GAAG,MAAM,IAAI;AAC/C,UAAI,MAAM,GAAG,MAAM,KAAM;AACzB;AAAA,IACD;AACA,QAAI,MAAM,MAAM,OAAQ;AAAA,EACzB,WAAW,OAAO,KAAK;AACtB,QAAI,QAAQ;AACZ;AACA,WAAO,MAAM,MAAM,UAAU,QAAQ,GAAG;AACvC,UAAI,MAAM,GAAG,MAAM,IAAK;AAAA,eACf,MAAM,GAAG,MAAM,IAAK;AAC7B;AAAA,IACD;AAAA,EACD,OAAO;AACN,WAAO,MAAM,MAAM,UAAU,CAAC,aAAa,MAAM,GAAG,CAAC,EAAG;AAAA,EACzD;AACA,SAAO;AACR;AAEA,SAAS,aAAa,IAAqB;AAC1C,SAAO,OAAO,OAAO,OAAO,OAAQ,OAAO,QAAQ,OAAO;AAC3D;AAEA,SAAS,OAAO,KAAsB;AACrC,MAAI,QAAQ,OAAQ,QAAO;AAC3B,MAAI,QAAQ,QAAS,QAAO;AAC5B,MAAI,QAAQ,OAAQ,QAAO;AAC3B,QAAM,MAAM,OAAO,GAAG;AACtB,MAAI,CAAC,OAAO,MAAM,GAAG,KAAK,IAAI,SAAS,EAAG,QAAO;AACjD,SAAO;AACR;;;AC3IO,IAAK,iBAAL,kBAAKA,oBAAL;AACN,EAAAA,gBAAA,cAAW;AACX,EAAAA,gBAAA,YAAS;AACT,EAAAA,gBAAA,eAAY;AAHD,SAAAA;AAAA,GAAA;AAML,IAAK,YAAL,kBAAKC,eAAL;AACN,EAAAA,WAAA,WAAQ;AACR,EAAAA,WAAA,cAAW;AACX,EAAAA,WAAA,oBAAiB;AACjB,EAAAA,WAAA,eAAY;AAJD,SAAAA;AAAA,GAAA;AAeL,IAAM,YAAN,MAAgB;AAAA,EACd,QAAwB;AAAA,EACxB,SAAS;AAAA,EACT,cAAc;AAAA,EACd,aAA4B;AAAA,EAC5B,UAAU;AAAA,EACV,SAAkB,CAAC;AAAA,EAE3B,WAA2B;AAC1B,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,YAAoB;AACnB,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,MAAM,OAAwB;AAC7B,SAAK,SAAS,CAAC;AAEf,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACtC,YAAM,OAAO,MAAM,CAAC;AACpB,YAAM,OAAO,MAAM,IAAI,CAAC;AAExB,cAAQ,KAAK,OAAO;AAAA,QACnB,KAAK;AACJ,cAAI,SAAS,OAAO,SAAS,KAAK;AACjC,iBAAK,WAAW;AAChB,iBAAK,SAAS;AACd,iBAAK,QAAQ;AACb;AAAA,UACD,OAAO;AACN,iBAAK,eAAe;AAAA,UACrB;AACA;AAAA,QAED,KAAK;AACJ,eAAK,UAAU;AACf,cAAI,SAAS,OAAO,SAAS,KAAK;AACjC,iBAAK,aAAa;AAClB,iBAAK,UAAU;AACf,iBAAK,QAAQ;AAAA,UACd,WAAW,SAAS,OAAO,SAAS,KAAK;AACxC,iBAAK,UAAU;AACf;AACA,iBAAK,QAAQ;AACb,iBAAK,QAAQ;AAAA,UACd;AACA;AAAA,QAED,KAAK;AACJ,eAAK,UAAU;AACf,cAAI,KAAK,SAAS;AACjB,iBAAK,UAAU;AAAA,UAChB,WAAW,SAAS,MAAM;AACzB,iBAAK,UAAU;AAAA,UAChB,WAAW,SAAS,KAAK,YAAY;AACpC,iBAAK,aAAa;AAClB,iBAAK,QAAQ;AAAA,UACd;AACA;AAAA,MACF;AAAA,IACD;AAEA,QAAI,KAAK,UAAU,2BAAyB;AAC3C,WAAK,WAAW;AAAA,IACjB;AAEA,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,QAAiB;AAChB,SAAK,SAAS,CAAC;AAEf,QAAI,KAAK,UAAU,yBAAyB,KAAK,UAAU,6BAA0B;AACpF,WAAK,eAAe,KAAK;AACzB,WAAK,SAAS;AACd,WAAK,QAAQ;AAAA,IACd;AAEA,SAAK,WAAW;AAChB,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,QAAc;AACb,SAAK,QAAQ;AACb,SAAK,SAAS;AACd,SAAK,cAAc;AACnB,SAAK,aAAa;AAClB,SAAK,UAAU;AACf,SAAK,SAAS,CAAC;AAAA,EAChB;AAAA,EAEQ,aAAmB;AAC1B,QAAI,KAAK,YAAY,SAAS,GAAG;AAChC,WAAK,OAAO,KAAK,EAAE,MAAM,qBAAiB,KAAK,KAAK,YAAY,CAAC;AACjE,WAAK,cAAc;AAAA,IACpB;AAAA,EACD;AAAA,EAEQ,UAAgB;AACvB,UAAM,MAAM,KAAK;AACjB,SAAK,SAAS;AAEd,UAAM,QAAQ,IAAI,MAAM,GAAG,EAAE,EAAE,KAAK;AACpC,QAAI,MAAM,WAAW,EAAG;AAExB,QAAI,MAAM,WAAW,GAAG,GAAG;AAC1B,WAAK,OAAO,KAAK,EAAE,MAAM,6BAAqB,KAAK,MAAM,MAAM,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;AAChF;AAAA,IACD;AAEA,UAAM,cAAc,MAAM,SAAS,GAAG;AACtC,UAAM,UAAU,cAAc,MAAM,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI;AAC1D,UAAM,WAAW,QAAQ,QAAQ,GAAG;AAEpC,SAAK,OAAO,KAAK;AAAA,MAChB,MAAM,cAAc,wCAA2B;AAAA,MAC/C;AAAA,MACA,MAAM,aAAa,KAAK,UAAU,QAAQ,MAAM,GAAG,QAAQ;AAAA,MAC3D,OAAO,aAAa,KAAK,KAAK,QAAQ,MAAM,WAAW,CAAC,EAAE,KAAK;AAAA,MAC/D;AAAA,IACD,CAAC;AAAA,EACF;AACD;;;ACtIO,IAAM,kBAAN,MAAsB;AAAA,EACpB,YAAY,IAAI,UAAU;AAAA,EAC1B,iBAA4B,CAAC;AAAA,EAC7B,YAAyB,CAAC;AAAA,EAC1B,SAAuB,CAAC;AAAA,EACxB;AAAA,EAER,YAAY,SAAyB;AACpC,SAAK,UAAU;AAAA,MACd,aAAa,SAAS,eAAe;AAAA,MACrC,WAAW,SAAS,aAAa,oBAAI,IAAI;AAAA,IAC1C;AAAA,EACD;AAAA,EAEA,MAAM,OAA0B;AAC/B,UAAM,SAAS,KAAK,UAAU,MAAM,KAAK;AACzC,UAAM,WAAsB,CAAC;AAE7B,eAAW,SAAS,QAAQ;AAC3B,eAAS,KAAK,GAAG,KAAK,aAAa,KAAK,CAAC;AAAA,IAC1C;AAEA,SAAK,eAAe,KAAK,GAAG,QAAQ;AACpC,WAAO;AAAA,EACR;AAAA;AAAA,EAGA,QAAmB;AAClB,UAAM,YAAY,KAAK,UAAU,MAAM;AACvC,UAAM,WAAsB,CAAC;AAE7B,eAAW,SAAS,WAAW;AAC9B,eAAS,KAAK,GAAG,KAAK,aAAa,KAAK,CAAC;AAAA,IAC1C;AAEA,WAAO,KAAK,UAAU,SAAS,GAAG;AACjC,YAAM,QAAQ,KAAK,SAAS;AAC5B,WAAK,OAAO,KAAK;AAAA,QAChB,MAAM;AAAA,QACN,SAAS,MAAM;AAAA,QACf,SAAS,WAAW,MAAM,IAAI;AAAA,MAC/B,CAAC;AACD,YAAM,OAAO,KAAK,mBAAmB,KAAK;AAC1C,UAAI,KAAK,SAAS,GAAG;AACpB,aAAK,aAAa,EAAE,SAAS,KAAK,IAAI;AAAA,MACvC,OAAO;AACN,iBAAS,KAAK,IAAI;AAAA,MACnB;AAAA,IACD;AAEA,SAAK,eAAe,KAAK,GAAG,QAAQ;AACpC,WAAO;AAAA,EACR;AAAA,EAEA,WAAsB;AACrB,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,UAAqB;AACpB,WAAO;AAAA,MACN,QAAQ,CAAC,GAAG,KAAK,MAAM;AAAA,MACvB,WAAW,KAAK,eAAe;AAAA,MAC/B,YAAY,KAAK,UAAU,WAAW;AAAA,IACvC;AAAA,EACD;AAAA,EAEA,QAAc;AACb,SAAK,UAAU,MAAM;AACrB,SAAK,iBAAiB,CAAC;AACvB,SAAK,YAAY,CAAC;AAClB,SAAK,SAAS,CAAC;AAAA,EAChB;AAAA,EAEQ,aAAa,OAAyB;AAC7C,UAAM,QAAmB,CAAC;AAE1B,YAAQ,MAAM,MAAM;AAAA,MACnB;AACC,aAAK,YAAY,MAAM,KAAK,KAAK;AACjC;AAAA,MACD;AACC,aAAK,gBAAgB,OAAO,KAAK;AACjC;AAAA,MACD;AACC,aAAK,WAAW,KAAK;AACrB;AAAA,MACD;AACC,aAAK,YAAY,OAAO,KAAK;AAC7B;AAAA,IACF;AAEA,WAAO;AAAA,EACR;AAAA,EAEQ,YAAY,SAAiB,KAAsB;AAC1D,QAAI,QAAQ,WAAW,EAAG;AAE1B,UAAM,OAAkB,EAAE,MAAM,SAAS,QAAQ;AACjD,QAAI,KAAK,SAAS,GAAG;AACpB,WAAK,aAAa,EAAE,SAAS,KAAK,IAAI;AAAA,IACvC,OAAO;AACN,UAAI,KAAK,IAAI;AAAA,IACd;AAAA,EACD;AAAA,EAEQ,gBAAgB,OAAc,KAAsB;AAC3D,UAAM,OAAO,MAAM,QAAQ;AAC3B,QAAI,CAAC,KAAK,QAAQ,IAAI,GAAG;AACxB,WAAK,OAAO,KAAK;AAAA,QAChB,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS,sBAAsB,IAAI;AAAA,QACnC,KAAK,MAAM;AAAA,MACZ,CAAC;AACD,UAAI,CAAC,KAAK,QAAQ,aAAa;AAC9B,aAAK,YAAY,MAAM,KAAK,GAAG;AAAA,MAChC;AACA;AAAA,IACD;AAEA,UAAM,QAAQ,gBAAgB,MAAM,SAAS,EAAE;AAC/C,UAAM,OAAsB;AAAA,MAC3B,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,UAAU,CAAC;AAAA,MACX,aAAa;AAAA,IACd;AAEA,QAAI,KAAK,SAAS,GAAG;AACpB,WAAK,aAAa,EAAE,SAAS,KAAK,IAAI;AAAA,IACvC,OAAO;AACN,UAAI,KAAK,IAAI;AAAA,IACd;AAAA,EACD;AAAA,EAEQ,WAAW,OAAoB;AACtC,UAAM,OAAO,MAAM,QAAQ;AAC3B,QAAI,CAAC,KAAK,QAAQ,IAAI,GAAG;AACxB,WAAK,OAAO,KAAK;AAAA,QAChB,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS,sBAAsB,IAAI;AAAA,QACnC,KAAK,MAAM;AAAA,MACZ,CAAC;AACD;AAAA,IACD;AAEA,SAAK,UAAU,KAAK;AAAA,MACnB;AAAA,MACA,OAAO,gBAAgB,MAAM,SAAS,EAAE;AAAA,MACxC,UAAU,CAAC;AAAA,IACZ,CAAC;AAAA,EACF;AAAA,EAEQ,YAAY,OAAc,KAAsB;AACvD,UAAM,OAAO,MAAM,QAAQ;AAE3B,QAAI,WAAW;AACf,aAAS,IAAI,KAAK,UAAU,SAAS,GAAG,KAAK,GAAG,KAAK;AACpD,UAAI,KAAK,UAAU,CAAC,EAAE,SAAS,MAAM;AACpC,mBAAW;AACX;AAAA,MACD;AAAA,IACD;AAEA,QAAI,aAAa,IAAI;AACpB,WAAK,OAAO,KAAK;AAAA,QAChB,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS,oBAAoB,IAAI;AAAA,QACjC,KAAK,MAAM;AAAA,MACZ,CAAC;AACD;AAAA,IACD;AAGA,WAAO,KAAK,UAAU,SAAS,WAAW,GAAG;AAC5C,YAAM,SAAS,KAAK,SAAS;AAC7B,WAAK,OAAO,KAAK;AAAA,QAChB,MAAM;AAAA,QACN,SAAS,OAAO;AAAA,QAChB,SAAS,WAAW,OAAO,IAAI,iCAAiC,IAAI;AAAA,MACrE,CAAC;AACD,YAAM,aAAa,KAAK,mBAAmB,MAAM;AACjD,WAAK,UAAU,KAAK,UAAU,SAAS,CAAC,EAAE,SAAS,KAAK,UAAU;AAAA,IACnE;AAEA,UAAM,QAAQ,KAAK,SAAS;AAC5B,UAAM,OAAO,KAAK,mBAAmB,KAAK;AAE1C,QAAI,KAAK,SAAS,GAAG;AACpB,WAAK,aAAa,EAAE,SAAS,KAAK,IAAI;AAAA,IACvC,OAAO;AACN,UAAI,KAAK,IAAI;AAAA,IACd;AAAA,EACD;AAAA,EAEQ,mBAAmB,OAAiC;AAC3D,WAAO;AAAA,MACN,MAAM;AAAA,MACN,MAAM,MAAM;AAAA,MACZ,OAAO,MAAM;AAAA,MACb,UAAU,MAAM;AAAA,MAChB,aAAa;AAAA,IACd;AAAA,EACD;AAAA,EAEQ,WAAsB;AAC7B,WAAO,KAAK,UAAU,IAAI;AAAA,EAC3B;AAAA,EAEQ,WAAoB;AAC3B,WAAO,KAAK,UAAU,SAAS;AAAA,EAChC;AAAA,EAEQ,eAA0B;AACjC,WAAO,KAAK,UAAU,KAAK,UAAU,SAAS,CAAC;AAAA,EAChD;AAAA,EAEQ,QAAQ,MAAuB;AACtC,QAAI,KAAK,QAAQ,UAAU,SAAS,EAAG,QAAO;AAC9C,WAAO,KAAK,QAAQ,UAAU,IAAI,IAAI;AAAA,EACvC;AACD;;;ACvOO,SAAS,eAAe,UAA6B,SAAiC;AAC5F,QAAM,WAAqB,CAAC;AAE5B,MAAI,SAAS,UAAU;AACtB,aAAS,KAAK,QAAQ,UAAU,EAAE;AAAA,EACnC;AAEA,WAAS;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAEA,QAAM,OAAO,SAAS,IAAI;AAC1B,MAAI,KAAK,SAAS,GAAG;AACpB,aAAS,KAAK,iBAAiB,EAAE;AAEjC,QAAI,SAAS,UAAU,QAAQ,OAAO,SAAS,GAAG;AACjD,YAAM,UAAU,oBAAI,IAAY;AAEhC,iBAAW,SAAS,QAAQ,QAAQ;AACnC,iBAAS,KAAK,OAAO,MAAM,IAAI,EAAE;AACjC,YAAI,MAAM,OAAO;AAChB,qBAAW,QAAQ,MAAM,MAAO,UAAS,KAAK,KAAK,IAAI,EAAE;AAAA,QAC1D;AACA,iBAAS,KAAK,EAAE;AAChB,mBAAW,QAAQ,MAAM,YAAY;AACpC,gBAAM,MAAM,SAAS,IAAI,IAAI;AAC7B,cAAI,KAAK;AACR,qBAAS,KAAK,gBAAgB,GAAG,GAAG,EAAE;AACtC,oBAAQ,IAAI,IAAI;AAAA,UACjB;AAAA,QACD;AAAA,MACD;AAEA,iBAAW,OAAO,MAAM;AACvB,YAAI,CAAC,QAAQ,IAAI,IAAI,IAAI,EAAG,UAAS,KAAK,gBAAgB,GAAG,GAAG,EAAE;AAAA,MACnE;AAAA,IACD,OAAO;AACN,iBAAW,OAAO,KAAM,UAAS,KAAK,gBAAgB,GAAG,GAAG,EAAE;AAAA,IAC/D;AAAA,EACD;AAEA,WAAS;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAEA,MAAI,SAAS,mBAAmB,QAAQ,gBAAgB,SAAS,GAAG;AACnE,aAAS,KAAK,UAAU;AACxB,eAAW,QAAQ,QAAQ,gBAAiB,UAAS,KAAK,KAAK,IAAI,EAAE;AACrE,aAAS,KAAK,EAAE;AAAA,EACjB;AAEA,MAAI,SAAS,YAAY,QAAQ,SAAS,SAAS,GAAG;AACrD,aAAS,KAAK,cAAc,EAAE;AAC9B,eAAW,WAAW,QAAQ,SAAU,UAAS,KAAK,SAAS,EAAE;AAAA,EAClE;AAEA,SAAO,SAAS,KAAK,IAAI,EAAE,KAAK;AACjC;AAUA,SAAS,YAAY,KAAqB;AACzC,QAAM,WAAW,IAAI;AAErB,MAAI,aAAa,iBAAiB,aAAa,cAAc;AAC5D,WAAO,YAAY,IAAI,WAAW,QAAQ,CAAC,CAAC;AAAA,EAC7C;AAEA,MAAI,aAAa,WAAW;AAC3B,UAAM,OAAQ,IAAI,UAAuB,CAAC;AAC1C,WAAO,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,KAAK;AAAA,EAC5C;AAEA,MAAI,aAAa,YAAY;AAC5B,UAAM,QAAQ,YAAY,IAAI,MAAM,QAAQ,CAAC,CAAC;AAC9C,WAAO,GAAG,KAAK;AAAA,EAChB;AAEA,MAAI,aAAa,YAAa,QAAO;AACrC,MAAI,aAAa,YAAa,QAAO;AACrC,MAAI,aAAa,aAAc,QAAO;AAEtC,SAAO;AACR;AAEA,SAAS,gBAAgB,KAAkC;AAC1D,QAAM,UAAU,IAAI,aAAa,SAAS,SAAS;AACnD,QAAM,QAAQ,IAAI,MAAM;AACxB,QAAM,YAAY,OAAO,KAAK,KAAK;AAEnC,MAAI,UAAU,WAAW,GAAG;AAC3B,UAAMC,SAAQ,CAAC,MAAM,IAAI,IAAI,GAAG,OAAO,IAAI,KAAK,IAAI,WAAW,EAAE;AACjE,QAAI,IAAI,YAAY,IAAI,aAAa,QAAQ;AAC5C,MAAAA,OAAM,KAAK,0BAA0B;AAAA,IACtC;AACA,WAAOA,OAAM,KAAK,IAAI;AAAA,EACvB;AAEA,QAAM,MAAM,UAAU,IAAI,CAAC,SAAU,MAAM,IAAI,EAAE,WAAW,IAAI,GAAG,IAAI,MAAM,IAAK,EAAE,KAAK,GAAG;AAC5F,QAAM,QAAQ,CAAC,MAAM,IAAI,IAAI,IAAI,GAAG,GAAG,OAAO,IAAI,KAAK,IAAI,WAAW,EAAE;AAExE,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAClD,UAAM,OAAO,MAAM,KAAK,eAAe;AACvC,UAAM,UAAU,YAAY,MAAM,IAAI;AACtC,UAAM,MAAM,MAAM,WAAW,IAAI,gBAAgB;AACjD,UAAM,WAAW,UAAU,WAAM,OAAO,KAAK;AAC7C,UAAM,KAAK,KAAK,IAAI,GAAG,QAAQ,KAAK,IAAI,GAAG,GAAG,EAAE;AAAA,EACjD;AAEA,MAAI,IAAI,YAAY,IAAI,aAAa,QAAQ;AAC5C,UAAM,KAAK,0BAA0B;AAAA,EACtC;AAEA,SAAO,MAAM,KAAK,IAAI;AACvB;;;ACvIO,SAAS,gBAAgB,YAAsD;AACrF,SAAO;AACR;AAEO,IAAM,oBAAN,MAAwB;AAAA,EACtB,aAAa,oBAAI,IAAiC;AAAA,EAE1D,SAAS,YAAuC;AAC/C,SAAK,WAAW,IAAI,WAAW,MAAM,UAAU;AAC/C,WAAO;AAAA,EACR;AAAA,EAEA,YAAY,aAA0C;AACrD,eAAW,OAAO,YAAa,MAAK,SAAS,GAAG;AAChD,WAAO;AAAA,EACR;AAAA,EAEA,IAAI,MAA+C;AAClD,WAAO,KAAK,WAAW,IAAI,IAAI;AAAA,EAChC;AAAA,EAEA,IAAI,MAAuB;AAC1B,WAAO,KAAK,WAAW,IAAI,IAAI;AAAA,EAChC;AAAA,EAEA,QAAkB;AACjB,WAAO,CAAC,GAAG,KAAK,WAAW,KAAK,CAAC;AAAA,EAClC;AAAA,EAEA,MAA6B;AAC5B,WAAO,CAAC,GAAG,KAAK,WAAW,OAAO,CAAC;AAAA,EACpC;AAAA,EAEA,YAAyB;AACxB,WAAO,IAAI,IAAI,KAAK,WAAW,KAAK,CAAC;AAAA,EACtC;AAAA,EAEA,SAAS,SAAiB,OAAkD;AAC3E,UAAM,MAAM,KAAK,WAAW,IAAI,OAAO;AACvC,QAAI,CAAC,KAAK;AACT,aAAO,EAAE,OAAO,OAAO,QAAQ,CAAC,sBAAsB,OAAO,EAAE,EAAE;AAAA,IAClE;AAEA,UAAM,SAAS,IAAI,MAAM,UAAU,KAAK;AACxC,QAAI,OAAO,SAAS;AACnB,aAAO,EAAE,OAAO,MAAM,QAAQ,CAAC,GAAG,OAAO,OAAO,KAAgC;AAAA,IACjF;AAEA,WAAO;AAAA,MACN,OAAO;AAAA,MACP,QAAQ,OAAO,MAAM,OAAO;AAAA,QAC3B,CAAC,UAAsB,GAAG,MAAM,KAAK,KAAK,GAAG,CAAC,KAAK,MAAM,OAAO;AAAA,MACjE;AAAA,IACD;AAAA,EACD;AACD;","names":["TokenizerState","TokenType","lines"]}
package/dist/index.d.cts CHANGED
@@ -1,38 +1,6 @@
1
1
  import { z } from 'zod';
2
2
 
3
- declare enum TokenizerState {
4
- IN_PROSE = "IN_PROSE",
5
- IN_TAG = "IN_TAG",
6
- IN_STRING = "IN_STRING"
7
- }
8
- declare enum TokenType {
9
- PROSE = "PROSE",
10
- TAG_OPEN = "TAG_OPEN",
11
- TAG_SELF_CLOSE = "TAG_SELF_CLOSE",
12
- TAG_CLOSE = "TAG_CLOSE"
13
- }
14
- interface Token {
15
- type: TokenType;
16
- raw: string;
17
- name?: string;
18
- attrs?: string;
19
- selfClosing?: boolean;
20
- }
21
- declare class Tokenizer {
22
- private state;
23
- private buffer;
24
- private proseBuffer;
25
- private stringChar;
26
- private escaped;
27
- private tokens;
28
- getState(): TokenizerState;
29
- getBuffer(): string;
30
- write(chunk: string): Token[];
31
- flush(): Token[];
32
- reset(): void;
33
- private flushProse;
34
- private emitTag;
35
- }
3
+ declare function parseAttributes(input: string): Record<string, unknown>;
36
4
 
37
5
  interface ComponentDefinition {
38
6
  name: string;
@@ -119,8 +87,6 @@ declare class StreamingParser {
119
87
  private isKnown;
120
88
  }
121
89
 
122
- declare function parseAttributes(input: string): Record<string, unknown>;
123
-
124
90
  /** Type helper — returns the definition unchanged. */
125
91
  declare function defineComponent(definition: ComponentDefinition): ComponentDefinition;
126
92
  declare class ComponentRegistry {
@@ -137,4 +103,38 @@ declare class ComponentRegistry {
137
103
 
138
104
  declare function generatePrompt(registry: ComponentRegistry, options?: PromptOptions): string;
139
105
 
106
+ declare enum TokenizerState {
107
+ IN_PROSE = "IN_PROSE",
108
+ IN_TAG = "IN_TAG",
109
+ IN_STRING = "IN_STRING"
110
+ }
111
+ declare enum TokenType {
112
+ PROSE = "PROSE",
113
+ TAG_OPEN = "TAG_OPEN",
114
+ TAG_SELF_CLOSE = "TAG_SELF_CLOSE",
115
+ TAG_CLOSE = "TAG_CLOSE"
116
+ }
117
+ interface Token {
118
+ type: TokenType;
119
+ raw: string;
120
+ name?: string;
121
+ attrs?: string;
122
+ selfClosing?: boolean;
123
+ }
124
+ declare class Tokenizer {
125
+ private state;
126
+ private buffer;
127
+ private proseBuffer;
128
+ private stringChar;
129
+ private escaped;
130
+ private tokens;
131
+ getState(): TokenizerState;
132
+ getBuffer(): string;
133
+ write(chunk: string): Token[];
134
+ flush(): Token[];
135
+ reset(): void;
136
+ private flushProse;
137
+ private emitTag;
138
+ }
139
+
140
140
  export { type ASTNode, type ActionEvent, type ComponentDefinition, type ComponentGroup, type ComponentNode, ComponentRegistry, type ParseError, type ParseMeta, type ParserOptions, type PromptOptions, type ProseNode, StreamingParser, type Token, TokenType, Tokenizer, TokenizerState, type ValidationResult, defineComponent, generatePrompt, parseAttributes };
package/dist/index.d.ts CHANGED
@@ -1,38 +1,6 @@
1
1
  import { z } from 'zod';
2
2
 
3
- declare enum TokenizerState {
4
- IN_PROSE = "IN_PROSE",
5
- IN_TAG = "IN_TAG",
6
- IN_STRING = "IN_STRING"
7
- }
8
- declare enum TokenType {
9
- PROSE = "PROSE",
10
- TAG_OPEN = "TAG_OPEN",
11
- TAG_SELF_CLOSE = "TAG_SELF_CLOSE",
12
- TAG_CLOSE = "TAG_CLOSE"
13
- }
14
- interface Token {
15
- type: TokenType;
16
- raw: string;
17
- name?: string;
18
- attrs?: string;
19
- selfClosing?: boolean;
20
- }
21
- declare class Tokenizer {
22
- private state;
23
- private buffer;
24
- private proseBuffer;
25
- private stringChar;
26
- private escaped;
27
- private tokens;
28
- getState(): TokenizerState;
29
- getBuffer(): string;
30
- write(chunk: string): Token[];
31
- flush(): Token[];
32
- reset(): void;
33
- private flushProse;
34
- private emitTag;
35
- }
3
+ declare function parseAttributes(input: string): Record<string, unknown>;
36
4
 
37
5
  interface ComponentDefinition {
38
6
  name: string;
@@ -119,8 +87,6 @@ declare class StreamingParser {
119
87
  private isKnown;
120
88
  }
121
89
 
122
- declare function parseAttributes(input: string): Record<string, unknown>;
123
-
124
90
  /** Type helper — returns the definition unchanged. */
125
91
  declare function defineComponent(definition: ComponentDefinition): ComponentDefinition;
126
92
  declare class ComponentRegistry {
@@ -137,4 +103,38 @@ declare class ComponentRegistry {
137
103
 
138
104
  declare function generatePrompt(registry: ComponentRegistry, options?: PromptOptions): string;
139
105
 
106
+ declare enum TokenizerState {
107
+ IN_PROSE = "IN_PROSE",
108
+ IN_TAG = "IN_TAG",
109
+ IN_STRING = "IN_STRING"
110
+ }
111
+ declare enum TokenType {
112
+ PROSE = "PROSE",
113
+ TAG_OPEN = "TAG_OPEN",
114
+ TAG_SELF_CLOSE = "TAG_SELF_CLOSE",
115
+ TAG_CLOSE = "TAG_CLOSE"
116
+ }
117
+ interface Token {
118
+ type: TokenType;
119
+ raw: string;
120
+ name?: string;
121
+ attrs?: string;
122
+ selfClosing?: boolean;
123
+ }
124
+ declare class Tokenizer {
125
+ private state;
126
+ private buffer;
127
+ private proseBuffer;
128
+ private stringChar;
129
+ private escaped;
130
+ private tokens;
131
+ getState(): TokenizerState;
132
+ getBuffer(): string;
133
+ write(chunk: string): Token[];
134
+ flush(): Token[];
135
+ reset(): void;
136
+ private flushProse;
137
+ private emitTag;
138
+ }
139
+
140
140
  export { type ASTNode, type ActionEvent, type ComponentDefinition, type ComponentGroup, type ComponentNode, ComponentRegistry, type ParseError, type ParseMeta, type ParserOptions, type PromptOptions, type ProseNode, StreamingParser, type Token, TokenType, Tokenizer, TokenizerState, type ValidationResult, defineComponent, generatePrompt, parseAttributes };
package/dist/index.js CHANGED
@@ -1,123 +1,3 @@
1
- // src/tokenizer.ts
2
- var TokenizerState = /* @__PURE__ */ ((TokenizerState2) => {
3
- TokenizerState2["IN_PROSE"] = "IN_PROSE";
4
- TokenizerState2["IN_TAG"] = "IN_TAG";
5
- TokenizerState2["IN_STRING"] = "IN_STRING";
6
- return TokenizerState2;
7
- })(TokenizerState || {});
8
- var TokenType = /* @__PURE__ */ ((TokenType2) => {
9
- TokenType2["PROSE"] = "PROSE";
10
- TokenType2["TAG_OPEN"] = "TAG_OPEN";
11
- TokenType2["TAG_SELF_CLOSE"] = "TAG_SELF_CLOSE";
12
- TokenType2["TAG_CLOSE"] = "TAG_CLOSE";
13
- return TokenType2;
14
- })(TokenType || {});
15
- var Tokenizer = class {
16
- state = "IN_PROSE" /* IN_PROSE */;
17
- buffer = "";
18
- proseBuffer = "";
19
- stringChar = null;
20
- escaped = false;
21
- tokens = [];
22
- getState() {
23
- return this.state;
24
- }
25
- getBuffer() {
26
- return this.buffer;
27
- }
28
- write(chunk) {
29
- this.tokens = [];
30
- for (let i = 0; i < chunk.length; i++) {
31
- const char = chunk[i];
32
- const next = chunk[i + 1];
33
- switch (this.state) {
34
- case "IN_PROSE" /* IN_PROSE */:
35
- if (char === "{" && next === "%") {
36
- this.flushProse();
37
- this.buffer = "{%";
38
- this.state = "IN_TAG" /* IN_TAG */;
39
- i++;
40
- } else {
41
- this.proseBuffer += char;
42
- }
43
- break;
44
- case "IN_TAG" /* IN_TAG */:
45
- this.buffer += char;
46
- if (char === '"' || char === "'") {
47
- this.stringChar = char;
48
- this.escaped = false;
49
- this.state = "IN_STRING" /* IN_STRING */;
50
- } else if (char === "%" && next === "}") {
51
- this.buffer += "}";
52
- i++;
53
- this.emitTag();
54
- this.state = "IN_PROSE" /* IN_PROSE */;
55
- }
56
- break;
57
- case "IN_STRING" /* IN_STRING */:
58
- this.buffer += char;
59
- if (this.escaped) {
60
- this.escaped = false;
61
- } else if (char === "\\") {
62
- this.escaped = true;
63
- } else if (char === this.stringChar) {
64
- this.stringChar = null;
65
- this.state = "IN_TAG" /* IN_TAG */;
66
- }
67
- break;
68
- }
69
- }
70
- if (this.state === "IN_PROSE" /* IN_PROSE */) {
71
- this.flushProse();
72
- }
73
- return this.tokens;
74
- }
75
- flush() {
76
- this.tokens = [];
77
- if (this.state === "IN_TAG" /* IN_TAG */ || this.state === "IN_STRING" /* IN_STRING */) {
78
- this.proseBuffer += this.buffer;
79
- this.buffer = "";
80
- this.state = "IN_PROSE" /* IN_PROSE */;
81
- }
82
- this.flushProse();
83
- return this.tokens;
84
- }
85
- reset() {
86
- this.state = "IN_PROSE" /* IN_PROSE */;
87
- this.buffer = "";
88
- this.proseBuffer = "";
89
- this.stringChar = null;
90
- this.escaped = false;
91
- this.tokens = [];
92
- }
93
- flushProse() {
94
- if (this.proseBuffer.length > 0) {
95
- this.tokens.push({ type: "PROSE" /* PROSE */, raw: this.proseBuffer });
96
- this.proseBuffer = "";
97
- }
98
- }
99
- emitTag() {
100
- const raw = this.buffer;
101
- this.buffer = "";
102
- const inner = raw.slice(2, -2).trim();
103
- if (inner.length === 0) return;
104
- if (inner.startsWith("/")) {
105
- this.tokens.push({ type: "TAG_CLOSE" /* TAG_CLOSE */, raw, name: inner.slice(1).trim() });
106
- return;
107
- }
108
- const selfClosing = inner.endsWith("/");
109
- const content = selfClosing ? inner.slice(0, -1).trim() : inner;
110
- const spaceIdx = content.indexOf(" ");
111
- this.tokens.push({
112
- type: selfClosing ? "TAG_SELF_CLOSE" /* TAG_SELF_CLOSE */ : "TAG_OPEN" /* TAG_OPEN */,
113
- raw,
114
- name: spaceIdx === -1 ? content : content.slice(0, spaceIdx),
115
- attrs: spaceIdx === -1 ? "" : content.slice(spaceIdx + 1).trim(),
116
- selfClosing
117
- });
118
- }
119
- };
120
-
121
1
  // src/attributes.ts
122
2
  var UNSAFE_KEYS = /* @__PURE__ */ new Set(["__proto__", "constructor", "prototype"]);
123
3
  function parseAttributes(input) {
@@ -245,6 +125,126 @@ function coerce(raw) {
245
125
  return raw;
246
126
  }
247
127
 
128
+ // src/tokenizer.ts
129
+ var TokenizerState = /* @__PURE__ */ ((TokenizerState2) => {
130
+ TokenizerState2["IN_PROSE"] = "IN_PROSE";
131
+ TokenizerState2["IN_TAG"] = "IN_TAG";
132
+ TokenizerState2["IN_STRING"] = "IN_STRING";
133
+ return TokenizerState2;
134
+ })(TokenizerState || {});
135
+ var TokenType = /* @__PURE__ */ ((TokenType2) => {
136
+ TokenType2["PROSE"] = "PROSE";
137
+ TokenType2["TAG_OPEN"] = "TAG_OPEN";
138
+ TokenType2["TAG_SELF_CLOSE"] = "TAG_SELF_CLOSE";
139
+ TokenType2["TAG_CLOSE"] = "TAG_CLOSE";
140
+ return TokenType2;
141
+ })(TokenType || {});
142
+ var Tokenizer = class {
143
+ state = "IN_PROSE" /* IN_PROSE */;
144
+ buffer = "";
145
+ proseBuffer = "";
146
+ stringChar = null;
147
+ escaped = false;
148
+ tokens = [];
149
+ getState() {
150
+ return this.state;
151
+ }
152
+ getBuffer() {
153
+ return this.buffer;
154
+ }
155
+ write(chunk) {
156
+ this.tokens = [];
157
+ for (let i = 0; i < chunk.length; i++) {
158
+ const char = chunk[i];
159
+ const next = chunk[i + 1];
160
+ switch (this.state) {
161
+ case "IN_PROSE" /* IN_PROSE */:
162
+ if (char === "{" && next === "%") {
163
+ this.flushProse();
164
+ this.buffer = "{%";
165
+ this.state = "IN_TAG" /* IN_TAG */;
166
+ i++;
167
+ } else {
168
+ this.proseBuffer += char;
169
+ }
170
+ break;
171
+ case "IN_TAG" /* IN_TAG */:
172
+ this.buffer += char;
173
+ if (char === '"' || char === "'") {
174
+ this.stringChar = char;
175
+ this.escaped = false;
176
+ this.state = "IN_STRING" /* IN_STRING */;
177
+ } else if (char === "%" && next === "}") {
178
+ this.buffer += "}";
179
+ i++;
180
+ this.emitTag();
181
+ this.state = "IN_PROSE" /* IN_PROSE */;
182
+ }
183
+ break;
184
+ case "IN_STRING" /* IN_STRING */:
185
+ this.buffer += char;
186
+ if (this.escaped) {
187
+ this.escaped = false;
188
+ } else if (char === "\\") {
189
+ this.escaped = true;
190
+ } else if (char === this.stringChar) {
191
+ this.stringChar = null;
192
+ this.state = "IN_TAG" /* IN_TAG */;
193
+ }
194
+ break;
195
+ }
196
+ }
197
+ if (this.state === "IN_PROSE" /* IN_PROSE */) {
198
+ this.flushProse();
199
+ }
200
+ return this.tokens;
201
+ }
202
+ flush() {
203
+ this.tokens = [];
204
+ if (this.state === "IN_TAG" /* IN_TAG */ || this.state === "IN_STRING" /* IN_STRING */) {
205
+ this.proseBuffer += this.buffer;
206
+ this.buffer = "";
207
+ this.state = "IN_PROSE" /* IN_PROSE */;
208
+ }
209
+ this.flushProse();
210
+ return this.tokens;
211
+ }
212
+ reset() {
213
+ this.state = "IN_PROSE" /* IN_PROSE */;
214
+ this.buffer = "";
215
+ this.proseBuffer = "";
216
+ this.stringChar = null;
217
+ this.escaped = false;
218
+ this.tokens = [];
219
+ }
220
+ flushProse() {
221
+ if (this.proseBuffer.length > 0) {
222
+ this.tokens.push({ type: "PROSE" /* PROSE */, raw: this.proseBuffer });
223
+ this.proseBuffer = "";
224
+ }
225
+ }
226
+ emitTag() {
227
+ const raw = this.buffer;
228
+ this.buffer = "";
229
+ const inner = raw.slice(2, -2).trim();
230
+ if (inner.length === 0) return;
231
+ if (inner.startsWith("/")) {
232
+ this.tokens.push({ type: "TAG_CLOSE" /* TAG_CLOSE */, raw, name: inner.slice(1).trim() });
233
+ return;
234
+ }
235
+ const selfClosing = inner.endsWith("/");
236
+ const content = selfClosing ? inner.slice(0, -1).trim() : inner;
237
+ const spaceIdx = content.indexOf(" ");
238
+ this.tokens.push({
239
+ type: selfClosing ? "TAG_SELF_CLOSE" /* TAG_SELF_CLOSE */ : "TAG_OPEN" /* TAG_OPEN */,
240
+ raw,
241
+ name: spaceIdx === -1 ? content : content.slice(0, spaceIdx),
242
+ attrs: spaceIdx === -1 ? "" : content.slice(spaceIdx + 1).trim(),
243
+ selfClosing
244
+ });
245
+ }
246
+ };
247
+
248
248
  // src/parser.ts
249
249
  var StreamingParser = class {
250
250
  tokenizer = new Tokenizer();
@@ -439,53 +439,6 @@ var StreamingParser = class {
439
439
  }
440
440
  };
441
441
 
442
- // src/registry.ts
443
- function defineComponent(definition) {
444
- return definition;
445
- }
446
- var ComponentRegistry = class {
447
- components = /* @__PURE__ */ new Map();
448
- register(definition) {
449
- this.components.set(definition.name, definition);
450
- return this;
451
- }
452
- registerAll(definitions) {
453
- for (const def of definitions) this.register(def);
454
- return this;
455
- }
456
- get(name) {
457
- return this.components.get(name);
458
- }
459
- has(name) {
460
- return this.components.has(name);
461
- }
462
- names() {
463
- return [...this.components.keys()];
464
- }
465
- all() {
466
- return [...this.components.values()];
467
- }
468
- knownTags() {
469
- return new Set(this.components.keys());
470
- }
471
- validate(tagName, props) {
472
- const def = this.components.get(tagName);
473
- if (!def) {
474
- return { valid: false, errors: [`Unknown component: ${tagName}`] };
475
- }
476
- const result = def.props.safeParse(props);
477
- if (result.success) {
478
- return { valid: true, errors: [], props: result.data };
479
- }
480
- return {
481
- valid: false,
482
- errors: result.error.issues.map(
483
- (issue) => `${issue.path.join(".")}: ${issue.message}`
484
- )
485
- };
486
- }
487
- };
488
-
489
442
  // src/prompt.ts
490
443
  function generatePrompt(registry, options) {
491
444
  const sections = [];
@@ -594,6 +547,53 @@ function formatComponent(def) {
594
547
  }
595
548
  return lines.join("\n");
596
549
  }
550
+
551
+ // src/registry.ts
552
+ function defineComponent(definition) {
553
+ return definition;
554
+ }
555
+ var ComponentRegistry = class {
556
+ components = /* @__PURE__ */ new Map();
557
+ register(definition) {
558
+ this.components.set(definition.name, definition);
559
+ return this;
560
+ }
561
+ registerAll(definitions) {
562
+ for (const def of definitions) this.register(def);
563
+ return this;
564
+ }
565
+ get(name) {
566
+ return this.components.get(name);
567
+ }
568
+ has(name) {
569
+ return this.components.has(name);
570
+ }
571
+ names() {
572
+ return [...this.components.keys()];
573
+ }
574
+ all() {
575
+ return [...this.components.values()];
576
+ }
577
+ knownTags() {
578
+ return new Set(this.components.keys());
579
+ }
580
+ validate(tagName, props) {
581
+ const def = this.components.get(tagName);
582
+ if (!def) {
583
+ return { valid: false, errors: [`Unknown component: ${tagName}`] };
584
+ }
585
+ const result = def.props.safeParse(props);
586
+ if (result.success) {
587
+ return { valid: true, errors: [], props: result.data };
588
+ }
589
+ return {
590
+ valid: false,
591
+ errors: result.error.issues.map(
592
+ (issue) => `${issue.path.join(".")}: ${issue.message}`
593
+ )
594
+ };
595
+ }
596
+ };
597
597
  export {
598
598
  ComponentRegistry,
599
599
  StreamingParser,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tokenizer.ts","../src/attributes.ts","../src/parser.ts","../src/registry.ts","../src/prompt.ts"],"sourcesContent":["export enum TokenizerState {\n\tIN_PROSE = 'IN_PROSE',\n\tIN_TAG = 'IN_TAG',\n\tIN_STRING = 'IN_STRING',\n}\n\nexport enum TokenType {\n\tPROSE = 'PROSE',\n\tTAG_OPEN = 'TAG_OPEN',\n\tTAG_SELF_CLOSE = 'TAG_SELF_CLOSE',\n\tTAG_CLOSE = 'TAG_CLOSE',\n}\n\nexport interface Token {\n\ttype: TokenType\n\traw: string\n\tname?: string\n\tattrs?: string\n\tselfClosing?: boolean\n}\n\nexport class Tokenizer {\n\tprivate state: TokenizerState = TokenizerState.IN_PROSE\n\tprivate buffer = ''\n\tprivate proseBuffer = ''\n\tprivate stringChar: string | null = null\n\tprivate escaped = false\n\tprivate tokens: Token[] = []\n\n\tgetState(): TokenizerState {\n\t\treturn this.state\n\t}\n\n\tgetBuffer(): string {\n\t\treturn this.buffer\n\t}\n\n\twrite(chunk: string): Token[] {\n\t\tthis.tokens = []\n\n\t\tfor (let i = 0; i < chunk.length; i++) {\n\t\t\tconst char = chunk[i]\n\t\t\tconst next = chunk[i + 1]\n\n\t\t\tswitch (this.state) {\n\t\t\t\tcase TokenizerState.IN_PROSE:\n\t\t\t\t\tif (char === '{' && next === '%') {\n\t\t\t\t\t\tthis.flushProse()\n\t\t\t\t\t\tthis.buffer = '{%'\n\t\t\t\t\t\tthis.state = TokenizerState.IN_TAG\n\t\t\t\t\t\ti++\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.proseBuffer += char\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\n\t\t\t\tcase TokenizerState.IN_TAG:\n\t\t\t\t\tthis.buffer += char\n\t\t\t\t\tif (char === '\"' || char === \"'\") {\n\t\t\t\t\t\tthis.stringChar = char\n\t\t\t\t\t\tthis.escaped = false\n\t\t\t\t\t\tthis.state = TokenizerState.IN_STRING\n\t\t\t\t\t} else if (char === '%' && next === '}') {\n\t\t\t\t\t\tthis.buffer += '}'\n\t\t\t\t\t\ti++\n\t\t\t\t\t\tthis.emitTag()\n\t\t\t\t\t\tthis.state = TokenizerState.IN_PROSE\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\n\t\t\t\tcase TokenizerState.IN_STRING:\n\t\t\t\t\tthis.buffer += char\n\t\t\t\t\tif (this.escaped) {\n\t\t\t\t\t\tthis.escaped = false\n\t\t\t\t\t} else if (char === '\\\\') {\n\t\t\t\t\t\tthis.escaped = true\n\t\t\t\t\t} else if (char === this.stringChar) {\n\t\t\t\t\t\tthis.stringChar = null\n\t\t\t\t\t\tthis.state = TokenizerState.IN_TAG\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif (this.state === TokenizerState.IN_PROSE) {\n\t\t\tthis.flushProse()\n\t\t}\n\n\t\treturn this.tokens\n\t}\n\n\tflush(): Token[] {\n\t\tthis.tokens = []\n\n\t\tif (this.state === TokenizerState.IN_TAG || this.state === TokenizerState.IN_STRING) {\n\t\t\tthis.proseBuffer += this.buffer\n\t\t\tthis.buffer = ''\n\t\t\tthis.state = TokenizerState.IN_PROSE\n\t\t}\n\n\t\tthis.flushProse()\n\t\treturn this.tokens\n\t}\n\n\treset(): void {\n\t\tthis.state = TokenizerState.IN_PROSE\n\t\tthis.buffer = ''\n\t\tthis.proseBuffer = ''\n\t\tthis.stringChar = null\n\t\tthis.escaped = false\n\t\tthis.tokens = []\n\t}\n\n\tprivate flushProse(): void {\n\t\tif (this.proseBuffer.length > 0) {\n\t\t\tthis.tokens.push({ type: TokenType.PROSE, raw: this.proseBuffer })\n\t\t\tthis.proseBuffer = ''\n\t\t}\n\t}\n\n\tprivate emitTag(): void {\n\t\tconst raw = this.buffer\n\t\tthis.buffer = ''\n\n\t\tconst inner = raw.slice(2, -2).trim()\n\t\tif (inner.length === 0) return\n\n\t\tif (inner.startsWith('/')) {\n\t\t\tthis.tokens.push({ type: TokenType.TAG_CLOSE, raw, name: inner.slice(1).trim() })\n\t\t\treturn\n\t\t}\n\n\t\tconst selfClosing = inner.endsWith('/')\n\t\tconst content = selfClosing ? inner.slice(0, -1).trim() : inner\n\t\tconst spaceIdx = content.indexOf(' ')\n\n\t\tthis.tokens.push({\n\t\t\ttype: selfClosing ? TokenType.TAG_SELF_CLOSE : TokenType.TAG_OPEN,\n\t\t\traw,\n\t\t\tname: spaceIdx === -1 ? content : content.slice(0, spaceIdx),\n\t\t\tattrs: spaceIdx === -1 ? '' : content.slice(spaceIdx + 1).trim(),\n\t\t\tselfClosing,\n\t\t})\n\t}\n}\n","const UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype'])\n\nexport function parseAttributes(input: string): Record<string, unknown> {\n\tconst result = Object.create(null) as Record<string, unknown>\n\tlet i = 0\n\n\twhile (i < input.length) {\n\t\twhile (i < input.length && isWhitespace(input[i])) i++\n\t\tif (i >= input.length) break\n\n\t\tconst keyStart = i\n\t\twhile (i < input.length && input[i] !== '=' && !isWhitespace(input[i])) i++\n\t\tconst key = input.slice(keyStart, i)\n\t\tif (key.length === 0) break\n\n\t\tif (UNSAFE_KEYS.has(key)) {\n\t\t\t// skip past the value if there is one\n\t\t\twhile (i < input.length && isWhitespace(input[i])) i++\n\t\t\tif (i < input.length && input[i] === '=') {\n\t\t\t\ti++\n\t\t\t\ti = skipValue(input, i)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\twhile (i < input.length && isWhitespace(input[i])) i++\n\n\t\tif (i >= input.length || input[i] !== '=') {\n\t\t\tresult[key] = true\n\t\t\tcontinue\n\t\t}\n\t\ti++ // skip =\n\t\twhile (i < input.length && isWhitespace(input[i])) i++\n\n\t\tif (i >= input.length) {\n\t\t\tresult[key] = true\n\t\t\tbreak\n\t\t}\n\n\t\tconst char = input[i]\n\n\t\tif (char === '\"' || char === \"'\") {\n\t\t\tconst quote = char\n\t\t\ti++\n\t\t\tlet value = ''\n\t\t\twhile (i < input.length && input[i] !== quote) {\n\t\t\t\tif (input[i] === '\\\\' && i + 1 < input.length) {\n\t\t\t\t\tvalue += input[i + 1]\n\t\t\t\t\ti += 2\n\t\t\t\t} else {\n\t\t\t\t\tvalue += input[i]\n\t\t\t\t\ti++\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (i < input.length) i++ // skip closing quote\n\t\t\tresult[key] = value\n\t\t} else if (char === '[') {\n\t\t\tconst start = i\n\t\t\tlet depth = 1\n\t\t\ti++\n\t\t\tlet inStr = false\n\t\t\tlet strChar = ''\n\t\t\tlet escaped = false\n\t\t\twhile (i < input.length && depth > 0) {\n\t\t\t\tif (inStr) {\n\t\t\t\t\tif (escaped) {\n\t\t\t\t\t\tescaped = false\n\t\t\t\t\t} else if (input[i] === '\\\\') {\n\t\t\t\t\t\tescaped = true\n\t\t\t\t\t} else if (input[i] === strChar) {\n\t\t\t\t\t\tinStr = false\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (input[i] === '\"' || input[i] === \"'\") {\n\t\t\t\t\t\tinStr = true\n\t\t\t\t\t\tstrChar = input[i]\n\t\t\t\t\t} else if (input[i] === '[') {\n\t\t\t\t\t\tdepth++\n\t\t\t\t\t} else if (input[i] === ']') {\n\t\t\t\t\t\tdepth--\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ti++\n\t\t\t}\n\t\t\tconst raw = input.slice(start, i)\n\t\t\ttry {\n\t\t\t\tresult[key] = JSON.parse(raw)\n\t\t\t} catch {\n\t\t\t\tresult[key] = raw\n\t\t\t}\n\t\t} else {\n\t\t\tconst valStart = i\n\t\t\twhile (i < input.length && !isWhitespace(input[i])) i++\n\t\t\tconst raw = input.slice(valStart, i)\n\t\t\tresult[key] = coerce(raw)\n\t\t}\n\t}\n\n\treturn result\n}\n\nfunction skipValue(input: string, start: number): number {\n\tlet pos = start\n\twhile (pos < input.length && isWhitespace(input[pos])) pos++\n\tif (pos >= input.length) return pos\n\n\tconst ch = input[pos]\n\tif (ch === '\"' || ch === \"'\") {\n\t\tpos++\n\t\twhile (pos < input.length && input[pos] !== ch) {\n\t\t\tif (input[pos] === '\\\\') pos++\n\t\t\tpos++\n\t\t}\n\t\tif (pos < input.length) pos++\n\t} else if (ch === '[') {\n\t\tlet depth = 1\n\t\tpos++\n\t\twhile (pos < input.length && depth > 0) {\n\t\t\tif (input[pos] === '[') depth++\n\t\t\telse if (input[pos] === ']') depth--\n\t\t\tpos++\n\t\t}\n\t} else {\n\t\twhile (pos < input.length && !isWhitespace(input[pos])) pos++\n\t}\n\treturn pos\n}\n\nfunction isWhitespace(ch: string): boolean {\n\treturn ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r'\n}\n\nfunction coerce(raw: string): unknown {\n\tif (raw === 'true') return true\n\tif (raw === 'false') return false\n\tif (raw === 'null') return null\n\tconst num = Number(raw)\n\tif (!Number.isNaN(num) && raw.length > 0) return num\n\treturn raw\n}\n","import { parseAttributes } from './attributes'\nimport { TokenType, Tokenizer } from './tokenizer'\nimport type { Token } from './tokenizer'\nimport type { ASTNode, ComponentNode, ParseError, ParseMeta, ProseNode } from './types'\n\nexport interface ParserOptions {\n\tdropUnknown?: boolean\n\tknownTags?: Set<string>\n}\n\nexport class StreamingParser {\n\tprivate tokenizer = new Tokenizer()\n\tprivate completedNodes: ASTNode[] = []\n\tprivate bodyStack: BodyFrame[] = []\n\tprivate errors: ParseError[] = []\n\tprivate options: Required<ParserOptions>\n\n\tconstructor(options?: ParserOptions) {\n\t\tthis.options = {\n\t\t\tdropUnknown: options?.dropUnknown ?? true,\n\t\t\tknownTags: options?.knownTags ?? new Set(),\n\t\t}\n\t}\n\n\twrite(chunk: string): ASTNode[] {\n\t\tconst tokens = this.tokenizer.write(chunk)\n\t\tconst newNodes: ASTNode[] = []\n\n\t\tfor (const token of tokens) {\n\t\t\tnewNodes.push(...this.processToken(token))\n\t\t}\n\n\t\tthis.completedNodes.push(...newNodes)\n\t\treturn newNodes\n\t}\n\n\t/** Flush remaining buffers. Open body tags are force-closed. */\n\tflush(): ASTNode[] {\n\t\tconst remaining = this.tokenizer.flush()\n\t\tconst newNodes: ASTNode[] = []\n\n\t\tfor (const token of remaining) {\n\t\t\tnewNodes.push(...this.processToken(token))\n\t\t}\n\n\t\twhile (this.bodyStack.length > 0) {\n\t\t\tconst frame = this.popFrame()\n\t\t\tthis.errors.push({\n\t\t\t\tcode: 'unclosed',\n\t\t\t\ttagName: frame.name,\n\t\t\t\tmessage: `Tag \"{% ${frame.name} %}\" was never closed`,\n\t\t\t})\n\t\t\tconst node = this.buildComponentNode(frame)\n\t\t\tif (this.isInBody()) {\n\t\t\t\tthis.currentFrame().children.push(node)\n\t\t\t} else {\n\t\t\t\tnewNodes.push(node)\n\t\t\t}\n\t\t}\n\n\t\tthis.completedNodes.push(...newNodes)\n\t\treturn newNodes\n\t}\n\n\tgetNodes(): ASTNode[] {\n\t\treturn this.completedNodes\n\t}\n\n\tgetMeta(): ParseMeta {\n\t\treturn {\n\t\t\terrors: [...this.errors],\n\t\t\tnodeCount: this.completedNodes.length,\n\t\t\tisComplete: this.bodyStack.length === 0,\n\t\t}\n\t}\n\n\treset(): void {\n\t\tthis.tokenizer.reset()\n\t\tthis.completedNodes = []\n\t\tthis.bodyStack = []\n\t\tthis.errors = []\n\t}\n\n\tprivate processToken(token: Token): ASTNode[] {\n\t\tconst nodes: ASTNode[] = []\n\n\t\tswitch (token.type) {\n\t\t\tcase TokenType.PROSE:\n\t\t\t\tthis.handleProse(token.raw, nodes)\n\t\t\t\tbreak\n\t\t\tcase TokenType.TAG_SELF_CLOSE:\n\t\t\t\tthis.handleSelfClose(token, nodes)\n\t\t\t\tbreak\n\t\t\tcase TokenType.TAG_OPEN:\n\t\t\t\tthis.handleOpen(token)\n\t\t\t\tbreak\n\t\t\tcase TokenType.TAG_CLOSE:\n\t\t\t\tthis.handleClose(token, nodes)\n\t\t\t\tbreak\n\t\t}\n\n\t\treturn nodes\n\t}\n\n\tprivate handleProse(content: string, out: ASTNode[]): void {\n\t\tif (content.length === 0) return\n\n\t\tconst node: ProseNode = { type: 'prose', content }\n\t\tif (this.isInBody()) {\n\t\t\tthis.currentFrame().children.push(node)\n\t\t} else {\n\t\t\tout.push(node)\n\t\t}\n\t}\n\n\tprivate handleSelfClose(token: Token, out: ASTNode[]): void {\n\t\tconst name = token.name ?? ''\n\t\tif (!this.isKnown(name)) {\n\t\t\tthis.errors.push({\n\t\t\t\tcode: 'unknown_tag',\n\t\t\t\ttagName: name,\n\t\t\t\tmessage: `Unknown component: ${name}`,\n\t\t\t\traw: token.raw,\n\t\t\t})\n\t\t\tif (!this.options.dropUnknown) {\n\t\t\t\tthis.handleProse(token.raw, out)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst props = parseAttributes(token.attrs ?? '')\n\t\tconst node: ComponentNode = {\n\t\t\ttype: 'component',\n\t\t\tname,\n\t\t\tprops,\n\t\t\tchildren: [],\n\t\t\tselfClosing: true,\n\t\t}\n\n\t\tif (this.isInBody()) {\n\t\t\tthis.currentFrame().children.push(node)\n\t\t} else {\n\t\t\tout.push(node)\n\t\t}\n\t}\n\n\tprivate handleOpen(token: Token): void {\n\t\tconst name = token.name ?? ''\n\t\tif (!this.isKnown(name)) {\n\t\t\tthis.errors.push({\n\t\t\t\tcode: 'unknown_tag',\n\t\t\t\ttagName: name,\n\t\t\t\tmessage: `Unknown component: ${name}`,\n\t\t\t\traw: token.raw,\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\tthis.bodyStack.push({\n\t\t\tname,\n\t\t\tprops: parseAttributes(token.attrs ?? ''),\n\t\t\tchildren: [],\n\t\t})\n\t}\n\n\tprivate handleClose(token: Token, out: ASTNode[]): void {\n\t\tconst name = token.name ?? ''\n\n\t\tlet frameIdx = -1\n\t\tfor (let i = this.bodyStack.length - 1; i >= 0; i--) {\n\t\t\tif (this.bodyStack[i].name === name) {\n\t\t\t\tframeIdx = i\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif (frameIdx === -1) {\n\t\t\tthis.errors.push({\n\t\t\t\tcode: 'malformed',\n\t\t\t\ttagName: name,\n\t\t\t\tmessage: `Closing tag \"{% /${name} %}\" has no matching opening tag`,\n\t\t\t\traw: token.raw,\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\t// force-close anything nested above the matching opener\n\t\twhile (this.bodyStack.length > frameIdx + 1) {\n\t\t\tconst orphan = this.popFrame()\n\t\t\tthis.errors.push({\n\t\t\t\tcode: 'unclosed',\n\t\t\t\ttagName: orphan.name,\n\t\t\t\tmessage: `Tag \"{% ${orphan.name} %}\" was force-closed by \"{% /${name} %}\"`,\n\t\t\t})\n\t\t\tconst orphanNode = this.buildComponentNode(orphan)\n\t\t\tthis.bodyStack[this.bodyStack.length - 1].children.push(orphanNode)\n\t\t}\n\n\t\tconst frame = this.popFrame()\n\t\tconst node = this.buildComponentNode(frame)\n\n\t\tif (this.isInBody()) {\n\t\t\tthis.currentFrame().children.push(node)\n\t\t} else {\n\t\t\tout.push(node)\n\t\t}\n\t}\n\n\tprivate buildComponentNode(frame: BodyFrame): ComponentNode {\n\t\treturn {\n\t\t\ttype: 'component',\n\t\t\tname: frame.name,\n\t\t\tprops: frame.props,\n\t\t\tchildren: frame.children,\n\t\t\tselfClosing: false,\n\t\t}\n\t}\n\n\tprivate popFrame(): BodyFrame {\n\t\treturn this.bodyStack.pop() as BodyFrame\n\t}\n\n\tprivate isInBody(): boolean {\n\t\treturn this.bodyStack.length > 0\n\t}\n\n\tprivate currentFrame(): BodyFrame {\n\t\treturn this.bodyStack[this.bodyStack.length - 1]\n\t}\n\n\tprivate isKnown(name: string): boolean {\n\t\tif (this.options.knownTags.size === 0) return true\n\t\treturn this.options.knownTags.has(name)\n\t}\n}\n\ninterface BodyFrame {\n\tname: string\n\tprops: Record<string, unknown>\n\tchildren: ASTNode[]\n}\n","import type { z } from 'zod'\nimport type { ComponentDefinition, ValidationResult } from './types'\n\n/** Type helper — returns the definition unchanged. */\nexport function defineComponent(definition: ComponentDefinition): ComponentDefinition {\n\treturn definition\n}\n\nexport class ComponentRegistry {\n\tprivate components = new Map<string, ComponentDefinition>()\n\n\tregister(definition: ComponentDefinition): this {\n\t\tthis.components.set(definition.name, definition)\n\t\treturn this\n\t}\n\n\tregisterAll(definitions: ComponentDefinition[]): this {\n\t\tfor (const def of definitions) this.register(def)\n\t\treturn this\n\t}\n\n\tget(name: string): ComponentDefinition | undefined {\n\t\treturn this.components.get(name)\n\t}\n\n\thas(name: string): boolean {\n\t\treturn this.components.has(name)\n\t}\n\n\tnames(): string[] {\n\t\treturn [...this.components.keys()]\n\t}\n\n\tall(): ComponentDefinition[] {\n\t\treturn [...this.components.values()]\n\t}\n\n\tknownTags(): Set<string> {\n\t\treturn new Set(this.components.keys())\n\t}\n\n\tvalidate(tagName: string, props: Record<string, unknown>): ValidationResult {\n\t\tconst def = this.components.get(tagName)\n\t\tif (!def) {\n\t\t\treturn { valid: false, errors: [`Unknown component: ${tagName}`] }\n\t\t}\n\n\t\tconst result = def.props.safeParse(props)\n\t\tif (result.success) {\n\t\t\treturn { valid: true, errors: [], props: result.data as Record<string, unknown> }\n\t\t}\n\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\terrors: result.error.issues.map(\n\t\t\t\t(issue: z.ZodIssue) => `${issue.path.join('.')}: ${issue.message}`,\n\t\t\t),\n\t\t}\n\t}\n}\n","import type { ComponentRegistry } from './registry'\nimport type { ComponentDefinition, PromptOptions } from './types'\n\nexport function generatePrompt(registry: ComponentRegistry, options?: PromptOptions): string {\n\tconst sections: string[] = []\n\n\tif (options?.preamble) {\n\t\tsections.push(options.preamble, '')\n\t}\n\n\tsections.push(\n\t\t'You respond in mdocUI format.',\n\t\t'',\n\t\t'Write natural markdown prose. Embed UI components using Markdoc tag syntax.',\n\t\t'',\n\t\t'## TAG SYNTAX',\n\t\t'Self-closing: {% tagname attr=\"value\" attr2=123 /%}',\n\t\t'With body: {% tagname attr=\"value\" %}',\n\t\t' content here',\n\t\t' {% /tagname %}',\n\t\t'',\n\t\t'Never wrap tags in code fences.',\n\t\t'Never invent component names not listed below.',\n\t\t'Unknown tags will be silently dropped.',\n\t\t'',\n\t)\n\n\tconst defs = registry.all()\n\tif (defs.length > 0) {\n\t\tsections.push('## COMPONENTS', '')\n\n\t\tif (options?.groups && options.groups.length > 0) {\n\t\t\tconst grouped = new Set<string>()\n\n\t\t\tfor (const group of options.groups) {\n\t\t\t\tsections.push(`### ${group.name}`)\n\t\t\t\tif (group.notes) {\n\t\t\t\t\tfor (const note of group.notes) sections.push(`> ${note}`)\n\t\t\t\t}\n\t\t\t\tsections.push('')\n\t\t\t\tfor (const name of group.components) {\n\t\t\t\t\tconst def = registry.get(name)\n\t\t\t\t\tif (def) {\n\t\t\t\t\t\tsections.push(formatComponent(def), '')\n\t\t\t\t\t\tgrouped.add(name)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const def of defs) {\n\t\t\t\tif (!grouped.has(def.name)) sections.push(formatComponent(def), '')\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const def of defs) sections.push(formatComponent(def), '')\n\t\t}\n\t}\n\n\tsections.push(\n\t\t'## STREAMING GUIDELINE',\n\t\t'Write prose content before components.',\n\t\t'Users see text immediately while components load.',\n\t\t'',\n\t)\n\n\tif (options?.additionalRules && options.additionalRules.length > 0) {\n\t\tsections.push('## RULES')\n\t\tfor (const rule of options.additionalRules) sections.push(`- ${rule}`)\n\t\tsections.push('')\n\t}\n\n\tif (options?.examples && options.examples.length > 0) {\n\t\tsections.push('## EXAMPLE', '')\n\t\tfor (const example of options.examples) sections.push(example, '')\n\t}\n\n\treturn sections.join('\\n').trim()\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: Zod internals require dynamic access\ntype ZodDef = Record<string, any>\n\ninterface ZodField {\n\tisOptional: () => boolean\n\t_def: ZodDef\n}\n\nfunction resolveType(def: ZodDef): string {\n\tconst typeName = def.typeName as string | undefined\n\n\tif (typeName === 'ZodOptional' || typeName === 'ZodDefault') {\n\t\treturn resolveType(def.innerType?._def ?? {})\n\t}\n\n\tif (typeName === 'ZodEnum') {\n\t\tconst vals = (def.values as string[]) ?? []\n\t\treturn vals.map((v) => `\"${v}\"`).join(' | ')\n\t}\n\n\tif (typeName === 'ZodArray') {\n\t\tconst inner = resolveType(def.type?._def ?? {})\n\t\treturn `${inner}[]`\n\t}\n\n\tif (typeName === 'ZodString') return 'string'\n\tif (typeName === 'ZodNumber') return 'number'\n\tif (typeName === 'ZodBoolean') return 'boolean'\n\n\treturn ''\n}\n\nfunction formatComponent(def: ComponentDefinition): string {\n\tconst closing = def.children === 'none' ? ' /%}' : ' %}'\n\tconst shape = def.props.shape as Record<string, ZodField>\n\tconst propNames = Object.keys(shape)\n\n\tif (propNames.length === 0) {\n\t\tconst lines = [`{% ${def.name}${closing}`, ` ${def.description}`]\n\t\tif (def.children && def.children !== 'none') {\n\t\t\tlines.push(' (accepts body content)')\n\t\t}\n\t\treturn lines.join('\\n')\n\t}\n\n\tconst sig = propNames.map((name) => (shape[name].isOptional() ? `${name}?` : name)).join(' ')\n\tconst lines = [`{% ${def.name} ${sig}${closing}`, ` ${def.description}`]\n\n\tfor (const [name, field] of Object.entries(shape)) {\n\t\tconst desc = field._def.description ?? ''\n\t\tconst typeStr = resolveType(field._def)\n\t\tconst opt = field.isOptional() ? ' (optional)' : ''\n\t\tconst typeHint = typeStr ? ` — ${typeStr}` : ''\n\t\tlines.push(` ${name}${typeHint}: ${desc}${opt}`)\n\t}\n\n\tif (def.children && def.children !== 'none') {\n\t\tlines.push(' (accepts body content)')\n\t}\n\n\treturn lines.join('\\n')\n}\n"],"mappings":"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","names":["TokenizerState","TokenType","lines"]}
1
+ {"version":3,"sources":["../src/attributes.ts","../src/tokenizer.ts","../src/parser.ts","../src/prompt.ts","../src/registry.ts"],"sourcesContent":["const UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype'])\n\nexport function parseAttributes(input: string): Record<string, unknown> {\n\tconst result = Object.create(null) as Record<string, unknown>\n\tlet i = 0\n\n\twhile (i < input.length) {\n\t\twhile (i < input.length && isWhitespace(input[i])) i++\n\t\tif (i >= input.length) break\n\n\t\tconst keyStart = i\n\t\twhile (i < input.length && input[i] !== '=' && !isWhitespace(input[i])) i++\n\t\tconst key = input.slice(keyStart, i)\n\t\tif (key.length === 0) break\n\n\t\tif (UNSAFE_KEYS.has(key)) {\n\t\t\t// skip past the value if there is one\n\t\t\twhile (i < input.length && isWhitespace(input[i])) i++\n\t\t\tif (i < input.length && input[i] === '=') {\n\t\t\t\ti++\n\t\t\t\ti = skipValue(input, i)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\twhile (i < input.length && isWhitespace(input[i])) i++\n\n\t\tif (i >= input.length || input[i] !== '=') {\n\t\t\tresult[key] = true\n\t\t\tcontinue\n\t\t}\n\t\ti++ // skip =\n\t\twhile (i < input.length && isWhitespace(input[i])) i++\n\n\t\tif (i >= input.length) {\n\t\t\tresult[key] = true\n\t\t\tbreak\n\t\t}\n\n\t\tconst char = input[i]\n\n\t\tif (char === '\"' || char === \"'\") {\n\t\t\tconst quote = char\n\t\t\ti++\n\t\t\tlet value = ''\n\t\t\twhile (i < input.length && input[i] !== quote) {\n\t\t\t\tif (input[i] === '\\\\' && i + 1 < input.length) {\n\t\t\t\t\tvalue += input[i + 1]\n\t\t\t\t\ti += 2\n\t\t\t\t} else {\n\t\t\t\t\tvalue += input[i]\n\t\t\t\t\ti++\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (i < input.length) i++ // skip closing quote\n\t\t\tresult[key] = value\n\t\t} else if (char === '[') {\n\t\t\tconst start = i\n\t\t\tlet depth = 1\n\t\t\ti++\n\t\t\tlet inStr = false\n\t\t\tlet strChar = ''\n\t\t\tlet escaped = false\n\t\t\twhile (i < input.length && depth > 0) {\n\t\t\t\tif (inStr) {\n\t\t\t\t\tif (escaped) {\n\t\t\t\t\t\tescaped = false\n\t\t\t\t\t} else if (input[i] === '\\\\') {\n\t\t\t\t\t\tescaped = true\n\t\t\t\t\t} else if (input[i] === strChar) {\n\t\t\t\t\t\tinStr = false\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (input[i] === '\"' || input[i] === \"'\") {\n\t\t\t\t\t\tinStr = true\n\t\t\t\t\t\tstrChar = input[i]\n\t\t\t\t\t} else if (input[i] === '[') {\n\t\t\t\t\t\tdepth++\n\t\t\t\t\t} else if (input[i] === ']') {\n\t\t\t\t\t\tdepth--\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ti++\n\t\t\t}\n\t\t\tconst raw = input.slice(start, i)\n\t\t\ttry {\n\t\t\t\tresult[key] = JSON.parse(raw)\n\t\t\t} catch {\n\t\t\t\tresult[key] = raw\n\t\t\t}\n\t\t} else {\n\t\t\tconst valStart = i\n\t\t\twhile (i < input.length && !isWhitespace(input[i])) i++\n\t\t\tconst raw = input.slice(valStart, i)\n\t\t\tresult[key] = coerce(raw)\n\t\t}\n\t}\n\n\treturn result\n}\n\nfunction skipValue(input: string, start: number): number {\n\tlet pos = start\n\twhile (pos < input.length && isWhitespace(input[pos])) pos++\n\tif (pos >= input.length) return pos\n\n\tconst ch = input[pos]\n\tif (ch === '\"' || ch === \"'\") {\n\t\tpos++\n\t\twhile (pos < input.length && input[pos] !== ch) {\n\t\t\tif (input[pos] === '\\\\') pos++\n\t\t\tpos++\n\t\t}\n\t\tif (pos < input.length) pos++\n\t} else if (ch === '[') {\n\t\tlet depth = 1\n\t\tpos++\n\t\twhile (pos < input.length && depth > 0) {\n\t\t\tif (input[pos] === '[') depth++\n\t\t\telse if (input[pos] === ']') depth--\n\t\t\tpos++\n\t\t}\n\t} else {\n\t\twhile (pos < input.length && !isWhitespace(input[pos])) pos++\n\t}\n\treturn pos\n}\n\nfunction isWhitespace(ch: string): boolean {\n\treturn ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r'\n}\n\nfunction coerce(raw: string): unknown {\n\tif (raw === 'true') return true\n\tif (raw === 'false') return false\n\tif (raw === 'null') return null\n\tconst num = Number(raw)\n\tif (!Number.isNaN(num) && raw.length > 0) return num\n\treturn raw\n}\n","export enum TokenizerState {\n\tIN_PROSE = 'IN_PROSE',\n\tIN_TAG = 'IN_TAG',\n\tIN_STRING = 'IN_STRING',\n}\n\nexport enum TokenType {\n\tPROSE = 'PROSE',\n\tTAG_OPEN = 'TAG_OPEN',\n\tTAG_SELF_CLOSE = 'TAG_SELF_CLOSE',\n\tTAG_CLOSE = 'TAG_CLOSE',\n}\n\nexport interface Token {\n\ttype: TokenType\n\traw: string\n\tname?: string\n\tattrs?: string\n\tselfClosing?: boolean\n}\n\nexport class Tokenizer {\n\tprivate state: TokenizerState = TokenizerState.IN_PROSE\n\tprivate buffer = ''\n\tprivate proseBuffer = ''\n\tprivate stringChar: string | null = null\n\tprivate escaped = false\n\tprivate tokens: Token[] = []\n\n\tgetState(): TokenizerState {\n\t\treturn this.state\n\t}\n\n\tgetBuffer(): string {\n\t\treturn this.buffer\n\t}\n\n\twrite(chunk: string): Token[] {\n\t\tthis.tokens = []\n\n\t\tfor (let i = 0; i < chunk.length; i++) {\n\t\t\tconst char = chunk[i]\n\t\t\tconst next = chunk[i + 1]\n\n\t\t\tswitch (this.state) {\n\t\t\t\tcase TokenizerState.IN_PROSE:\n\t\t\t\t\tif (char === '{' && next === '%') {\n\t\t\t\t\t\tthis.flushProse()\n\t\t\t\t\t\tthis.buffer = '{%'\n\t\t\t\t\t\tthis.state = TokenizerState.IN_TAG\n\t\t\t\t\t\ti++\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.proseBuffer += char\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\n\t\t\t\tcase TokenizerState.IN_TAG:\n\t\t\t\t\tthis.buffer += char\n\t\t\t\t\tif (char === '\"' || char === \"'\") {\n\t\t\t\t\t\tthis.stringChar = char\n\t\t\t\t\t\tthis.escaped = false\n\t\t\t\t\t\tthis.state = TokenizerState.IN_STRING\n\t\t\t\t\t} else if (char === '%' && next === '}') {\n\t\t\t\t\t\tthis.buffer += '}'\n\t\t\t\t\t\ti++\n\t\t\t\t\t\tthis.emitTag()\n\t\t\t\t\t\tthis.state = TokenizerState.IN_PROSE\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\n\t\t\t\tcase TokenizerState.IN_STRING:\n\t\t\t\t\tthis.buffer += char\n\t\t\t\t\tif (this.escaped) {\n\t\t\t\t\t\tthis.escaped = false\n\t\t\t\t\t} else if (char === '\\\\') {\n\t\t\t\t\t\tthis.escaped = true\n\t\t\t\t\t} else if (char === this.stringChar) {\n\t\t\t\t\t\tthis.stringChar = null\n\t\t\t\t\t\tthis.state = TokenizerState.IN_TAG\n\t\t\t\t\t}\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif (this.state === TokenizerState.IN_PROSE) {\n\t\t\tthis.flushProse()\n\t\t}\n\n\t\treturn this.tokens\n\t}\n\n\tflush(): Token[] {\n\t\tthis.tokens = []\n\n\t\tif (this.state === TokenizerState.IN_TAG || this.state === TokenizerState.IN_STRING) {\n\t\t\tthis.proseBuffer += this.buffer\n\t\t\tthis.buffer = ''\n\t\t\tthis.state = TokenizerState.IN_PROSE\n\t\t}\n\n\t\tthis.flushProse()\n\t\treturn this.tokens\n\t}\n\n\treset(): void {\n\t\tthis.state = TokenizerState.IN_PROSE\n\t\tthis.buffer = ''\n\t\tthis.proseBuffer = ''\n\t\tthis.stringChar = null\n\t\tthis.escaped = false\n\t\tthis.tokens = []\n\t}\n\n\tprivate flushProse(): void {\n\t\tif (this.proseBuffer.length > 0) {\n\t\t\tthis.tokens.push({ type: TokenType.PROSE, raw: this.proseBuffer })\n\t\t\tthis.proseBuffer = ''\n\t\t}\n\t}\n\n\tprivate emitTag(): void {\n\t\tconst raw = this.buffer\n\t\tthis.buffer = ''\n\n\t\tconst inner = raw.slice(2, -2).trim()\n\t\tif (inner.length === 0) return\n\n\t\tif (inner.startsWith('/')) {\n\t\t\tthis.tokens.push({ type: TokenType.TAG_CLOSE, raw, name: inner.slice(1).trim() })\n\t\t\treturn\n\t\t}\n\n\t\tconst selfClosing = inner.endsWith('/')\n\t\tconst content = selfClosing ? inner.slice(0, -1).trim() : inner\n\t\tconst spaceIdx = content.indexOf(' ')\n\n\t\tthis.tokens.push({\n\t\t\ttype: selfClosing ? TokenType.TAG_SELF_CLOSE : TokenType.TAG_OPEN,\n\t\t\traw,\n\t\t\tname: spaceIdx === -1 ? content : content.slice(0, spaceIdx),\n\t\t\tattrs: spaceIdx === -1 ? '' : content.slice(spaceIdx + 1).trim(),\n\t\t\tselfClosing,\n\t\t})\n\t}\n}\n","import { parseAttributes } from './attributes'\nimport type { Token } from './tokenizer'\nimport { Tokenizer, TokenType } from './tokenizer'\nimport type { ASTNode, ComponentNode, ParseError, ParseMeta, ProseNode } from './types'\n\nexport interface ParserOptions {\n\tdropUnknown?: boolean\n\tknownTags?: Set<string>\n}\n\nexport class StreamingParser {\n\tprivate tokenizer = new Tokenizer()\n\tprivate completedNodes: ASTNode[] = []\n\tprivate bodyStack: BodyFrame[] = []\n\tprivate errors: ParseError[] = []\n\tprivate options: Required<ParserOptions>\n\n\tconstructor(options?: ParserOptions) {\n\t\tthis.options = {\n\t\t\tdropUnknown: options?.dropUnknown ?? true,\n\t\t\tknownTags: options?.knownTags ?? new Set(),\n\t\t}\n\t}\n\n\twrite(chunk: string): ASTNode[] {\n\t\tconst tokens = this.tokenizer.write(chunk)\n\t\tconst newNodes: ASTNode[] = []\n\n\t\tfor (const token of tokens) {\n\t\t\tnewNodes.push(...this.processToken(token))\n\t\t}\n\n\t\tthis.completedNodes.push(...newNodes)\n\t\treturn newNodes\n\t}\n\n\t/** Flush remaining buffers. Open body tags are force-closed. */\n\tflush(): ASTNode[] {\n\t\tconst remaining = this.tokenizer.flush()\n\t\tconst newNodes: ASTNode[] = []\n\n\t\tfor (const token of remaining) {\n\t\t\tnewNodes.push(...this.processToken(token))\n\t\t}\n\n\t\twhile (this.bodyStack.length > 0) {\n\t\t\tconst frame = this.popFrame()\n\t\t\tthis.errors.push({\n\t\t\t\tcode: 'unclosed',\n\t\t\t\ttagName: frame.name,\n\t\t\t\tmessage: `Tag \"{% ${frame.name} %}\" was never closed`,\n\t\t\t})\n\t\t\tconst node = this.buildComponentNode(frame)\n\t\t\tif (this.isInBody()) {\n\t\t\t\tthis.currentFrame().children.push(node)\n\t\t\t} else {\n\t\t\t\tnewNodes.push(node)\n\t\t\t}\n\t\t}\n\n\t\tthis.completedNodes.push(...newNodes)\n\t\treturn newNodes\n\t}\n\n\tgetNodes(): ASTNode[] {\n\t\treturn this.completedNodes\n\t}\n\n\tgetMeta(): ParseMeta {\n\t\treturn {\n\t\t\terrors: [...this.errors],\n\t\t\tnodeCount: this.completedNodes.length,\n\t\t\tisComplete: this.bodyStack.length === 0,\n\t\t}\n\t}\n\n\treset(): void {\n\t\tthis.tokenizer.reset()\n\t\tthis.completedNodes = []\n\t\tthis.bodyStack = []\n\t\tthis.errors = []\n\t}\n\n\tprivate processToken(token: Token): ASTNode[] {\n\t\tconst nodes: ASTNode[] = []\n\n\t\tswitch (token.type) {\n\t\t\tcase TokenType.PROSE:\n\t\t\t\tthis.handleProse(token.raw, nodes)\n\t\t\t\tbreak\n\t\t\tcase TokenType.TAG_SELF_CLOSE:\n\t\t\t\tthis.handleSelfClose(token, nodes)\n\t\t\t\tbreak\n\t\t\tcase TokenType.TAG_OPEN:\n\t\t\t\tthis.handleOpen(token)\n\t\t\t\tbreak\n\t\t\tcase TokenType.TAG_CLOSE:\n\t\t\t\tthis.handleClose(token, nodes)\n\t\t\t\tbreak\n\t\t}\n\n\t\treturn nodes\n\t}\n\n\tprivate handleProse(content: string, out: ASTNode[]): void {\n\t\tif (content.length === 0) return\n\n\t\tconst node: ProseNode = { type: 'prose', content }\n\t\tif (this.isInBody()) {\n\t\t\tthis.currentFrame().children.push(node)\n\t\t} else {\n\t\t\tout.push(node)\n\t\t}\n\t}\n\n\tprivate handleSelfClose(token: Token, out: ASTNode[]): void {\n\t\tconst name = token.name ?? ''\n\t\tif (!this.isKnown(name)) {\n\t\t\tthis.errors.push({\n\t\t\t\tcode: 'unknown_tag',\n\t\t\t\ttagName: name,\n\t\t\t\tmessage: `Unknown component: ${name}`,\n\t\t\t\traw: token.raw,\n\t\t\t})\n\t\t\tif (!this.options.dropUnknown) {\n\t\t\t\tthis.handleProse(token.raw, out)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst props = parseAttributes(token.attrs ?? '')\n\t\tconst node: ComponentNode = {\n\t\t\ttype: 'component',\n\t\t\tname,\n\t\t\tprops,\n\t\t\tchildren: [],\n\t\t\tselfClosing: true,\n\t\t}\n\n\t\tif (this.isInBody()) {\n\t\t\tthis.currentFrame().children.push(node)\n\t\t} else {\n\t\t\tout.push(node)\n\t\t}\n\t}\n\n\tprivate handleOpen(token: Token): void {\n\t\tconst name = token.name ?? ''\n\t\tif (!this.isKnown(name)) {\n\t\t\tthis.errors.push({\n\t\t\t\tcode: 'unknown_tag',\n\t\t\t\ttagName: name,\n\t\t\t\tmessage: `Unknown component: ${name}`,\n\t\t\t\traw: token.raw,\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\tthis.bodyStack.push({\n\t\t\tname,\n\t\t\tprops: parseAttributes(token.attrs ?? ''),\n\t\t\tchildren: [],\n\t\t})\n\t}\n\n\tprivate handleClose(token: Token, out: ASTNode[]): void {\n\t\tconst name = token.name ?? ''\n\n\t\tlet frameIdx = -1\n\t\tfor (let i = this.bodyStack.length - 1; i >= 0; i--) {\n\t\t\tif (this.bodyStack[i].name === name) {\n\t\t\t\tframeIdx = i\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif (frameIdx === -1) {\n\t\t\tthis.errors.push({\n\t\t\t\tcode: 'malformed',\n\t\t\t\ttagName: name,\n\t\t\t\tmessage: `Closing tag \"{% /${name} %}\" has no matching opening tag`,\n\t\t\t\traw: token.raw,\n\t\t\t})\n\t\t\treturn\n\t\t}\n\n\t\t// force-close anything nested above the matching opener\n\t\twhile (this.bodyStack.length > frameIdx + 1) {\n\t\t\tconst orphan = this.popFrame()\n\t\t\tthis.errors.push({\n\t\t\t\tcode: 'unclosed',\n\t\t\t\ttagName: orphan.name,\n\t\t\t\tmessage: `Tag \"{% ${orphan.name} %}\" was force-closed by \"{% /${name} %}\"`,\n\t\t\t})\n\t\t\tconst orphanNode = this.buildComponentNode(orphan)\n\t\t\tthis.bodyStack[this.bodyStack.length - 1].children.push(orphanNode)\n\t\t}\n\n\t\tconst frame = this.popFrame()\n\t\tconst node = this.buildComponentNode(frame)\n\n\t\tif (this.isInBody()) {\n\t\t\tthis.currentFrame().children.push(node)\n\t\t} else {\n\t\t\tout.push(node)\n\t\t}\n\t}\n\n\tprivate buildComponentNode(frame: BodyFrame): ComponentNode {\n\t\treturn {\n\t\t\ttype: 'component',\n\t\t\tname: frame.name,\n\t\t\tprops: frame.props,\n\t\t\tchildren: frame.children,\n\t\t\tselfClosing: false,\n\t\t}\n\t}\n\n\tprivate popFrame(): BodyFrame {\n\t\treturn this.bodyStack.pop() as BodyFrame\n\t}\n\n\tprivate isInBody(): boolean {\n\t\treturn this.bodyStack.length > 0\n\t}\n\n\tprivate currentFrame(): BodyFrame {\n\t\treturn this.bodyStack[this.bodyStack.length - 1]\n\t}\n\n\tprivate isKnown(name: string): boolean {\n\t\tif (this.options.knownTags.size === 0) return true\n\t\treturn this.options.knownTags.has(name)\n\t}\n}\n\ninterface BodyFrame {\n\tname: string\n\tprops: Record<string, unknown>\n\tchildren: ASTNode[]\n}\n","import type { ComponentRegistry } from './registry'\nimport type { ComponentDefinition, PromptOptions } from './types'\n\nexport function generatePrompt(registry: ComponentRegistry, options?: PromptOptions): string {\n\tconst sections: string[] = []\n\n\tif (options?.preamble) {\n\t\tsections.push(options.preamble, '')\n\t}\n\n\tsections.push(\n\t\t'You respond in mdocUI format.',\n\t\t'',\n\t\t'Write natural markdown prose. Embed UI components using Markdoc tag syntax.',\n\t\t'',\n\t\t'## TAG SYNTAX',\n\t\t'Self-closing: {% tagname attr=\"value\" attr2=123 /%}',\n\t\t'With body: {% tagname attr=\"value\" %}',\n\t\t' content here',\n\t\t' {% /tagname %}',\n\t\t'',\n\t\t'Never wrap tags in code fences.',\n\t\t'Never invent component names not listed below.',\n\t\t'Unknown tags will be silently dropped.',\n\t\t'',\n\t)\n\n\tconst defs = registry.all()\n\tif (defs.length > 0) {\n\t\tsections.push('## COMPONENTS', '')\n\n\t\tif (options?.groups && options.groups.length > 0) {\n\t\t\tconst grouped = new Set<string>()\n\n\t\t\tfor (const group of options.groups) {\n\t\t\t\tsections.push(`### ${group.name}`)\n\t\t\t\tif (group.notes) {\n\t\t\t\t\tfor (const note of group.notes) sections.push(`> ${note}`)\n\t\t\t\t}\n\t\t\t\tsections.push('')\n\t\t\t\tfor (const name of group.components) {\n\t\t\t\t\tconst def = registry.get(name)\n\t\t\t\t\tif (def) {\n\t\t\t\t\t\tsections.push(formatComponent(def), '')\n\t\t\t\t\t\tgrouped.add(name)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const def of defs) {\n\t\t\t\tif (!grouped.has(def.name)) sections.push(formatComponent(def), '')\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const def of defs) sections.push(formatComponent(def), '')\n\t\t}\n\t}\n\n\tsections.push(\n\t\t'## STREAMING GUIDELINE',\n\t\t'Write prose content before components.',\n\t\t'Users see text immediately while components load.',\n\t\t'',\n\t)\n\n\tif (options?.additionalRules && options.additionalRules.length > 0) {\n\t\tsections.push('## RULES')\n\t\tfor (const rule of options.additionalRules) sections.push(`- ${rule}`)\n\t\tsections.push('')\n\t}\n\n\tif (options?.examples && options.examples.length > 0) {\n\t\tsections.push('## EXAMPLE', '')\n\t\tfor (const example of options.examples) sections.push(example, '')\n\t}\n\n\treturn sections.join('\\n').trim()\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: Zod internals require dynamic access\ntype ZodDef = Record<string, any>\n\ninterface ZodField {\n\tisOptional: () => boolean\n\t_def: ZodDef\n}\n\nfunction resolveType(def: ZodDef): string {\n\tconst typeName = def.typeName as string | undefined\n\n\tif (typeName === 'ZodOptional' || typeName === 'ZodDefault') {\n\t\treturn resolveType(def.innerType?._def ?? {})\n\t}\n\n\tif (typeName === 'ZodEnum') {\n\t\tconst vals = (def.values as string[]) ?? []\n\t\treturn vals.map((v) => `\"${v}\"`).join(' | ')\n\t}\n\n\tif (typeName === 'ZodArray') {\n\t\tconst inner = resolveType(def.type?._def ?? {})\n\t\treturn `${inner}[]`\n\t}\n\n\tif (typeName === 'ZodString') return 'string'\n\tif (typeName === 'ZodNumber') return 'number'\n\tif (typeName === 'ZodBoolean') return 'boolean'\n\n\treturn ''\n}\n\nfunction formatComponent(def: ComponentDefinition): string {\n\tconst closing = def.children === 'none' ? ' /%}' : ' %}'\n\tconst shape = def.props.shape as unknown as Record<string, ZodField>\n\tconst propNames = Object.keys(shape)\n\n\tif (propNames.length === 0) {\n\t\tconst lines = [`{% ${def.name}${closing}`, ` ${def.description}`]\n\t\tif (def.children && def.children !== 'none') {\n\t\t\tlines.push(' (accepts body content)')\n\t\t}\n\t\treturn lines.join('\\n')\n\t}\n\n\tconst sig = propNames.map((name) => (shape[name].isOptional() ? `${name}?` : name)).join(' ')\n\tconst lines = [`{% ${def.name} ${sig}${closing}`, ` ${def.description}`]\n\n\tfor (const [name, field] of Object.entries(shape)) {\n\t\tconst desc = field._def.description ?? ''\n\t\tconst typeStr = resolveType(field._def)\n\t\tconst opt = field.isOptional() ? ' (optional)' : ''\n\t\tconst typeHint = typeStr ? ` — ${typeStr}` : ''\n\t\tlines.push(` ${name}${typeHint}: ${desc}${opt}`)\n\t}\n\n\tif (def.children && def.children !== 'none') {\n\t\tlines.push(' (accepts body content)')\n\t}\n\n\treturn lines.join('\\n')\n}\n","import type { z } from 'zod'\nimport type { ComponentDefinition, ValidationResult } from './types'\n\n/** Type helper — returns the definition unchanged. */\nexport function defineComponent(definition: ComponentDefinition): ComponentDefinition {\n\treturn definition\n}\n\nexport class ComponentRegistry {\n\tprivate components = new Map<string, ComponentDefinition>()\n\n\tregister(definition: ComponentDefinition): this {\n\t\tthis.components.set(definition.name, definition)\n\t\treturn this\n\t}\n\n\tregisterAll(definitions: ComponentDefinition[]): this {\n\t\tfor (const def of definitions) this.register(def)\n\t\treturn this\n\t}\n\n\tget(name: string): ComponentDefinition | undefined {\n\t\treturn this.components.get(name)\n\t}\n\n\thas(name: string): boolean {\n\t\treturn this.components.has(name)\n\t}\n\n\tnames(): string[] {\n\t\treturn [...this.components.keys()]\n\t}\n\n\tall(): ComponentDefinition[] {\n\t\treturn [...this.components.values()]\n\t}\n\n\tknownTags(): Set<string> {\n\t\treturn new Set(this.components.keys())\n\t}\n\n\tvalidate(tagName: string, props: Record<string, unknown>): ValidationResult {\n\t\tconst def = this.components.get(tagName)\n\t\tif (!def) {\n\t\t\treturn { valid: false, errors: [`Unknown component: ${tagName}`] }\n\t\t}\n\n\t\tconst result = def.props.safeParse(props)\n\t\tif (result.success) {\n\t\t\treturn { valid: true, errors: [], props: result.data as Record<string, unknown> }\n\t\t}\n\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\terrors: result.error.issues.map(\n\t\t\t\t(issue: z.ZodIssue) => `${issue.path.join('.')}: ${issue.message}`,\n\t\t\t),\n\t\t}\n\t}\n}\n"],"mappings":"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","names":["TokenizerState","TokenType","lines"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mdocui/core",
3
- "version": "0.1.4",
3
+ "version": "0.2.0",
4
4
  "description": "Streaming Markdoc parser, component registry, and system prompt generator for LLM generative UI",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -17,7 +17,7 @@
17
17
  "dist"
18
18
  ],
19
19
  "dependencies": {
20
- "zod": "^3.25.0"
20
+ "zod": "^4.3.0"
21
21
  },
22
22
  "devDependencies": {
23
23
  "tsup": "^8.5.0",