prose-writer 0.1.0 → 0.1.1
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/README.md +166 -12
- package/dist/index.d.ts +1 -1
- package/dist/index.js +76 -62
- package/dist/index.js.map +3 -3
- package/dist/markdown.d.ts +1 -0
- package/dist/markdown.js +95 -0
- package/dist/markdown.js.map +10 -0
- package/dist/prose-writer.d.ts +70 -11
- package/dist/safe.d.ts +10 -0
- package/dist/safe.js +95 -0
- package/dist/safe.js.map +11 -0
- package/dist/schema.d.ts +1 -0
- package/dist/schema.js +3 -0
- package/dist/schema.js.map +9 -0
- package/dist/validation.d.ts +2 -0
- package/dist/validation.js +95 -0
- package/dist/validation.js.map +10 -0
- package/package.json +26 -2
package/dist/index.js.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/prose-writer.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * Inline formatting utilities that can be used within write() or builder functions.\n * These return strings and do not side-effect the writer.\n */\nexport interface InlineUtils {\n bold: (content: string | number | boolean | ProseWriter) => string;\n italic: (content: string | number | boolean | ProseWriter) => string;\n code: (content: string | number | boolean | ProseWriter) => string;\n inline: (content: string | number | boolean | ProseWriter) => string;\n strike: (content: string | number | boolean | ProseWriter) => string;\n link: (text: string | ProseWriter, url: string) => string;\n image: (alt: string | ProseWriter, url: string) => string;\n}\n\n/**\n * Builder for markdown lists.\n */\nexport interface ListBuilder extends InlineUtils {\n item(...content: (string | number | boolean | ProseWriter)[]): this;\n task(checked: boolean, ...content: (string | number | boolean | ProseWriter)[]): this;\n todo(...content: (string | number | boolean | ProseWriter)[]): this;\n done(...content: (string | number | boolean | ProseWriter)[]): this;\n comment(content: string): this;\n unorderedList(builder: (l: ListBuilder) => void): this;\n unorderedList(...items: (string | number | boolean | ProseWriter)[]): this;\n list(builder: (l: ListBuilder) => void): this;\n list(...items: (string | number | boolean | ProseWriter)[]): this;\n orderedList(builder: (l: ListBuilder) => void): this;\n orderedList(...items: (string | number | boolean | ProseWriter)[]): this;\n}\n\n/**\n * A chainable prose writer for building formatted text/markdown strings.\n */\nexport class ProseWriter {\n private parts: string[] = [];\n private _skipNextPadding = false;\n\n constructor(content?: string) {\n if (content !== undefined) {\n this.parts.push(content.endsWith('\\n') ? content : content + '\\n');\n }\n }\n\n /**\n * Appends content to the prose.\n * Multiple arguments are joined with a space.\n * Chaining write() calls creates separate paragraphs by default.\n */\n write(...content: (string | number | boolean | ProseWriter)[]): this {\n const joined = content\n .map((c) => {\n if (c instanceof ProseWriter) {\n return c.toString().trimEnd();\n }\n return String(c);\n })\n .join(' ');\n\n if (this.parts.length === 0 && joined.length === 0) {\n return this;\n }\n\n const p = this.padding;\n this.parts.push(p + joined + '\\n');\n return this;\n }\n\n /**\n * Prevents the next block element or write() call from adding a paragraph break.\n * Useful for placing two write() calls on consecutive lines.\n */\n nextLine(): this {\n this._skipNextPadding = true;\n return this;\n }\n\n /**\n * Appends an unordered list.\n * Each item is prefixed with `- ` on its own line.\n * Supports nesting by passing another ProseWriter instance or a builder function.\n */\n unorderedList(builder: (l: ListBuilder) => void): this;\n unorderedList(...items: (string | number | boolean | ProseWriter)[]): this;\n unorderedList(\n ...args: [(l: ListBuilder) => void] | (string | number | boolean | ProseWriter)[]\n ): this {\n if (args.length === 1 && typeof args[0] === 'function') {\n const { builder, getItems } = this.createListBuilder();\n (args[0] as (l: ListBuilder) => void)(builder);\n return this.unorderedList(...getItems());\n }\n\n const items = args as (string | number | boolean | ProseWriter)[];\n const listContent = items\n .map((item) => {\n if (item instanceof ProseWriter) {\n return item\n .toString()\n .trimEnd()\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n }\n return `- ${item}`;\n })\n .join('\\n');\n this.parts.push(`${this.padding}${listContent}\\n\\n`);\n return this;\n }\n\n /**\n * Alias for unorderedList().\n */\n list(builder: (l: ListBuilder) => void): this;\n list(...items: (string | number | boolean | ProseWriter)[]): this;\n list(\n ...args: [(l: ListBuilder) => void] | (string | number | boolean | ProseWriter)[]\n ): this {\n if (args.length === 1 && typeof args[0] === 'function') {\n return this.unorderedList(args[0] as (l: ListBuilder) => void);\n }\n return this.unorderedList(...(args as (string | number | boolean | ProseWriter)[]));\n }\n\n /**\n * Appends an ordered list.\n * Each item is prefixed with its number on its own line.\n * Supports nesting by passing another ProseWriter instance or a builder function.\n */\n orderedList(builder: (l: ListBuilder) => void): this;\n orderedList(...items: (string | number | boolean | ProseWriter)[]): this;\n orderedList(\n ...args: [(l: ListBuilder) => void] | (string | number | boolean | ProseWriter)[]\n ): this {\n if (args.length === 1 && typeof args[0] === 'function') {\n const { builder, getItems } = this.createListBuilder();\n (args[0] as (l: ListBuilder) => void)(builder);\n return this.orderedList(...getItems());\n }\n\n let index = 1;\n const items = args as (string | number | boolean | ProseWriter)[];\n const listContent = items\n .map((item) => {\n if (item instanceof ProseWriter) {\n return item\n .toString()\n .trimEnd()\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n }\n return `${index++}. ${item}`;\n })\n .join('\\n');\n this.parts.push(`${this.padding}${listContent}\\n\\n`);\n return this;\n }\n\n /**\n * Appends a task list with checkboxes.\n */\n tasks(builder: (l: ListBuilder) => void): this;\n tasks(\n ...items: (\n | string\n | number\n | boolean\n | ProseWriter\n | [string | number | boolean | ProseWriter, boolean]\n )[]\n ): this;\n tasks(\n ...args:\n | [(l: ListBuilder) => void]\n | (\n | string\n | number\n | boolean\n | ProseWriter\n | [string | number | boolean | ProseWriter, boolean]\n )[]\n ): this {\n if (args.length === 1 && typeof args[0] === 'function') {\n const { builder, getItems } = this.createListBuilder();\n (args[0] as (l: ListBuilder) => void)(builder);\n const items = getItems();\n const listContent = items\n .map((item) => {\n if (item instanceof ProseWriter) {\n return item\n .toString()\n .trimEnd()\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n }\n return `- ${item}`;\n })\n .join('\\n');\n this.parts.push(`${this.padding}${listContent}\\n\\n`);\n return this;\n }\n\n const items = (\n args as (\n | string\n | number\n | boolean\n | ProseWriter\n | [string | number | boolean | ProseWriter, boolean]\n )[]\n ).map((arg) => {\n if (Array.isArray(arg) && arg.length === 2 && typeof arg[1] === 'boolean') {\n const [content, checked] = arg;\n const checkbox = checked ? '[x] ' : '[ ] ';\n const text = write(content).toString().trimEnd();\n return checkbox + text;\n }\n const checkbox = '[ ] ';\n const text = write(arg as string | number | boolean | ProseWriter)\n .toString()\n .trimEnd();\n return checkbox + text;\n });\n\n const listContent = items.map((item) => `- ${item}`).join('\\n');\n this.parts.push(`${this.padding}${listContent}\\n\\n`);\n return this;\n }\n\n /**\n * Appends a GitHub Alert (callout).\n */\n callout(\n type: 'NOTE' | 'TIP' | 'IMPORTANT' | 'WARNING' | 'CAUTION',\n content: string | ((writer: ProseWriter & InlineUtils) => void),\n ): this {\n let contentString: string;\n if (typeof content === 'function') {\n const writer = new ProseWriter();\n content(writer.enhanced);\n contentString = writer.toString().trimEnd();\n } else {\n contentString = content;\n }\n\n const lines = contentString.split('\\n');\n const alertLines = [`[!${type.toUpperCase()}]`, ...lines];\n const alertContent = alertLines.map((line) => `> ${line}`).join('\\n');\n\n this.parts.push(`${this.padding}${alertContent}\\n\\n`);\n return this;\n }\n\n /**\n * Appends a markdown heading at the specified level.\n */\n heading(level: 1 | 2 | 3 | 4 | 5 | 6, ...content: string[]): this {\n const hashes = '#'.repeat(level);\n const joined = content.join(' ');\n this.parts.push(`${this.padding}${hashes} ${joined}\\n\\n`);\n return this;\n }\n\n /**\n * Appends a blockquote with the given lines.\n * Lines are separated by an empty blockquote line.\n */\n blockquote(...lines: string[]): this {\n const quotedLines = lines.map((line) => `> ${line}`).join('\\n>\\n');\n this.parts.push(`${this.padding}${quotedLines}\\n\\n`);\n return this;\n }\n\n /**\n * Appends a fenced code block with the specified language.\n */\n codeblock(\n language: string,\n content: string | ((writer: ProseWriter & InlineUtils) => void),\n ): this {\n let code: string;\n if (typeof content === 'function') {\n const writer = new ProseWriter();\n content(writer.enhanced);\n code = writer.toString().trim();\n } else {\n code = content;\n }\n this.parts.push(`${this.padding}\\`\\`\\`${language}\\n${code}\\n\\`\\`\\`\\n\\n`);\n return this;\n }\n\n /**\n * Appends a horizontal separator.\n */\n get separator(): this {\n this.parts.push(`${this.padding}---\\n\\n`);\n return this;\n }\n\n /**\n * Appends a JSON code block.\n * If data is not a string, it will be stringified with formatting.\n */\n json(data: unknown): this {\n const jsonString = typeof data === 'string' ? data : JSON.stringify(data, null, 2);\n return this.codeblock('json', jsonString);\n }\n\n /**\n * Appends the content from another ProseWriter instance.\n * Enables composition of prompts from reusable pieces.\n */\n append(writer: ProseWriter): this {\n const content = writer.toString();\n if (content.length > 0) {\n this.parts.push(this.padding + content);\n }\n return this;\n }\n\n /**\n * Returns a version of this writer with inline formatters as methods.\n * This is passed to builder functions to allow using formatters without imports.\n */\n private get enhanced(): this & InlineUtils {\n const formatters: Record<string, unknown> = {\n bold,\n italic,\n code,\n inline,\n link,\n strike,\n image,\n };\n return new Proxy(this, {\n get(target, prop) {\n if (typeof prop === 'string' && prop in formatters) {\n return formatters[prop];\n }\n const val = Reflect.get(target, prop, target) as unknown;\n if (typeof val === 'function') {\n return (val as (...args: unknown[]) => unknown).bind(target);\n }\n return val;\n },\n }) as this & InlineUtils;\n }\n\n /**\n * Conditionally executes a builder function.\n * If the condition is truthy, the builder is called with this instance.\n */\n when(condition: unknown, builder: (writer: this & InlineUtils) => void): this {\n if (condition) {\n builder(this.enhanced);\n }\n return this;\n }\n\n /**\n * Executes a builder function with this instance.\n * Useful for logical grouping in chains.\n */\n with(builder: (writer: this & InlineUtils) => void): this {\n builder(this.enhanced);\n return this;\n }\n\n /**\n * Wraps content in XML-style tags.\n * Useful for Claude and other models that respond well to XML delimiters.\n */\n tag(\n name: string,\n content: string | ProseWriter | ((writer: ProseWriter & InlineUtils) => void),\n ): this {\n let contentString: string;\n if (typeof content === 'function') {\n const writer = new ProseWriter();\n content(writer.enhanced);\n contentString = writer.toString();\n } else {\n contentString = content instanceof ProseWriter ? content.toString() : content;\n }\n this.parts.push(`${this.padding}<${name}>\\n${contentString.trimEnd()}\\n</${name}>\\n`);\n return this;\n }\n\n /**\n * Appends inline code (wrapped in backticks).\n */\n code(content: string | number | boolean | ProseWriter): this {\n this.parts.push(this.padding + code(content) + '\\n');\n return this;\n }\n\n /**\n * Replaces template variables in the format {{variableName}} with provided values.\n * Returns a new ProseWriter with the substitutions applied.\n */\n fill(variables: Record<string, string>): ProseWriter {\n const content = this.toString();\n const filled = content.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key: string): string => {\n return variables[key] ?? match;\n });\n return new ProseWriter(filled);\n }\n\n /**\n * Creates a semantic section with a heading and content built by the builder function.\n * @param name - The section heading text\n * @param builder - A function that receives a fresh ProseWriter to build section content\n * @param level - Optional heading level (defaults to 2)\n */\n section(\n name: string,\n builder: (writer: ProseWriter & InlineUtils) => void,\n level: 1 | 2 | 3 | 4 | 5 | 6 = 2,\n ): this {\n const sectionWriter = new ProseWriter();\n builder(sectionWriter.enhanced);\n const hashes = '#'.repeat(level);\n this.parts.push(`${this.padding}${hashes} ${name}\\n\\n${sectionWriter.toString()}`);\n return this;\n }\n\n /**\n * Creates a copy of this ProseWriter with the same content.\n * Useful for creating variations of a base prompt.\n */\n clone(): ProseWriter {\n const cloned = new ProseWriter();\n cloned.parts = [...this.parts];\n return cloned;\n }\n\n /**\n * Appends a markdown table with headers and rows.\n * Type-safe: Each row can be an array of strings matching the header length,\n * or an object where keys match the header names.\n */\n table<T extends string>(\n headers: [...T[]],\n rows: (string[] | Record<T, string | number | boolean | ProseWriter>)[],\n ): this {\n const headerRow = `| ${headers.join(' | ')} |`;\n const separatorRow = `| ${headers.map(() => '---').join(' | ')} |`;\n\n const dataRows = rows\n .map((row) => {\n const values = Array.isArray(row)\n ? row\n : headers.map((h) => {\n const val = row[h];\n if (val instanceof ProseWriter) return val.toPlainText();\n return String(val ?? '');\n });\n return `| ${values.join(' | ')} |`;\n })\n .join('\\n');\n\n this.parts.push(`${this.padding}${headerRow}\\n${separatorRow}\\n${dataRows}\\n\\n`);\n return this;\n }\n\n /**\n * Appends a definition list with key-value pairs.\n * Each key is bolded, followed by a colon and the value.\n */\n definitions(obj: Record<string, string>): this {\n const entries = Object.entries(obj)\n .map(([key, value]) => `**${key}**: ${value}`)\n .join('\\n');\n this.parts.push(`${this.padding}${entries}\\n\\n`);\n return this;\n }\n\n /**\n * Appends bold text.\n */\n bold(content: string | number | boolean | ProseWriter): this {\n this.parts.push(this.padding + bold(content) + '\\n');\n return this;\n }\n\n /**\n * Appends italic text.\n */\n italic(content: string | number | boolean | ProseWriter): this {\n this.parts.push(this.padding + italic(content) + '\\n');\n return this;\n }\n\n /**\n * Appends strikethrough text.\n */\n strike(content: string | number | boolean | ProseWriter): this {\n this.parts.push(this.padding + strike(content) + '\\n');\n return this;\n }\n\n /**\n * Appends raw content without any processing.\n */\n raw(content: string): this {\n this.parts.push(content);\n return this;\n }\n\n /**\n * Appends a markdown link.\n */\n link(text: string | ProseWriter, url: string): this {\n this.parts.push(this.padding + link(text, url) + '\\n');\n return this;\n }\n\n /**\n * Appends a markdown image.\n */\n image(alt: string | ProseWriter, url: string): this {\n this.parts.push(this.padding + image(alt, url) + '\\n');\n return this;\n }\n\n /**\n * Appends an HTML comment.\n */\n comment(content: string): this {\n this.parts.push(`${this.padding}<!-- ${content} -->\\n\\n`);\n return this;\n }\n\n /**\n * Appends a YAML code block.\n * If data is not a string, it will be converted to YAML format.\n */\n yaml(data: unknown): this {\n const yamlString = typeof data === 'string' ? data : this.toYamlString(data);\n return this.codeblock('yaml', yamlString);\n }\n\n /**\n * Converts a value to a simple YAML string representation.\n */\n private toYamlString(data: unknown, indent: number = 0): string {\n const prefix = ' '.repeat(indent);\n\n if (data === null || data === undefined) {\n return 'null';\n }\n\n if (typeof data === 'string') {\n // Quote strings that contain special characters\n if (/[:\\n#\"']/.test(data) || data === '') {\n return `\"${data.replace(/\"/g, '\\\\\"')}\"`;\n }\n return data;\n }\n\n if (typeof data === 'number' || typeof data === 'boolean') {\n return String(data);\n }\n\n if (Array.isArray(data)) {\n if (data.length === 0) return '[]';\n return data\n .map((item) => `${prefix}- ${this.toYamlString(item, indent + 1)}`)\n .join('\\n');\n }\n\n if (typeof data === 'object') {\n const entries = Object.entries(data as Record<string, unknown>);\n if (entries.length === 0) return '{}';\n return entries\n .map(([key, value]) => {\n const valueStr = this.toYamlString(value, indent + 1);\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n return `${prefix}${key}:\\n${valueStr}`;\n }\n if (Array.isArray(value)) {\n return `${prefix}${key}:\\n${valueStr}`;\n }\n return `${prefix}${key}: ${valueStr}`;\n })\n .join('\\n');\n }\n\n // Fallback for any other types - use JSON stringify\n return JSON.stringify(data) ?? 'null';\n }\n\n /**\n * Wraps content with custom delimiters.\n */\n delimit(open: string, close: string, content: string | ProseWriter): this {\n const contentString = content instanceof ProseWriter ? content.toString() : content;\n this.parts.push(`${this.padding}${open}\\n${contentString}\\n${close}\\n`);\n return this;\n }\n\n /**\n * Returns a new ProseWriter with consecutive newlines collapsed to double newlines.\n */\n compact(): ProseWriter {\n const content = this.toString().replace(/\\n{3,}/g, '\\n\\n');\n return new ProseWriter(content);\n }\n\n /**\n * Returns a new ProseWriter with leading and trailing whitespace removed.\n */\n trim(): ProseWriter {\n const content = this.toString().trim();\n return new ProseWriter(content);\n }\n\n /**\n * Estimates the number of tokens in the prose.\n * By default, uses a rough approximation of ~4 characters per token.\n * An optional counter function can be provided for more accurate counting.\n */\n tokens(counter?: (content: string) => number): number {\n const content = this.toString();\n if (counter) {\n return counter(content);\n }\n // Rough estimation: ~4 characters per token for English text\n return Math.ceil(content.length / 4);\n }\n\n /**\n * Iterates over items and applies a builder function for each.\n */\n each<T>(\n items: T[],\n builder: (item: T, writer: this & InlineUtils, index: number) => void,\n ): this {\n items.forEach((item, index) => {\n builder(item, this.enhanced, index);\n });\n return this;\n }\n\n /**\n * Converts the prose to plain text by stripping markdown formatting.\n */\n toPlainText(): string {\n let text = this.toString();\n\n // Remove code blocks (preserve content)\n text = text.replace(/```[\\s\\S]*?```/g, (match) => {\n const lines = match.split('\\n');\n return lines.slice(1, -1).join('\\n');\n });\n\n // Remove inline code backticks\n text = text.replace(/`([^`]+)`/g, '$1');\n\n // Remove headings (keep text)\n text = text.replace(/^#{1,6}\\s+(.*)$/gm, '$1');\n\n // Remove bold\n text = text.replace(/\\*\\*([^*]+)\\*\\*/g, '$1');\n\n // Remove italic\n text = text.replace(/\\*([^*]+)\\*/g, '$1');\n\n // Remove links (keep text)\n text = text.replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1');\n\n // Remove blockquote markers\n text = text.replace(/^>\\s?/gm, '');\n\n // Remove horizontal rules\n text = text.replace(/^---$/gm, '');\n\n // Remove list markers\n text = text.replace(/^[-*]\\s+/gm, '');\n text = text.replace(/^\\d+\\.\\s+/gm, '');\n\n // Remove XML tags (keep content)\n text = text.replace(/<[^>]+>/g, '');\n\n // Remove table formatting\n text = text.replace(/\\|/g, ' ');\n text = text.replace(/^[\\s-]+$/gm, '');\n\n // Collapse multiple spaces\n text = text.replace(/ {2,}/g, ' ');\n\n // Collapse multiple newlines\n text = text.replace(/\\n{3,}/g, '\\n\\n');\n\n return text.trim();\n }\n\n /**\n * Returns necessary newline padding if there is existing content.\n * Ensures exactly two newlines (a paragraph break) before a block element.\n */\n private get padding(): string {\n if (this._skipNextPadding || this.parts.length === 0) {\n this._skipNextPadding = false;\n return '';\n }\n const lastPart = this.parts[this.parts.length - 1]!;\n if (lastPart.endsWith('\\n\\n')) return '';\n if (lastPart.endsWith('\\n')) return '\\n';\n return '\\n\\n';\n }\n\n /**\n * Internal helper to create a list builder.\n */\n private createListBuilder(): {\n builder: ListBuilder;\n getItems: () => (string | number | boolean | ProseWriter)[];\n } {\n const items: (string | number | boolean | ProseWriter)[] = [];\n const lb: ListBuilder = {\n item: (...content: (string | number | boolean | ProseWriter)[]) => {\n items.push(\n write(...content)\n .toString()\n .trimEnd(),\n );\n return lb;\n },\n task: (\n checked: boolean,\n ...content: (string | number | boolean | ProseWriter)[]\n ) => {\n const checkbox = checked ? '[x] ' : '[ ] ';\n const text = write(...content)\n .toString()\n .trimEnd();\n items.push(checkbox + text);\n return lb;\n },\n todo: (...content: (string | number | boolean | ProseWriter)[]) =>\n lb.task(false, ...content),\n done: (...content: (string | number | boolean | ProseWriter)[]) =>\n lb.task(true, ...content),\n unorderedList: (\n ...args: [(l: ListBuilder) => void] | (string | number | boolean | ProseWriter)[]\n ) => {\n const sub = new ProseWriter();\n if (args.length === 1 && typeof args[0] === 'function') {\n sub.unorderedList(args[0] as (l: ListBuilder) => void);\n } else {\n sub.unorderedList(...(args as (string | number | boolean | ProseWriter)[]));\n }\n items.push(sub);\n return lb;\n },\n list: (\n ...args: [(l: ListBuilder) => void] | (string | number | boolean | ProseWriter)[]\n ) => {\n const sub = new ProseWriter();\n if (args.length === 1 && typeof args[0] === 'function') {\n sub.list(args[0] as (l: ListBuilder) => void);\n } else {\n sub.list(...(args as (string | number | boolean | ProseWriter)[]));\n }\n items.push(sub);\n return lb;\n },\n orderedList: (\n ...args: [(l: ListBuilder) => void] | (string | number | boolean | ProseWriter)[]\n ) => {\n const sub = new ProseWriter();\n if (args.length === 1 && typeof args[0] === 'function') {\n sub.orderedList(args[0] as (l: ListBuilder) => void);\n } else {\n sub.orderedList(...(args as (string | number | boolean | ProseWriter)[]));\n }\n items.push(sub);\n return lb;\n },\n comment: (content: string) => {\n const sub = new ProseWriter();\n sub.comment(content);\n items.push(sub);\n return lb;\n },\n bold,\n italic,\n code,\n inline,\n strike,\n link,\n image,\n };\n return { builder: lb, getItems: () => items };\n }\n\n /**\n * Creates an empty ProseWriter instance.\n */\n static empty(): ProseWriter {\n return new ProseWriter();\n }\n\n /**\n * Joins multiple ProseWriter instances into one.\n */\n static join(...writers: ProseWriter[]): ProseWriter {\n const result = new ProseWriter();\n for (const writer of writers) {\n result.parts.push(writer.toString());\n }\n return result;\n }\n\n /**\n * Creates a ProseWriter from a template string.\n */\n static fromTemplate(template: string): ProseWriter {\n return new ProseWriter(template);\n }\n\n /**\n * Converts the accumulated prose to a string.\n */\n toString(): string {\n return this.parts.join('');\n }\n\n /**\n * Returns the primitive value (string) for type coercion.\n */\n [Symbol.toPrimitive](hint: string): string | number {\n if (hint === 'number') {\n return Number.NaN;\n }\n return this.toString();\n }\n\n /**\n * Returns the string tag for the object.\n */\n get [Symbol.toStringTag](): string {\n return 'ProseWriter';\n }\n}\n\n/**\n * Creates a new ProseWriter instance with the given content.\n */\nexport const write = Object.assign(\n (...content: (string | number | boolean | ProseWriter)[]): ProseWriter => {\n return new ProseWriter().write(...content);\n },\n {\n with: (builder: (writer: ProseWriter & InlineUtils) => void): ProseWriter => {\n return new ProseWriter().with(builder);\n },\n unorderedList: (\n ...args: [(l: ListBuilder) => void] | (string | number | boolean | ProseWriter)[]\n ): ProseWriter => {\n const pw = new ProseWriter();\n if (args.length === 1 && typeof args[0] === 'function') {\n return pw.unorderedList(args[0] as (l: ListBuilder) => void);\n }\n return pw.unorderedList(...(args as (string | number | boolean | ProseWriter)[]));\n },\n list: (\n ...args: [(l: ListBuilder) => void] | (string | number | boolean | ProseWriter)[]\n ): ProseWriter => {\n const pw = new ProseWriter();\n if (args.length === 1 && typeof args[0] === 'function') {\n return pw.list(args[0] as (l: ListBuilder) => void);\n }\n return pw.list(...(args as (string | number | boolean | ProseWriter)[]));\n },\n orderedList: (\n ...args: [(l: ListBuilder) => void] | (string | number | boolean | ProseWriter)[]\n ): ProseWriter => {\n const pw = new ProseWriter();\n if (args.length === 1 && typeof args[0] === 'function') {\n return pw.orderedList(args[0] as (l: ListBuilder) => void);\n }\n return pw.orderedList(...(args as (string | number | boolean | ProseWriter)[]));\n },\n tasks: (\n ...args:\n | [(l: ListBuilder) => void]\n | (\n | string\n | number\n | boolean\n | ProseWriter\n | [string | number | boolean | ProseWriter, boolean]\n )[]\n ): ProseWriter => {\n const pw = new ProseWriter();\n if (args.length === 1 && typeof args[0] === 'function') {\n return pw.tasks(args[0] as (l: ListBuilder) => void);\n }\n return pw.tasks(\n ...(args as (\n | string\n | number\n | boolean\n | ProseWriter\n | [string | number | boolean | ProseWriter, boolean]\n )[]),\n );\n },\n callout: (\n type: 'NOTE' | 'TIP' | 'IMPORTANT' | 'WARNING' | 'CAUTION',\n content: string | ((writer: ProseWriter & InlineUtils) => void),\n ): ProseWriter => {\n return new ProseWriter().callout(type, content);\n },\n },\n);\n\n/**\n * Appends bold formatting to a string.\n */\nexport const bold = (content: string | number | boolean | ProseWriter): string =>\n `**${content instanceof ProseWriter ? content.toString().trim() : content}**`;\n\n/**\n * Appends italic formatting to a string.\n */\nexport const italic = (content: string | number | boolean | ProseWriter): string =>\n `*${content instanceof ProseWriter ? content.toString().trim() : content}*`;\n\n/**\n * Appends inline code formatting to a string.\n */\nexport const code = (content: string | number | boolean | ProseWriter): string =>\n `\\`${content instanceof ProseWriter ? content.toString().trim() : content}\\``;\n\n/**\n * Alias for code().\n */\nexport const inline = code;\n\n/**\n * Appends strikethrough formatting to a string.\n */\nexport const strike = (content: string | number | boolean | ProseWriter): string =>\n `~~${content instanceof ProseWriter ? content.toString().trim() : content}~~`;\n\n/**\n * Creates a markdown link string.\n */\nexport const link = (text: string | ProseWriter, url: string): string =>\n `[${text instanceof ProseWriter ? text.toString().trim() : text}](${url})`;\n\n/**\n * Creates a markdown image string.\n */\nexport const image = (alt: string | ProseWriter, url: string): string =>\n ``;\n"
|
|
5
|
+
"/**\n * Inline formatting utilities that can be used within write() or builder functions.\n * These return strings and do not side-effect the writer.\n */\nexport interface InlineUtils {\n bold: (content: string | number | boolean | ProseWriter) => string;\n italic: (content: string | number | boolean | ProseWriter) => string;\n code: (content: string | number | boolean | ProseWriter) => string;\n inline: (content: string | number | boolean | ProseWriter) => string;\n strike: (content: string | number | boolean | ProseWriter) => string;\n link: (text: string | ProseWriter, url: string) => string;\n image: (alt: string | ProseWriter, url: string) => string;\n}\n\n/**\n * Builder for markdown lists.\n */\nexport interface ListBuilder extends InlineUtils {\n item(...content: (string | number | boolean | ProseWriter)[]): this;\n task(checked: boolean, ...content: (string | number | boolean | ProseWriter)[]): this;\n todo(...content: (string | number | boolean | ProseWriter)[]): this;\n done(...content: (string | number | boolean | ProseWriter)[]): this;\n comment(content: string): this;\n unorderedList(builder: (l: ListBuilder) => void): this;\n unorderedList(...items: (string | number | boolean | ProseWriter)[]): this;\n list(builder: (l: ListBuilder) => void): this;\n list(...items: (string | number | boolean | ProseWriter)[]): this;\n orderedList(builder: (l: ListBuilder) => void): this;\n orderedList(...items: (string | number | boolean | ProseWriter)[]): this;\n}\n\nclass SafeString {\n private value: string;\n\n constructor(value: string) {\n this.value = value;\n }\n\n toString(): string {\n return this.value;\n }\n\n valueOf(): string {\n return this.value;\n }\n}\n\nexport type OutputFormat = 'json' | 'yaml';\n\nexport type ValidationIssue = {\n message: string;\n path?: string;\n};\n\nexport type ValidationResult = {\n valid: boolean;\n issues?: ValidationIssue[];\n};\n\nexport type OutputValidator = (options: {\n format: OutputFormat;\n data: unknown;\n schema?: unknown;\n}) => ValidationResult;\n\nexport type JsonSchemaAdapter = (schema: unknown, data: unknown) => ValidationResult;\n\nexport type ValidationOptions = {\n schema?: unknown;\n validate?: OutputValidator;\n label?: string;\n parseYaml?: (input: string) => unknown;\n};\n\nexport type SchemaEmbedOptions = {\n format?: OutputFormat;\n title?: string;\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n tag?: string;\n};\n\ntype WriterOptions = {\n safe?: boolean;\n};\n\ntype WriterValue = string | number | boolean | ProseWriter;\ntype ContentValue = WriterValue | SafeString;\n\nconst escapeXmlText = (value: string): string =>\n value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n\nconst escapeMarkdownLineStart = (line: string): string => {\n if (/^\\s*#{1,6}\\s/.test(line)) {\n return line.replace(/^(\\s*)(#{1,6})/, '$1\\\\$2');\n }\n if (/^\\s*>/.test(line)) {\n return line.replace(/^(\\s*)>/, '$1\\\\>');\n }\n if (/^\\s*([-+*])\\s/.test(line)) {\n return line.replace(/^(\\s*)([-+*])/, '$1\\\\$2');\n }\n if (/^\\s*\\d+\\.\\s/.test(line)) {\n return line.replace(/^(\\s*)(\\d+)\\./, '$1$2\\\\.');\n }\n return line;\n};\n\nconst escapeMarkdownText = (value: string): string => {\n const escaped = escapeXmlText(value)\n .replace(/([\\\\`*_~()|!])/g, '\\\\$1')\n .replace(/\\[/g, '\\\\[')\n .replace(/\\]/g, '\\\\]');\n return escaped\n .split('\\n')\n .map((line) => escapeMarkdownLineStart(line))\n .join('\\n');\n};\n\nconst wrapInlineCode = (value: string): string => {\n const matches = value.match(/`+/g);\n const fenceSize = (matches ? Math.max(...matches.map((m) => m.length)) : 0) + 1;\n const fence = '`'.repeat(fenceSize);\n const needsPadding = /^\\s|\\s$/.test(value);\n const content = needsPadding ? ` ${value} ` : value;\n return `${fence}${content}${fence}`;\n};\n\nconst escapeLinkDestination = (url: string): string => {\n const encoded = encodeURI(url);\n return encoded.replace(/[()]/g, '\\\\$&');\n};\n\nconst toContentString = (\n content: ContentValue,\n trim: 'none' | 'end' | 'both' = 'none',\n): { value: string; isTrusted: boolean } => {\n if (content instanceof SafeString) {\n return { value: content.toString(), isTrusted: true };\n }\n if (content instanceof ProseWriter) {\n const raw = content.toString();\n if (trim === 'end') return { value: raw.trimEnd(), isTrusted: true };\n if (trim === 'both') return { value: raw.trim(), isTrusted: true };\n return { value: raw, isTrusted: true };\n }\n return { value: String(content), isTrusted: false };\n};\n\nconst toSafeInlineText = (content: ContentValue): string => {\n const { value, isTrusted } = toContentString(content, 'both');\n return isTrusted ? value : escapeMarkdownText(value);\n};\n\nconst asSafeString = (value: string): string =>\n new SafeString(value) as unknown as string;\n\nconst safeBold = (content: ContentValue): string =>\n asSafeString(`**${toSafeInlineText(content)}**`);\n\nconst safeItalic = (content: ContentValue): string =>\n asSafeString(`*${toSafeInlineText(content)}*`);\n\nconst safeStrike = (content: ContentValue): string =>\n asSafeString(`~~${toSafeInlineText(content)}~~`);\n\nconst safeInlineCode = (content: ContentValue): string => {\n const { value } = toContentString(content, 'both');\n return asSafeString(wrapInlineCode(value));\n};\n\nconst safeLink = (text: string | ProseWriter, url: string): string => {\n const { value, isTrusted } = toContentString(text, 'both');\n const safeText = isTrusted ? value : escapeMarkdownText(value);\n const safeUrl = escapeLinkDestination(url);\n return asSafeString(`[${safeText}](${safeUrl})`);\n};\n\nconst safeImage = (alt: string | ProseWriter, url: string): string => {\n const { value, isTrusted } = toContentString(alt, 'both');\n const safeAlt = isTrusted ? value : escapeMarkdownText(value);\n const safeUrl = escapeLinkDestination(url);\n return asSafeString(``);\n};\n\nconst formatValidationIssues = (issues: ValidationIssue[]): string => {\n if (issues.length === 0) {\n return 'No validation issues were provided.';\n }\n return issues\n .map((issue, index) => {\n const path = issue.path ? `${issue.path}: ` : '';\n return `${index + 1}. ${path}${issue.message}`;\n })\n .join('\\n');\n};\n\nexport class ValidationError extends Error {\n format: OutputFormat;\n issues: ValidationIssue[];\n\n constructor(format: OutputFormat, issues: ValidationIssue[], label?: string) {\n const title = label ?? `${format.toUpperCase()} validation failed`;\n super(`${title}\\n${formatValidationIssues(issues)}`);\n this.name = 'ValidationError';\n this.format = format;\n this.issues = issues;\n }\n}\n\nexport const createJsonSchemaValidator = (\n adapter: JsonSchemaAdapter,\n): OutputValidator => {\n return ({ format, data, schema }): ValidationResult => {\n if (format !== 'json' || schema === undefined) {\n return { valid: true };\n }\n return adapter(schema, data);\n };\n};\n\nexport const createYamlParserAdapter = (\n parser: (input: string) => unknown,\n): ((input: string) => unknown) => {\n return (input: string) => parser(input);\n};\n\n/**\n * A chainable prose writer for building formatted text/markdown strings.\n */\nexport class ProseWriter {\n private parts: string[] = [];\n private _skipNextPadding = false;\n private safeMode: boolean;\n\n constructor(content?: string, options: WriterOptions = {}) {\n this.safeMode = options.safe ?? false;\n if (content !== undefined) {\n this.parts.push(content.endsWith('\\n') ? content : content + '\\n');\n }\n }\n\n private createChildWriter(): ProseWriter {\n return new ProseWriter(undefined, { safe: this.safeMode });\n }\n\n /**\n * Appends content to the prose.\n * Multiple arguments are joined with a space.\n * Chaining write() calls creates separate paragraphs by default.\n */\n write(...content: (string | number | boolean | ProseWriter)[]): this {\n const joined = content\n .map((c) => {\n const { value, isTrusted } = toContentString(c, 'end');\n if (this.safeMode && !isTrusted) {\n return escapeMarkdownText(value);\n }\n return value;\n })\n .join(' ');\n\n if (this.parts.length === 0 && joined.length === 0) {\n return this;\n }\n\n const p = this.padding;\n this.parts.push(p + joined + '\\n');\n return this;\n }\n\n /**\n * Prevents the next block element or write() call from adding a paragraph break.\n * Useful for placing two write() calls on consecutive lines.\n */\n nextLine(): this {\n this._skipNextPadding = true;\n return this;\n }\n\n /**\n * Appends an unordered list.\n * Each item is prefixed with `- ` on its own line.\n * Supports nesting by passing another ProseWriter instance or a builder function.\n */\n unorderedList(builder: (l: ListBuilder) => void): this;\n unorderedList(...items: (string | number | boolean | ProseWriter)[]): this;\n unorderedList(\n ...args: [(l: ListBuilder) => void] | (string | number | boolean | ProseWriter)[]\n ): this {\n if (args.length === 1 && typeof args[0] === 'function') {\n const { builder, getItems } = this.createListBuilder();\n (args[0] as (l: ListBuilder) => void)(builder);\n const items = getItems();\n const listContent = items\n .map((item) => {\n if (item instanceof ProseWriter) {\n return item\n .toString()\n .trimEnd()\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n }\n return `- ${item}`;\n })\n .join('\\n');\n this.parts.push(`${this.padding}${listContent}\\n\\n`);\n return this;\n }\n\n const items = args as (string | number | boolean | ProseWriter)[];\n const listContent = items\n .map((item) => {\n if (item instanceof ProseWriter) {\n return item\n .toString()\n .trimEnd()\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n }\n const { value, isTrusted } = toContentString(item);\n const text = this.safeMode && !isTrusted ? escapeMarkdownText(value) : value;\n return `- ${text}`;\n })\n .join('\\n');\n this.parts.push(`${this.padding}${listContent}\\n\\n`);\n return this;\n }\n\n /**\n * Alias for unorderedList().\n */\n list(builder: (l: ListBuilder) => void): this;\n list(...items: (string | number | boolean | ProseWriter)[]): this;\n list(\n ...args: [(l: ListBuilder) => void] | (string | number | boolean | ProseWriter)[]\n ): this {\n if (args.length === 1 && typeof args[0] === 'function') {\n return this.unorderedList(args[0] as (l: ListBuilder) => void);\n }\n return this.unorderedList(...(args as (string | number | boolean | ProseWriter)[]));\n }\n\n /**\n * Appends an ordered list.\n * Each item is prefixed with its number on its own line.\n * Supports nesting by passing another ProseWriter instance or a builder function.\n */\n orderedList(builder: (l: ListBuilder) => void): this;\n orderedList(...items: (string | number | boolean | ProseWriter)[]): this;\n orderedList(\n ...args: [(l: ListBuilder) => void] | (string | number | boolean | ProseWriter)[]\n ): this {\n if (args.length === 1 && typeof args[0] === 'function') {\n const { builder, getItems } = this.createListBuilder();\n (args[0] as (l: ListBuilder) => void)(builder);\n let index = 1;\n const items = getItems();\n const listContent = items\n .map((item) => {\n if (item instanceof ProseWriter) {\n return item\n .toString()\n .trimEnd()\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n }\n return `${index++}. ${item}`;\n })\n .join('\\n');\n this.parts.push(`${this.padding}${listContent}\\n\\n`);\n return this;\n }\n\n let index = 1;\n const items = args as (string | number | boolean | ProseWriter)[];\n const listContent = items\n .map((item) => {\n if (item instanceof ProseWriter) {\n return item\n .toString()\n .trimEnd()\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n }\n const { value, isTrusted } = toContentString(item);\n const text = this.safeMode && !isTrusted ? escapeMarkdownText(value) : value;\n return `${index++}. ${text}`;\n })\n .join('\\n');\n this.parts.push(`${this.padding}${listContent}\\n\\n`);\n return this;\n }\n\n /**\n * Appends a task list with checkboxes.\n */\n tasks(builder: (l: ListBuilder) => void): this;\n tasks(\n ...items: (\n | string\n | number\n | boolean\n | ProseWriter\n | [string | number | boolean | ProseWriter, boolean]\n )[]\n ): this;\n tasks(\n ...args:\n | [(l: ListBuilder) => void]\n | (\n | string\n | number\n | boolean\n | ProseWriter\n | [string | number | boolean | ProseWriter, boolean]\n )[]\n ): this {\n if (args.length === 1 && typeof args[0] === 'function') {\n const { builder, getItems } = this.createListBuilder();\n (args[0] as (l: ListBuilder) => void)(builder);\n const items = getItems();\n const listContent = items\n .map((item) => {\n if (item instanceof ProseWriter) {\n return item\n .toString()\n .trimEnd()\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n }\n return `- ${item}`;\n })\n .join('\\n');\n this.parts.push(`${this.padding}${listContent}\\n\\n`);\n return this;\n }\n\n const items = (\n args as (\n | string\n | number\n | boolean\n | ProseWriter\n | [string | number | boolean | ProseWriter, boolean]\n )[]\n ).map((arg) => {\n if (Array.isArray(arg) && arg.length === 2 && typeof arg[1] === 'boolean') {\n const [content, checked] = arg;\n const checkbox = checked ? '[x] ' : '[ ] ';\n const text = this.createChildWriter().write(content).toString().trimEnd();\n return checkbox + text;\n }\n const checkbox = '[ ] ';\n const text = this.createChildWriter()\n .write(arg as string | number | boolean | ProseWriter)\n .toString()\n .trimEnd();\n return checkbox + text;\n });\n\n const listContent = items.map((item) => `- ${item}`).join('\\n');\n this.parts.push(`${this.padding}${listContent}\\n\\n`);\n return this;\n }\n\n /**\n * Appends a GitHub Alert (callout).\n */\n callout(\n type: 'NOTE' | 'TIP' | 'IMPORTANT' | 'WARNING' | 'CAUTION',\n content: string | ((writer: ProseWriter & InlineUtils) => void),\n ): this {\n let contentString: string;\n if (typeof content === 'function') {\n const writer = this.createChildWriter();\n content(writer.enhanced);\n contentString = writer.toString().trimEnd();\n } else {\n const { value, isTrusted } = toContentString(content);\n contentString = this.safeMode && !isTrusted ? escapeMarkdownText(value) : value;\n }\n\n const lines = contentString.split('\\n');\n const alertLines = [`[!${type.toUpperCase()}]`, ...lines];\n const alertContent = alertLines.map((line) => `> ${line}`).join('\\n');\n\n this.parts.push(`${this.padding}${alertContent}\\n\\n`);\n return this;\n }\n\n /**\n * Appends a markdown heading at the specified level.\n */\n heading(level: 1 | 2 | 3 | 4 | 5 | 6, ...content: string[]): this {\n const hashes = '#'.repeat(level);\n const joined = content\n .map((part) => {\n const { value, isTrusted } = toContentString(part);\n if (this.safeMode && !isTrusted) {\n return escapeMarkdownText(value);\n }\n return value;\n })\n .join(' ');\n this.parts.push(`${this.padding}${hashes} ${joined}\\n\\n`);\n return this;\n }\n\n /**\n * Appends a blockquote with the given lines.\n * Lines are separated by an empty blockquote line.\n */\n blockquote(...lines: string[]): this {\n const quotedLines = lines\n .map((line) => {\n const { value, isTrusted } = toContentString(line);\n if (this.safeMode && !isTrusted) {\n return escapeMarkdownText(value);\n }\n return value;\n })\n .map((line) => `> ${line}`)\n .join('\\n>\\n');\n this.parts.push(`${this.padding}${quotedLines}\\n\\n`);\n return this;\n }\n\n /**\n * Appends a fenced code block with the specified language.\n */\n codeblock(\n language: string,\n content: string | ((writer: ProseWriter & InlineUtils) => void),\n ): this {\n let code: string;\n if (typeof content === 'function') {\n const writer = new ProseWriter();\n content(writer.enhanced);\n code = writer.toString().trim();\n } else {\n code = content;\n }\n this.parts.push(`${this.padding}\\`\\`\\`${language}\\n${code}\\n\\`\\`\\`\\n\\n`);\n return this;\n }\n\n /**\n * Appends a horizontal separator.\n */\n get separator(): this {\n this.parts.push(`${this.padding}---\\n\\n`);\n return this;\n }\n\n /**\n * Appends a JSON code block.\n * If data is not a string, it will be stringified with formatting.\n */\n json(data: unknown, options: ValidationOptions = {}): this {\n this.validateOutput('json', data, options);\n const jsonString = typeof data === 'string' ? data : JSON.stringify(data, null, 2);\n return this.codeblock('json', jsonString);\n }\n\n /**\n * Appends the content from another ProseWriter instance.\n * Enables composition of prompts from reusable pieces.\n */\n append(writer: ProseWriter): this {\n const content = writer.toString();\n if (content.length > 0) {\n this.parts.push(this.padding + content);\n }\n return this;\n }\n\n /**\n * Returns a version of this writer with inline formatters as methods.\n * This is passed to builder functions to allow using formatters without imports.\n */\n private get enhanced(): this & InlineUtils {\n const formatters: Record<string, unknown> = this.safeMode\n ? {\n bold: safeBold,\n italic: safeItalic,\n code: safeInlineCode,\n inline: safeInlineCode,\n link: safeLink,\n strike: safeStrike,\n image: safeImage,\n }\n : {\n bold,\n italic,\n code,\n inline,\n link,\n strike,\n image,\n };\n return new Proxy(this, {\n get(target, prop) {\n if (typeof prop === 'string' && prop in formatters) {\n return formatters[prop];\n }\n const val = Reflect.get(target, prop, target) as unknown;\n if (typeof val === 'function') {\n return (val as (...args: unknown[]) => unknown).bind(target);\n }\n return val;\n },\n }) as this & InlineUtils;\n }\n\n /**\n * Conditionally executes a builder function.\n * If the condition is truthy, the builder is called with this instance.\n */\n when(condition: unknown, builder: (writer: this & InlineUtils) => void): this {\n if (condition) {\n builder(this.enhanced);\n }\n return this;\n }\n\n /**\n * Executes a builder function with this instance.\n * Useful for logical grouping in chains.\n */\n with(builder: (writer: this & InlineUtils) => void): this {\n builder(this.enhanced);\n return this;\n }\n\n /**\n * Wraps content in XML-style tags.\n * Useful for Claude and other models that respond well to XML delimiters.\n */\n tag(\n name: string,\n content: string | ProseWriter | ((writer: ProseWriter & InlineUtils) => void),\n ): this {\n let contentString: string;\n if (typeof content === 'function') {\n const writer = this.createChildWriter();\n content(writer.enhanced);\n contentString = writer.toString();\n } else {\n const { value, isTrusted } = toContentString(content);\n if (this.safeMode && !isTrusted) {\n contentString = escapeXmlText(value);\n } else {\n contentString = value;\n }\n }\n this.parts.push(`${this.padding}<${name}>\\n${contentString.trimEnd()}\\n</${name}>\\n`);\n return this;\n }\n\n /**\n * Appends inline code (wrapped in backticks).\n */\n code(content: string | number | boolean | ProseWriter): this {\n const formatted = this.safeMode ? safeInlineCode(content) : code(content);\n this.parts.push(this.padding + formatted + '\\n');\n return this;\n }\n\n /**\n * Replaces template variables in the format {{variableName}} with provided values.\n * Returns a new ProseWriter with the substitutions applied.\n */\n fill(variables: Record<string, string>): ProseWriter {\n const content = this.toString();\n const filled = content.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key: string): string => {\n const value = variables[key];\n if (value === undefined) return match;\n return this.safeMode ? escapeMarkdownText(value) : value;\n });\n return new ProseWriter(filled, { safe: this.safeMode });\n }\n\n /**\n * Creates a semantic section with a heading and content built by the builder function.\n * @param name - The section heading text\n * @param builder - A function that receives a fresh ProseWriter to build section content\n * @param level - Optional heading level (defaults to 2)\n */\n section(\n name: string,\n builder: (writer: ProseWriter & InlineUtils) => void,\n level: 1 | 2 | 3 | 4 | 5 | 6 = 2,\n ): this {\n const sectionWriter = this.createChildWriter();\n builder(sectionWriter.enhanced);\n const hashes = '#'.repeat(level);\n const title = this.safeMode ? escapeMarkdownText(name) : name;\n this.parts.push(`${this.padding}${hashes} ${title}\\n\\n${sectionWriter.toString()}`);\n return this;\n }\n\n /**\n * Creates a copy of this ProseWriter with the same content.\n * Useful for creating variations of a base prompt.\n */\n clone(): ProseWriter {\n const cloned = new ProseWriter(undefined, { safe: this.safeMode });\n cloned.parts = [...this.parts];\n return cloned;\n }\n\n /**\n * Appends a markdown table with headers and rows.\n * Type-safe: Each row can be an array of strings matching the header length,\n * or an object where keys match the header names.\n */\n table<T extends string>(\n headers: [...T[]],\n rows: (string[] | Record<T, string | number | boolean | ProseWriter>)[],\n ): this {\n const safeHeaders = this.safeMode\n ? headers.map((header) => escapeMarkdownText(header))\n : headers;\n const headerRow = `| ${safeHeaders.join(' | ')} |`;\n const separatorRow = `| ${headers.map(() => '---').join(' | ')} |`;\n\n const dataRows = rows\n .map((row) => {\n const values = Array.isArray(row)\n ? row.map((val) => {\n const text = String(val ?? '');\n return this.safeMode ? escapeMarkdownText(text) : text;\n })\n : headers.map((h) => {\n const val = row[h];\n if (val instanceof ProseWriter) return val.toPlainText();\n const text = String(val ?? '');\n return this.safeMode ? escapeMarkdownText(text) : text;\n });\n return `| ${values.join(' | ')} |`;\n })\n .join('\\n');\n\n this.parts.push(`${this.padding}${headerRow}\\n${separatorRow}\\n${dataRows}\\n\\n`);\n return this;\n }\n\n /**\n * Appends a definition list with key-value pairs.\n * Each key is bolded, followed by a colon and the value.\n */\n definitions(obj: Record<string, string>): this {\n const entries = Object.entries(obj)\n .map(([key, value]) => {\n if (this.safeMode) {\n return `${safeBold(key)}: ${escapeMarkdownText(value)}`;\n }\n return `**${key}**: ${value}`;\n })\n .join('\\n');\n this.parts.push(`${this.padding}${entries}\\n\\n`);\n return this;\n }\n\n /**\n * Embeds a schema or output contract in the prompt.\n */\n schema(schemaValue: unknown, options: SchemaEmbedOptions = {}): this {\n const { format = 'json', title, level = 2, tag } = options;\n if (title) {\n this.heading(level, title);\n }\n\n if (tag) {\n const schemaWriter = this.createChildWriter();\n if (format === 'json') {\n schemaWriter.json(schemaValue);\n } else {\n schemaWriter.yaml(schemaValue);\n }\n return this.tag(tag, schemaWriter);\n }\n\n if (format === 'json') {\n return this.json(schemaValue);\n }\n return this.yaml(schemaValue);\n }\n\n /**\n * Appends bold text.\n */\n bold(content: string | number | boolean | ProseWriter): this {\n const formatted = this.safeMode ? safeBold(content) : bold(content);\n this.parts.push(this.padding + formatted + '\\n');\n return this;\n }\n\n /**\n * Appends italic text.\n */\n italic(content: string | number | boolean | ProseWriter): this {\n const formatted = this.safeMode ? safeItalic(content) : italic(content);\n this.parts.push(this.padding + formatted + '\\n');\n return this;\n }\n\n /**\n * Appends strikethrough text.\n */\n strike(content: string | number | boolean | ProseWriter): this {\n const formatted = this.safeMode ? safeStrike(content) : strike(content);\n this.parts.push(this.padding + formatted + '\\n');\n return this;\n }\n\n /**\n * Appends raw content without any processing.\n */\n raw(content: string): this {\n this.parts.push(content);\n return this;\n }\n\n /**\n * Appends a markdown link.\n */\n link(text: string | ProseWriter, url: string): this {\n const formatted = this.safeMode ? safeLink(text, url) : link(text, url);\n this.parts.push(this.padding + formatted + '\\n');\n return this;\n }\n\n /**\n * Appends a markdown image.\n */\n image(alt: string | ProseWriter, url: string): this {\n const formatted = this.safeMode ? safeImage(alt, url) : image(alt, url);\n this.parts.push(this.padding + formatted + '\\n');\n return this;\n }\n\n /**\n * Appends an HTML comment.\n */\n comment(content: string): this {\n this.parts.push(`${this.padding}<!-- ${content} -->\\n\\n`);\n return this;\n }\n\n /**\n * Appends a YAML code block.\n * If data is not a string, it will be converted to YAML format.\n */\n yaml(data: unknown, options: ValidationOptions = {}): this {\n this.validateOutput('yaml', data, options);\n const yamlString = typeof data === 'string' ? data : this.toYamlString(data);\n return this.codeblock('yaml', yamlString);\n }\n\n /**\n * Converts a value to a simple YAML string representation.\n */\n private toYamlString(data: unknown, indent: number = 0): string {\n const prefix = ' '.repeat(indent);\n\n if (data === null || data === undefined) {\n return 'null';\n }\n\n if (typeof data === 'string') {\n // Quote strings that contain special characters\n if (/[:\\n#\"']/.test(data) || data === '') {\n return `\"${data.replace(/\"/g, '\\\\\"')}\"`;\n }\n return data;\n }\n\n if (typeof data === 'number' || typeof data === 'boolean') {\n return String(data);\n }\n\n if (Array.isArray(data)) {\n if (data.length === 0) return '[]';\n return data\n .map((item) => `${prefix}- ${this.toYamlString(item, indent + 1)}`)\n .join('\\n');\n }\n\n if (typeof data === 'object') {\n const entries = Object.entries(data as Record<string, unknown>);\n if (entries.length === 0) return '{}';\n return entries\n .map(([key, value]) => {\n const valueStr = this.toYamlString(value, indent + 1);\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n return `${prefix}${key}:\\n${valueStr}`;\n }\n if (Array.isArray(value)) {\n return `${prefix}${key}:\\n${valueStr}`;\n }\n return `${prefix}${key}: ${valueStr}`;\n })\n .join('\\n');\n }\n\n // Fallback for any other types - use JSON stringify\n return JSON.stringify(data) ?? 'null';\n }\n\n /**\n * Wraps content with custom delimiters.\n */\n delimit(open: string, close: string, content: string | ProseWriter): this {\n const contentString = content instanceof ProseWriter ? content.toString() : content;\n this.parts.push(`${this.padding}${open}\\n${contentString}\\n${close}\\n`);\n return this;\n }\n\n /**\n * Returns a new ProseWriter with consecutive newlines collapsed to double newlines.\n */\n compact(): ProseWriter {\n const content = this.toString().replace(/\\n{3,}/g, '\\n\\n');\n return new ProseWriter(content, { safe: this.safeMode });\n }\n\n /**\n * Returns a new ProseWriter with leading and trailing whitespace removed.\n */\n trim(): ProseWriter {\n const content = this.toString().trim();\n return new ProseWriter(content, { safe: this.safeMode });\n }\n\n /**\n * Estimates the number of tokens in the prose.\n * By default, uses a rough approximation of ~4 characters per token.\n * An optional counter function can be provided for more accurate counting.\n */\n tokens(counter?: (content: string) => number): number {\n const content = this.toString();\n if (counter) {\n return counter(content);\n }\n // Rough estimation: ~4 characters per token for English text\n return Math.ceil(content.length / 4);\n }\n\n /**\n * Iterates over items and applies a builder function for each.\n */\n each<T>(\n items: T[],\n builder: (item: T, writer: this & InlineUtils, index: number) => void,\n ): this {\n items.forEach((item, index) => {\n builder(item, this.enhanced, index);\n });\n return this;\n }\n\n /**\n * Converts the prose to plain text by stripping markdown formatting.\n */\n toPlainText(): string {\n let text = this.toString();\n\n // Remove code blocks (preserve content)\n text = text.replace(/```[\\s\\S]*?```/g, (match) => {\n const lines = match.split('\\n');\n return lines.slice(1, -1).join('\\n');\n });\n\n // Remove inline code backticks\n text = text.replace(/`([^`]+)`/g, '$1');\n\n // Remove headings (keep text)\n text = text.replace(/^#{1,6}\\s+(.*)$/gm, '$1');\n\n // Remove bold\n text = text.replace(/\\*\\*([^*]+)\\*\\*/g, '$1');\n\n // Remove italic\n text = text.replace(/\\*([^*]+)\\*/g, '$1');\n\n // Remove links (keep text)\n text = text.replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1');\n\n // Remove blockquote markers\n text = text.replace(/^>\\s?/gm, '');\n\n // Remove horizontal rules\n text = text.replace(/^---$/gm, '');\n\n // Remove list markers\n text = text.replace(/^[-*]\\s+/gm, '');\n text = text.replace(/^\\d+\\.\\s+/gm, '');\n\n // Remove XML tags (keep content)\n text = text.replace(/<[^>]+>/g, '');\n\n // Remove table formatting\n text = text.replace(/\\|/g, ' ');\n text = text.replace(/^[\\s-]+$/gm, '');\n\n // Collapse multiple spaces\n text = text.replace(/ {2,}/g, ' ');\n\n // Collapse multiple newlines\n text = text.replace(/\\n{3,}/g, '\\n\\n');\n\n return text.trim();\n }\n\n /**\n * Runs output validation if a validator is provided.\n */\n private validateOutput(\n format: OutputFormat,\n data: unknown,\n options: ValidationOptions,\n ): void {\n if (!options.validate) return;\n let validationData = data;\n if (format === 'json' && typeof data === 'string') {\n try {\n validationData = JSON.parse(data);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Invalid JSON string';\n throw new ValidationError(\n format,\n [{ path: '$', message: `Invalid JSON string: ${message}` }],\n options.label,\n );\n }\n }\n if (format === 'yaml' && typeof data === 'string' && options.parseYaml) {\n try {\n validationData = options.parseYaml(data);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Invalid YAML string';\n throw new ValidationError(\n format,\n [{ path: '$', message: `Invalid YAML string: ${message}` }],\n options.label,\n );\n }\n }\n const result = options.validate({\n format,\n data: validationData,\n schema: options.schema,\n });\n if (result.valid) return;\n throw new ValidationError(format, result.issues ?? [], options.label);\n }\n\n /**\n * Returns necessary newline padding if there is existing content.\n * Ensures exactly two newlines (a paragraph break) before a block element.\n */\n private get padding(): string {\n if (this._skipNextPadding || this.parts.length === 0) {\n this._skipNextPadding = false;\n return '';\n }\n const lastPart = this.parts[this.parts.length - 1]!;\n if (lastPart.endsWith('\\n\\n')) return '';\n if (lastPart.endsWith('\\n')) return '\\n';\n return '\\n\\n';\n }\n\n /**\n * Internal helper to create a list builder.\n */\n private createListBuilder(): {\n builder: ListBuilder;\n getItems: () => (string | number | boolean | ProseWriter)[];\n } {\n const items: (string | number | boolean | ProseWriter)[] = [];\n const lb: ListBuilder = {\n item: (...content: (string | number | boolean | ProseWriter)[]) => {\n items.push(\n this.createChildWriter()\n .write(...content)\n .toString()\n .trimEnd(),\n );\n return lb;\n },\n task: (\n checked: boolean,\n ...content: (string | number | boolean | ProseWriter)[]\n ) => {\n const checkbox = checked ? '[x] ' : '[ ] ';\n const text = this.createChildWriter()\n .write(...content)\n .toString()\n .trimEnd();\n items.push(checkbox + text);\n return lb;\n },\n todo: (...content: (string | number | boolean | ProseWriter)[]) =>\n lb.task(false, ...content),\n done: (...content: (string | number | boolean | ProseWriter)[]) =>\n lb.task(true, ...content),\n unorderedList: (\n ...args: [(l: ListBuilder) => void] | (string | number | boolean | ProseWriter)[]\n ) => {\n const sub = this.createChildWriter();\n if (args.length === 1 && typeof args[0] === 'function') {\n sub.unorderedList(args[0] as (l: ListBuilder) => void);\n } else {\n sub.unorderedList(...(args as (string | number | boolean | ProseWriter)[]));\n }\n items.push(sub);\n return lb;\n },\n list: (\n ...args: [(l: ListBuilder) => void] | (string | number | boolean | ProseWriter)[]\n ) => {\n const sub = this.createChildWriter();\n if (args.length === 1 && typeof args[0] === 'function') {\n sub.list(args[0] as (l: ListBuilder) => void);\n } else {\n sub.list(...(args as (string | number | boolean | ProseWriter)[]));\n }\n items.push(sub);\n return lb;\n },\n orderedList: (\n ...args: [(l: ListBuilder) => void] | (string | number | boolean | ProseWriter)[]\n ) => {\n const sub = this.createChildWriter();\n if (args.length === 1 && typeof args[0] === 'function') {\n sub.orderedList(args[0] as (l: ListBuilder) => void);\n } else {\n sub.orderedList(...(args as (string | number | boolean | ProseWriter)[]));\n }\n items.push(sub);\n return lb;\n },\n comment: (content: string) => {\n const sub = this.createChildWriter();\n sub.comment(content);\n items.push(sub);\n return lb;\n },\n bold: this.safeMode ? safeBold : bold,\n italic: this.safeMode ? safeItalic : italic,\n code: this.safeMode ? safeInlineCode : code,\n inline: this.safeMode ? safeInlineCode : inline,\n strike: this.safeMode ? safeStrike : strike,\n link: this.safeMode ? safeLink : link,\n image: this.safeMode ? safeImage : image,\n };\n return { builder: lb, getItems: () => items };\n }\n\n /**\n * Creates an empty ProseWriter instance.\n */\n static empty(): ProseWriter {\n return new ProseWriter();\n }\n\n /**\n * Joins multiple ProseWriter instances into one.\n */\n static join(...writers: ProseWriter[]): ProseWriter {\n const result = new ProseWriter();\n for (const writer of writers) {\n result.parts.push(writer.toString());\n }\n return result;\n }\n\n /**\n * Creates a ProseWriter from a template string.\n */\n static fromTemplate(template: string): ProseWriter {\n return new ProseWriter(template);\n }\n\n /**\n * Converts the accumulated prose to a string.\n */\n toString(): string {\n return this.parts.join('');\n }\n\n /**\n * Returns the primitive value (string) for type coercion.\n */\n [Symbol.toPrimitive](hint: string): string | number {\n if (hint === 'number') {\n return Number.NaN;\n }\n return this.toString();\n }\n\n /**\n * Returns the string tag for the object.\n */\n get [Symbol.toStringTag](): string {\n return 'ProseWriter';\n }\n}\n\n/**\n * Creates a new ProseWriter instance with the given content.\n */\nconst buildWrite = (safeMode: boolean) => {\n const createWriter = () => new ProseWriter(undefined, { safe: safeMode });\n return Object.assign(\n (...content: WriterValue[]): ProseWriter => {\n return createWriter().write(...content);\n },\n {\n with: (builder: (writer: ProseWriter & InlineUtils) => void): ProseWriter => {\n return createWriter().with(builder);\n },\n template: (template: string): ProseWriter => {\n if (safeMode) {\n return createWriter().write(asSafeString(template));\n }\n return createWriter().write(template);\n },\n unorderedList: (\n ...args: [(l: ListBuilder) => void] | WriterValue[]\n ): ProseWriter => {\n const pw = createWriter();\n if (args.length === 1 && typeof args[0] === 'function') {\n return pw.unorderedList(args[0] as (l: ListBuilder) => void);\n }\n return pw.unorderedList(...(args as WriterValue[]));\n },\n list: (...args: [(l: ListBuilder) => void] | WriterValue[]): ProseWriter => {\n const pw = createWriter();\n if (args.length === 1 && typeof args[0] === 'function') {\n return pw.list(args[0] as (l: ListBuilder) => void);\n }\n return pw.list(...(args as WriterValue[]));\n },\n orderedList: (...args: [(l: ListBuilder) => void] | WriterValue[]): ProseWriter => {\n const pw = createWriter();\n if (args.length === 1 && typeof args[0] === 'function') {\n return pw.orderedList(args[0] as (l: ListBuilder) => void);\n }\n return pw.orderedList(...(args as WriterValue[]));\n },\n tasks: (\n ...args: [(l: ListBuilder) => void] | (WriterValue | [WriterValue, boolean])[]\n ): ProseWriter => {\n const pw = createWriter();\n if (args.length === 1 && typeof args[0] === 'function') {\n return pw.tasks(args[0] as (l: ListBuilder) => void);\n }\n return pw.tasks(...(args as (WriterValue | [WriterValue, boolean])[]));\n },\n callout: (\n type: 'NOTE' | 'TIP' | 'IMPORTANT' | 'WARNING' | 'CAUTION',\n content: string | ((writer: ProseWriter & InlineUtils) => void),\n ): ProseWriter => {\n return createWriter().callout(type, content);\n },\n schema: (schemaValue: unknown, options?: SchemaEmbedOptions): ProseWriter => {\n return createWriter().schema(schemaValue, options);\n },\n },\n );\n};\n\nconst safeWrite = buildWrite(true);\n\nexport const write = Object.assign(buildWrite(false), { safe: safeWrite });\n\n/**\n * Appends bold formatting to a string.\n */\nexport const bold = (content: string | number | boolean | ProseWriter): string =>\n `**${content instanceof ProseWriter ? content.toString().trim() : content}**`;\n\n/**\n * Appends italic formatting to a string.\n */\nexport const italic = (content: string | number | boolean | ProseWriter): string =>\n `*${content instanceof ProseWriter ? content.toString().trim() : content}*`;\n\n/**\n * Appends inline code formatting to a string.\n */\nexport const code = (content: string | number | boolean | ProseWriter): string =>\n `\\`${content instanceof ProseWriter ? content.toString().trim() : content}\\``;\n\n/**\n * Alias for code().\n */\nexport const inline = code;\n\n/**\n * Appends strikethrough formatting to a string.\n */\nexport const strike = (content: string | number | boolean | ProseWriter): string =>\n `~~${content instanceof ProseWriter ? content.toString().trim() : content}~~`;\n\n/**\n * Creates a markdown link string.\n */\nexport const link = (text: string | ProseWriter, url: string): string =>\n `[${text instanceof ProseWriter ? text.toString().trim() : text}](${url})`;\n\n/**\n * Creates a markdown image string.\n */\nexport const image = (alt: string | ProseWriter, url: string): string =>\n ``;\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";AA+BA,MAAM,CAAW,CACP,MAER,WAAW,CAAC,EAAe,CACzB,KAAK,MAAQ,EAGf,QAAQ,EAAW,CACjB,OAAO,KAAK,MAGd,OAAO,EAAW,CAChB,OAAO,KAAK,MAEhB,CA2CA,IAAM,EAAgB,CAAC,IACrB,EAAM,QAAQ,KAAM,OAAO,EAAE,QAAQ,KAAM,MAAM,EAAE,QAAQ,KAAM,MAAM,EAEnE,EAA0B,CAAC,IAAyB,CACxD,GAAI,eAAe,KAAK,CAAI,EAC1B,OAAO,EAAK,QAAQ,iBAAkB,QAAQ,EAEhD,GAAI,QAAQ,KAAK,CAAI,EACnB,OAAO,EAAK,QAAQ,UAAW,OAAO,EAExC,GAAI,gBAAgB,KAAK,CAAI,EAC3B,OAAO,EAAK,QAAQ,gBAAiB,QAAQ,EAE/C,GAAI,cAAc,KAAK,CAAI,EACzB,OAAO,EAAK,QAAQ,gBAAiB,SAAS,EAEhD,OAAO,GAGH,EAAqB,CAAC,IAA0B,CAKpD,OAJgB,EAAc,CAAK,EAChC,QAAQ,kBAAmB,MAAM,EACjC,QAAQ,MAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EAEpB,MAAM;AAAA,CAAI,EACV,IAAI,CAAC,IAAS,EAAwB,CAAI,CAAC,EAC3C,KAAK;AAAA,CAAI,GAGR,EAAiB,CAAC,IAA0B,CAChD,IAAM,EAAU,EAAM,MAAM,KAAK,EAC3B,GAAa,EAAU,KAAK,IAAI,GAAG,EAAQ,IAAI,CAAC,IAAM,EAAE,MAAM,CAAC,EAAI,GAAK,EACxE,EAAQ,IAAI,OAAO,CAAS,EAE5B,EADe,UAAU,KAAK,CAAK,EACV,IAAI,KAAW,EAC9C,MAAO,GAAG,IAAQ,IAAU,KAGxB,EAAwB,CAAC,IAAwB,CAErD,OADgB,UAAU,CAAG,EACd,QAAQ,QAAS,MAAM,GAGlC,EAAkB,CACtB,EACA,EAAgC,SACU,CAC1C,GAAI,aAAmB,EACrB,MAAO,CAAE,MAAO,EAAQ,SAAS,EAAG,UAAW,EAAK,EAEtD,GAAI,aAAmB,EAAa,CAClC,IAAM,EAAM,EAAQ,SAAS,EAC7B,GAAI,IAAS,MAAO,MAAO,CAAE,MAAO,EAAI,QAAQ,EAAG,UAAW,EAAK,EACnE,GAAI,IAAS,OAAQ,MAAO,CAAE,MAAO,EAAI,KAAK,EAAG,UAAW,EAAK,EACjE,MAAO,CAAE,MAAO,EAAK,UAAW,EAAK,EAEvC,MAAO,CAAE,MAAO,OAAO,CAAO,EAAG,UAAW,EAAM,GAG9C,EAAmB,CAAC,IAAkC,CAC1D,IAAQ,QAAO,aAAc,EAAgB,EAAS,MAAM,EAC5D,OAAO,EAAY,EAAQ,EAAmB,CAAK,GAG/C,EAAe,CAAC,IACpB,IAAI,EAAW,CAAK,EAEhB,EAAW,CAAC,IAChB,EAAa,KAAK,EAAiB,CAAO,KAAK,EAE3C,EAAa,CAAC,IAClB,EAAa,IAAI,EAAiB,CAAO,IAAI,EAEzC,EAAa,CAAC,IAClB,EAAa,KAAK,EAAiB,CAAO,KAAK,EAE3C,EAAiB,CAAC,IAAkC,CACxD,IAAQ,SAAU,EAAgB,EAAS,MAAM,EACjD,OAAO,EAAa,EAAe,CAAK,CAAC,GAGrC,EAAW,CAAC,EAA4B,IAAwB,CACpE,IAAQ,QAAO,aAAc,EAAgB,EAAM,MAAM,EACnD,EAAW,EAAY,EAAQ,EAAmB,CAAK,EACvD,EAAU,EAAsB,CAAG,EACzC,OAAO,EAAa,IAAI,MAAa,IAAU,GAG3C,EAAY,CAAC,EAA2B,IAAwB,CACpE,IAAQ,QAAO,aAAc,EAAgB,EAAK,MAAM,EAClD,EAAU,EAAY,EAAQ,EAAmB,CAAK,EACtD,EAAU,EAAsB,CAAG,EACzC,OAAO,EAAa,KAAK,MAAY,IAAU,GAG3C,EAAyB,CAAC,IAAsC,CACpE,GAAI,EAAO,SAAW,EACpB,MAAO,sCAET,OAAO,EACJ,IAAI,CAAC,EAAO,IAAU,CACrB,IAAM,EAAO,EAAM,KAAO,GAAG,EAAM,SAAW,GAC9C,MAAO,GAAG,EAAQ,MAAM,IAAO,EAAM,UACtC,EACA,KAAK;AAAA,CAAI,GAGP,MAAM,UAAwB,KAAM,CACzC,OACA,OAEA,WAAW,CAAC,EAAsB,EAA2B,EAAgB,CAC3E,IAAM,EAAQ,GAAS,GAAG,EAAO,YAAY,sBAC7C,MAAM,GAAG;AAAA,EAAU,EAAuB,CAAM,GAAG,EACnD,KAAK,KAAO,kBACZ,KAAK,OAAS,EACd,KAAK,OAAS,EAElB,CAEO,IAAM,EAA4B,CACvC,IACoB,CACpB,MAAO,EAAG,SAAQ,OAAM,YAA+B,CACrD,GAAI,IAAW,QAAU,IAAW,OAClC,MAAO,CAAE,MAAO,EAAK,EAEvB,OAAO,EAAQ,EAAQ,CAAI,IAIlB,EAA0B,CACrC,IACiC,CACjC,MAAO,CAAC,IAAkB,EAAO,CAAK,GAMjC,MAAM,CAAY,CACf,MAAkB,CAAC,EACnB,iBAAmB,GACnB,SAER,WAAW,CAAC,EAAkB,EAAyB,CAAC,EAAG,CAEzD,GADA,KAAK,SAAW,EAAQ,MAAQ,GAC5B,IAAY,OACd,KAAK,MAAM,KAAK,EAAQ,SAAS;AAAA,CAAI,EAAI,EAAU,EAAU;AAAA,CAAI,EAI7D,iBAAiB,EAAgB,CACvC,OAAO,IAAI,EAAY,OAAW,CAAE,KAAM,KAAK,QAAS,CAAC,EAQ3D,KAAK,IAAI,EAA4D,CACnE,IAAM,EAAS,EACZ,IAAI,CAAC,IAAM,CACV,IAAQ,QAAO,aAAc,EAAgB,EAAG,KAAK,EACrD,GAAI,KAAK,UAAY,CAAC,EACpB,OAAO,EAAmB,CAAK,EAEjC,OAAO,EACR,EACA,KAAK,GAAG,EAEX,GAAI,KAAK,MAAM,SAAW,GAAK,EAAO,SAAW,EAC/C,OAAO,KAGT,IAAM,EAAI,KAAK,QAEf,OADA,KAAK,MAAM,KAAK,EAAI,EAAS;AAAA,CAAI,EAC1B,KAOT,QAAQ,EAAS,CAEf,OADA,KAAK,iBAAmB,GACjB,KAUT,aAAa,IACR,EACG,CACN,GAAI,EAAK,SAAW,GAAK,OAAO,EAAK,KAAO,WAAY,CACtD,IAAQ,UAAS,YAAa,KAAK,kBAAkB,EACpD,EAAK,GAAgC,CAAO,EAE7C,IAAM,EADQ,EAAS,EAEpB,IAAI,CAAC,IAAS,CACb,GAAI,aAAgB,EAClB,OAAO,EACJ,SAAS,EACT,QAAQ,EACR,MAAM;AAAA,CAAI,EACV,IAAI,CAAC,IAAS,KAAK,GAAM,EACzB,KAAK;AAAA,CAAI,EAEd,MAAO,KAAK,IACb,EACA,KAAK;AAAA,CAAI,EAEZ,OADA,KAAK,MAAM,KAAK,GAAG,KAAK,UAAU;AAAA;AAAA,CAAiB,EAC5C,KAIT,IAAM,EADQ,EAEX,IAAI,CAAC,IAAS,CACb,GAAI,aAAgB,EAClB,OAAO,EACJ,SAAS,EACT,QAAQ,EACR,MAAM;AAAA,CAAI,EACV,IAAI,CAAC,IAAS,KAAK,GAAM,EACzB,KAAK;AAAA,CAAI,EAEd,IAAQ,QAAO,aAAc,EAAgB,CAAI,EAEjD,MAAO,KADM,KAAK,UAAY,CAAC,EAAY,EAAmB,CAAK,EAAI,IAExE,EACA,KAAK;AAAA,CAAI,EAEZ,OADA,KAAK,MAAM,KAAK,GAAG,KAAK,UAAU;AAAA;AAAA,CAAiB,EAC5C,KAQT,IAAI,IACC,EACG,CACN,GAAI,EAAK,SAAW,GAAK,OAAO,EAAK,KAAO,WAC1C,OAAO,KAAK,cAAc,EAAK,EAA8B,EAE/D,OAAO,KAAK,cAAc,GAAI,CAAoD,EAUpF,WAAW,IACN,EACG,CACN,GAAI,EAAK,SAAW,GAAK,OAAO,EAAK,KAAO,WAAY,CACtD,IAAQ,UAAS,YAAa,KAAK,kBAAkB,EACpD,EAAK,GAAgC,CAAO,EAC7C,IAAI,EAAQ,EAEN,EADQ,EAAS,EAEpB,IAAI,CAAC,IAAS,CACb,GAAI,aAAgB,EAClB,OAAO,EACJ,SAAS,EACT,QAAQ,EACR,MAAM;AAAA,CAAI,EACV,IAAI,CAAC,IAAS,KAAK,GAAM,EACzB,KAAK;AAAA,CAAI,EAEd,MAAO,GAAG,QAAY,IACvB,EACA,KAAK;AAAA,CAAI,EAEZ,OADA,KAAK,MAAM,KAAK,GAAG,KAAK,UAAU;AAAA;AAAA,CAAiB,EAC5C,KAGT,IAAI,EAAQ,EAEN,EADQ,EAEX,IAAI,CAAC,IAAS,CACb,GAAI,aAAgB,EAClB,OAAO,EACJ,SAAS,EACT,QAAQ,EACR,MAAM;AAAA,CAAI,EACV,IAAI,CAAC,IAAS,KAAK,GAAM,EACzB,KAAK;AAAA,CAAI,EAEd,IAAQ,QAAO,aAAc,EAAgB,CAAI,EAC3C,EAAO,KAAK,UAAY,CAAC,EAAY,EAAmB,CAAK,EAAI,EACvE,MAAO,GAAG,QAAY,IACvB,EACA,KAAK;AAAA,CAAI,EAEZ,OADA,KAAK,MAAM,KAAK,GAAG,KAAK,UAAU;AAAA;AAAA,CAAiB,EAC5C,KAgBT,KAAK,IACA,EASG,CACN,GAAI,EAAK,SAAW,GAAK,OAAO,EAAK,KAAO,WAAY,CACtD,IAAQ,UAAS,YAAa,KAAK,kBAAkB,EACpD,EAAK,GAAgC,CAAO,EAE7C,IAAM,EADQ,EAAS,EAEpB,IAAI,CAAC,IAAS,CACb,GAAI,aAAgB,EAClB,OAAO,EACJ,SAAS,EACT,QAAQ,EACR,MAAM;AAAA,CAAI,EACV,IAAI,CAAC,IAAS,KAAK,GAAM,EACzB,KAAK;AAAA,CAAI,EAEd,MAAO,KAAK,IACb,EACA,KAAK;AAAA,CAAI,EAEZ,OADA,KAAK,MAAM,KAAK,GAAG,KAAK,UAAU;AAAA;AAAA,CAAiB,EAC5C,KA0BT,IAAM,EAtBJ,EAOA,IAAI,CAAC,IAAQ,CACb,GAAI,MAAM,QAAQ,CAAG,GAAK,EAAI,SAAW,GAAK,OAAO,EAAI,KAAO,UAAW,CACzE,IAAO,EAAS,GAAW,EACrB,EAAW,EAAU,OAAS,OAC9B,EAAO,KAAK,kBAAkB,EAAE,MAAM,CAAO,EAAE,SAAS,EAAE,QAAQ,EACxE,OAAO,EAAW,EAEpB,IAAM,EAAW,OACX,EAAO,KAAK,kBAAkB,EACjC,MAAM,CAA8C,EACpD,SAAS,EACT,QAAQ,EACX,OAAO,EAAW,EACnB,EAEyB,IAAI,CAAC,IAAS,KAAK,GAAM,EAAE,KAAK;AAAA,CAAI,EAE9D,OADA,KAAK,MAAM,KAAK,GAAG,KAAK,UAAU;AAAA;AAAA,CAAiB,EAC5C,KAMT,OAAO,CACL,EACA,EACM,CACN,IAAI,EACJ,GAAI,OAAO,IAAY,WAAY,CACjC,IAAM,EAAS,KAAK,kBAAkB,EACtC,EAAQ,EAAO,QAAQ,EACvB,EAAgB,EAAO,SAAS,EAAE,QAAQ,EACrC,KACL,IAAQ,QAAO,aAAc,EAAgB,CAAO,EACpD,EAAgB,KAAK,UAAY,CAAC,EAAY,EAAmB,CAAK,EAAI,EAG5E,IAAM,EAAQ,EAAc,MAAM;AAAA,CAAI,EAEhC,EADa,CAAC,KAAK,EAAK,YAAY,KAAM,GAAG,CAAK,EACxB,IAAI,CAAC,IAAS,KAAK,GAAM,EAAE,KAAK;AAAA,CAAI,EAGpE,OADA,KAAK,MAAM,KAAK,GAAG,KAAK,UAAU;AAAA;AAAA,CAAkB,EAC7C,KAMT,OAAO,CAAC,KAAiC,EAAyB,CAChE,IAAM,EAAS,IAAI,OAAO,CAAK,EACzB,EAAS,EACZ,IAAI,CAAC,IAAS,CACb,IAAQ,QAAO,aAAc,EAAgB,CAAI,EACjD,GAAI,KAAK,UAAY,CAAC,EACpB,OAAO,EAAmB,CAAK,EAEjC,OAAO,EACR,EACA,KAAK,GAAG,EAEX,OADA,KAAK,MAAM,KAAK,GAAG,KAAK,UAAU,KAAU;AAAA;AAAA,CAAY,EACjD,KAOT,UAAU,IAAI,EAAuB,CACnC,IAAM,EAAc,EACjB,IAAI,CAAC,IAAS,CACb,IAAQ,QAAO,aAAc,EAAgB,CAAI,EACjD,GAAI,KAAK,UAAY,CAAC,EACpB,OAAO,EAAmB,CAAK,EAEjC,OAAO,EACR,EACA,IAAI,CAAC,IAAS,KAAK,GAAM,EACzB,KAAK;AAAA;AAAA,CAAO,EAEf,OADA,KAAK,MAAM,KAAK,GAAG,KAAK,UAAU;AAAA;AAAA,CAAiB,EAC5C,KAMT,SAAS,CACP,EACA,EACM,CACN,IAAI,EACJ,GAAI,OAAO,IAAY,WAAY,CACjC,IAAM,EAAS,IAAI,EACnB,EAAQ,EAAO,QAAQ,EACvB,EAAO,EAAO,SAAS,EAAE,KAAK,EAE9B,OAAO,EAGT,OADA,KAAK,MAAM,KAAK,GAAG,KAAK,gBAAgB;AAAA,EAAa;AAAA;AAAA;AAAA,CAAkB,EAChE,QAML,UAAS,EAAS,CAEpB,OADA,KAAK,MAAM,KAAK,GAAG,KAAK;AAAA;AAAA,CAAgB,EACjC,KAOT,IAAI,CAAC,EAAe,EAA6B,CAAC,EAAS,CACzD,KAAK,eAAe,OAAQ,EAAM,CAAO,EACzC,IAAM,EAAa,OAAO,IAAS,SAAW,EAAO,KAAK,UAAU,EAAM,KAAM,CAAC,EACjF,OAAO,KAAK,UAAU,OAAQ,CAAU,EAO1C,MAAM,CAAC,EAA2B,CAChC,IAAM,EAAU,EAAO,SAAS,EAChC,GAAI,EAAQ,OAAS,EACnB,KAAK,MAAM,KAAK,KAAK,QAAU,CAAO,EAExC,OAAO,QAOG,SAAQ,EAAuB,CACzC,IAAM,EAAsC,KAAK,SAC7C,CACE,KAAM,EACN,OAAQ,EACR,KAAM,EACN,OAAQ,EACR,KAAM,EACN,OAAQ,EACR,MAAO,CACT,EACA,CACE,OACA,SACA,OACA,SACA,OACA,SACA,OACF,EACJ,OAAO,IAAI,MAAM,KAAM,CACrB,GAAG,CAAC,EAAQ,EAAM,CAChB,GAAI,OAAO,IAAS,UAAY,KAAQ,EACtC,OAAO,EAAW,GAEpB,IAAM,EAAM,QAAQ,IAAI,EAAQ,EAAM,CAAM,EAC5C,GAAI,OAAO,IAAQ,WACjB,OAAQ,EAAwC,KAAK,CAAM,EAE7D,OAAO,EAEX,CAAC,EAOH,IAAI,CAAC,EAAoB,EAAqD,CAC5E,GAAI,EACF,EAAQ,KAAK,QAAQ,EAEvB,OAAO,KAOT,IAAI,CAAC,EAAqD,CAExD,OADA,EAAQ,KAAK,QAAQ,EACd,KAOT,GAAG,CACD,EACA,EACM,CACN,IAAI,EACJ,GAAI,OAAO,IAAY,WAAY,CACjC,IAAM,EAAS,KAAK,kBAAkB,EACtC,EAAQ,EAAO,QAAQ,EACvB,EAAgB,EAAO,SAAS,EAC3B,KACL,IAAQ,QAAO,aAAc,EAAgB,CAAO,EACpD,GAAI,KAAK,UAAY,CAAC,EACpB,EAAgB,EAAc,CAAK,EAEnC,OAAgB,EAIpB,OADA,KAAK,MAAM,KAAK,GAAG,KAAK,WAAW;AAAA,EAAU,EAAc,QAAQ;AAAA,IAAQ;AAAA,CAAS,EAC7E,KAMT,IAAI,CAAC,EAAwD,CAC3D,IAAM,EAAY,KAAK,SAAW,EAAe,CAAO,EAAI,EAAK,CAAO,EAExE,OADA,KAAK,MAAM,KAAK,KAAK,QAAU,EAAY;AAAA,CAAI,EACxC,KAOT,IAAI,CAAC,EAAgD,CAEnD,IAAM,EADU,KAAK,SAAS,EACP,QAAQ,iBAAkB,CAAC,EAAO,IAAwB,CAC/E,IAAM,EAAQ,EAAU,GACxB,GAAI,IAAU,OAAW,OAAO,EAChC,OAAO,KAAK,SAAW,EAAmB,CAAK,EAAI,EACpD,EACD,OAAO,IAAI,EAAY,EAAQ,CAAE,KAAM,KAAK,QAAS,CAAC,EASxD,OAAO,CACL,EACA,EACA,EAA+B,EACzB,CACN,IAAM,EAAgB,KAAK,kBAAkB,EAC7C,EAAQ,EAAc,QAAQ,EAC9B,IAAM,EAAS,IAAI,OAAO,CAAK,EACzB,EAAQ,KAAK,SAAW,EAAmB,CAAI,EAAI,EAEzD,OADA,KAAK,MAAM,KAAK,GAAG,KAAK,UAAU,KAAU;AAAA;AAAA,EAAY,EAAc,SAAS,GAAG,EAC3E,KAOT,KAAK,EAAgB,CACnB,IAAM,EAAS,IAAI,EAAY,OAAW,CAAE,KAAM,KAAK,QAAS,CAAC,EAEjE,OADA,EAAO,MAAQ,CAAC,GAAG,KAAK,KAAK,EACtB,EAQT,KAAuB,CACrB,EACA,EACM,CAIN,IAAM,EAAY,MAHE,KAAK,SACrB,EAAQ,IAAI,CAAC,IAAW,EAAmB,CAAM,CAAC,EAClD,GAC+B,KAAK,KAAK,MACvC,EAAe,KAAK,EAAQ,IAAI,IAAM,KAAK,EAAE,KAAK,KAAK,MAEvD,EAAW,EACd,IAAI,CAAC,IAAQ,CAYZ,MAAO,MAXQ,MAAM,QAAQ,CAAG,EAC5B,EAAI,IAAI,CAAC,IAAQ,CACf,IAAM,EAAO,OAAO,GAAO,EAAE,EAC7B,OAAO,KAAK,SAAW,EAAmB,CAAI,EAAI,EACnD,EACD,EAAQ,IAAI,CAAC,IAAM,CACjB,IAAM,EAAM,EAAI,GAChB,GAAI,aAAe,EAAa,OAAO,EAAI,YAAY,EACvD,IAAM,EAAO,OAAO,GAAO,EAAE,EAC7B,OAAO,KAAK,SAAW,EAAmB,CAAI,EAAI,EACnD,GACc,KAAK,KAAK,MAC9B,EACA,KAAK;AAAA,CAAI,EAGZ,OADA,KAAK,MAAM,KAAK,GAAG,KAAK,UAAU;AAAA,EAAc;AAAA,EAAiB;AAAA;AAAA,CAAc,EACxE,KAOT,WAAW,CAAC,EAAmC,CAC7C,IAAM,EAAU,OAAO,QAAQ,CAAG,EAC/B,IAAI,EAAE,EAAK,KAAW,CACrB,GAAI,KAAK,SACP,MAAO,GAAG,EAAS,CAAG,MAAM,EAAmB,CAAK,IAEtD,MAAO,KAAK,QAAU,IACvB,EACA,KAAK;AAAA,CAAI,EAEZ,OADA,KAAK,MAAM,KAAK,GAAG,KAAK,UAAU;AAAA;AAAA,CAAa,EACxC,KAMT,MAAM,CAAC,EAAsB,EAA8B,CAAC,EAAS,CACnE,IAAQ,SAAS,OAAQ,QAAO,QAAQ,EAAG,OAAQ,EACnD,GAAI,EACF,KAAK,QAAQ,EAAO,CAAK,EAG3B,GAAI,EAAK,CACP,IAAM,EAAe,KAAK,kBAAkB,EAC5C,GAAI,IAAW,OACb,EAAa,KAAK,CAAW,EAE7B,OAAa,KAAK,CAAW,EAE/B,OAAO,KAAK,IAAI,EAAK,CAAY,EAGnC,GAAI,IAAW,OACb,OAAO,KAAK,KAAK,CAAW,EAE9B,OAAO,KAAK,KAAK,CAAW,EAM9B,IAAI,CAAC,EAAwD,CAC3D,IAAM,EAAY,KAAK,SAAW,EAAS,CAAO,EAAI,EAAK,CAAO,EAElE,OADA,KAAK,MAAM,KAAK,KAAK,QAAU,EAAY;AAAA,CAAI,EACxC,KAMT,MAAM,CAAC,EAAwD,CAC7D,IAAM,EAAY,KAAK,SAAW,EAAW,CAAO,EAAI,EAAO,CAAO,EAEtE,OADA,KAAK,MAAM,KAAK,KAAK,QAAU,EAAY;AAAA,CAAI,EACxC,KAMT,MAAM,CAAC,EAAwD,CAC7D,IAAM,EAAY,KAAK,SAAW,EAAW,CAAO,EAAI,EAAO,CAAO,EAEtE,OADA,KAAK,MAAM,KAAK,KAAK,QAAU,EAAY;AAAA,CAAI,EACxC,KAMT,GAAG,CAAC,EAAuB,CAEzB,OADA,KAAK,MAAM,KAAK,CAAO,EAChB,KAMT,IAAI,CAAC,EAA4B,EAAmB,CAClD,IAAM,EAAY,KAAK,SAAW,EAAS,EAAM,CAAG,EAAI,EAAK,EAAM,CAAG,EAEtE,OADA,KAAK,MAAM,KAAK,KAAK,QAAU,EAAY;AAAA,CAAI,EACxC,KAMT,KAAK,CAAC,EAA2B,EAAmB,CAClD,IAAM,EAAY,KAAK,SAAW,EAAU,EAAK,CAAG,EAAI,EAAM,EAAK,CAAG,EAEtE,OADA,KAAK,MAAM,KAAK,KAAK,QAAU,EAAY;AAAA,CAAI,EACxC,KAMT,OAAO,CAAC,EAAuB,CAE7B,OADA,KAAK,MAAM,KAAK,GAAG,KAAK,eAAe;AAAA;AAAA,CAAiB,EACjD,KAOT,IAAI,CAAC,EAAe,EAA6B,CAAC,EAAS,CACzD,KAAK,eAAe,OAAQ,EAAM,CAAO,EACzC,IAAM,EAAa,OAAO,IAAS,SAAW,EAAO,KAAK,aAAa,CAAI,EAC3E,OAAO,KAAK,UAAU,OAAQ,CAAU,EAMlC,YAAY,CAAC,EAAe,EAAiB,EAAW,CAC9D,IAAM,EAAS,KAAK,OAAO,CAAM,EAEjC,GAAI,IAAS,MAAQ,IAAS,OAC5B,MAAO,OAGT,GAAI,OAAO,IAAS,SAAU,CAE5B,GAAI,WAAW,KAAK,CAAI,GAAK,IAAS,GACpC,MAAO,IAAI,EAAK,QAAQ,KAAM,MAAK,KAErC,OAAO,EAGT,GAAI,OAAO,IAAS,UAAY,OAAO,IAAS,UAC9C,OAAO,OAAO,CAAI,EAGpB,GAAI,MAAM,QAAQ,CAAI,EAAG,CACvB,GAAI,EAAK,SAAW,EAAG,MAAO,KAC9B,OAAO,EACJ,IAAI,CAAC,IAAS,GAAG,MAAW,KAAK,aAAa,EAAM,EAAS,CAAC,GAAG,EACjE,KAAK;AAAA,CAAI,EAGd,GAAI,OAAO,IAAS,SAAU,CAC5B,IAAM,EAAU,OAAO,QAAQ,CAA+B,EAC9D,GAAI,EAAQ,SAAW,EAAG,MAAO,KACjC,OAAO,EACJ,IAAI,EAAE,EAAK,KAAW,CACrB,IAAM,EAAW,KAAK,aAAa,EAAO,EAAS,CAAC,EACpD,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,CAAC,MAAM,QAAQ,CAAK,EACrE,MAAO,GAAG,IAAS;AAAA,EAAS,IAE9B,GAAI,MAAM,QAAQ,CAAK,EACrB,MAAO,GAAG,IAAS;AAAA,EAAS,IAE9B,MAAO,GAAG,IAAS,MAAQ,IAC5B,EACA,KAAK;AAAA,CAAI,EAId,OAAO,KAAK,UAAU,CAAI,GAAK,OAMjC,OAAO,CAAC,EAAc,EAAe,EAAqC,CACxE,IAAM,EAAgB,aAAmB,EAAc,EAAQ,SAAS,EAAI,EAE5E,OADA,KAAK,MAAM,KAAK,GAAG,KAAK,UAAU;AAAA,EAAS;AAAA,EAAkB;AAAA,CAAS,EAC/D,KAMT,OAAO,EAAgB,CACrB,IAAM,EAAU,KAAK,SAAS,EAAE,QAAQ,UAAW;AAAA;AAAA,CAAM,EACzD,OAAO,IAAI,EAAY,EAAS,CAAE,KAAM,KAAK,QAAS,CAAC,EAMzD,IAAI,EAAgB,CAClB,IAAM,EAAU,KAAK,SAAS,EAAE,KAAK,EACrC,OAAO,IAAI,EAAY,EAAS,CAAE,KAAM,KAAK,QAAS,CAAC,EAQzD,MAAM,CAAC,EAA+C,CACpD,IAAM,EAAU,KAAK,SAAS,EAC9B,GAAI,EACF,OAAO,EAAQ,CAAO,EAGxB,OAAO,KAAK,KAAK,EAAQ,OAAS,CAAC,EAMrC,IAAO,CACL,EACA,EACM,CAIN,OAHA,EAAM,QAAQ,CAAC,EAAM,IAAU,CAC7B,EAAQ,EAAM,KAAK,SAAU,CAAK,EACnC,EACM,KAMT,WAAW,EAAW,CACpB,IAAI,EAAO,KAAK,SAAS,EA8CzB,OA3CA,EAAO,EAAK,QAAQ,kBAAmB,CAAC,IAAU,CAEhD,OADc,EAAM,MAAM;AAAA,CAAI,EACjB,MAAM,EAAG,EAAE,EAAE,KAAK;AAAA,CAAI,EACpC,EAGD,EAAO,EAAK,QAAQ,aAAc,IAAI,EAGtC,EAAO,EAAK,QAAQ,oBAAqB,IAAI,EAG7C,EAAO,EAAK,QAAQ,mBAAoB,IAAI,EAG5C,EAAO,EAAK,QAAQ,eAAgB,IAAI,EAGxC,EAAO,EAAK,QAAQ,yBAA0B,IAAI,EAGlD,EAAO,EAAK,QAAQ,UAAW,EAAE,EAGjC,EAAO,EAAK,QAAQ,UAAW,EAAE,EAGjC,EAAO,EAAK,QAAQ,aAAc,EAAE,EACpC,EAAO,EAAK,QAAQ,cAAe,EAAE,EAGrC,EAAO,EAAK,QAAQ,WAAY,EAAE,EAGlC,EAAO,EAAK,QAAQ,MAAO,GAAG,EAC9B,EAAO,EAAK,QAAQ,aAAc,EAAE,EAGpC,EAAO,EAAK,QAAQ,SAAU,GAAG,EAGjC,EAAO,EAAK,QAAQ,UAAW;AAAA;AAAA,CAAM,EAE9B,EAAK,KAAK,EAMX,cAAc,CACpB,EACA,EACA,EACM,CACN,GAAI,CAAC,EAAQ,SAAU,OACvB,IAAI,EAAiB,EACrB,GAAI,IAAW,QAAU,OAAO,IAAS,SACvC,GAAI,CACF,EAAiB,KAAK,MAAM,CAAI,EAChC,MAAO,EAAO,CACd,IAAM,EAAU,aAAiB,MAAQ,EAAM,QAAU,sBACzD,MAAM,IAAI,EACR,EACA,CAAC,CAAE,KAAM,IAAK,QAAS,wBAAwB,GAAU,CAAC,EAC1D,EAAQ,KACV,EAGJ,GAAI,IAAW,QAAU,OAAO,IAAS,UAAY,EAAQ,UAC3D,GAAI,CACF,EAAiB,EAAQ,UAAU,CAAI,EACvC,MAAO,EAAO,CACd,IAAM,EAAU,aAAiB,MAAQ,EAAM,QAAU,sBACzD,MAAM,IAAI,EACR,EACA,CAAC,CAAE,KAAM,IAAK,QAAS,wBAAwB,GAAU,CAAC,EAC1D,EAAQ,KACV,EAGJ,IAAM,EAAS,EAAQ,SAAS,CAC9B,SACA,KAAM,EACN,OAAQ,EAAQ,MAClB,CAAC,EACD,GAAI,EAAO,MAAO,OAClB,MAAM,IAAI,EAAgB,EAAQ,EAAO,QAAU,CAAC,EAAG,EAAQ,KAAK,KAO1D,QAAO,EAAW,CAC5B,GAAI,KAAK,kBAAoB,KAAK,MAAM,SAAW,EAEjD,OADA,KAAK,iBAAmB,GACjB,GAET,IAAM,EAAW,KAAK,MAAM,KAAK,MAAM,OAAS,GAChD,GAAI,EAAS,SAAS;AAAA;AAAA,CAAM,EAAG,MAAO,GACtC,GAAI,EAAS,SAAS;AAAA,CAAI,EAAG,MAAO;AAAA,EACpC,MAAO;AAAA;AAAA,EAMD,iBAAiB,EAGvB,CACA,IAAM,EAAqD,CAAC,EACtD,EAAkB,CACtB,KAAM,IAAI,IAAyD,CAOjE,OANA,EAAM,KACJ,KAAK,kBAAkB,EACpB,MAAM,GAAG,CAAO,EAChB,SAAS,EACT,QAAQ,CACb,EACO,GAET,KAAM,CACJ,KACG,IACA,CACH,IAAM,EAAW,EAAU,OAAS,OAC9B,EAAO,KAAK,kBAAkB,EACjC,MAAM,GAAG,CAAO,EAChB,SAAS,EACT,QAAQ,EAEX,OADA,EAAM,KAAK,EAAW,CAAI,EACnB,GAET,KAAM,IAAI,IACR,EAAG,KAAK,GAAO,GAAG,CAAO,EAC3B,KAAM,IAAI,IACR,EAAG,KAAK,GAAM,GAAG,CAAO,EAC1B,cAAe,IACV,IACA,CACH,IAAM,EAAM,KAAK,kBAAkB,EACnC,GAAI,EAAK,SAAW,GAAK,OAAO,EAAK,KAAO,WAC1C,EAAI,cAAc,EAAK,EAA8B,EAErD,OAAI,cAAc,GAAI,CAAoD,EAG5E,OADA,EAAM,KAAK,CAAG,EACP,GAET,KAAM,IACD,IACA,CACH,IAAM,EAAM,KAAK,kBAAkB,EACnC,GAAI,EAAK,SAAW,GAAK,OAAO,EAAK,KAAO,WAC1C,EAAI,KAAK,EAAK,EAA8B,EAE5C,OAAI,KAAK,GAAI,CAAoD,EAGnE,OADA,EAAM,KAAK,CAAG,EACP,GAET,YAAa,IACR,IACA,CACH,IAAM,EAAM,KAAK,kBAAkB,EACnC,GAAI,EAAK,SAAW,GAAK,OAAO,EAAK,KAAO,WAC1C,EAAI,YAAY,EAAK,EAA8B,EAEnD,OAAI,YAAY,GAAI,CAAoD,EAG1E,OADA,EAAM,KAAK,CAAG,EACP,GAET,QAAS,CAAC,IAAoB,CAC5B,IAAM,EAAM,KAAK,kBAAkB,EAGnC,OAFA,EAAI,QAAQ,CAAO,EACnB,EAAM,KAAK,CAAG,EACP,GAET,KAAM,KAAK,SAAW,EAAW,EACjC,OAAQ,KAAK,SAAW,EAAa,EACrC,KAAM,KAAK,SAAW,EAAiB,EACvC,OAAQ,KAAK,SAAW,EAAiB,EACzC,OAAQ,KAAK,SAAW,EAAa,EACrC,KAAM,KAAK,SAAW,EAAW,EACjC,MAAO,KAAK,SAAW,EAAY,CACrC,EACA,MAAO,CAAE,QAAS,EAAI,SAAU,IAAM,CAAM,QAMvC,MAAK,EAAgB,CAC1B,OAAO,IAAI,QAMN,KAAI,IAAI,EAAqC,CAClD,IAAM,EAAS,IAAI,EACnB,QAAW,KAAU,EACnB,EAAO,MAAM,KAAK,EAAO,SAAS,CAAC,EAErC,OAAO,QAMF,aAAY,CAAC,EAA+B,CACjD,OAAO,IAAI,EAAY,CAAQ,EAMjC,QAAQ,EAAW,CACjB,OAAO,KAAK,MAAM,KAAK,EAAE,GAM1B,OAAO,YAAY,CAAC,EAA+B,CAClD,GAAI,IAAS,SACX,OAAO,OAAO,IAEhB,OAAO,KAAK,SAAS,MAMlB,OAAO,YAAY,EAAW,CACjC,MAAO,cAEX,CAKA,IAAM,EAAa,CAAC,IAAsB,CACxC,IAAM,EAAe,IAAM,IAAI,EAAY,OAAW,CAAE,KAAM,CAAS,CAAC,EACxE,OAAO,OAAO,OACZ,IAAI,IAAwC,CAC1C,OAAO,EAAa,EAAE,MAAM,GAAG,CAAO,GAExC,CACE,KAAM,CAAC,IAAsE,CAC3E,OAAO,EAAa,EAAE,KAAK,CAAO,GAEpC,SAAU,CAAC,IAAkC,CAC3C,GAAI,EACF,OAAO,EAAa,EAAE,MAAM,EAAa,CAAQ,CAAC,EAEpD,OAAO,EAAa,EAAE,MAAM,CAAQ,GAEtC,cAAe,IACV,IACa,CAChB,IAAM,EAAK,EAAa,EACxB,GAAI,EAAK,SAAW,GAAK,OAAO,EAAK,KAAO,WAC1C,OAAO,EAAG,cAAc,EAAK,EAA8B,EAE7D,OAAO,EAAG,cAAc,GAAI,CAAsB,GAEpD,KAAM,IAAI,IAAkE,CAC1E,IAAM,EAAK,EAAa,EACxB,GAAI,EAAK,SAAW,GAAK,OAAO,EAAK,KAAO,WAC1C,OAAO,EAAG,KAAK,EAAK,EAA8B,EAEpD,OAAO,EAAG,KAAK,GAAI,CAAsB,GAE3C,YAAa,IAAI,IAAkE,CACjF,IAAM,EAAK,EAAa,EACxB,GAAI,EAAK,SAAW,GAAK,OAAO,EAAK,KAAO,WAC1C,OAAO,EAAG,YAAY,EAAK,EAA8B,EAE3D,OAAO,EAAG,YAAY,GAAI,CAAsB,GAElD,MAAO,IACF,IACa,CAChB,IAAM,EAAK,EAAa,EACxB,GAAI,EAAK,SAAW,GAAK,OAAO,EAAK,KAAO,WAC1C,OAAO,EAAG,MAAM,EAAK,EAA8B,EAErD,OAAO,EAAG,MAAM,GAAI,CAAiD,GAEvE,QAAS,CACP,EACA,IACgB,CAChB,OAAO,EAAa,EAAE,QAAQ,EAAM,CAAO,GAE7C,OAAQ,CAAC,EAAsB,IAA8C,CAC3E,OAAO,EAAa,EAAE,OAAO,EAAa,CAAO,EAErD,CACF,GAGI,EAAY,EAAW,EAAI,EAEpB,EAAQ,OAAO,OAAO,EAAW,EAAK,EAAG,CAAE,KAAM,CAAU,CAAC,EAK5D,EAAO,CAAC,IACnB,KAAK,aAAmB,EAAc,EAAQ,SAAS,EAAE,KAAK,EAAI,MAKvD,EAAS,CAAC,IACrB,IAAI,aAAmB,EAAc,EAAQ,SAAS,EAAE,KAAK,EAAI,KAKtD,EAAO,CAAC,IACnB,KAAK,aAAmB,EAAc,EAAQ,SAAS,EAAE,KAAK,EAAI,MAKvD,EAAS,EAKT,EAAS,CAAC,IACrB,KAAK,aAAmB,EAAc,EAAQ,SAAS,EAAE,KAAK,EAAI,MAKvD,EAAO,CAAC,EAA4B,IAC/C,IAAI,aAAgB,EAAc,EAAK,SAAS,EAAE,KAAK,EAAI,MAAS,KAKzD,EAAQ,CAAC,EAA2B,IAC/C,KAAK,aAAe,EAAc,EAAI,SAAS,EAAE,KAAK,EAAI,MAAQ",
|
|
8
|
+
"debugId": "ECE9ECE86506912164756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { bold, code, image, inline, italic, link, strike } from './prose-writer';
|
package/dist/markdown.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
class b{value;constructor(F){this.value=F}toString(){return this.value}valueOf(){return this.value}}var h=(F)=>F.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),S=(F)=>{if(/^\s*#{1,6}\s/.test(F))return F.replace(/^(\s*)(#{1,6})/,"$1\\$2");if(/^\s*>/.test(F))return F.replace(/^(\s*)>/,"$1\\>");if(/^\s*([-+*])\s/.test(F))return F.replace(/^(\s*)([-+*])/,"$1\\$2");if(/^\s*\d+\.\s/.test(F))return F.replace(/^(\s*)(\d+)\./,"$1$2\\.");return F},Z=(F)=>{return h(F).replace(/([\\`*_~()|!])/g,"\\$1").replace(/\[/g,"\\[").replace(/\]/g,"\\]").split(`
|
|
3
|
+
`).map((G)=>S(G)).join(`
|
|
4
|
+
`)},W=(F)=>{let H=F.match(/`+/g),G=(H?Math.max(...H.map((O)=>O.length)):0)+1,J="`".repeat(G),K=/^\s|\s$/.test(F)?` ${F} `:F;return`${J}${K}${J}`},P=(F)=>{return encodeURI(F).replace(/[()]/g,"\\$&")},q=(F,H="none")=>{if(F instanceof b)return{value:F.toString(),isTrusted:!0};if(F instanceof Q){let G=F.toString();if(H==="end")return{value:G.trimEnd(),isTrusted:!0};if(H==="both")return{value:G.trim(),isTrusted:!0};return{value:G,isTrusted:!0}}return{value:String(F),isTrusted:!1}},k=(F)=>{let{value:H,isTrusted:G}=q(F,"both");return G?H:Z(H)},z=(F)=>new b(F),R=(F)=>z(`**${k(F)}**`),V=(F)=>z(`*${k(F)}*`),I=(F)=>z(`~~${k(F)}~~`),A=(F)=>{let{value:H}=q(F,"both");return z(W(H))},M=(F,H)=>{let{value:G,isTrusted:J}=q(F,"both"),N=J?G:Z(G),K=P(H);return z(`[${N}](${K})`)},C=(F,H)=>{let{value:G,isTrusted:J}=q(F,"both"),N=J?G:Z(G),K=P(H);return z(``)},v=(F)=>{if(F.length===0)return"No validation issues were provided.";return F.map((H,G)=>{let J=H.path?`${H.path}: `:"";return`${G+1}. ${J}${H.message}`}).join(`
|
|
5
|
+
`)};class B extends Error{format;issues;constructor(F,H,G){let J=G??`${F.toUpperCase()} validation failed`;super(`${J}
|
|
6
|
+
${v(H)}`);this.name="ValidationError",this.format=F,this.issues=H}}var x=(F)=>{return({format:H,data:G,schema:J})=>{if(H!=="json"||J===void 0)return{valid:!0};return F(J,G)}},p=(F)=>{return(H)=>F(H)};class Q{parts=[];_skipNextPadding=!1;safeMode;constructor(F,H={}){if(this.safeMode=H.safe??!1,F!==void 0)this.parts.push(F.endsWith(`
|
|
7
|
+
`)?F:F+`
|
|
8
|
+
`)}createChildWriter(){return new Q(void 0,{safe:this.safeMode})}write(...F){let H=F.map((J)=>{let{value:N,isTrusted:K}=q(J,"end");if(this.safeMode&&!K)return Z(N);return N}).join(" ");if(this.parts.length===0&&H.length===0)return this;let G=this.padding;return this.parts.push(G+H+`
|
|
9
|
+
`),this}nextLine(){return this._skipNextPadding=!0,this}unorderedList(...F){if(F.length===1&&typeof F[0]==="function"){let{builder:J,getItems:N}=this.createListBuilder();F[0](J);let O=N().map((Y)=>{if(Y instanceof Q)return Y.toString().trimEnd().split(`
|
|
10
|
+
`).map((_)=>` ${_}`).join(`
|
|
11
|
+
`);return`- ${Y}`}).join(`
|
|
12
|
+
`);return this.parts.push(`${this.padding}${O}
|
|
13
|
+
|
|
14
|
+
`),this}let G=F.map((J)=>{if(J instanceof Q)return J.toString().trimEnd().split(`
|
|
15
|
+
`).map((Y)=>` ${Y}`).join(`
|
|
16
|
+
`);let{value:N,isTrusted:K}=q(J);return`- ${this.safeMode&&!K?Z(N):N}`}).join(`
|
|
17
|
+
`);return this.parts.push(`${this.padding}${G}
|
|
18
|
+
|
|
19
|
+
`),this}list(...F){if(F.length===1&&typeof F[0]==="function")return this.unorderedList(F[0]);return this.unorderedList(...F)}orderedList(...F){if(F.length===1&&typeof F[0]==="function"){let{builder:N,getItems:K}=this.createListBuilder();F[0](N);let O=1,_=K().map(($)=>{if($ instanceof Q)return $.toString().trimEnd().split(`
|
|
20
|
+
`).map((X)=>` ${X}`).join(`
|
|
21
|
+
`);return`${O++}. ${$}`}).join(`
|
|
22
|
+
`);return this.parts.push(`${this.padding}${_}
|
|
23
|
+
|
|
24
|
+
`),this}let H=1,J=F.map((N)=>{if(N instanceof Q)return N.toString().trimEnd().split(`
|
|
25
|
+
`).map((_)=>` ${_}`).join(`
|
|
26
|
+
`);let{value:K,isTrusted:O}=q(N),Y=this.safeMode&&!O?Z(K):K;return`${H++}. ${Y}`}).join(`
|
|
27
|
+
`);return this.parts.push(`${this.padding}${J}
|
|
28
|
+
|
|
29
|
+
`),this}tasks(...F){if(F.length===1&&typeof F[0]==="function"){let{builder:J,getItems:N}=this.createListBuilder();F[0](J);let O=N().map((Y)=>{if(Y instanceof Q)return Y.toString().trimEnd().split(`
|
|
30
|
+
`).map((_)=>` ${_}`).join(`
|
|
31
|
+
`);return`- ${Y}`}).join(`
|
|
32
|
+
`);return this.parts.push(`${this.padding}${O}
|
|
33
|
+
|
|
34
|
+
`),this}let G=F.map((J)=>{if(Array.isArray(J)&&J.length===2&&typeof J[1]==="boolean"){let[O,Y]=J,_=Y?"[x] ":"[ ] ",$=this.createChildWriter().write(O).toString().trimEnd();return _+$}let N="[ ] ",K=this.createChildWriter().write(J).toString().trimEnd();return N+K}).map((J)=>`- ${J}`).join(`
|
|
35
|
+
`);return this.parts.push(`${this.padding}${G}
|
|
36
|
+
|
|
37
|
+
`),this}callout(F,H){let G;if(typeof H==="function"){let O=this.createChildWriter();H(O.enhanced),G=O.toString().trimEnd()}else{let{value:O,isTrusted:Y}=q(H);G=this.safeMode&&!Y?Z(O):O}let J=G.split(`
|
|
38
|
+
`),K=[`[!${F.toUpperCase()}]`,...J].map((O)=>`> ${O}`).join(`
|
|
39
|
+
`);return this.parts.push(`${this.padding}${K}
|
|
40
|
+
|
|
41
|
+
`),this}heading(F,...H){let G="#".repeat(F),J=H.map((N)=>{let{value:K,isTrusted:O}=q(N);if(this.safeMode&&!O)return Z(K);return K}).join(" ");return this.parts.push(`${this.padding}${G} ${J}
|
|
42
|
+
|
|
43
|
+
`),this}blockquote(...F){let H=F.map((G)=>{let{value:J,isTrusted:N}=q(G);if(this.safeMode&&!N)return Z(J);return J}).map((G)=>`> ${G}`).join(`
|
|
44
|
+
>
|
|
45
|
+
`);return this.parts.push(`${this.padding}${H}
|
|
46
|
+
|
|
47
|
+
`),this}codeblock(F,H){let G;if(typeof H==="function"){let J=new Q;H(J.enhanced),G=J.toString().trim()}else G=H;return this.parts.push(`${this.padding}\`\`\`${F}
|
|
48
|
+
${G}
|
|
49
|
+
\`\`\`
|
|
50
|
+
|
|
51
|
+
`),this}get separator(){return this.parts.push(`${this.padding}---
|
|
52
|
+
|
|
53
|
+
`),this}json(F,H={}){this.validateOutput("json",F,H);let G=typeof F==="string"?F:JSON.stringify(F,null,2);return this.codeblock("json",G)}append(F){let H=F.toString();if(H.length>0)this.parts.push(this.padding+H);return this}get enhanced(){let F=this.safeMode?{bold:R,italic:V,code:A,inline:A,link:M,strike:I,image:C}:{bold:D,italic:j,code:U,inline:T,link:L,strike:E,image:y};return new Proxy(this,{get(H,G){if(typeof G==="string"&&G in F)return F[G];let J=Reflect.get(H,G,H);if(typeof J==="function")return J.bind(H);return J}})}when(F,H){if(F)H(this.enhanced);return this}with(F){return F(this.enhanced),this}tag(F,H){let G;if(typeof H==="function"){let J=this.createChildWriter();H(J.enhanced),G=J.toString()}else{let{value:J,isTrusted:N}=q(H);if(this.safeMode&&!N)G=h(J);else G=J}return this.parts.push(`${this.padding}<${F}>
|
|
54
|
+
${G.trimEnd()}
|
|
55
|
+
</${F}>
|
|
56
|
+
`),this}code(F){let H=this.safeMode?A(F):U(F);return this.parts.push(this.padding+H+`
|
|
57
|
+
`),this}fill(F){let G=this.toString().replace(/\{\{(\w+)\}\}/g,(J,N)=>{let K=F[N];if(K===void 0)return J;return this.safeMode?Z(K):K});return new Q(G,{safe:this.safeMode})}section(F,H,G=2){let J=this.createChildWriter();H(J.enhanced);let N="#".repeat(G),K=this.safeMode?Z(F):F;return this.parts.push(`${this.padding}${N} ${K}
|
|
58
|
+
|
|
59
|
+
${J.toString()}`),this}clone(){let F=new Q(void 0,{safe:this.safeMode});return F.parts=[...this.parts],F}table(F,H){let J=`| ${(this.safeMode?F.map((O)=>Z(O)):F).join(" | ")} |`,N=`| ${F.map(()=>"---").join(" | ")} |`,K=H.map((O)=>{return`| ${(Array.isArray(O)?O.map((_)=>{let $=String(_??"");return this.safeMode?Z($):$}):F.map((_)=>{let $=O[_];if($ instanceof Q)return $.toPlainText();let X=String($??"");return this.safeMode?Z(X):X})).join(" | ")} |`}).join(`
|
|
60
|
+
`);return this.parts.push(`${this.padding}${J}
|
|
61
|
+
${N}
|
|
62
|
+
${K}
|
|
63
|
+
|
|
64
|
+
`),this}definitions(F){let H=Object.entries(F).map(([G,J])=>{if(this.safeMode)return`${R(G)}: ${Z(J)}`;return`**${G}**: ${J}`}).join(`
|
|
65
|
+
`);return this.parts.push(`${this.padding}${H}
|
|
66
|
+
|
|
67
|
+
`),this}schema(F,H={}){let{format:G="json",title:J,level:N=2,tag:K}=H;if(J)this.heading(N,J);if(K){let O=this.createChildWriter();if(G==="json")O.json(F);else O.yaml(F);return this.tag(K,O)}if(G==="json")return this.json(F);return this.yaml(F)}bold(F){let H=this.safeMode?R(F):D(F);return this.parts.push(this.padding+H+`
|
|
68
|
+
`),this}italic(F){let H=this.safeMode?V(F):j(F);return this.parts.push(this.padding+H+`
|
|
69
|
+
`),this}strike(F){let H=this.safeMode?I(F):E(F);return this.parts.push(this.padding+H+`
|
|
70
|
+
`),this}raw(F){return this.parts.push(F),this}link(F,H){let G=this.safeMode?M(F,H):L(F,H);return this.parts.push(this.padding+G+`
|
|
71
|
+
`),this}image(F,H){let G=this.safeMode?C(F,H):y(F,H);return this.parts.push(this.padding+G+`
|
|
72
|
+
`),this}comment(F){return this.parts.push(`${this.padding}<!-- ${F} -->
|
|
73
|
+
|
|
74
|
+
`),this}yaml(F,H={}){this.validateOutput("yaml",F,H);let G=typeof F==="string"?F:this.toYamlString(F);return this.codeblock("yaml",G)}toYamlString(F,H=0){let G=" ".repeat(H);if(F===null||F===void 0)return"null";if(typeof F==="string"){if(/[:\n#"']/.test(F)||F==="")return`"${F.replace(/"/g,"\\\"")}"`;return F}if(typeof F==="number"||typeof F==="boolean")return String(F);if(Array.isArray(F)){if(F.length===0)return"[]";return F.map((J)=>`${G}- ${this.toYamlString(J,H+1)}`).join(`
|
|
75
|
+
`)}if(typeof F==="object"){let J=Object.entries(F);if(J.length===0)return"{}";return J.map(([N,K])=>{let O=this.toYamlString(K,H+1);if(typeof K==="object"&&K!==null&&!Array.isArray(K))return`${G}${N}:
|
|
76
|
+
${O}`;if(Array.isArray(K))return`${G}${N}:
|
|
77
|
+
${O}`;return`${G}${N}: ${O}`}).join(`
|
|
78
|
+
`)}return JSON.stringify(F)??"null"}delimit(F,H,G){let J=G instanceof Q?G.toString():G;return this.parts.push(`${this.padding}${F}
|
|
79
|
+
${J}
|
|
80
|
+
${H}
|
|
81
|
+
`),this}compact(){let F=this.toString().replace(/\n{3,}/g,`
|
|
82
|
+
|
|
83
|
+
`);return new Q(F,{safe:this.safeMode})}trim(){let F=this.toString().trim();return new Q(F,{safe:this.safeMode})}tokens(F){let H=this.toString();if(F)return F(H);return Math.ceil(H.length/4)}each(F,H){return F.forEach((G,J)=>{H(G,this.enhanced,J)}),this}toPlainText(){let F=this.toString();return F=F.replace(/```[\s\S]*?```/g,(H)=>{return H.split(`
|
|
84
|
+
`).slice(1,-1).join(`
|
|
85
|
+
`)}),F=F.replace(/`([^`]+)`/g,"$1"),F=F.replace(/^#{1,6}\s+(.*)$/gm,"$1"),F=F.replace(/\*\*([^*]+)\*\*/g,"$1"),F=F.replace(/\*([^*]+)\*/g,"$1"),F=F.replace(/\[([^\]]+)\]\([^)]+\)/g,"$1"),F=F.replace(/^>\s?/gm,""),F=F.replace(/^---$/gm,""),F=F.replace(/^[-*]\s+/gm,""),F=F.replace(/^\d+\.\s+/gm,""),F=F.replace(/<[^>]+>/g,""),F=F.replace(/\|/g," "),F=F.replace(/^[\s-]+$/gm,""),F=F.replace(/ {2,}/g," "),F=F.replace(/\n{3,}/g,`
|
|
86
|
+
|
|
87
|
+
`),F.trim()}validateOutput(F,H,G){if(!G.validate)return;let J=H;if(F==="json"&&typeof H==="string")try{J=JSON.parse(H)}catch(K){let O=K instanceof Error?K.message:"Invalid JSON string";throw new B(F,[{path:"$",message:`Invalid JSON string: ${O}`}],G.label)}if(F==="yaml"&&typeof H==="string"&&G.parseYaml)try{J=G.parseYaml(H)}catch(K){let O=K instanceof Error?K.message:"Invalid YAML string";throw new B(F,[{path:"$",message:`Invalid YAML string: ${O}`}],G.label)}let N=G.validate({format:F,data:J,schema:G.schema});if(N.valid)return;throw new B(F,N.issues??[],G.label)}get padding(){if(this._skipNextPadding||this.parts.length===0)return this._skipNextPadding=!1,"";let F=this.parts[this.parts.length-1];if(F.endsWith(`
|
|
88
|
+
|
|
89
|
+
`))return"";if(F.endsWith(`
|
|
90
|
+
`))return`
|
|
91
|
+
`;return`
|
|
92
|
+
|
|
93
|
+
`}createListBuilder(){let F=[],H={item:(...G)=>{return F.push(this.createChildWriter().write(...G).toString().trimEnd()),H},task:(G,...J)=>{let N=G?"[x] ":"[ ] ",K=this.createChildWriter().write(...J).toString().trimEnd();return F.push(N+K),H},todo:(...G)=>H.task(!1,...G),done:(...G)=>H.task(!0,...G),unorderedList:(...G)=>{let J=this.createChildWriter();if(G.length===1&&typeof G[0]==="function")J.unorderedList(G[0]);else J.unorderedList(...G);return F.push(J),H},list:(...G)=>{let J=this.createChildWriter();if(G.length===1&&typeof G[0]==="function")J.list(G[0]);else J.list(...G);return F.push(J),H},orderedList:(...G)=>{let J=this.createChildWriter();if(G.length===1&&typeof G[0]==="function")J.orderedList(G[0]);else J.orderedList(...G);return F.push(J),H},comment:(G)=>{let J=this.createChildWriter();return J.comment(G),F.push(J),H},bold:this.safeMode?R:D,italic:this.safeMode?V:j,code:this.safeMode?A:U,inline:this.safeMode?A:T,strike:this.safeMode?I:E,link:this.safeMode?M:L,image:this.safeMode?C:y};return{builder:H,getItems:()=>F}}static empty(){return new Q}static join(...F){let H=new Q;for(let G of F)H.parts.push(G.toString());return H}static fromTemplate(F){return new Q(F)}toString(){return this.parts.join("")}[Symbol.toPrimitive](F){if(F==="number")return Number.NaN;return this.toString()}get[Symbol.toStringTag](){return"ProseWriter"}}var w=(F)=>{let H=()=>new Q(void 0,{safe:F});return Object.assign((...G)=>{return H().write(...G)},{with:(G)=>{return H().with(G)},template:(G)=>{if(F)return H().write(z(G));return H().write(G)},unorderedList:(...G)=>{let J=H();if(G.length===1&&typeof G[0]==="function")return J.unorderedList(G[0]);return J.unorderedList(...G)},list:(...G)=>{let J=H();if(G.length===1&&typeof G[0]==="function")return J.list(G[0]);return J.list(...G)},orderedList:(...G)=>{let J=H();if(G.length===1&&typeof G[0]==="function")return J.orderedList(G[0]);return J.orderedList(...G)},tasks:(...G)=>{let J=H();if(G.length===1&&typeof G[0]==="function")return J.tasks(G[0]);return J.tasks(...G)},callout:(G,J)=>{return H().callout(G,J)},schema:(G,J)=>{return H().schema(G,J)}})},f=w(!0),m=Object.assign(w(!1),{safe:f}),D=(F)=>`**${F instanceof Q?F.toString().trim():F}**`,j=(F)=>`*${F instanceof Q?F.toString().trim():F}*`,U=(F)=>`\`${F instanceof Q?F.toString().trim():F}\``,T=U,E=(F)=>`~~${F instanceof Q?F.toString().trim():F}~~`,L=(F,H)=>`[${F instanceof Q?F.toString().trim():F}](${H})`,y=(F,H)=>``;export{E as strike,L as link,j as italic,T as inline,y as image,U as code,D as bold};
|
|
94
|
+
|
|
95
|
+
//# debugId=6C78B4E230FE231864756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/prose-writer.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Inline formatting utilities that can be used within write() or builder functions.\n * These return strings and do not side-effect the writer.\n */\nexport interface InlineUtils {\n bold: (content: string | number | boolean | ProseWriter) => string;\n italic: (content: string | number | boolean | ProseWriter) => string;\n code: (content: string | number | boolean | ProseWriter) => string;\n inline: (content: string | number | boolean | ProseWriter) => string;\n strike: (content: string | number | boolean | ProseWriter) => string;\n link: (text: string | ProseWriter, url: string) => string;\n image: (alt: string | ProseWriter, url: string) => string;\n}\n\n/**\n * Builder for markdown lists.\n */\nexport interface ListBuilder extends InlineUtils {\n item(...content: (string | number | boolean | ProseWriter)[]): this;\n task(checked: boolean, ...content: (string | number | boolean | ProseWriter)[]): this;\n todo(...content: (string | number | boolean | ProseWriter)[]): this;\n done(...content: (string | number | boolean | ProseWriter)[]): this;\n comment(content: string): this;\n unorderedList(builder: (l: ListBuilder) => void): this;\n unorderedList(...items: (string | number | boolean | ProseWriter)[]): this;\n list(builder: (l: ListBuilder) => void): this;\n list(...items: (string | number | boolean | ProseWriter)[]): this;\n orderedList(builder: (l: ListBuilder) => void): this;\n orderedList(...items: (string | number | boolean | ProseWriter)[]): this;\n}\n\nclass SafeString {\n private value: string;\n\n constructor(value: string) {\n this.value = value;\n }\n\n toString(): string {\n return this.value;\n }\n\n valueOf(): string {\n return this.value;\n }\n}\n\nexport type OutputFormat = 'json' | 'yaml';\n\nexport type ValidationIssue = {\n message: string;\n path?: string;\n};\n\nexport type ValidationResult = {\n valid: boolean;\n issues?: ValidationIssue[];\n};\n\nexport type OutputValidator = (options: {\n format: OutputFormat;\n data: unknown;\n schema?: unknown;\n}) => ValidationResult;\n\nexport type JsonSchemaAdapter = (schema: unknown, data: unknown) => ValidationResult;\n\nexport type ValidationOptions = {\n schema?: unknown;\n validate?: OutputValidator;\n label?: string;\n parseYaml?: (input: string) => unknown;\n};\n\nexport type SchemaEmbedOptions = {\n format?: OutputFormat;\n title?: string;\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n tag?: string;\n};\n\ntype WriterOptions = {\n safe?: boolean;\n};\n\ntype WriterValue = string | number | boolean | ProseWriter;\ntype ContentValue = WriterValue | SafeString;\n\nconst escapeXmlText = (value: string): string =>\n value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n\nconst escapeMarkdownLineStart = (line: string): string => {\n if (/^\\s*#{1,6}\\s/.test(line)) {\n return line.replace(/^(\\s*)(#{1,6})/, '$1\\\\$2');\n }\n if (/^\\s*>/.test(line)) {\n return line.replace(/^(\\s*)>/, '$1\\\\>');\n }\n if (/^\\s*([-+*])\\s/.test(line)) {\n return line.replace(/^(\\s*)([-+*])/, '$1\\\\$2');\n }\n if (/^\\s*\\d+\\.\\s/.test(line)) {\n return line.replace(/^(\\s*)(\\d+)\\./, '$1$2\\\\.');\n }\n return line;\n};\n\nconst escapeMarkdownText = (value: string): string => {\n const escaped = escapeXmlText(value)\n .replace(/([\\\\`*_~()|!])/g, '\\\\$1')\n .replace(/\\[/g, '\\\\[')\n .replace(/\\]/g, '\\\\]');\n return escaped\n .split('\\n')\n .map((line) => escapeMarkdownLineStart(line))\n .join('\\n');\n};\n\nconst wrapInlineCode = (value: string): string => {\n const matches = value.match(/`+/g);\n const fenceSize = (matches ? Math.max(...matches.map((m) => m.length)) : 0) + 1;\n const fence = '`'.repeat(fenceSize);\n const needsPadding = /^\\s|\\s$/.test(value);\n const content = needsPadding ? ` ${value} ` : value;\n return `${fence}${content}${fence}`;\n};\n\nconst escapeLinkDestination = (url: string): string => {\n const encoded = encodeURI(url);\n return encoded.replace(/[()]/g, '\\\\$&');\n};\n\nconst toContentString = (\n content: ContentValue,\n trim: 'none' | 'end' | 'both' = 'none',\n): { value: string; isTrusted: boolean } => {\n if (content instanceof SafeString) {\n return { value: content.toString(), isTrusted: true };\n }\n if (content instanceof ProseWriter) {\n const raw = content.toString();\n if (trim === 'end') return { value: raw.trimEnd(), isTrusted: true };\n if (trim === 'both') return { value: raw.trim(), isTrusted: true };\n return { value: raw, isTrusted: true };\n }\n return { value: String(content), isTrusted: false };\n};\n\nconst toSafeInlineText = (content: ContentValue): string => {\n const { value, isTrusted } = toContentString(content, 'both');\n return isTrusted ? value : escapeMarkdownText(value);\n};\n\nconst asSafeString = (value: string): string =>\n new SafeString(value) as unknown as string;\n\nconst safeBold = (content: ContentValue): string =>\n asSafeString(`**${toSafeInlineText(content)}**`);\n\nconst safeItalic = (content: ContentValue): string =>\n asSafeString(`*${toSafeInlineText(content)}*`);\n\nconst safeStrike = (content: ContentValue): string =>\n asSafeString(`~~${toSafeInlineText(content)}~~`);\n\nconst safeInlineCode = (content: ContentValue): string => {\n const { value } = toContentString(content, 'both');\n return asSafeString(wrapInlineCode(value));\n};\n\nconst safeLink = (text: string | ProseWriter, url: string): string => {\n const { value, isTrusted } = toContentString(text, 'both');\n const safeText = isTrusted ? value : escapeMarkdownText(value);\n const safeUrl = escapeLinkDestination(url);\n return asSafeString(`[${safeText}](${safeUrl})`);\n};\n\nconst safeImage = (alt: string | ProseWriter, url: string): string => {\n const { value, isTrusted } = toContentString(alt, 'both');\n const safeAlt = isTrusted ? value : escapeMarkdownText(value);\n const safeUrl = escapeLinkDestination(url);\n return asSafeString(``);\n};\n\nconst formatValidationIssues = (issues: ValidationIssue[]): string => {\n if (issues.length === 0) {\n return 'No validation issues were provided.';\n }\n return issues\n .map((issue, index) => {\n const path = issue.path ? `${issue.path}: ` : '';\n return `${index + 1}. ${path}${issue.message}`;\n })\n .join('\\n');\n};\n\nexport class ValidationError extends Error {\n format: OutputFormat;\n issues: ValidationIssue[];\n\n constructor(format: OutputFormat, issues: ValidationIssue[], label?: string) {\n const title = label ?? `${format.toUpperCase()} validation failed`;\n super(`${title}\\n${formatValidationIssues(issues)}`);\n this.name = 'ValidationError';\n this.format = format;\n this.issues = issues;\n }\n}\n\nexport const createJsonSchemaValidator = (\n adapter: JsonSchemaAdapter,\n): OutputValidator => {\n return ({ format, data, schema }): ValidationResult => {\n if (format !== 'json' || schema === undefined) {\n return { valid: true };\n }\n return adapter(schema, data);\n };\n};\n\nexport const createYamlParserAdapter = (\n parser: (input: string) => unknown,\n): ((input: string) => unknown) => {\n return (input: string) => parser(input);\n};\n\n/**\n * A chainable prose writer for building formatted text/markdown strings.\n */\nexport class ProseWriter {\n private parts: string[] = [];\n private _skipNextPadding = false;\n private safeMode: boolean;\n\n constructor(content?: string, options: WriterOptions = {}) {\n this.safeMode = options.safe ?? false;\n if (content !== undefined) {\n this.parts.push(content.endsWith('\\n') ? content : content + '\\n');\n }\n }\n\n private createChildWriter(): ProseWriter {\n return new ProseWriter(undefined, { safe: this.safeMode });\n }\n\n /**\n * Appends content to the prose.\n * Multiple arguments are joined with a space.\n * Chaining write() calls creates separate paragraphs by default.\n */\n write(...content: (string | number | boolean | ProseWriter)[]): this {\n const joined = content\n .map((c) => {\n const { value, isTrusted } = toContentString(c, 'end');\n if (this.safeMode && !isTrusted) {\n return escapeMarkdownText(value);\n }\n return value;\n })\n .join(' ');\n\n if (this.parts.length === 0 && joined.length === 0) {\n return this;\n }\n\n const p = this.padding;\n this.parts.push(p + joined + '\\n');\n return this;\n }\n\n /**\n * Prevents the next block element or write() call from adding a paragraph break.\n * Useful for placing two write() calls on consecutive lines.\n */\n nextLine(): this {\n this._skipNextPadding = true;\n return this;\n }\n\n /**\n * Appends an unordered list.\n * Each item is prefixed with `- ` on its own line.\n * Supports nesting by passing another ProseWriter instance or a builder function.\n */\n unorderedList(builder: (l: ListBuilder) => void): this;\n unorderedList(...items: (string | number | boolean | ProseWriter)[]): this;\n unorderedList(\n ...args: [(l: ListBuilder) => void] | (string | number | boolean | ProseWriter)[]\n ): this {\n if (args.length === 1 && typeof args[0] === 'function') {\n const { builder, getItems } = this.createListBuilder();\n (args[0] as (l: ListBuilder) => void)(builder);\n const items = getItems();\n const listContent = items\n .map((item) => {\n if (item instanceof ProseWriter) {\n return item\n .toString()\n .trimEnd()\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n }\n return `- ${item}`;\n })\n .join('\\n');\n this.parts.push(`${this.padding}${listContent}\\n\\n`);\n return this;\n }\n\n const items = args as (string | number | boolean | ProseWriter)[];\n const listContent = items\n .map((item) => {\n if (item instanceof ProseWriter) {\n return item\n .toString()\n .trimEnd()\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n }\n const { value, isTrusted } = toContentString(item);\n const text = this.safeMode && !isTrusted ? escapeMarkdownText(value) : value;\n return `- ${text}`;\n })\n .join('\\n');\n this.parts.push(`${this.padding}${listContent}\\n\\n`);\n return this;\n }\n\n /**\n * Alias for unorderedList().\n */\n list(builder: (l: ListBuilder) => void): this;\n list(...items: (string | number | boolean | ProseWriter)[]): this;\n list(\n ...args: [(l: ListBuilder) => void] | (string | number | boolean | ProseWriter)[]\n ): this {\n if (args.length === 1 && typeof args[0] === 'function') {\n return this.unorderedList(args[0] as (l: ListBuilder) => void);\n }\n return this.unorderedList(...(args as (string | number | boolean | ProseWriter)[]));\n }\n\n /**\n * Appends an ordered list.\n * Each item is prefixed with its number on its own line.\n * Supports nesting by passing another ProseWriter instance or a builder function.\n */\n orderedList(builder: (l: ListBuilder) => void): this;\n orderedList(...items: (string | number | boolean | ProseWriter)[]): this;\n orderedList(\n ...args: [(l: ListBuilder) => void] | (string | number | boolean | ProseWriter)[]\n ): this {\n if (args.length === 1 && typeof args[0] === 'function') {\n const { builder, getItems } = this.createListBuilder();\n (args[0] as (l: ListBuilder) => void)(builder);\n let index = 1;\n const items = getItems();\n const listContent = items\n .map((item) => {\n if (item instanceof ProseWriter) {\n return item\n .toString()\n .trimEnd()\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n }\n return `${index++}. ${item}`;\n })\n .join('\\n');\n this.parts.push(`${this.padding}${listContent}\\n\\n`);\n return this;\n }\n\n let index = 1;\n const items = args as (string | number | boolean | ProseWriter)[];\n const listContent = items\n .map((item) => {\n if (item instanceof ProseWriter) {\n return item\n .toString()\n .trimEnd()\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n }\n const { value, isTrusted } = toContentString(item);\n const text = this.safeMode && !isTrusted ? escapeMarkdownText(value) : value;\n return `${index++}. ${text}`;\n })\n .join('\\n');\n this.parts.push(`${this.padding}${listContent}\\n\\n`);\n return this;\n }\n\n /**\n * Appends a task list with checkboxes.\n */\n tasks(builder: (l: ListBuilder) => void): this;\n tasks(\n ...items: (\n | string\n | number\n | boolean\n | ProseWriter\n | [string | number | boolean | ProseWriter, boolean]\n )[]\n ): this;\n tasks(\n ...args:\n | [(l: ListBuilder) => void]\n | (\n | string\n | number\n | boolean\n | ProseWriter\n | [string | number | boolean | ProseWriter, boolean]\n )[]\n ): this {\n if (args.length === 1 && typeof args[0] === 'function') {\n const { builder, getItems } = this.createListBuilder();\n (args[0] as (l: ListBuilder) => void)(builder);\n const items = getItems();\n const listContent = items\n .map((item) => {\n if (item instanceof ProseWriter) {\n return item\n .toString()\n .trimEnd()\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n');\n }\n return `- ${item}`;\n })\n .join('\\n');\n this.parts.push(`${this.padding}${listContent}\\n\\n`);\n return this;\n }\n\n const items = (\n args as (\n | string\n | number\n | boolean\n | ProseWriter\n | [string | number | boolean | ProseWriter, boolean]\n )[]\n ).map((arg) => {\n if (Array.isArray(arg) && arg.length === 2 && typeof arg[1] === 'boolean') {\n const [content, checked] = arg;\n const checkbox = checked ? '[x] ' : '[ ] ';\n const text = this.createChildWriter().write(content).toString().trimEnd();\n return checkbox + text;\n }\n const checkbox = '[ ] ';\n const text = this.createChildWriter()\n .write(arg as string | number | boolean | ProseWriter)\n .toString()\n .trimEnd();\n return checkbox + text;\n });\n\n const listContent = items.map((item) => `- ${item}`).join('\\n');\n this.parts.push(`${this.padding}${listContent}\\n\\n`);\n return this;\n }\n\n /**\n * Appends a GitHub Alert (callout).\n */\n callout(\n type: 'NOTE' | 'TIP' | 'IMPORTANT' | 'WARNING' | 'CAUTION',\n content: string | ((writer: ProseWriter & InlineUtils) => void),\n ): this {\n let contentString: string;\n if (typeof content === 'function') {\n const writer = this.createChildWriter();\n content(writer.enhanced);\n contentString = writer.toString().trimEnd();\n } else {\n const { value, isTrusted } = toContentString(content);\n contentString = this.safeMode && !isTrusted ? escapeMarkdownText(value) : value;\n }\n\n const lines = contentString.split('\\n');\n const alertLines = [`[!${type.toUpperCase()}]`, ...lines];\n const alertContent = alertLines.map((line) => `> ${line}`).join('\\n');\n\n this.parts.push(`${this.padding}${alertContent}\\n\\n`);\n return this;\n }\n\n /**\n * Appends a markdown heading at the specified level.\n */\n heading(level: 1 | 2 | 3 | 4 | 5 | 6, ...content: string[]): this {\n const hashes = '#'.repeat(level);\n const joined = content\n .map((part) => {\n const { value, isTrusted } = toContentString(part);\n if (this.safeMode && !isTrusted) {\n return escapeMarkdownText(value);\n }\n return value;\n })\n .join(' ');\n this.parts.push(`${this.padding}${hashes} ${joined}\\n\\n`);\n return this;\n }\n\n /**\n * Appends a blockquote with the given lines.\n * Lines are separated by an empty blockquote line.\n */\n blockquote(...lines: string[]): this {\n const quotedLines = lines\n .map((line) => {\n const { value, isTrusted } = toContentString(line);\n if (this.safeMode && !isTrusted) {\n return escapeMarkdownText(value);\n }\n return value;\n })\n .map((line) => `> ${line}`)\n .join('\\n>\\n');\n this.parts.push(`${this.padding}${quotedLines}\\n\\n`);\n return this;\n }\n\n /**\n * Appends a fenced code block with the specified language.\n */\n codeblock(\n language: string,\n content: string | ((writer: ProseWriter & InlineUtils) => void),\n ): this {\n let code: string;\n if (typeof content === 'function') {\n const writer = new ProseWriter();\n content(writer.enhanced);\n code = writer.toString().trim();\n } else {\n code = content;\n }\n this.parts.push(`${this.padding}\\`\\`\\`${language}\\n${code}\\n\\`\\`\\`\\n\\n`);\n return this;\n }\n\n /**\n * Appends a horizontal separator.\n */\n get separator(): this {\n this.parts.push(`${this.padding}---\\n\\n`);\n return this;\n }\n\n /**\n * Appends a JSON code block.\n * If data is not a string, it will be stringified with formatting.\n */\n json(data: unknown, options: ValidationOptions = {}): this {\n this.validateOutput('json', data, options);\n const jsonString = typeof data === 'string' ? data : JSON.stringify(data, null, 2);\n return this.codeblock('json', jsonString);\n }\n\n /**\n * Appends the content from another ProseWriter instance.\n * Enables composition of prompts from reusable pieces.\n */\n append(writer: ProseWriter): this {\n const content = writer.toString();\n if (content.length > 0) {\n this.parts.push(this.padding + content);\n }\n return this;\n }\n\n /**\n * Returns a version of this writer with inline formatters as methods.\n * This is passed to builder functions to allow using formatters without imports.\n */\n private get enhanced(): this & InlineUtils {\n const formatters: Record<string, unknown> = this.safeMode\n ? {\n bold: safeBold,\n italic: safeItalic,\n code: safeInlineCode,\n inline: safeInlineCode,\n link: safeLink,\n strike: safeStrike,\n image: safeImage,\n }\n : {\n bold,\n italic,\n code,\n inline,\n link,\n strike,\n image,\n };\n return new Proxy(this, {\n get(target, prop) {\n if (typeof prop === 'string' && prop in formatters) {\n return formatters[prop];\n }\n const val = Reflect.get(target, prop, target) as unknown;\n if (typeof val === 'function') {\n return (val as (...args: unknown[]) => unknown).bind(target);\n }\n return val;\n },\n }) as this & InlineUtils;\n }\n\n /**\n * Conditionally executes a builder function.\n * If the condition is truthy, the builder is called with this instance.\n */\n when(condition: unknown, builder: (writer: this & InlineUtils) => void): this {\n if (condition) {\n builder(this.enhanced);\n }\n return this;\n }\n\n /**\n * Executes a builder function with this instance.\n * Useful for logical grouping in chains.\n */\n with(builder: (writer: this & InlineUtils) => void): this {\n builder(this.enhanced);\n return this;\n }\n\n /**\n * Wraps content in XML-style tags.\n * Useful for Claude and other models that respond well to XML delimiters.\n */\n tag(\n name: string,\n content: string | ProseWriter | ((writer: ProseWriter & InlineUtils) => void),\n ): this {\n let contentString: string;\n if (typeof content === 'function') {\n const writer = this.createChildWriter();\n content(writer.enhanced);\n contentString = writer.toString();\n } else {\n const { value, isTrusted } = toContentString(content);\n if (this.safeMode && !isTrusted) {\n contentString = escapeXmlText(value);\n } else {\n contentString = value;\n }\n }\n this.parts.push(`${this.padding}<${name}>\\n${contentString.trimEnd()}\\n</${name}>\\n`);\n return this;\n }\n\n /**\n * Appends inline code (wrapped in backticks).\n */\n code(content: string | number | boolean | ProseWriter): this {\n const formatted = this.safeMode ? safeInlineCode(content) : code(content);\n this.parts.push(this.padding + formatted + '\\n');\n return this;\n }\n\n /**\n * Replaces template variables in the format {{variableName}} with provided values.\n * Returns a new ProseWriter with the substitutions applied.\n */\n fill(variables: Record<string, string>): ProseWriter {\n const content = this.toString();\n const filled = content.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key: string): string => {\n const value = variables[key];\n if (value === undefined) return match;\n return this.safeMode ? escapeMarkdownText(value) : value;\n });\n return new ProseWriter(filled, { safe: this.safeMode });\n }\n\n /**\n * Creates a semantic section with a heading and content built by the builder function.\n * @param name - The section heading text\n * @param builder - A function that receives a fresh ProseWriter to build section content\n * @param level - Optional heading level (defaults to 2)\n */\n section(\n name: string,\n builder: (writer: ProseWriter & InlineUtils) => void,\n level: 1 | 2 | 3 | 4 | 5 | 6 = 2,\n ): this {\n const sectionWriter = this.createChildWriter();\n builder(sectionWriter.enhanced);\n const hashes = '#'.repeat(level);\n const title = this.safeMode ? escapeMarkdownText(name) : name;\n this.parts.push(`${this.padding}${hashes} ${title}\\n\\n${sectionWriter.toString()}`);\n return this;\n }\n\n /**\n * Creates a copy of this ProseWriter with the same content.\n * Useful for creating variations of a base prompt.\n */\n clone(): ProseWriter {\n const cloned = new ProseWriter(undefined, { safe: this.safeMode });\n cloned.parts = [...this.parts];\n return cloned;\n }\n\n /**\n * Appends a markdown table with headers and rows.\n * Type-safe: Each row can be an array of strings matching the header length,\n * or an object where keys match the header names.\n */\n table<T extends string>(\n headers: [...T[]],\n rows: (string[] | Record<T, string | number | boolean | ProseWriter>)[],\n ): this {\n const safeHeaders = this.safeMode\n ? headers.map((header) => escapeMarkdownText(header))\n : headers;\n const headerRow = `| ${safeHeaders.join(' | ')} |`;\n const separatorRow = `| ${headers.map(() => '---').join(' | ')} |`;\n\n const dataRows = rows\n .map((row) => {\n const values = Array.isArray(row)\n ? row.map((val) => {\n const text = String(val ?? '');\n return this.safeMode ? escapeMarkdownText(text) : text;\n })\n : headers.map((h) => {\n const val = row[h];\n if (val instanceof ProseWriter) return val.toPlainText();\n const text = String(val ?? '');\n return this.safeMode ? escapeMarkdownText(text) : text;\n });\n return `| ${values.join(' | ')} |`;\n })\n .join('\\n');\n\n this.parts.push(`${this.padding}${headerRow}\\n${separatorRow}\\n${dataRows}\\n\\n`);\n return this;\n }\n\n /**\n * Appends a definition list with key-value pairs.\n * Each key is bolded, followed by a colon and the value.\n */\n definitions(obj: Record<string, string>): this {\n const entries = Object.entries(obj)\n .map(([key, value]) => {\n if (this.safeMode) {\n return `${safeBold(key)}: ${escapeMarkdownText(value)}`;\n }\n return `**${key}**: ${value}`;\n })\n .join('\\n');\n this.parts.push(`${this.padding}${entries}\\n\\n`);\n return this;\n }\n\n /**\n * Embeds a schema or output contract in the prompt.\n */\n schema(schemaValue: unknown, options: SchemaEmbedOptions = {}): this {\n const { format = 'json', title, level = 2, tag } = options;\n if (title) {\n this.heading(level, title);\n }\n\n if (tag) {\n const schemaWriter = this.createChildWriter();\n if (format === 'json') {\n schemaWriter.json(schemaValue);\n } else {\n schemaWriter.yaml(schemaValue);\n }\n return this.tag(tag, schemaWriter);\n }\n\n if (format === 'json') {\n return this.json(schemaValue);\n }\n return this.yaml(schemaValue);\n }\n\n /**\n * Appends bold text.\n */\n bold(content: string | number | boolean | ProseWriter): this {\n const formatted = this.safeMode ? safeBold(content) : bold(content);\n this.parts.push(this.padding + formatted + '\\n');\n return this;\n }\n\n /**\n * Appends italic text.\n */\n italic(content: string | number | boolean | ProseWriter): this {\n const formatted = this.safeMode ? safeItalic(content) : italic(content);\n this.parts.push(this.padding + formatted + '\\n');\n return this;\n }\n\n /**\n * Appends strikethrough text.\n */\n strike(content: string | number | boolean | ProseWriter): this {\n const formatted = this.safeMode ? safeStrike(content) : strike(content);\n this.parts.push(this.padding + formatted + '\\n');\n return this;\n }\n\n /**\n * Appends raw content without any processing.\n */\n raw(content: string): this {\n this.parts.push(content);\n return this;\n }\n\n /**\n * Appends a markdown link.\n */\n link(text: string | ProseWriter, url: string): this {\n const formatted = this.safeMode ? safeLink(text, url) : link(text, url);\n this.parts.push(this.padding + formatted + '\\n');\n return this;\n }\n\n /**\n * Appends a markdown image.\n */\n image(alt: string | ProseWriter, url: string): this {\n const formatted = this.safeMode ? safeImage(alt, url) : image(alt, url);\n this.parts.push(this.padding + formatted + '\\n');\n return this;\n }\n\n /**\n * Appends an HTML comment.\n */\n comment(content: string): this {\n this.parts.push(`${this.padding}<!-- ${content} -->\\n\\n`);\n return this;\n }\n\n /**\n * Appends a YAML code block.\n * If data is not a string, it will be converted to YAML format.\n */\n yaml(data: unknown, options: ValidationOptions = {}): this {\n this.validateOutput('yaml', data, options);\n const yamlString = typeof data === 'string' ? data : this.toYamlString(data);\n return this.codeblock('yaml', yamlString);\n }\n\n /**\n * Converts a value to a simple YAML string representation.\n */\n private toYamlString(data: unknown, indent: number = 0): string {\n const prefix = ' '.repeat(indent);\n\n if (data === null || data === undefined) {\n return 'null';\n }\n\n if (typeof data === 'string') {\n // Quote strings that contain special characters\n if (/[:\\n#\"']/.test(data) || data === '') {\n return `\"${data.replace(/\"/g, '\\\\\"')}\"`;\n }\n return data;\n }\n\n if (typeof data === 'number' || typeof data === 'boolean') {\n return String(data);\n }\n\n if (Array.isArray(data)) {\n if (data.length === 0) return '[]';\n return data\n .map((item) => `${prefix}- ${this.toYamlString(item, indent + 1)}`)\n .join('\\n');\n }\n\n if (typeof data === 'object') {\n const entries = Object.entries(data as Record<string, unknown>);\n if (entries.length === 0) return '{}';\n return entries\n .map(([key, value]) => {\n const valueStr = this.toYamlString(value, indent + 1);\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n return `${prefix}${key}:\\n${valueStr}`;\n }\n if (Array.isArray(value)) {\n return `${prefix}${key}:\\n${valueStr}`;\n }\n return `${prefix}${key}: ${valueStr}`;\n })\n .join('\\n');\n }\n\n // Fallback for any other types - use JSON stringify\n return JSON.stringify(data) ?? 'null';\n }\n\n /**\n * Wraps content with custom delimiters.\n */\n delimit(open: string, close: string, content: string | ProseWriter): this {\n const contentString = content instanceof ProseWriter ? content.toString() : content;\n this.parts.push(`${this.padding}${open}\\n${contentString}\\n${close}\\n`);\n return this;\n }\n\n /**\n * Returns a new ProseWriter with consecutive newlines collapsed to double newlines.\n */\n compact(): ProseWriter {\n const content = this.toString().replace(/\\n{3,}/g, '\\n\\n');\n return new ProseWriter(content, { safe: this.safeMode });\n }\n\n /**\n * Returns a new ProseWriter with leading and trailing whitespace removed.\n */\n trim(): ProseWriter {\n const content = this.toString().trim();\n return new ProseWriter(content, { safe: this.safeMode });\n }\n\n /**\n * Estimates the number of tokens in the prose.\n * By default, uses a rough approximation of ~4 characters per token.\n * An optional counter function can be provided for more accurate counting.\n */\n tokens(counter?: (content: string) => number): number {\n const content = this.toString();\n if (counter) {\n return counter(content);\n }\n // Rough estimation: ~4 characters per token for English text\n return Math.ceil(content.length / 4);\n }\n\n /**\n * Iterates over items and applies a builder function for each.\n */\n each<T>(\n items: T[],\n builder: (item: T, writer: this & InlineUtils, index: number) => void,\n ): this {\n items.forEach((item, index) => {\n builder(item, this.enhanced, index);\n });\n return this;\n }\n\n /**\n * Converts the prose to plain text by stripping markdown formatting.\n */\n toPlainText(): string {\n let text = this.toString();\n\n // Remove code blocks (preserve content)\n text = text.replace(/```[\\s\\S]*?```/g, (match) => {\n const lines = match.split('\\n');\n return lines.slice(1, -1).join('\\n');\n });\n\n // Remove inline code backticks\n text = text.replace(/`([^`]+)`/g, '$1');\n\n // Remove headings (keep text)\n text = text.replace(/^#{1,6}\\s+(.*)$/gm, '$1');\n\n // Remove bold\n text = text.replace(/\\*\\*([^*]+)\\*\\*/g, '$1');\n\n // Remove italic\n text = text.replace(/\\*([^*]+)\\*/g, '$1');\n\n // Remove links (keep text)\n text = text.replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1');\n\n // Remove blockquote markers\n text = text.replace(/^>\\s?/gm, '');\n\n // Remove horizontal rules\n text = text.replace(/^---$/gm, '');\n\n // Remove list markers\n text = text.replace(/^[-*]\\s+/gm, '');\n text = text.replace(/^\\d+\\.\\s+/gm, '');\n\n // Remove XML tags (keep content)\n text = text.replace(/<[^>]+>/g, '');\n\n // Remove table formatting\n text = text.replace(/\\|/g, ' ');\n text = text.replace(/^[\\s-]+$/gm, '');\n\n // Collapse multiple spaces\n text = text.replace(/ {2,}/g, ' ');\n\n // Collapse multiple newlines\n text = text.replace(/\\n{3,}/g, '\\n\\n');\n\n return text.trim();\n }\n\n /**\n * Runs output validation if a validator is provided.\n */\n private validateOutput(\n format: OutputFormat,\n data: unknown,\n options: ValidationOptions,\n ): void {\n if (!options.validate) return;\n let validationData = data;\n if (format === 'json' && typeof data === 'string') {\n try {\n validationData = JSON.parse(data);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Invalid JSON string';\n throw new ValidationError(\n format,\n [{ path: '$', message: `Invalid JSON string: ${message}` }],\n options.label,\n );\n }\n }\n if (format === 'yaml' && typeof data === 'string' && options.parseYaml) {\n try {\n validationData = options.parseYaml(data);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Invalid YAML string';\n throw new ValidationError(\n format,\n [{ path: '$', message: `Invalid YAML string: ${message}` }],\n options.label,\n );\n }\n }\n const result = options.validate({\n format,\n data: validationData,\n schema: options.schema,\n });\n if (result.valid) return;\n throw new ValidationError(format, result.issues ?? [], options.label);\n }\n\n /**\n * Returns necessary newline padding if there is existing content.\n * Ensures exactly two newlines (a paragraph break) before a block element.\n */\n private get padding(): string {\n if (this._skipNextPadding || this.parts.length === 0) {\n this._skipNextPadding = false;\n return '';\n }\n const lastPart = this.parts[this.parts.length - 1]!;\n if (lastPart.endsWith('\\n\\n')) return '';\n if (lastPart.endsWith('\\n')) return '\\n';\n return '\\n\\n';\n }\n\n /**\n * Internal helper to create a list builder.\n */\n private createListBuilder(): {\n builder: ListBuilder;\n getItems: () => (string | number | boolean | ProseWriter)[];\n } {\n const items: (string | number | boolean | ProseWriter)[] = [];\n const lb: ListBuilder = {\n item: (...content: (string | number | boolean | ProseWriter)[]) => {\n items.push(\n this.createChildWriter()\n .write(...content)\n .toString()\n .trimEnd(),\n );\n return lb;\n },\n task: (\n checked: boolean,\n ...content: (string | number | boolean | ProseWriter)[]\n ) => {\n const checkbox = checked ? '[x] ' : '[ ] ';\n const text = this.createChildWriter()\n .write(...content)\n .toString()\n .trimEnd();\n items.push(checkbox + text);\n return lb;\n },\n todo: (...content: (string | number | boolean | ProseWriter)[]) =>\n lb.task(false, ...content),\n done: (...content: (string | number | boolean | ProseWriter)[]) =>\n lb.task(true, ...content),\n unorderedList: (\n ...args: [(l: ListBuilder) => void] | (string | number | boolean | ProseWriter)[]\n ) => {\n const sub = this.createChildWriter();\n if (args.length === 1 && typeof args[0] === 'function') {\n sub.unorderedList(args[0] as (l: ListBuilder) => void);\n } else {\n sub.unorderedList(...(args as (string | number | boolean | ProseWriter)[]));\n }\n items.push(sub);\n return lb;\n },\n list: (\n ...args: [(l: ListBuilder) => void] | (string | number | boolean | ProseWriter)[]\n ) => {\n const sub = this.createChildWriter();\n if (args.length === 1 && typeof args[0] === 'function') {\n sub.list(args[0] as (l: ListBuilder) => void);\n } else {\n sub.list(...(args as (string | number | boolean | ProseWriter)[]));\n }\n items.push(sub);\n return lb;\n },\n orderedList: (\n ...args: [(l: ListBuilder) => void] | (string | number | boolean | ProseWriter)[]\n ) => {\n const sub = this.createChildWriter();\n if (args.length === 1 && typeof args[0] === 'function') {\n sub.orderedList(args[0] as (l: ListBuilder) => void);\n } else {\n sub.orderedList(...(args as (string | number | boolean | ProseWriter)[]));\n }\n items.push(sub);\n return lb;\n },\n comment: (content: string) => {\n const sub = this.createChildWriter();\n sub.comment(content);\n items.push(sub);\n return lb;\n },\n bold: this.safeMode ? safeBold : bold,\n italic: this.safeMode ? safeItalic : italic,\n code: this.safeMode ? safeInlineCode : code,\n inline: this.safeMode ? safeInlineCode : inline,\n strike: this.safeMode ? safeStrike : strike,\n link: this.safeMode ? safeLink : link,\n image: this.safeMode ? safeImage : image,\n };\n return { builder: lb, getItems: () => items };\n }\n\n /**\n * Creates an empty ProseWriter instance.\n */\n static empty(): ProseWriter {\n return new ProseWriter();\n }\n\n /**\n * Joins multiple ProseWriter instances into one.\n */\n static join(...writers: ProseWriter[]): ProseWriter {\n const result = new ProseWriter();\n for (const writer of writers) {\n result.parts.push(writer.toString());\n }\n return result;\n }\n\n /**\n * Creates a ProseWriter from a template string.\n */\n static fromTemplate(template: string): ProseWriter {\n return new ProseWriter(template);\n }\n\n /**\n * Converts the accumulated prose to a string.\n */\n toString(): string {\n return this.parts.join('');\n }\n\n /**\n * Returns the primitive value (string) for type coercion.\n */\n [Symbol.toPrimitive](hint: string): string | number {\n if (hint === 'number') {\n return Number.NaN;\n }\n return this.toString();\n }\n\n /**\n * Returns the string tag for the object.\n */\n get [Symbol.toStringTag](): string {\n return 'ProseWriter';\n }\n}\n\n/**\n * Creates a new ProseWriter instance with the given content.\n */\nconst buildWrite = (safeMode: boolean) => {\n const createWriter = () => new ProseWriter(undefined, { safe: safeMode });\n return Object.assign(\n (...content: WriterValue[]): ProseWriter => {\n return createWriter().write(...content);\n },\n {\n with: (builder: (writer: ProseWriter & InlineUtils) => void): ProseWriter => {\n return createWriter().with(builder);\n },\n template: (template: string): ProseWriter => {\n if (safeMode) {\n return createWriter().write(asSafeString(template));\n }\n return createWriter().write(template);\n },\n unorderedList: (\n ...args: [(l: ListBuilder) => void] | WriterValue[]\n ): ProseWriter => {\n const pw = createWriter();\n if (args.length === 1 && typeof args[0] === 'function') {\n return pw.unorderedList(args[0] as (l: ListBuilder) => void);\n }\n return pw.unorderedList(...(args as WriterValue[]));\n },\n list: (...args: [(l: ListBuilder) => void] | WriterValue[]): ProseWriter => {\n const pw = createWriter();\n if (args.length === 1 && typeof args[0] === 'function') {\n return pw.list(args[0] as (l: ListBuilder) => void);\n }\n return pw.list(...(args as WriterValue[]));\n },\n orderedList: (...args: [(l: ListBuilder) => void] | WriterValue[]): ProseWriter => {\n const pw = createWriter();\n if (args.length === 1 && typeof args[0] === 'function') {\n return pw.orderedList(args[0] as (l: ListBuilder) => void);\n }\n return pw.orderedList(...(args as WriterValue[]));\n },\n tasks: (\n ...args: [(l: ListBuilder) => void] | (WriterValue | [WriterValue, boolean])[]\n ): ProseWriter => {\n const pw = createWriter();\n if (args.length === 1 && typeof args[0] === 'function') {\n return pw.tasks(args[0] as (l: ListBuilder) => void);\n }\n return pw.tasks(...(args as (WriterValue | [WriterValue, boolean])[]));\n },\n callout: (\n type: 'NOTE' | 'TIP' | 'IMPORTANT' | 'WARNING' | 'CAUTION',\n content: string | ((writer: ProseWriter & InlineUtils) => void),\n ): ProseWriter => {\n return createWriter().callout(type, content);\n },\n schema: (schemaValue: unknown, options?: SchemaEmbedOptions): ProseWriter => {\n return createWriter().schema(schemaValue, options);\n },\n },\n );\n};\n\nconst safeWrite = buildWrite(true);\n\nexport const write = Object.assign(buildWrite(false), { safe: safeWrite });\n\n/**\n * Appends bold formatting to a string.\n */\nexport const bold = (content: string | number | boolean | ProseWriter): string =>\n `**${content instanceof ProseWriter ? content.toString().trim() : content}**`;\n\n/**\n * Appends italic formatting to a string.\n */\nexport const italic = (content: string | number | boolean | ProseWriter): string =>\n `*${content instanceof ProseWriter ? content.toString().trim() : content}*`;\n\n/**\n * Appends inline code formatting to a string.\n */\nexport const code = (content: string | number | boolean | ProseWriter): string =>\n `\\`${content instanceof ProseWriter ? content.toString().trim() : content}\\``;\n\n/**\n * Alias for code().\n */\nexport const inline = code;\n\n/**\n * Appends strikethrough formatting to a string.\n */\nexport const strike = (content: string | number | boolean | ProseWriter): string =>\n `~~${content instanceof ProseWriter ? content.toString().trim() : content}~~`;\n\n/**\n * Creates a markdown link string.\n */\nexport const link = (text: string | ProseWriter, url: string): string =>\n `[${text instanceof ProseWriter ? text.toString().trim() : text}](${url})`;\n\n/**\n * Creates a markdown image string.\n */\nexport const image = (alt: string | ProseWriter, url: string): string =>\n ``;\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "6C78B4E230FE231864756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|