@mdocui/core 0.1.3 → 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 +195 -168
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +35 -35
- package/dist/index.d.ts +35 -35
- package/dist/index.js +195 -168
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
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 = [];
|
|
@@ -584,22 +537,96 @@ function generatePrompt(registry, options) {
|
|
|
584
537
|
}
|
|
585
538
|
return sections.join("\n").trim();
|
|
586
539
|
}
|
|
540
|
+
function resolveType(def) {
|
|
541
|
+
const typeName = def.typeName;
|
|
542
|
+
if (typeName === "ZodOptional" || typeName === "ZodDefault") {
|
|
543
|
+
return resolveType(def.innerType?._def ?? {});
|
|
544
|
+
}
|
|
545
|
+
if (typeName === "ZodEnum") {
|
|
546
|
+
const vals = def.values ?? [];
|
|
547
|
+
return vals.map((v) => `"${v}"`).join(" | ");
|
|
548
|
+
}
|
|
549
|
+
if (typeName === "ZodArray") {
|
|
550
|
+
const inner = resolveType(def.type?._def ?? {});
|
|
551
|
+
return `${inner}[]`;
|
|
552
|
+
}
|
|
553
|
+
if (typeName === "ZodString") return "string";
|
|
554
|
+
if (typeName === "ZodNumber") return "number";
|
|
555
|
+
if (typeName === "ZodBoolean") return "boolean";
|
|
556
|
+
return "";
|
|
557
|
+
}
|
|
587
558
|
function formatComponent(def) {
|
|
588
559
|
const closing = def.children === "none" ? " /%}" : " %}";
|
|
589
560
|
const shape = def.props.shape;
|
|
590
561
|
const propNames = Object.keys(shape);
|
|
562
|
+
if (propNames.length === 0) {
|
|
563
|
+
const lines2 = [`{% ${def.name}${closing}`, ` ${def.description}`];
|
|
564
|
+
if (def.children && def.children !== "none") {
|
|
565
|
+
lines2.push(" (accepts body content)");
|
|
566
|
+
}
|
|
567
|
+
return lines2.join("\n");
|
|
568
|
+
}
|
|
591
569
|
const sig = propNames.map((name) => shape[name].isOptional() ? `${name}?` : name).join(" ");
|
|
592
570
|
const lines = [`{% ${def.name} ${sig}${closing}`, ` ${def.description}`];
|
|
593
571
|
for (const [name, field] of Object.entries(shape)) {
|
|
594
572
|
const desc = field._def.description ?? "";
|
|
573
|
+
const typeStr = resolveType(field._def);
|
|
595
574
|
const opt = field.isOptional() ? " (optional)" : "";
|
|
596
|
-
|
|
575
|
+
const typeHint = typeStr ? ` \u2014 ${typeStr}` : "";
|
|
576
|
+
lines.push(` ${name}${typeHint}: ${desc}${opt}`);
|
|
597
577
|
}
|
|
598
578
|
if (def.children && def.children !== "none") {
|
|
599
579
|
lines.push(" (accepts body content)");
|
|
600
580
|
}
|
|
601
581
|
return lines.join("\n");
|
|
602
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
|
+
};
|
|
603
630
|
// Annotate the CommonJS export names for ESM import in node:
|
|
604
631
|
0 && (module.exports = {
|
|
605
632
|
ComponentRegistry,
|
package/dist/index.cjs.map
CHANGED
|
@@ -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\ninterface ZodField {\n\tisOptional: () => boolean\n\t_def: { description?: string }\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\tconst sig = propNames.map((name) => (shape[name].isOptional() ? `${name}?` : name)).join(' ')\n\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 opt = field.isOptional() ? ' (optional)' : ''\n\t\tlines.push(` ${name}: ${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"]}
|
|
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":"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","names":["TokenizerState","TokenType","lines"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,38 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
|
|
3
|
-
declare
|
|
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
|
|
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 = [];
|
|
@@ -551,22 +504,96 @@ function generatePrompt(registry, options) {
|
|
|
551
504
|
}
|
|
552
505
|
return sections.join("\n").trim();
|
|
553
506
|
}
|
|
507
|
+
function resolveType(def) {
|
|
508
|
+
const typeName = def.typeName;
|
|
509
|
+
if (typeName === "ZodOptional" || typeName === "ZodDefault") {
|
|
510
|
+
return resolveType(def.innerType?._def ?? {});
|
|
511
|
+
}
|
|
512
|
+
if (typeName === "ZodEnum") {
|
|
513
|
+
const vals = def.values ?? [];
|
|
514
|
+
return vals.map((v) => `"${v}"`).join(" | ");
|
|
515
|
+
}
|
|
516
|
+
if (typeName === "ZodArray") {
|
|
517
|
+
const inner = resolveType(def.type?._def ?? {});
|
|
518
|
+
return `${inner}[]`;
|
|
519
|
+
}
|
|
520
|
+
if (typeName === "ZodString") return "string";
|
|
521
|
+
if (typeName === "ZodNumber") return "number";
|
|
522
|
+
if (typeName === "ZodBoolean") return "boolean";
|
|
523
|
+
return "";
|
|
524
|
+
}
|
|
554
525
|
function formatComponent(def) {
|
|
555
526
|
const closing = def.children === "none" ? " /%}" : " %}";
|
|
556
527
|
const shape = def.props.shape;
|
|
557
528
|
const propNames = Object.keys(shape);
|
|
529
|
+
if (propNames.length === 0) {
|
|
530
|
+
const lines2 = [`{% ${def.name}${closing}`, ` ${def.description}`];
|
|
531
|
+
if (def.children && def.children !== "none") {
|
|
532
|
+
lines2.push(" (accepts body content)");
|
|
533
|
+
}
|
|
534
|
+
return lines2.join("\n");
|
|
535
|
+
}
|
|
558
536
|
const sig = propNames.map((name) => shape[name].isOptional() ? `${name}?` : name).join(" ");
|
|
559
537
|
const lines = [`{% ${def.name} ${sig}${closing}`, ` ${def.description}`];
|
|
560
538
|
for (const [name, field] of Object.entries(shape)) {
|
|
561
539
|
const desc = field._def.description ?? "";
|
|
540
|
+
const typeStr = resolveType(field._def);
|
|
562
541
|
const opt = field.isOptional() ? " (optional)" : "";
|
|
563
|
-
|
|
542
|
+
const typeHint = typeStr ? ` \u2014 ${typeStr}` : "";
|
|
543
|
+
lines.push(` ${name}${typeHint}: ${desc}${opt}`);
|
|
564
544
|
}
|
|
565
545
|
if (def.children && def.children !== "none") {
|
|
566
546
|
lines.push(" (accepts body content)");
|
|
567
547
|
}
|
|
568
548
|
return lines.join("\n");
|
|
569
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
|
+
};
|
|
570
597
|
export {
|
|
571
598
|
ComponentRegistry,
|
|
572
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\ninterface ZodField {\n\tisOptional: () => boolean\n\t_def: { description?: string }\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\tconst sig = propNames.map((name) => (shape[name].isOptional() ? `${name}?` : name)).join(' ')\n\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 opt = field.isOptional() ? ' (optional)' : ''\n\t\tlines.push(` ${name}: ${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":";AAAO,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;;;AChJA,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;;;ACjIO,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;;;ACtOO,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;;;ACxDO,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;AAOA,SAAS,gBAAgB,KAAkC;AAC1D,QAAM,UAAU,IAAI,aAAa,SAAS,SAAS;AACnD,QAAM,QAAQ,IAAI,MAAM;AACxB,QAAM,YAAY,OAAO,KAAK,KAAK;AAEnC,QAAM,MAAM,UAAU,IAAI,CAAC,SAAU,MAAM,IAAI,EAAE,WAAW,IAAI,GAAG,IAAI,MAAM,IAAK,EAAE,KAAK,GAAG;AAE5F,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,MAAM,MAAM,WAAW,IAAI,gBAAgB;AACjD,UAAM,KAAK,KAAK,IAAI,KAAK,IAAI,GAAG,GAAG,EAAE;AAAA,EACtC;AAEA,MAAI,IAAI,YAAY,IAAI,aAAa,QAAQ;AAC5C,UAAM,KAAK,0BAA0B;AAAA,EACtC;AAEA,SAAO,MAAM,KAAK,IAAI;AACvB;","names":["TokenizerState","TokenType"]}
|
|
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.
|
|
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.
|
|
20
|
+
"zod": "^4.3.0"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"tsup": "^8.5.0",
|