@contractkit/explorer-ui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +130 -0
- package/dist/assets/style.css +859 -0
- package/dist/constraints.d.ts +4 -0
- package/dist/constraints.d.ts.map +1 -0
- package/dist/html.d.ts +28 -0
- package/dist/html.d.ts.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1359 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown.d.ts +10 -0
- package/dist/markdown.d.ts.map +1 -0
- package/dist/render-code-samples.d.ts +20 -0
- package/dist/render-code-samples.d.ts.map +1 -0
- package/dist/render-item.d.ts +44 -0
- package/dist/render-item.d.ts.map +1 -0
- package/dist/render-model.d.ts +9 -0
- package/dist/render-model.d.ts.map +1 -0
- package/dist/render-operation.d.ts +17 -0
- package/dist/render-operation.d.ts.map +1 -0
- package/dist/render-schema.d.ts +18 -0
- package/dist/render-schema.d.ts.map +1 -0
- package/dist/render-tryit.d.ts +12 -0
- package/dist/render-tryit.d.ts.map +1 -0
- package/dist/render-type.d.ts +11 -0
- package/dist/render-type.d.ts.map +1 -0
- package/dist/render.d.ts +7 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/types.d.ts +65 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/html.ts","../src/markdown.ts","../src/render-code-samples.ts","../src/render-schema.ts","../src/constraints.ts","../src/render-model.ts","../src/render-type.ts","../src/render-tryit.ts","../src/render-operation.ts","../src/render.ts","../src/render-item.ts"],"sourcesContent":["/**\n * Minimal tagged-template helper for building HTML strings with automatic escaping.\n *\n * html`<p>${userInput}</p>` // escapes userInput\n * html`<ul>${raw(items.join(''))}</ul>` // bypasses escaping\n *\n * Interpolations are coerced to strings and HTML-escaped. Arrays are joined without a separator\n * after escaping each element. `raw(...)` marks a string as pre-escaped so it passes through.\n */\n\nconst RAW = Symbol('raw');\n\ninterface RawHtml {\n [RAW]: true;\n value: string;\n}\n\n/** Marks a string as already-escaped HTML so the {@link html} tag inserts it verbatim. */\nexport function raw(value: string): RawHtml {\n return { [RAW]: true, value };\n}\n\nfunction isRaw(value: unknown): value is RawHtml {\n return typeof value === 'object' && value !== null && (value as { [RAW]?: boolean })[RAW] === true;\n}\n\n/** Escapes the five HTML-significant characters (`& < > \" '`) so the input is safe to embed in markup. */\nexport function escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nfunction renderValue(value: unknown): string {\n if (value === null || value === undefined || value === false) return '';\n if (isRaw(value)) return value.value;\n if (Array.isArray(value)) return value.map(renderValue).join('');\n return escapeHtml(String(value));\n}\n\n/**\n * Tagged template literal that auto-escapes every interpolated value. Use {@link raw} to inject\n * pre-built HTML without double-escaping. `null`, `undefined`, and `false` interpolations render\n * as empty strings; arrays are flattened and each element is escaped (or passed through if `raw`).\n */\nexport function html(strings: TemplateStringsArray, ...values: unknown[]): string {\n let out = strings[0] ?? '';\n for (let i = 0; i < values.length; i++) {\n out += renderValue(values[i]) + (strings[i + 1] ?? '');\n }\n return out;\n}\n\n/** Slugify an arbitrary string for use in anchor ids — keeps a-z, 0-9, dashes; collapses everything else. */\nexport function slug(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n","import { escapeHtml } from './html.js';\n\n/**\n * Minimal block + inline Markdown renderer used for `description:` fields in models and operations.\n * Supports paragraphs, headings, fenced code blocks, inline code, **bold**, *italic*, [links](url),\n * unordered lists (`-` or `*` bullets), and ordered lists. Anything else passes through as text.\n *\n * Intentionally small (~80 LOC) so the webview bundle stays lean. For richer needs we can swap to\n * `marked` later — the API matches.\n */\nexport function renderMarkdown(input: string): string {\n if (!input) return '';\n const lines = input.replace(/\\r\\n/g, '\\n').split('\\n');\n const out: string[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i] ?? '';\n\n // Fenced code block\n const fence = /^```(\\w*)\\s*$/.exec(line);\n if (fence) {\n const lang = fence[1] ?? '';\n const buf: string[] = [];\n i++;\n while (i < lines.length && !/^```\\s*$/.test(lines[i] ?? '')) {\n buf.push(lines[i] ?? '');\n i++;\n }\n i++; // skip closing fence\n const langAttr = lang ? ` data-lang=\"${escapeHtml(lang)}\"` : '';\n out.push(`<pre class=\"ce-code\"${langAttr}><code>${escapeHtml(buf.join('\\n'))}</code></pre>`);\n continue;\n }\n\n // Heading\n const heading = /^(#{1,6})\\s+(.+)$/.exec(line);\n if (heading) {\n const level = heading[1]!.length;\n out.push(`<h${level}>${renderInline(heading[2]!)}</h${level}>`);\n i++;\n continue;\n }\n\n // Unordered list\n if (/^\\s*[-*]\\s+/.test(line)) {\n const items: string[] = [];\n while (i < lines.length && /^\\s*[-*]\\s+/.test(lines[i] ?? '')) {\n items.push(renderInline((lines[i] ?? '').replace(/^\\s*[-*]\\s+/, '')));\n i++;\n }\n out.push(`<ul>${items.map(t => `<li>${t}</li>`).join('')}</ul>`);\n continue;\n }\n\n // Ordered list\n if (/^\\s*\\d+\\.\\s+/.test(line)) {\n const items: string[] = [];\n while (i < lines.length && /^\\s*\\d+\\.\\s+/.test(lines[i] ?? '')) {\n items.push(renderInline((lines[i] ?? '').replace(/^\\s*\\d+\\.\\s+/, '')));\n i++;\n }\n out.push(`<ol>${items.map(t => `<li>${t}</li>`).join('')}</ol>`);\n continue;\n }\n\n // Blank → paragraph break\n if (line.trim() === '') {\n i++;\n continue;\n }\n\n // Paragraph (consume consecutive non-blank, non-special lines)\n const buf: string[] = [line];\n i++;\n while (i < lines.length) {\n const next = lines[i] ?? '';\n if (next.trim() === '' || /^```/.test(next) || /^#{1,6}\\s/.test(next) || /^\\s*[-*]\\s/.test(next) || /^\\s*\\d+\\.\\s/.test(next)) break;\n buf.push(next);\n i++;\n }\n out.push(`<p>${renderInline(buf.join(' '))}</p>`);\n }\n\n return out.join('\\n');\n}\n\nfunction renderInline(text: string): string {\n // First escape, then re-introduce supported inline patterns.\n let s = escapeHtml(text);\n\n // Inline code: `code`\n s = s.replace(/`([^`]+)`/g, (_m, code: string) => `<code>${code}</code>`);\n\n // Bold: **text**\n s = s.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n\n // Italic: *text* (single asterisks, no other asterisks inside)\n s = s.replace(/(^|[^*])\\*([^*\\s][^*]*?)\\*(?!\\*)/g, (_m, before: string, body: string) => `${before}<em>${body}</em>`);\n\n // Links: [text](url) — only http(s) URLs to avoid `javascript:` injection.\n s = s.replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^)\\s]+)\\)/g, (_m, label: string, url: string) => {\n return `<a href=\"${url}\" rel=\"noopener noreferrer\">${label}</a>`;\n });\n\n return s;\n}\n","import type { ContractTypeNode, ModelNode, ScalarTypeNode } from '@contractkit/core';\nimport { resolveEffectiveFields } from '@contractkit/core/type-utils';\nimport { faker } from '@faker-js/faker';\nimport { escapeHtml } from './html.js';\nimport type { RenderContext, ResolvedOperation } from './types.js';\n\n/**\n * Renders the right-rail code samples: a curl Request Sample and (when a 2xx JSON response is\n * declared) a synthesized Response Example. Used by `renderOperation` on wide viewports — the\n * card switches to a two-column grid and places this output in the right rail.\n */\nexport function renderCodeSamples(op: ResolvedOperation, baseUrl: string, ctx: RenderContext = {}): string {\n const curl = renderCurlSample(op, baseUrl, ctx);\n const responseExample = renderResponseExample(op, ctx);\n return `<section class=\"ce-rail-section\">\n <h4 class=\"ce-rail-heading\">Request Sample</h4>\n <pre class=\"ce-code ce-code-dark\">${curl}</pre>\n </section>\n ${responseExample}`;\n}\n\nfunction renderCurlSample(op: ResolvedOperation, baseUrl: string, ctx: RenderContext): string {\n const cleanBase = baseUrl ? baseUrl.replace(/\\/$/, '') : 'https://api.example.com';\n const url = `${cleanBase}${op.routePath}`;\n const lines: string[] = [];\n lines.push(`curl --request ${op.method.toUpperCase()} \\\\`);\n lines.push(` --url ${url}`);\n\n const hasJsonResponse = op.op.responses.some(r => r.contentType?.includes('json'));\n const jsonBody = op.op.request?.bodies.find(\n b => b.contentType === 'application/json' || b.contentType.endsWith('+json'),\n );\n\n if (hasJsonResponse) {\n lines[lines.length - 1] += ' \\\\';\n lines.push(` --header 'Accept: application/json'`);\n }\n if (jsonBody) {\n lines[lines.length - 1] += ' \\\\';\n lines.push(` --header 'Content-Type: application/json'`);\n // Append a `--data` argument with a faker-generated sample matching the request body\n // schema. Same seed key as the Try-It pre-fill so the curl payload and the textarea\n // sample stay aligned.\n const sample = buildSampleJson(\n jsonBody.bodyType,\n ctx,\n `${op.method}:${op.routePath}:request-body`,\n 'readonly',\n );\n const bodyJson = JSON.stringify(sample, null, 2)\n // Single-quote-wrap the body, so escape any inner single quotes.\n .replace(/'/g, `'\\\\''`);\n lines[lines.length - 1] += ' \\\\';\n lines.push(` --data '${bodyJson}'`);\n }\n\n return escapeHtml(lines.join('\\n'));\n}\n\nfunction renderResponseExample(op: ResolvedOperation, ctx: RenderContext): string {\n const primary = op.op.responses.find(\n r =>\n r.statusCode >= 200 &&\n r.statusCode < 300 &&\n r.bodyType !== undefined &&\n r.contentType !== undefined &&\n r.contentType.includes('json'),\n );\n if (!primary || !primary.bodyType) return '';\n\n // Seed faker deterministically off the operation + status code so re-renders are stable.\n faker.seed(hashString(`${op.method}:${op.routePath}:${primary.statusCode}`));\n\n const sample = jsonSample(primary.bodyType, ctx, new Set(), undefined, 'writeonly');\n const formatted = JSON.stringify(sample, null, 2);\n return `<section class=\"ce-rail-section\">\n <h4 class=\"ce-rail-heading\">Response Example</h4>\n <pre class=\"ce-code ce-code-dark\">${escapeHtml(formatted)}</pre>\n </section>`;\n}\n\ntype Excluded = 'readonly' | 'writeonly';\n\nfunction jsonSample(\n type: ContractTypeNode,\n ctx: RenderContext,\n visited: Set<string>,\n fieldName: string | undefined,\n exclude: Excluded,\n): unknown {\n switch (type.kind) {\n case 'scalar':\n return scalarSample(type, fieldName);\n case 'literal':\n return type.value;\n case 'enum':\n return type.values.length > 0 ? faker.helpers.arrayElement(type.values) : null;\n case 'array': {\n const len = faker.number.int({ min: 1, max: 3 });\n return Array.from({ length: len }, () => jsonSample(type.item, ctx, visited, fieldName, exclude));\n }\n case 'tuple':\n return type.items.map(t => jsonSample(t, ctx, visited, fieldName, exclude));\n case 'record':\n return { key: jsonSample(type.value, ctx, visited, undefined, exclude) };\n case 'union':\n case 'discriminatedUnion': {\n const first = type.members[0];\n return first ? jsonSample(first, ctx, visited, fieldName, exclude) : null;\n }\n case 'intersection': {\n // Flatten the intersection via the canonical resolver, then sample each field.\n const resolved = resolveEffectiveFields(type, modelIndexFromCtx(ctx));\n if (resolved.fields.length > 0) {\n const out: Record<string, unknown> = {};\n for (const f of resolved.fields) {\n if (f.visibility === exclude) continue;\n out[f.name] = jsonSample(f.type, ctx, visited, f.name, exclude);\n }\n return out;\n }\n const first = type.members[0];\n return first ? jsonSample(first, ctx, visited, fieldName, exclude) : null;\n }\n case 'lazy':\n return jsonSample(type.inner, ctx, visited, fieldName, exclude);\n case 'inlineObject': {\n const out: Record<string, unknown> = {};\n for (const f of type.fields) {\n if (f.visibility === exclude) continue;\n out[f.name] = jsonSample(f.type, ctx, visited, f.name, exclude);\n }\n return out;\n }\n case 'ref': {\n if (visited.has(type.name)) return null;\n const entry = ctx.models?.get(type.name);\n if (!entry) return null;\n const next = new Set([...visited, type.name]);\n const resolved = resolveEffectiveFields(type.name, modelIndexFromCtx(ctx));\n if (resolved.fields.length > 0) {\n const out: Record<string, unknown> = {};\n for (const f of resolved.fields) {\n if (f.visibility === exclude) continue;\n out[f.name] = jsonSample(f.type, ctx, next, f.name, exclude);\n }\n return out;\n }\n // Model resolved to no fields (e.g. alias to a non-object type) — fall through.\n const model = entry.model;\n if (model.type) return jsonSample(model.type, ctx, next, fieldName, exclude);\n return null;\n }\n }\n}\n\n/**\n * Public sample-data factory. Used by `renderTryIt` to pre-fill the request body textarea and\n * the path/query/header inputs with realistic faker-generated values matching the schema.\n *\n * The `seed` makes output stable per-call: the same operation always pre-fills the same body\n * so users don't see flicker on re-render. `exclude: 'readonly'` is correct for request bodies\n * (readonly fields are server-controlled), `'writeonly'` for response examples.\n */\nexport function buildSampleJson(\n type: ContractTypeNode,\n ctx: RenderContext,\n seed: string,\n exclude: Excluded = 'writeonly',\n): unknown {\n faker.seed(hashString(seed));\n return jsonSample(type, ctx, new Set(), undefined, exclude);\n}\n\nfunction scalarSample(s: ScalarTypeNode, fieldName: string | undefined): unknown {\n switch (s.name) {\n case 'boolean':\n return faker.datatype.boolean();\n case 'number':\n case 'int':\n case 'bigint':\n return fakerNumber(fieldName, s);\n case 'uuid':\n return faker.string.uuid();\n case 'datetime':\n return faker.date.recent({ days: 90 }).toISOString();\n case 'date':\n return faker.date.recent({ days: 90 }).toISOString().slice(0, 10);\n case 'time':\n return faker.date.recent({ days: 1 }).toISOString().slice(11, 19);\n case 'interval':\n return 'P1D';\n case 'email':\n return faker.internet.email().toLowerCase();\n case 'url':\n return faker.internet.url();\n case 'string':\n return fakerString(fieldName);\n default:\n return fakerString(fieldName);\n }\n}\n\nfunction fakerString(fieldName: string | undefined): string {\n const name = (fieldName ?? '').toLowerCase();\n\n if (/email/.test(name)) return faker.internet.email().toLowerCase();\n if (/^url$|link|href|website/.test(name)) return faker.internet.url();\n if (/^id$|_id$|guid|uuid/.test(name)) return faker.string.uuid();\n if (/at$|_at$|date|time/.test(name)) return faker.date.recent({ days: 90 }).toISOString();\n\n if (/firstname|first_name/.test(name)) return faker.person.firstName();\n if (/lastname|last_name|surname/.test(name)) return faker.person.lastName();\n if (/^name$|fullname|full_name|displayname|display_name/.test(name)) return faker.person.fullName();\n if (/username|handle/.test(name)) return faker.internet.username();\n if (/avatar|image|photo|picture/.test(name)) return faker.image.url();\n if (/street|address/.test(name)) return faker.location.streetAddress();\n if (/city/.test(name)) return faker.location.city();\n if (/country/.test(name)) return faker.location.country();\n if (/zip|postal/.test(name)) return faker.location.zipCode();\n if (/state\\b|region/.test(name)) return faker.location.state();\n if (/company|organization|org\\b/.test(name)) return faker.company.name();\n if (/title|product|item/.test(name)) return faker.commerce.productName();\n if (/color|colour/.test(name)) return faker.color.human();\n if (/description|summary|bio|notes|message|content/.test(name)) return faker.lorem.sentence();\n if (/phone/.test(name)) return faker.phone.number();\n if (/password/.test(name)) return faker.internet.password();\n if (/token|key|secret|apikey/.test(name)) return faker.string.alphanumeric(32);\n if (/status|state/.test(name)) return faker.helpers.arrayElement(['active', 'inactive', 'pending', 'archived', 'draft']);\n if (/currency/.test(name)) return faker.finance.currencyCode();\n if (/locale|language/.test(name)) return faker.helpers.arrayElement(['en-US', 'en-GB', 'de-DE', 'fr-FR', 'ja-JP', 'es-ES']);\n if (/slug/.test(name)) return faker.lorem.slug();\n\n return faker.lorem.word();\n}\n\nfunction fakerNumber(fieldName: string | undefined, s: ScalarTypeNode): number {\n const name = (fieldName ?? '').toLowerCase();\n if (/amount|price|cost|total|balance|fee|salary|revenue/.test(name)) {\n return Number(faker.finance.amount({ min: 1, max: 9999, dec: 2 }));\n }\n if (/^age$/.test(name)) return faker.number.int({ min: 18, max: 80 });\n if (/year/.test(name)) return faker.number.int({ min: 2000, max: 2024 });\n if (/month/.test(name)) return faker.number.int({ min: 1, max: 12 });\n if (/day/.test(name)) return faker.number.int({ min: 1, max: 28 });\n if (/count|quantity|qty/.test(name)) return faker.number.int({ min: 1, max: 100 });\n if (/percent|pct|ratio/.test(name)) return faker.number.int({ min: 0, max: 100 });\n if (/latitude|lat\\b/.test(name)) return Number(faker.location.latitude().toFixed(2));\n if (/longitude|lng\\b|lon\\b/.test(name)) return Number(faker.location.longitude().toFixed(2));\n\n const lo = toFiniteNumber(s.min, 0);\n const hi = toFiniteNumber(s.max, Math.max(lo + 1, 999));\n if (s.name === 'int' || s.name === 'bigint') {\n return faker.number.int({ min: lo, max: hi });\n }\n return Number(faker.number.float({ min: lo, max: hi, fractionDigits: 2 }));\n}\n\nfunction toFiniteNumber(value: number | bigint | string | undefined, fallback: number): number {\n if (typeof value === 'number') return Number.isFinite(value) ? Math.floor(value) : fallback;\n if (typeof value === 'bigint') return Number(value);\n if (typeof value === 'string') {\n const n = Number(value);\n return Number.isFinite(n) ? Math.floor(n) : fallback;\n }\n return fallback;\n}\n\n/** Adapter that builds a plain ModelNode index from the RenderContext's ResolvedModel map. */\nfunction modelIndexFromCtx(ctx: RenderContext): Map<string, ModelNode> {\n const out = new Map<string, ModelNode>();\n if (ctx.models) {\n for (const [name, resolved] of ctx.models) out.set(name, resolved.model);\n }\n return out;\n}\n\nfunction hashString(s: string): number {\n let h = 5381;\n for (let i = 0; i < s.length; i++) h = ((h << 5) + h + s.charCodeAt(i)) | 0;\n return h >>> 0;\n}\n","import type { ContractTypeNode, FieldNode, ScalarTypeNode } from '@contractkit/core';\nimport { resolveEffectiveFields } from '@contractkit/core/type-utils';\nimport { escapeHtml } from './html.js';\nimport { renderMarkdown } from './markdown.js';\nimport { renderType } from './render-type.js';\nimport type { RenderContext } from './types.js';\n\nconst STRING_SCALARS = new Set(['string', 'uuid', 'email', 'url']);\n\n/** Per-field visibility to suppress when rendering. `readonly` for request inputs (server\n * controls those), `writeonly` for response payloads. */\nexport type SchemaVisibilityFilter = 'readonly' | 'writeonly';\n\nexport interface RenderSchemaOptions {\n /** Hide fields with this visibility. Pass `'readonly'` when rendering request inputs\n * (query/path/headers/request body) so server-controlled fields don't show up as inputs. */\n exclude?: SchemaVisibilityFilter;\n}\n\n/**\n * Renders a request/response body schema as an indented field tree: each row shows the field\n * name, type, required tag, description, default, and constraint chips, with nested objects/\n * arrays indented under their parent. Falls back to `renderType` for shapes that aren't\n * object-like (unions, primitives at the top level, etc.).\n */\nexport function renderSchemaTree(\n type: ContractTypeNode,\n ctx: RenderContext = {},\n options: RenderSchemaOptions = {},\n): string {\n return renderSchemaNode(type, ctx, options);\n}\n\nfunction renderSchemaNode(type: ContractTypeNode, ctx: RenderContext, options: RenderSchemaOptions): string {\n if (type.kind === 'inlineObject') {\n return renderSchemaFields(type.fields, ctx, options);\n }\n if (type.kind === 'ref') {\n const entry = ctx.models?.get(type.name);\n const visited = ctx.visited ?? new Set<string>();\n if (entry && !visited.has(type.name)) {\n const next: RenderContext = {\n ...ctx,\n visited: new Set([...visited, type.name]),\n depth: (ctx.depth ?? 0) + 1,\n };\n // Use the canonical core resolver — handles inheritance, type-alias bases, nested\n // intersections, alias chains, and diamond inheritance dedup.\n const resolved = resolveEffectiveFields(type.name, modelIndexFromCtx(ctx));\n if (resolved.fields.length > 0) {\n const fieldsHtml = renderSchemaFields(resolved.fields, next, options);\n const unresolvedHtml = renderUnresolvedRefs(resolved.unresolved);\n return `${fieldsHtml}${unresolvedHtml}`;\n }\n if (resolved.unresolved.length > 0) {\n return renderUnresolvedRefs(resolved.unresolved);\n }\n // Model exists but didn't flatten to fields (e.g. alias to a union/scalar) — fall\n // through to the model's own type rendering.\n const model = entry.model;\n if (model.type) {\n return renderSchemaNode(model.type, next, options);\n }\n }\n if (!entry) {\n return renderUnresolvedRefs([type.name]);\n }\n return `<div class=\"ce-schema-fallback\">${renderType(type, ctx)}</div>`;\n }\n if (type.kind === 'array') {\n return `<div class=\"ce-schema-array-label\">array of:</div>${renderSchemaNode(type.item, ctx, options)}`;\n }\n if (type.kind === 'intersection') {\n const resolved = resolveEffectiveFields(type, modelIndexFromCtx(ctx));\n if (resolved.fields.length > 0 || resolved.unresolved.length > 0) {\n const fieldsHtml = resolved.fields.length > 0 ? renderSchemaFields(resolved.fields, ctx, options) : '';\n const unresolvedHtml = renderUnresolvedRefs(resolved.unresolved);\n return `${fieldsHtml}${unresolvedHtml}`;\n }\n return `<div class=\"ce-schema-fallback\">${renderType(type, ctx)}</div>`;\n }\n if (type.kind === 'union' || type.kind === 'discriminatedUnion') {\n return renderUnion(type, ctx, options);\n }\n return `<div class=\"ce-schema-fallback\">${renderType(type, ctx)}</div>`;\n}\n\n/** Adapter that builds a plain ModelNode index from the RenderContext's ResolvedModel map. */\nfunction modelIndexFromCtx(ctx: RenderContext): Map<string, import('@contractkit/core').ModelNode> {\n const out = new Map<string, import('@contractkit/core').ModelNode>();\n if (ctx.models) {\n for (const [name, resolved] of ctx.models) out.set(name, resolved.model);\n }\n return out;\n}\n\n\nfunction renderUnresolvedRefs(names: string[]): string {\n if (names.length === 0) return '';\n const chips = names\n .map(n => `<a class=\"ce-schema-unresolved-ref ce-ref\" href=\"#model-${encodeURIComponent(n)}\">${escapeHtml(n)}</a>`)\n .join(', ');\n return `<div class=\"ce-schema-unresolved\">\n <span class=\"ce-schema-unresolved-label\">Unresolved</span>\n ${chips}\n <span class=\"ce-schema-unresolved-hint\">— not loaded in the workspace.</span>\n </div>`;\n}\n\n/**\n * Renders a (discriminated) union as a stacked list of expandable variant cards. Each card\n * shows the variant model name + the discriminator literal value (when applicable), and\n * expands into that variant's full field tree.\n */\nfunction renderUnion(\n type: Extract<ContractTypeNode, { kind: 'union' | 'discriminatedUnion' }>,\n ctx: RenderContext,\n options: RenderSchemaOptions,\n): string {\n const isDiscriminated = type.kind === 'discriminatedUnion';\n const label = isDiscriminated\n ? `One of <span class=\"ce-schema-union-disc\">by <code>${escapeHtml(type.discriminator)}</code></span>`\n : 'One of';\n const variants = type.members\n .map(m => renderVariant(m, ctx, isDiscriminated ? type.discriminator : undefined, options))\n .join('');\n return `<div class=\"ce-schema-union\">\n <div class=\"ce-schema-union-label\">${label}</div>\n <div class=\"ce-schema-union-variants\">${variants}</div>\n </div>`;\n}\n\nfunction renderVariant(\n member: ContractTypeNode,\n ctx: RenderContext,\n discriminator: string | undefined,\n options: RenderSchemaOptions,\n): string {\n const info = extractVariantInfo(member, ctx, discriminator, options);\n const discBadge = info.discriminatorValue !== undefined\n ? `<code class=\"ce-schema-variant-disc-value\">${escapeHtml(discriminator!)}: ${escapeHtml(info.discriminatorValue)}</code>`\n : '';\n return `<details class=\"ce-schema-variant\">\n <summary>\n <span class=\"ce-schema-variant-name\">${info.name}</span>\n ${discBadge}\n </summary>\n <div class=\"ce-schema-variant-body\">${info.body}</div>\n </details>`;\n}\n\ninterface VariantInfo {\n name: string;\n body: string;\n discriminatorValue?: string;\n}\n\nfunction extractVariantInfo(\n member: ContractTypeNode,\n ctx: RenderContext,\n discriminator: string | undefined,\n options: RenderSchemaOptions,\n): VariantInfo {\n if (member.kind === 'ref') {\n const entry = ctx.models?.get(member.name);\n const visited = ctx.visited ?? new Set<string>();\n if (entry && !visited.has(member.name)) {\n const next: RenderContext = {\n ...ctx,\n visited: new Set([...visited, member.name]),\n depth: (ctx.depth ?? 0) + 1,\n };\n const model = entry.model;\n const discriminatorValue = discriminator\n ? findDiscriminatorValue(model.fields, discriminator)\n : undefined;\n const resolved = resolveEffectiveFields(member.name, modelIndexFromCtx(ctx));\n let body: string;\n if (resolved.fields.length > 0 || resolved.unresolved.length > 0) {\n const fieldsHtml = resolved.fields.length > 0\n ? renderSchemaFields(resolved.fields, next, options)\n : '';\n body = `${fieldsHtml}${renderUnresolvedRefs(resolved.unresolved)}`;\n } else if (model.type) {\n body = renderSchemaNode(model.type, next, options);\n } else {\n body = `<p class=\"ce-empty\">No fields.</p>`;\n }\n return { name: escapeHtml(member.name), body, discriminatorValue };\n }\n return { name: escapeHtml(member.name), body: `<div class=\"ce-schema-fallback\">${renderType(member, ctx)}</div>` };\n }\n if (member.kind === 'inlineObject') {\n return {\n name: 'object',\n body: renderSchemaFields(member.fields, ctx, options),\n discriminatorValue: discriminator\n ? findDiscriminatorValue(member.fields, discriminator)\n : undefined,\n };\n }\n return {\n name: variantTypeName(member),\n body: `<div class=\"ce-schema-fallback\">${renderType(member, ctx)}</div>`,\n };\n}\n\nfunction findDiscriminatorValue(fields: FieldNode[] | undefined, discriminator: string): string | undefined {\n if (!fields) return undefined;\n const f = fields.find(field => field.name === discriminator);\n if (!f) return undefined;\n if (f.type.kind === 'literal') {\n return typeof f.type.value === 'string' ? `\"${f.type.value}\"` : String(f.type.value);\n }\n if (f.type.kind === 'enum' && f.type.values.length === 1) {\n return `\"${f.type.values[0]}\"`;\n }\n return undefined;\n}\n\nfunction variantTypeName(type: ContractTypeNode): string {\n switch (type.kind) {\n case 'scalar': return escapeHtml(type.name);\n case 'literal': return escapeHtml(typeof type.value === 'string' ? `\"${type.value}\"` : String(type.value));\n case 'enum': return 'enum';\n case 'array': return 'array';\n case 'tuple': return 'tuple';\n case 'record': return 'record';\n case 'lazy': return 'lazy';\n default: return type.kind;\n }\n}\n\nfunction renderSchemaFields(fields: FieldNode[], ctx: RenderContext, options: RenderSchemaOptions): string {\n const visible = options.exclude ? fields.filter(f => f.visibility !== options.exclude) : fields;\n if (visible.length === 0) return '<p class=\"ce-empty\">No fields.</p>';\n return `<div class=\"ce-schema-fields\">${visible.map(f => renderSchemaField(f, ctx, options)).join('')}</div>`;\n}\n\nfunction renderSchemaField(f: FieldNode, ctx: RenderContext, options: RenderSchemaOptions): string {\n // A field with a default isn't required from the caller's perspective — the server uses the\n // default when omitted — so we suppress the REQUIRED pill in that case to avoid the visual\n // noise of every paginated query param being flagged as required.\n const required = !f.optional && f.default === undefined;\n const typeLabel = renderTypeLabel(f.type);\n const chips = renderConstraintChips(f.type);\n const enumValues = renderEnumValues(f.type, ctx);\n const desc = f.description\n ? `<div class=\"ce-schema-desc ce-markdown\">${renderMarkdown(f.description)}</div>`\n : '';\n const defaultHtml =\n f.default !== undefined\n ? `<div class=\"ce-schema-default\">Default: <code>${escapeHtml(String(f.default))}</code></div>`\n : '';\n const requiredTag = required ? '<span class=\"ce-schema-required\">required</span>' : '';\n\n let nested = '';\n if (\n f.type.kind === 'inlineObject' ||\n f.type.kind === 'array' ||\n f.type.kind === 'ref' ||\n f.type.kind === 'intersection'\n ) {\n const inner = renderSchemaNode(f.type, ctx, options);\n if (inner.includes('ce-schema-fields') || inner.includes('ce-schema-array-label')) {\n nested = `<div class=\"ce-schema-nested\">${inner}</div>`;\n }\n }\n\n return `<div class=\"ce-schema-row\">\n <div class=\"ce-schema-head\">\n <code class=\"ce-schema-name\">${escapeHtml(f.name)}</code>\n ${typeLabel}\n ${requiredTag}\n </div>\n ${desc}\n ${defaultHtml}\n ${chips}\n ${enumValues}\n ${nested}\n </div>`;\n}\n\n/**\n * Returns the inline \"Allowed values\" list when the field's type is an enum (either inline\n * `enum(a, b, c)` or a ref to a model whose `type` alias is an enum). Empty string otherwise.\n */\nfunction renderEnumValues(type: ContractTypeNode, ctx: RenderContext): string {\n const values = resolveEnumValues(type, ctx);\n if (!values || values.length === 0) return '';\n const chips = values\n .map(v => `<code class=\"ce-schema-enum-value\">${escapeHtml(v)}</code>`)\n .join('');\n return `<div class=\"ce-schema-enum\">\n <span class=\"ce-schema-enum-label\">Allowed values:</span>\n <span class=\"ce-schema-enum-list\">${chips}</span>\n </div>`;\n}\n\nfunction resolveEnumValues(type: ContractTypeNode, ctx: RenderContext): string[] | null {\n if (type.kind === 'enum') return type.values;\n if (type.kind === 'ref') {\n const entry = ctx.models?.get(type.name);\n if (entry?.model.type?.kind === 'enum') return entry.model.type.values;\n }\n return null;\n}\n\nfunction renderTypeLabel(type: ContractTypeNode): string {\n switch (type.kind) {\n case 'scalar':\n return `<span class=\"ce-schema-type\">${escapeHtml(type.name)}</span>`;\n case 'enum':\n return `<span class=\"ce-schema-type\">enum</span>`;\n case 'literal':\n return `<span class=\"ce-schema-type\">literal</span>`;\n case 'ref':\n return `<a class=\"ce-schema-type ce-ref\" href=\"#model-${encodeURIComponent(type.name)}\">${escapeHtml(type.name)}</a>`;\n case 'array':\n return `<span class=\"ce-schema-type\">array<${innerTypeName(type.item)}></span>`;\n case 'tuple':\n return `<span class=\"ce-schema-type\">tuple</span>`;\n case 'record':\n return `<span class=\"ce-schema-type\">record</span>`;\n case 'union':\n return `<span class=\"ce-schema-type\">union</span>`;\n case 'discriminatedUnion':\n return `<span class=\"ce-schema-type\">union</span>`;\n case 'intersection': {\n const parts = type.members.map(intersectionMemberLabel);\n return `<span class=\"ce-schema-type\">${parts.join(' & ')}</span>`;\n }\n case 'lazy':\n return `<span class=\"ce-schema-type\">lazy</span>`;\n case 'inlineObject':\n return `<span class=\"ce-schema-type\">object</span>`;\n }\n}\n\nfunction innerTypeName(type: ContractTypeNode): string {\n if (type.kind === 'scalar') return escapeHtml(type.name);\n if (type.kind === 'ref') return escapeHtml(type.name);\n return type.kind;\n}\n\nfunction intersectionMemberLabel(type: ContractTypeNode): string {\n if (type.kind === 'ref') return escapeHtml(type.name);\n if (type.kind === 'inlineObject') return '{ … }';\n if (type.kind === 'scalar') return escapeHtml(type.name);\n return type.kind;\n}\n\nfunction renderConstraintChips(type: ContractTypeNode): string {\n if (type.kind !== 'scalar') return '';\n const chips = formatConstraints(type);\n if (chips.length === 0) return '';\n return `<div class=\"ce-schema-chips\">${chips.map(c => `<span class=\"ce-schema-chip\">${escapeHtml(c)}</span>`).join('')}</div>`;\n}\n\nfunction formatConstraints(s: ScalarTypeNode): string[] {\n const chips: string[] = [];\n const isString = STRING_SCALARS.has(s.name);\n const unit = isString ? ' characters' : '';\n if (s.min !== undefined) chips.push(`>= ${s.min}${unit}`);\n if (s.max !== undefined) chips.push(`<= ${s.max}${unit}`);\n if (s.len !== undefined) chips.push(`= ${s.len}${unit}`);\n if (s.format !== undefined) chips.push(`format: ${s.format}`);\n if (s.regex !== undefined) chips.push(`matches /${s.regex}/`);\n return chips;\n}\n","import type { ScalarTypeNode } from '@contractkit/core';\n\n/** Formats the constraint parameters on a scalar type (min/max/len/regex/format) as a parenthesized suffix. */\nexport function constraintSummary(scalar: ScalarTypeNode): string {\n const parts: string[] = [];\n if (scalar.min !== undefined) parts.push(`min=${scalar.min}`);\n if (scalar.max !== undefined) parts.push(`max=${scalar.max}`);\n if (scalar.len !== undefined) parts.push(`len=${scalar.len}`);\n if (scalar.regex !== undefined) parts.push(`regex=/${scalar.regex}/`);\n if (scalar.format !== undefined) parts.push(`format=${scalar.format}`);\n return parts.length > 0 ? `(${parts.join(', ')})` : '';\n}\n","import type { FieldNode } from '@contractkit/core';\nimport { escapeHtml, html, raw } from './html.js';\nimport { renderMarkdown } from './markdown.js';\nimport { renderType } from './render-type.js';\nimport type { RenderContext, ResolvedModel } from './types.js';\n\n/** Anchor id for a model, used by `<a href=\"#model-Name\">` ref links. */\nexport function modelAnchor(name: string): string {\n return `model-${encodeURIComponent(name)}`;\n}\n\n/** Renders a model card: header, badges, inheritance line, fields (or type alias). */\nexport function renderModel({ filePath, model }: ResolvedModel, ctx: RenderContext = {}): string {\n const badges: string[] = [];\n if (model.deprecated) badges.push(badge('deprecated', 'deprecated'));\n if (model.mode) badges.push(badge(`mode=${model.mode}`, 'mode'));\n if (model.inputCase) badges.push(badge(`format(input=${model.inputCase})`, 'format'));\n if (model.outputCase) badges.push(badge(`format(output=${model.outputCase})`, 'format'));\n\n // Suppress re-expansion of the model itself when its fields contain a self-reference.\n const fieldCtx: RenderContext = {\n ...ctx,\n visited: new Set([...(ctx.visited ?? []), model.name]),\n };\n\n const inheritance =\n model.bases && model.bases.length > 0\n ? `<p class=\"ce-extends\">extends ${model.bases\n .map(b => `<a class=\"ce-ref\" href=\"#model-${encodeURIComponent(b)}\" data-open-model=\"${escapeHtml(b)}\">${escapeHtml(b)}</a>`)\n .join(', ')}</p>`\n : '';\n\n const description = model.description\n ? `<div class=\"ce-description ce-markdown\">${renderMarkdown(model.description)}</div>`\n : '';\n\n const body = model.type\n ? `<div class=\"ce-type-alias\">= ${renderType(model.type, fieldCtx)}</div>`\n : renderFieldRows(model.fields, fieldCtx);\n\n return html`<section id=\"${raw(modelAnchor(model.name))}\" class=\"ce-card ce-model-card\">\n <header class=\"ce-card-header\">\n <h2>\n ${model.name}\n ${raw(badges.join(''))}\n <button\n class=\"ce-jump\"\n data-jump-file=\"${filePath}\"\n data-jump-line=\"${model.loc.line}\"\n title=\"Open in editor\"\n type=\"button\"\n >\n ↗\n </button>\n </h2>\n </header>\n ${raw(inheritance)}\n ${raw(description)}\n ${raw(body)}\n </section>`;\n}\n\n/** Renders a tabular view of fields with name/type/modifiers/default/description. Exported for reuse by inline-object rendering. */\nexport function renderFieldRows(fields: FieldNode[], ctx: RenderContext = {}): string {\n if (fields.length === 0) return `<p class=\"ce-empty\">No fields.</p>`;\n\n const rows = fields.map(f => {\n const modifiers: string[] = [];\n if (f.optional) modifiers.push('optional');\n if (f.nullable) modifiers.push('nullable');\n if (f.visibility === 'readonly') modifiers.push('readonly');\n if (f.visibility === 'writeonly') modifiers.push('writeonly');\n if (f.deprecated) modifiers.push('deprecated');\n if (f.override) modifiers.push('override');\n\n const modifierHtml = modifiers.map(m => badge(m, m)).join('');\n const defaultHtml =\n f.default !== undefined\n ? html`<code class=\"ce-default\">= ${String(f.default)}</code>`\n : '';\n const descHtml = f.description ? `<div class=\"ce-field-desc ce-markdown\">${renderMarkdown(f.description)}</div>` : '';\n\n return `<tr>\n <td class=\"ce-field-name\"><code>${escapeHtml(f.name)}</code>${modifierHtml}</td>\n <td class=\"ce-field-type\">${renderType(f.type, ctx)}${defaultHtml}${descHtml}</td>\n </tr>`;\n });\n\n return `<table class=\"ce-fields\"><tbody>${rows.join('')}</tbody></table>`;\n}\n\nfunction badge(label: string, kind: string): string {\n return `<span class=\"ce-badge ce-badge-${escapeHtml(kind)}\">${escapeHtml(label)}</span>`;\n}\n","import type { ContractTypeNode } from '@contractkit/core';\nimport { escapeHtml } from './html.js';\nimport { constraintSummary } from './constraints.js';\nimport { renderFieldRows } from './render-model.js';\nimport type { RenderContext } from './types.js';\n\nconst DEFAULT_MAX_DEPTH = 4;\n\n/**\n * Recursively renders a ContractTypeNode as inline HTML.\n *\n * When `ctx.models` is provided, `ref` types render as collapsible `<details>` containing the\n * referenced model's fields. `ctx.visited` (set internally) prevents infinite recursion on\n * self-referential models. Past `ctx.maxDepth` (default 4) refs collapse to plain links.\n */\nexport function renderType(type: ContractTypeNode, ctx: RenderContext = {}): string {\n switch (type.kind) {\n case 'scalar': {\n const constraint = constraintSummary(type);\n const constraintHtml = constraint\n ? `<span class=\"ce-type-constraint\">${escapeHtml(constraint)}</span>`\n : '';\n return `<span class=\"ce-type-scalar\">${escapeHtml(type.name)}${constraintHtml}</span>`;\n }\n case 'enum':\n return `<span class=\"ce-type-enum\">enum(${type.values.map(escapeHtml).join(', ')})</span>`;\n case 'literal':\n return `<span class=\"ce-type-literal\">${escapeHtml(\n typeof type.value === 'string' ? `\"${type.value}\"` : String(type.value),\n )}</span>`;\n case 'ref':\n return renderRef(type.name, ctx);\n case 'array':\n return `${tok('Array<')}${renderType(type.item, ctx)}${tok('>')}`;\n case 'tuple':\n return `${tok('[')}${type.items.map(t => renderType(t, ctx)).join(tok(', '))}${tok(']')}`;\n case 'record':\n return `${tok('Record<')}${renderType(type.key, ctx)}${tok(', ')}${renderType(type.value, ctx)}${tok('>')}`;\n case 'union':\n return type.members.map(m => renderType(m, ctx)).join(tok(' | '));\n case 'discriminatedUnion':\n return (\n `${tok(`Union by ${escapeHtml(type.discriminator)}:`)} ` +\n type.members.map(m => renderType(m, ctx)).join(tok(' | '))\n );\n case 'intersection':\n return type.members.map(m => renderType(m, ctx)).join(tok(' & '));\n case 'lazy':\n return `${tok('Lazy<')}${renderType(type.inner, ctx)}${tok('>')}`;\n case 'inlineObject':\n return `<details class=\"ce-inline-object\"><summary>${tok('{ … }')}</summary>${renderFieldRows(type.fields, ctx)}</details>`;\n }\n}\n\nfunction renderRef(name: string, ctx: RenderContext): string {\n const encName = encodeURIComponent(name);\n const safeName = escapeHtml(name);\n const entry = ctx.models?.get(name);\n const visited = ctx.visited ?? new Set<string>();\n const depth = ctx.depth ?? 0;\n const maxDepth = ctx.maxDepth ?? DEFAULT_MAX_DEPTH;\n\n if (!entry) {\n // Unknown model — render as a link that lets the host navigate to the dedicated page.\n return `<a class=\"ce-ref\" href=\"#model-${encName}\">${safeName}</a>`;\n }\n if (visited.has(name)) {\n return `<span class=\"ce-ref ce-ref-cycle\" title=\"recursive reference\">${safeName} ↺</span>`;\n }\n\n const model = entry.model;\n const jumpAttrs = `data-jump-file=\"${escapeHtml(entry.filePath)}\" data-jump-line=\"${model.loc.line}\"`;\n\n if (depth >= maxDepth) {\n return `<a class=\"ce-ref\" href=\"#model-${encName}\" ${jumpAttrs} title=\"Jump to source\">${safeName}</a>`;\n }\n\n const nextCtx: RenderContext = {\n models: ctx.models,\n visited: new Set([...visited, name]),\n maxDepth,\n depth: depth + 1,\n };\n\n const bases =\n model.bases && model.bases.length > 0\n ? `<p class=\"ce-extends\">extends ${model.bases\n .map(b => renderRef(b, nextCtx))\n .join(', ')}</p>`\n : '';\n\n const body = model.type\n ? `<div class=\"ce-type-alias\">= ${renderType(model.type, nextCtx)}</div>`\n : renderFieldRows(model.fields, nextCtx);\n\n const openButton = `<button class=\"ce-ref-open\" type=\"button\" ${jumpAttrs} title=\"Jump to source\">↗</button>`;\n\n return `<details class=\"ce-ref-expand\">\n <summary><span class=\"ce-ref-name\">${safeName}</span>${openButton}</summary>\n <div class=\"ce-ref-body\">${bases}${body}</div>\n </details>`;\n}\n\n/** Internal: render a structural separator/keyword. Caller is responsible for escaping `text`. */\nfunction tok(text: string): string {\n return `<span class=\"ce-type-token\">${text}</span>`;\n}\n","import type { OpParamNode, ParamSource } from '@contractkit/core';\nimport { escapeHtml } from './html.js';\nimport { buildSampleJson } from './render-code-samples.js';\nimport type { RenderContext, ResolvedOperation } from './types.js';\nimport { operationAnchor } from './render-operation.js';\n\n/**\n * Renders an interactive \"Try it\" form for an operation. The form collects path params, query\n * params, headers, and a JSON body, then dispatches via the host (extension or page script) on\n * submit. The host listens for `data-tryit-action=\"send\"` clicks via event delegation.\n *\n * Inputs are pre-filled with realistic faker-generated samples derived from the schema so the\n * user can hit Send immediately instead of hand-crafting a payload. Pre-fills are\n * deterministic (seeded by operation identity) so re-renders don't flicker the values.\n */\nexport function renderTryIt(op: ResolvedOperation, baseUrl: string, ctx: RenderContext = {}): string {\n const id = operationAnchor(op);\n const pathParams = extractParams(op.routeParams);\n const queryParams = extractParams(op.op.query);\n const headerParams = extractParams(op.op.headers);\n const jsonBody = op.op.request?.bodies.find(\n b => b.contentType === 'application/json' || b.contentType.endsWith('+json'),\n );\n const bodySeed = `${op.method}:${op.routePath}:request-body`;\n const bodyPrefill = jsonBody\n ? JSON.stringify(buildSampleJson(jsonBody.bodyType, ctx, bodySeed, 'readonly'), null, 2)\n : '';\n\n return `<details class=\"ce-tryit\" data-tryit-id=\"${escapeHtml(id)}\">\n <summary>Try it</summary>\n <form class=\"ce-tryit-form\" onsubmit=\"return false;\">\n <label class=\"ce-tryit-row\">\n <span class=\"ce-tryit-label\">Base URL</span>\n <input type=\"text\" name=\"baseUrl\" value=\"${escapeHtml(baseUrl)}\" placeholder=\"https://api.example.com\" />\n </label>\n ${renderInputSection('Path params', 'path', pathParams, ctx, op)}\n ${renderInputSection('Query', 'query', queryParams, ctx, op)}\n ${renderInputSection('Headers', 'header', headerParams, ctx, op)}\n ${\n jsonBody\n ? `<label class=\"ce-tryit-row ce-tryit-col\">\n <span class=\"ce-tryit-label\">Body (JSON)</span>\n <textarea name=\"body\" rows=\"8\" placeholder=\"{}\">${escapeHtml(bodyPrefill)}</textarea>\n </label>`\n : ''\n }\n <div class=\"ce-tryit-actions\">\n <button type=\"button\" class=\"ce-tryit-send\" data-tryit-action=\"send\" data-tryit-target=\"${escapeHtml(id)}\">\n Send ${escapeHtml(op.method.toUpperCase())} ${escapeHtml(op.routePath)}\n </button>\n </div>\n <div class=\"ce-tryit-response\" data-tryit-response=\"${escapeHtml(id)}\"></div>\n </form>\n </details>`;\n}\n\nfunction extractParams(source: ParamSource | undefined): OpParamNode[] {\n if (!source || source.kind !== 'params') return [];\n return source.nodes;\n}\n\nfunction renderInputSection(\n label: string,\n scope: 'path' | 'query' | 'header',\n params: OpParamNode[],\n ctx: RenderContext,\n op: ResolvedOperation,\n): string {\n if (params.length === 0) return '';\n const rows = params\n .map(p => {\n const prefill = paramPrefill(p, ctx, op, scope);\n return `<label class=\"ce-tryit-row\">\n <span class=\"ce-tryit-label\"><code>${escapeHtml(p.name)}</code>${p.optional ? '' : ' *'}</span>\n <input type=\"text\"\n name=\"${scope}.${escapeHtml(p.name)}\"\n placeholder=\"${escapeHtml(typeHint(p))}\"\n value=\"${escapeHtml(prefill)}\" />\n </label>`;\n })\n .join('');\n return `<fieldset class=\"ce-tryit-section\"><legend>${escapeHtml(label)}</legend>${rows}</fieldset>`;\n}\n\nfunction paramPrefill(\n p: OpParamNode,\n ctx: RenderContext,\n op: ResolvedOperation,\n scope: 'path' | 'query' | 'header',\n): string {\n // Explicit defaults always win.\n if (p.default !== undefined) return String(p.default);\n // Generate a realistic value from the schema. Stringify primitives directly; for objects\n // (rare for params) fall back to a JSON dump.\n const seed = `${op.method}:${op.routePath}:${scope}:${p.name}`;\n const sample = buildSampleJson(p.type, ctx, seed, 'readonly');\n if (sample === null || sample === undefined) return '';\n if (typeof sample === 'object') return JSON.stringify(sample);\n return String(sample);\n}\n\nfunction typeHint(p: OpParamNode): string {\n if (p.type.kind === 'scalar') return p.type.name;\n return p.type.kind;\n}\n","import type {\n OpParamNode,\n OpRequestBodyNode,\n OpResponseHeaderNode,\n OpResponseNode,\n ParamSource,\n SecurityNode,\n} from '@contractkit/core';\nimport { escapeHtml, html, raw } from './html.js';\nimport { renderMarkdown } from './markdown.js';\nimport { renderCodeSamples } from './render-code-samples.js';\nimport { renderSchemaTree } from './render-schema.js';\nimport { renderTryIt } from './render-tryit.js';\nimport { renderType } from './render-type.js';\nimport type { RenderContext, ResolvedOperation } from './types.js';\n\n/** Anchor id for an operation. Stable across renders so the sidebar can deep-link to it. */\nexport function operationAnchor(op: ResolvedOperation): string {\n const suffix = op.op.sdk ?? op.op.name ?? '';\n const slug = `${op.method}-${op.routePath}-${suffix}`.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');\n return `op-${slug}`;\n}\n\n/** Options for {@link renderOperation}. */\nexport interface RenderOperationOptions {\n /** Base URL pre-filled into the Try-it form. Empty string when no base is configured. Omit to hide the Try-it form. */\n tryItBaseUrl?: string;\n /** Render context used to inline `ref` types as collapsible model expansions. */\n ctx?: RenderContext;\n}\n\n/**\n * Renders an operation card with header (method, path, badges, jump-to-source), description,\n * service/signature lines, parameter tables (path/query/headers), request body, responses,\n * plugin extensions, and an optional Try-it form when `options.tryItBaseUrl` is defined.\n */\nexport function renderOperation(op: ResolvedOperation, options: RenderOperationOptions = {}): string {\n const ctx = options.ctx ?? {};\n const badges: string[] = [];\n for (const m of op.effectiveModifiers) {\n badges.push(badge(m, m));\n }\n const securityBadge = renderSecurityBadge(op.effectiveSecurity);\n if (securityBadge) badges.push(securityBadge);\n\n const description = op.op.description\n ? `<div class=\"ce-description ce-markdown\">${renderMarkdown(op.op.description)}</div>`\n : '';\n const service = op.op.service ? html`<p class=\"ce-meta\"><strong>service:</strong> <code>${op.op.service}</code></p>` : '';\n const signature = op.op.signature\n ? html`<p class=\"ce-meta\"><strong>signature:</strong> <code>${op.op.signature}</code>${\n op.op.signatureDescription ? raw(` — ${escapeHtml(op.op.signatureDescription)}`) : ''\n }</p>`\n : '';\n\n const pathParams = renderParamSection('Path Parameters', op.routeParams, ctx);\n const queryParams = renderParamSection('Query Parameters', op.op.query, ctx);\n const headerParams = renderParamSection('Request Headers', op.op.headers, ctx);\n const requestBody = renderRequest(op.op.request, ctx);\n const responses = renderResponses(op.op.responses, ctx);\n const pluginExt = renderPluginExtensions(op.op.pluginExtensions);\n const tryIt = options.tryItBaseUrl !== undefined ? renderTryIt(op, options.tryItBaseUrl, ctx) : '';\n const codeSamples = renderCodeSamples(op, options.tryItBaseUrl ?? '', ctx);\n\n const title = op.op.name ?? op.op.sdk ?? `${op.method.toUpperCase()} ${op.routePath}`;\n\n return html`<section id=\"${raw(operationAnchor(op))}\" class=\"ce-card ce-op-card\">\n <header class=\"ce-card-header\">\n <div class=\"ce-op-title-row\">\n <h1 class=\"ce-op-title\">${title}</h1>\n <button\n class=\"ce-jump\"\n data-jump-file=\"${op.filePath}\"\n data-jump-line=\"${op.op.loc.line}\"\n title=\"Open in editor\"\n type=\"button\"\n >\n ↗\n </button>\n </div>\n <div class=\"ce-endpoint-row\">\n <span class=\"ce-method ce-method-${raw(op.method)}\">${op.method.toUpperCase()}</span>\n <code class=\"ce-path\">${op.routePath}</code>\n ${raw(badges.length > 0 ? `<span class=\"ce-badge-row\">${badges.join('')}</span>` : '')}\n </div>\n </header>\n <div class=\"ce-op-body\">\n <div class=\"ce-op-main\">\n ${raw(description)}\n ${raw(service)}\n ${raw(signature)}\n ${raw(pathParams)}\n ${raw(queryParams)}\n ${raw(headerParams)}\n ${raw(requestBody)}\n ${raw(responses)}\n ${raw(pluginExt)}\n </div>\n <div class=\"ce-op-resize\" data-resize-handle role=\"separator\" aria-orientation=\"vertical\" aria-label=\"Resize columns\" tabindex=\"0\"></div>\n <aside class=\"ce-op-rail\">\n ${raw(tryIt)}\n ${raw(codeSamples)}\n </aside>\n </div>\n </section>`;\n}\n\nfunction renderSecurityBadge(security: SecurityNode | undefined): string {\n if (security === undefined) return badge('security: secured', 'security-secured');\n if (security === 'none') return badge('security: none', 'security-none');\n if (security.policy === false) return badge('security: no policy', 'security-no-policy');\n if (typeof security.policy === 'string') return badge(`policy: ${security.policy}`, 'security-policy');\n return '';\n}\n\nfunction renderParamSection(label: string, source: ParamSource | undefined, ctx: RenderContext): string {\n if (!source) return '';\n if (source.kind === 'params') {\n if (source.nodes.length === 0) return '';\n return html`<section class=\"ce-subsection\">\n <h3>${label}</h3>\n ${raw(renderParamTable(source.nodes, ctx))}\n </section>`;\n }\n if (source.kind === 'ref') {\n return html`<section class=\"ce-subsection\">\n <h3>${label}</h3>\n ${raw(renderSchemaTree({ kind: 'ref', name: source.name }, ctx, { exclude: 'readonly' }))}\n </section>`;\n }\n return html`<section class=\"ce-subsection\">\n <h3>${label}</h3>\n ${raw(renderSchemaTree(source.node, ctx, { exclude: 'readonly' }))}\n </section>`;\n}\n\nfunction renderParamTable(params: OpParamNode[], ctx: RenderContext): string {\n const rows = params.map(p => {\n const modifiers: string[] = [];\n if (p.optional) modifiers.push('optional');\n if (p.nullable) modifiers.push('nullable');\n const modifierHtml = modifiers.map(m => badge(m, m)).join('');\n const defaultHtml = p.default !== undefined ? html`<code class=\"ce-default\">= ${String(p.default)}</code>` : '';\n const descHtml = p.description ? `<div class=\"ce-field-desc ce-markdown\">${renderMarkdown(p.description)}</div>` : '';\n return `<tr>\n <td class=\"ce-field-name\"><code>${escapeHtml(p.name)}</code>${modifierHtml}</td>\n <td class=\"ce-field-type\">${renderType(p.type, ctx)}${defaultHtml}${descHtml}</td>\n </tr>`;\n });\n return `<table class=\"ce-fields\"><tbody>${rows.join('')}</tbody></table>`;\n}\n\nfunction renderRequest(request: { bodies: OpRequestBodyNode[] } | undefined, ctx: RenderContext): string {\n if (!request || request.bodies.length === 0) return '';\n const blocks = request.bodies.map(body => {\n return `<div class=\"ce-body-block\">\n <div class=\"ce-body-header\">\n <span class=\"ce-body-title\">Body</span>\n <span class=\"ce-content-type\"><code>${escapeHtml(body.contentType)}</code></span>\n </div>\n ${renderSchemaTree(body.bodyType, ctx, { exclude: 'readonly' })}\n </div>`;\n });\n return `<section class=\"ce-subsection\"><h3>Request</h3>${blocks.join('')}</section>`;\n}\n\nfunction renderResponses(responses: OpResponseNode[], ctx: RenderContext): string {\n if (responses.length === 0) return '';\n // Only show the at-a-glance status pill row when there's more than one response — for a\n // single response the row would just duplicate the response block header right below it.\n const summary = responses.length > 1\n ? responses\n .map(r => {\n const statusClass = `ce-status-${Math.floor(r.statusCode / 100)}xx`;\n return `<a class=\"ce-status ${statusClass}\" href=\"#response-${r.statusCode}\">${r.statusCode}</a>`;\n })\n .join('')\n : '';\n const blocks = responses.map(r => renderResponse(r, ctx));\n return `<section class=\"ce-subsection\">\n <h3>Responses</h3>\n ${summary ? `<div class=\"ce-status-summary\">${summary}</div>` : ''}\n ${blocks.join('')}\n </section>`;\n}\n\nfunction renderResponse(response: OpResponseNode, ctx: RenderContext): string {\n const statusClass = `ce-status-${Math.floor(response.statusCode / 100)}xx`;\n const contentTypeHtml = response.contentType\n ? `<span class=\"ce-content-type\"><code>${escapeHtml(response.contentType)}</code></span>`\n : '';\n const bodyHtml = response.bodyType\n ? renderSchemaTree(response.bodyType, ctx, { exclude: 'writeonly' })\n : '<p class=\"ce-empty\">No response body.</p>';\n const headersHtml = renderResponseHeaders(response.headers, ctx);\n return `<div class=\"ce-response-block\" id=\"response-${response.statusCode}\">\n <div class=\"ce-body-header\">\n <span class=\"ce-status ${statusClass}\">${response.statusCode}</span>\n ${contentTypeHtml}\n </div>\n ${bodyHtml}\n ${headersHtml}\n </div>`;\n}\n\nfunction renderResponseHeaders(headers: OpResponseHeaderNode[] | undefined, ctx: RenderContext): string {\n if (!headers || headers.length === 0) return '';\n const rows = headers.map(h => {\n const optional = h.optional ? badge('optional', 'optional') : '';\n const desc = h.description ? `<div class=\"ce-field-desc ce-markdown\">${renderMarkdown(h.description)}</div>` : '';\n return `<tr>\n <td class=\"ce-field-name\"><code>${escapeHtml(h.name)}</code>${optional}</td>\n <td class=\"ce-field-type\">${renderType(h.type, ctx)}${desc}</td>\n </tr>`;\n });\n return `<h5>Headers</h5><table class=\"ce-fields\"><tbody>${rows.join('')}</tbody></table>`;\n}\n\nfunction renderPluginExtensions(ext: Record<string, unknown> | undefined): string {\n if (!ext || Object.keys(ext).length === 0) return '';\n const json = JSON.stringify(ext, null, 2);\n return html`<section class=\"ce-subsection\">\n <h3>Plugin extensions</h3>\n <details><summary>Show JSON</summary><pre class=\"ce-code\">${json}</pre></details>\n </section>`;\n}\n\nfunction badge(label: string, kind: string): string {\n return `<span class=\"ce-badge ce-badge-${escapeHtml(kind)}\">${escapeHtml(label)}</span>`;\n}\n","import { escapeHtml, html, raw } from './html.js';\nimport { operationAnchor, renderOperation } from './render-operation.js';\nimport { modelAnchor, renderModel } from './render-model.js';\nimport type { PreviewData, ResolvedOperation } from './types.js';\n\nconst METHOD_ORDER = ['get', 'post', 'put', 'patch', 'delete'] as const;\n\nconst SIDEBAR_MARKER_SVG =\n '<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">' +\n '<circle cx=\"8\" cy=\"8\" r=\"6.25\" />' +\n '<circle cx=\"8\" cy=\"8\" r=\"3.25\" />' +\n '<circle cx=\"8\" cy=\"8\" r=\"0.75\" fill=\"currentColor\" />' +\n '</svg>';\n\n/**\n * Renders the complete API explorer as an HTML fragment. Drop the result into a container\n * element (e.g. `root.innerHTML = renderApp(data)`) and pair with the package's `style.css`.\n */\nexport function renderApp(data: PreviewData): string {\n const warnings = renderWarnings(data.warnings);\n const overview = renderOverview(data);\n const sidebar = renderSidebar(data);\n const operations = sortOperations(data.operations);\n const opsHtml = operations.map(op => renderOperation(op)).join('');\n const modelsHtml = [...data.models]\n .sort((a, b) => a.model.name.localeCompare(b.model.name))\n .map(m => renderModel(m))\n .join('');\n\n return html`<div class=\"ce-layout\">\n ${raw(sidebar)}\n <main class=\"ce-detail\">\n ${raw(warnings)}\n ${raw(overview)}\n ${operations.length > 0 ? raw(`<section class=\"ce-section\"><h1 id=\"endpoints\">Endpoints</h1>${opsHtml}</section>`) : ''}\n ${data.models.length > 0 ? raw(`<section class=\"ce-section\"><h1 id=\"models\">Models</h1>${modelsHtml}</section>`) : ''}\n </main>\n </div>`;\n}\n\nfunction renderOverview(data: PreviewData): string {\n const { configMeta } = data;\n const description = configMeta.description\n ? html`<p class=\"ce-description\">${configMeta.description}</p>`\n : '';\n const servers =\n configMeta.servers && configMeta.servers.length > 0\n ? `<section class=\"ce-subsection\"><h3>Servers</h3><ul>${configMeta.servers\n .map(s => `<li><code>${escapeHtml(s.url)}</code>${s.description ? ` — ${escapeHtml(s.description)}` : ''}</li>`)\n .join('')}</ul></section>`\n : '';\n return html`<section id=\"overview\" class=\"ce-section ce-overview\">\n <h1>${configMeta.title}</h1>\n <p class=\"ce-version\">v${configMeta.version}</p>\n ${raw(description)}\n ${raw(servers)}\n </section>`;\n}\n\nfunction renderSidebar(data: PreviewData): string {\n const operations = sortOperations(data.operations);\n const groups = groupBy(operations, op => op.fileGroup);\n const groupKeys = [...groups.keys()].sort();\n\n const endpointGroups = groupKeys\n .map(key => {\n const items = groups\n .get(key)!\n .map(op => {\n const name = op.op.name ?? op.op.sdk ?? op.routePath;\n return `<li><a class=\"ce-sidebar-row\" href=\"#${escapeHtml(operationAnchor(op))}\">\n <span class=\"ce-sidebar-marker\" aria-hidden=\"true\">${SIDEBAR_MARKER_SVG}</span>\n <span class=\"ce-sidebar-name\">${escapeHtml(name)}</span>\n <span class=\"ce-sidebar-method ce-method-text-${escapeHtml(op.method)}\">${escapeHtml(op.method.toUpperCase())}</span>\n </a></li>`;\n })\n .join('');\n return `<details open class=\"ce-sidebar-group\">\n <summary>${escapeHtml(key)}</summary>\n <ul>${items}</ul>\n </details>`;\n })\n .join('');\n\n const modelLinks = [...data.models]\n .sort((a, b) => a.model.name.localeCompare(b.model.name))\n .map(m => `<li><a href=\"#${escapeHtml(modelAnchor(m.model.name))}\">${escapeHtml(m.model.name)}</a></li>`)\n .join('');\n\n return `<aside class=\"ce-sidebar\">\n <nav>\n <section>\n <h4><a href=\"#overview\">Overview</a></h4>\n </section>\n ${operations.length > 0 ? `<section><h4><a href=\"#endpoints\">Endpoints</a></h4>${endpointGroups}</section>` : ''}\n ${data.models.length > 0 ? `<section><h4><a href=\"#models\">Models</a></h4><ul class=\"ce-model-list\">${modelLinks}</ul></section>` : ''}\n </nav>\n </aside>`;\n}\n\nfunction renderWarnings(warnings: PreviewData['warnings']): string {\n if (warnings.length === 0) return '';\n const items = warnings\n .map(w => `<li>${escapeHtml(w.message)}${w.file ? ` <code>${escapeHtml(w.file)}${w.line ? `:${w.line}` : ''}</code>` : ''}</li>`)\n .join('');\n return `<div class=\"ce-warnings\"><strong>${warnings.length} warning${warnings.length === 1 ? '' : 's'}</strong><ul>${items}</ul></div>`;\n}\n\nfunction sortOperations(operations: ResolvedOperation[]): ResolvedOperation[] {\n return [...operations].sort((a, b) => {\n const groupCmp = a.fileGroup.localeCompare(b.fileGroup);\n if (groupCmp !== 0) return groupCmp;\n const pathCmp = a.routePath.localeCompare(b.routePath);\n if (pathCmp !== 0) return pathCmp;\n return METHOD_ORDER.indexOf(a.method) - METHOD_ORDER.indexOf(b.method);\n });\n}\n\nfunction groupBy<T, K>(items: T[], keyFn: (item: T) => K): Map<K, T[]> {\n const out = new Map<K, T[]>();\n for (const item of items) {\n const key = keyFn(item);\n const arr = out.get(key);\n if (arr) arr.push(item);\n else out.set(key, [item]);\n }\n return out;\n}\n","import { escapeHtml, html, raw } from './html.js';\nimport { renderMarkdown } from './markdown.js';\nimport { operationAnchor, renderOperation } from './render-operation.js';\nimport { modelAnchor, renderModel } from './render-model.js';\nimport type { PreviewData, PreviewServer, RenderContext, ResolvedModel, ResolvedOperation } from './types.js';\n\n/** Discriminated union identifying which item the detail page should render. */\nexport type ItemSelection =\n | { kind: 'operation'; id: string }\n | { kind: 'model'; name: string }\n | { kind: 'overview' }\n | { kind: 'file'; path: string };\n\n/**\n * Renders a single-item detail page intended for a focused webview. Wraps `renderOperation` /\n * `renderModel` / a file page (all operations + models declared in one source file) / an\n * Overview block in a minimal shell — no sidebar (the consumer provides navigation via a\n * native tree view).\n */\n/** Options for {@link renderItemPage}. */\nexport interface RenderItemOptions {\n /** Base URL surfaced to the operation's Try-it form. Pass an empty string to render the form with no default; omit to hide the form. */\n tryItBaseUrl?: string;\n}\n\nexport function renderItemPage(data: PreviewData, selection: ItemSelection, options: RenderItemOptions = {}): string {\n const body = renderBody(data, selection, options);\n return html`<div class=\"ce-detail ce-detail-single\">${raw(body)}</div>`;\n}\n\nfunction renderBody(data: PreviewData, selection: ItemSelection, options: RenderItemOptions): string {\n if (selection.kind === 'overview') return renderOverviewPage(data);\n\n const ctx: RenderContext = { models: buildModelMap(data) };\n\n if (selection.kind === 'operation') {\n const op = data.operations.find(o => operationAnchor(o) === selection.id);\n if (!op) return renderMissing(`Operation \\`${selection.id}\\` is not in the current workspace.`);\n return renderOperation(op, { tryItBaseUrl: options.tryItBaseUrl, ctx });\n }\n\n if (selection.kind === 'file') {\n return renderFilePage(data, selection.path, options, ctx);\n }\n\n const model = data.models.find(m => m.model.name === selection.name);\n if (!model) {\n return renderMissing(\n `Model \\`${selection.name}\\` isn't defined in any indexed \\`.ck\\` file. ` +\n `It's referenced from another contract but not declared anywhere in the workspace — ` +\n `check that the file containing \\`contract ${selection.name}: { ... }\\` (or its type alias) ` +\n `is present and saved. ${data.models.length} model${data.models.length === 1 ? '' : 's'} loaded.`,\n );\n }\n return renderModel(model, ctx);\n}\n\n/**\n * Renders every operation and model declared in a single source file. Used by the live-preview\n * panel that follows the active editor — operations stack first, then models.\n */\nfunction renderFilePage(\n data: PreviewData,\n path: string,\n options: RenderItemOptions,\n ctx: RenderContext,\n): string {\n const ops = data.operations.filter(o => o.filePath === path);\n const models = data.models.filter(m => m.filePath === path);\n if (ops.length === 0 && models.length === 0) {\n return renderMissing(`No contracts or operations found in \\`${path}\\`.`);\n }\n const opsHtml = ops.map(o => renderOperation(o, { tryItBaseUrl: options.tryItBaseUrl, ctx })).join('');\n const modelsHtml = models.map(m => renderModel(m, ctx)).join('');\n const fileLabel = path.split('/').pop() ?? path;\n return html`<section class=\"ce-section\">\n <h1>${fileLabel}</h1>\n <p class=\"ce-version\"><code>${path}</code></p>\n ${raw(ops.length > 0 ? `<section class=\"ce-section\"><h1 id=\"endpoints\">Endpoints</h1>${opsHtml}</section>` : '')}\n ${raw(models.length > 0 ? `<section class=\"ce-section\"><h1 id=\"models\">Models</h1>${modelsHtml}</section>` : '')}\n </section>`;\n}\n\nfunction buildModelMap(data: PreviewData): Map<string, ResolvedModel> {\n const out = new Map<string, ResolvedModel>();\n for (const entry of data.models) out.set(entry.model.name, entry);\n return out;\n}\n\nfunction renderOverviewPage(data: PreviewData): string {\n const { configMeta } = data;\n const description = configMeta.description\n ? `<div class=\"ce-description ce-markdown\">${renderMarkdown(configMeta.description)}</div>`\n : '';\n const servers = renderServersList(configMeta.servers);\n const stats = `<dl class=\"ce-stats\">\n <dt>Endpoints</dt><dd>${data.operations.length}</dd>\n <dt>Models</dt><dd>${data.models.length}</dd>\n </dl>`;\n\n return html`<section id=\"overview\" class=\"ce-section ce-overview\">\n <h1>${configMeta.title}</h1>\n <p class=\"ce-version\">v${configMeta.version}</p>\n ${raw(description)}\n ${raw(stats)}\n ${raw(servers)}\n <p class=\"ce-hint\">Pick an endpoint or model from the API Explorer in the sidebar to see details.</p>\n </section>`;\n}\n\nfunction renderServersList(servers: PreviewServer[] | undefined): string {\n if (!servers || servers.length === 0) return '';\n const items = servers\n .map(\n s =>\n `<li><code>${escapeHtml(s.url)}</code>${\n s.description ? ` — ${escapeHtml(s.description)}` : ''\n }</li>`,\n )\n .join('');\n return `<section class=\"ce-subsection\"><h3>Servers</h3><ul>${items}</ul></section>`;\n}\n\nfunction renderMissing(message: string): string {\n return `<section class=\"ce-card ce-missing\"><p class=\"ce-empty\">${escapeHtml(message)}</p></section>`;\n}\n\n/** Stable ids used by tree-view consumers to refer to operations and models. */\nexport const operationId = operationAnchor;\nexport const modelId = (name: string): string => modelAnchor(name);\n\n/**\n * Returns every selectable item in `data` as a flat list with its stable id paired with the\n * full resolved entry. Useful for building a navigation tree or a flat picker.\n */\nexport function listSelections(data: PreviewData): Array<\n | { kind: 'operation'; id: string; operation: ResolvedOperation }\n | { kind: 'model'; name: string; model: ResolvedModel }\n> {\n return [\n ...data.operations.map(operation => ({ kind: 'operation' as const, id: operationId(operation), operation })),\n ...data.models.map(model => ({ kind: 'model' as const, name: model.model.name, model })),\n ];\n}\n"],"mappings":"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","names":["RAW","Symbol","raw","value","isRaw","escapeHtml","replace","renderValue","undefined","Array","isArray","map","join","String","html","strings","values","out","i","length","slug","toLowerCase","renderMarkdown","input","lines","replace","split","out","i","length","line","fence","exec","lang","buf","test","push","langAttr","escapeHtml","join","heading","level","renderInline","items","map","t","trim","next","text","s","_m","code","before","body","label","url","resolveEffectiveFields","faker","renderCodeSamples","op","baseUrl","ctx","curl","renderCurlSample","responseExample","renderResponseExample","cleanBase","replace","url","routePath","lines","push","method","toUpperCase","hasJsonResponse","responses","some","r","contentType","includes","jsonBody","request","bodies","find","b","endsWith","length","sample","buildSampleJson","bodyType","bodyJson","JSON","stringify","escapeHtml","join","primary","statusCode","undefined","faker","seed","hashString","jsonSample","Set","formatted","type","visited","fieldName","exclude","kind","scalarSample","value","values","helpers","arrayElement","len","number","int","min","max","Array","from","item","items","map","t","key","first","members","resolved","resolveEffectiveFields","modelIndexFromCtx","fields","out","f","visibility","name","inner","has","entry","models","get","next","model","s","datatype","boolean","fakerNumber","string","uuid","date","recent","days","toISOString","slice","internet","email","toLowerCase","fakerString","test","person","firstName","lastName","fullName","username","image","location","streetAddress","city","country","zipCode","state","company","commerce","productName","color","human","lorem","sentence","phone","password","alphanumeric","finance","currencyCode","slug","word","Number","amount","dec","latitude","toFixed","longitude","lo","toFiniteNumber","hi","Math","float","fractionDigits","fallback","isFinite","floor","n","Map","set","h","i","charCodeAt","resolveEffectiveFields","constraintSummary","scalar","parts","min","undefined","push","max","len","regex","format","length","join","modelAnchor","name","encodeURIComponent","renderModel","filePath","model","ctx","badges","deprecated","push","badge","mode","inputCase","outputCase","fieldCtx","visited","Set","inheritance","bases","length","map","b","escapeHtml","join","description","renderMarkdown","body","type","renderType","renderFieldRows","fields","html","raw","loc","line","rows","f","modifiers","optional","nullable","visibility","override","modifierHtml","m","defaultHtml","default","undefined","String","descHtml","label","kind","DEFAULT_MAX_DEPTH","renderType","type","ctx","kind","constraint","constraintSummary","constraintHtml","escapeHtml","name","values","map","join","value","String","renderRef","tok","item","items","t","key","members","m","discriminator","inner","renderFieldRows","fields","encName","encodeURIComponent","safeName","entry","models","get","visited","Set","depth","maxDepth","has","model","jumpAttrs","filePath","loc","line","nextCtx","bases","length","b","body","openButton","text","STRING_SCALARS","Set","renderSchemaTree","type","ctx","options","renderSchemaNode","kind","renderSchemaFields","fields","entry","models","get","name","visited","has","next","depth","resolved","resolveEffectiveFields","modelIndexFromCtx","length","fieldsHtml","unresolvedHtml","renderUnresolvedRefs","unresolved","model","renderType","item","renderUnion","out","Map","set","names","chips","map","n","encodeURIComponent","escapeHtml","join","isDiscriminated","label","discriminator","variants","members","m","renderVariant","undefined","member","info","extractVariantInfo","discBadge","discriminatorValue","body","findDiscriminatorValue","variantTypeName","f","find","field","value","String","values","visible","exclude","filter","visibility","renderSchemaField","required","optional","default","typeLabel","renderTypeLabel","renderConstraintChips","enumValues","renderEnumValues","desc","description","renderMarkdown","defaultHtml","requiredTag","nested","inner","includes","resolveEnumValues","v","innerTypeName","parts","intersectionMemberLabel","formatConstraints","c","s","isString","unit","min","push","max","len","format","regex","renderTryIt","op","baseUrl","ctx","id","operationAnchor","pathParams","extractParams","routeParams","queryParams","query","headerParams","headers","jsonBody","request","bodies","find","b","contentType","endsWith","bodySeed","method","routePath","bodyPrefill","JSON","stringify","buildSampleJson","bodyType","escapeHtml","renderInputSection","toUpperCase","source","kind","nodes","label","scope","params","length","rows","map","p","prefill","paramPrefill","name","optional","typeHint","join","default","undefined","String","seed","sample","type","operationAnchor","op","suffix","sdk","name","slug","method","routePath","toLowerCase","replace","renderOperation","options","ctx","badges","m","effectiveModifiers","push","badge","securityBadge","renderSecurityBadge","effectiveSecurity","description","renderMarkdown","service","html","signature","signatureDescription","raw","escapeHtml","pathParams","renderParamSection","routeParams","queryParams","query","headerParams","headers","requestBody","renderRequest","request","responses","renderResponses","pluginExt","renderPluginExtensions","pluginExtensions","tryIt","tryItBaseUrl","undefined","renderTryIt","codeSamples","renderCodeSamples","title","toUpperCase","filePath","loc","line","length","join","security","policy","label","source","kind","nodes","renderParamTable","renderSchemaTree","exclude","node","params","rows","map","p","modifiers","optional","nullable","modifierHtml","defaultHtml","default","String","descHtml","renderType","type","bodies","blocks","body","contentType","bodyType","summary","r","statusClass","Math","floor","statusCode","renderResponse","response","contentTypeHtml","bodyHtml","headersHtml","renderResponseHeaders","h","desc","ext","Object","keys","json","JSON","stringify","METHOD_ORDER","SIDEBAR_MARKER_SVG","renderApp","data","warnings","renderWarnings","overview","renderOverview","sidebar","renderSidebar","operations","sortOperations","opsHtml","map","op","renderOperation","join","modelsHtml","models","sort","a","b","model","name","localeCompare","m","renderModel","html","raw","length","configMeta","description","servers","s","escapeHtml","url","title","version","groups","groupBy","fileGroup","groupKeys","keys","endpointGroups","key","items","get","sdk","routePath","operationAnchor","method","toUpperCase","modelLinks","modelAnchor","w","message","file","line","groupCmp","pathCmp","indexOf","keyFn","out","Map","item","arr","push","set","renderItemPage","data","selection","options","body","renderBody","html","raw","kind","renderOverviewPage","ctx","models","buildModelMap","op","operations","find","o","operationAnchor","id","renderMissing","renderOperation","tryItBaseUrl","renderFilePage","path","model","m","name","length","renderModel","ops","filter","filePath","opsHtml","map","join","modelsHtml","fileLabel","split","pop","out","Map","entry","set","configMeta","description","renderMarkdown","servers","renderServersList","stats","title","version","items","s","escapeHtml","url","message","operationId","modelId","modelAnchor","listSelections","operation"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal block + inline Markdown renderer used for `description:` fields in models and operations.
|
|
3
|
+
* Supports paragraphs, headings, fenced code blocks, inline code, **bold**, *italic*, [links](url),
|
|
4
|
+
* unordered lists (`-` or `*` bullets), and ordered lists. Anything else passes through as text.
|
|
5
|
+
*
|
|
6
|
+
* Intentionally small (~80 LOC) so the webview bundle stays lean. For richer needs we can swap to
|
|
7
|
+
* `marked` later — the API matches.
|
|
8
|
+
*/
|
|
9
|
+
export declare function renderMarkdown(input: string): string;
|
|
10
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA2EpD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ContractTypeNode } from '@contractkit/core';
|
|
2
|
+
import type { RenderContext, ResolvedOperation } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Renders the right-rail code samples: a curl Request Sample and (when a 2xx JSON response is
|
|
5
|
+
* declared) a synthesized Response Example. Used by `renderOperation` on wide viewports — the
|
|
6
|
+
* card switches to a two-column grid and places this output in the right rail.
|
|
7
|
+
*/
|
|
8
|
+
export declare function renderCodeSamples(op: ResolvedOperation, baseUrl: string, ctx?: RenderContext): string;
|
|
9
|
+
type Excluded = 'readonly' | 'writeonly';
|
|
10
|
+
/**
|
|
11
|
+
* Public sample-data factory. Used by `renderTryIt` to pre-fill the request body textarea and
|
|
12
|
+
* the path/query/header inputs with realistic faker-generated values matching the schema.
|
|
13
|
+
*
|
|
14
|
+
* The `seed` makes output stable per-call: the same operation always pre-fills the same body
|
|
15
|
+
* so users don't see flicker on re-render. `exclude: 'readonly'` is correct for request bodies
|
|
16
|
+
* (readonly fields are server-controlled), `'writeonly'` for response examples.
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildSampleJson(type: ContractTypeNode, ctx: RenderContext, seed: string, exclude?: Excluded): unknown;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=render-code-samples.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-code-samples.d.ts","sourceRoot":"","sources":["../src/render-code-samples.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAA6B,MAAM,mBAAmB,CAAC;AAIrF,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEnE;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,aAAkB,GAAG,MAAM,CAQzG;AA8DD,KAAK,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;AA2EzC;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC3B,IAAI,EAAE,gBAAgB,EACtB,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,QAAsB,GAChC,OAAO,CAGT"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { operationAnchor } from './render-operation.js';
|
|
2
|
+
import type { PreviewData, ResolvedModel, ResolvedOperation } from './types.js';
|
|
3
|
+
/** Discriminated union identifying which item the detail page should render. */
|
|
4
|
+
export type ItemSelection = {
|
|
5
|
+
kind: 'operation';
|
|
6
|
+
id: string;
|
|
7
|
+
} | {
|
|
8
|
+
kind: 'model';
|
|
9
|
+
name: string;
|
|
10
|
+
} | {
|
|
11
|
+
kind: 'overview';
|
|
12
|
+
} | {
|
|
13
|
+
kind: 'file';
|
|
14
|
+
path: string;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Renders a single-item detail page intended for a focused webview. Wraps `renderOperation` /
|
|
18
|
+
* `renderModel` / a file page (all operations + models declared in one source file) / an
|
|
19
|
+
* Overview block in a minimal shell — no sidebar (the consumer provides navigation via a
|
|
20
|
+
* native tree view).
|
|
21
|
+
*/
|
|
22
|
+
/** Options for {@link renderItemPage}. */
|
|
23
|
+
export interface RenderItemOptions {
|
|
24
|
+
/** Base URL surfaced to the operation's Try-it form. Pass an empty string to render the form with no default; omit to hide the form. */
|
|
25
|
+
tryItBaseUrl?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function renderItemPage(data: PreviewData, selection: ItemSelection, options?: RenderItemOptions): string;
|
|
28
|
+
/** Stable ids used by tree-view consumers to refer to operations and models. */
|
|
29
|
+
export declare const operationId: typeof operationAnchor;
|
|
30
|
+
export declare const modelId: (name: string) => string;
|
|
31
|
+
/**
|
|
32
|
+
* Returns every selectable item in `data` as a flat list with its stable id paired with the
|
|
33
|
+
* full resolved entry. Useful for building a navigation tree or a flat picker.
|
|
34
|
+
*/
|
|
35
|
+
export declare function listSelections(data: PreviewData): Array<{
|
|
36
|
+
kind: 'operation';
|
|
37
|
+
id: string;
|
|
38
|
+
operation: ResolvedOperation;
|
|
39
|
+
} | {
|
|
40
|
+
kind: 'model';
|
|
41
|
+
name: string;
|
|
42
|
+
model: ResolvedModel;
|
|
43
|
+
}>;
|
|
44
|
+
//# sourceMappingURL=render-item.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-item.d.ts","sourceRoot":"","sources":["../src/render-item.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAmB,MAAM,uBAAuB,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAgC,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE9G,gFAAgF;AAChF,MAAM,MAAM,aAAa,GACnB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErC;;;;;GAKG;AACH,0CAA0C;AAC1C,MAAM,WAAW,iBAAiB;IAC9B,wIAAwI;IACxI,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,GAAE,iBAAsB,GAAG,MAAM,CAGnH;AAmGD,gFAAgF;AAChF,eAAO,MAAM,WAAW,wBAAkB,CAAC;AAC3C,eAAO,MAAM,OAAO,GAAI,MAAM,MAAM,KAAG,MAA2B,CAAC;AAEnE;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,KAAK,CAClD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,iBAAiB,CAAA;CAAE,GAC/D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,aAAa,CAAA;CAAE,CAC1D,CAKA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { FieldNode } from '@contractkit/core';
|
|
2
|
+
import type { RenderContext, ResolvedModel } from './types.js';
|
|
3
|
+
/** Anchor id for a model, used by `<a href="#model-Name">` ref links. */
|
|
4
|
+
export declare function modelAnchor(name: string): string;
|
|
5
|
+
/** Renders a model card: header, badges, inheritance line, fields (or type alias). */
|
|
6
|
+
export declare function renderModel({ filePath, model }: ResolvedModel, ctx?: RenderContext): string;
|
|
7
|
+
/** Renders a tabular view of fields with name/type/modifiers/default/description. Exported for reuse by inline-object rendering. */
|
|
8
|
+
export declare function renderFieldRows(fields: FieldNode[], ctx?: RenderContext): string;
|
|
9
|
+
//# sourceMappingURL=render-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-model.d.ts","sourceRoot":"","sources":["../src/render-model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAInD,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE/D,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,sFAAsF;AACtF,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,GAAG,GAAE,aAAkB,GAAG,MAAM,CAgD/F;AAED,oIAAoI;AACpI,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,GAAE,aAAkB,GAAG,MAAM,CA0BpF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { RenderContext, ResolvedOperation } from './types.js';
|
|
2
|
+
/** Anchor id for an operation. Stable across renders so the sidebar can deep-link to it. */
|
|
3
|
+
export declare function operationAnchor(op: ResolvedOperation): string;
|
|
4
|
+
/** Options for {@link renderOperation}. */
|
|
5
|
+
export interface RenderOperationOptions {
|
|
6
|
+
/** Base URL pre-filled into the Try-it form. Empty string when no base is configured. Omit to hide the Try-it form. */
|
|
7
|
+
tryItBaseUrl?: string;
|
|
8
|
+
/** Render context used to inline `ref` types as collapsible model expansions. */
|
|
9
|
+
ctx?: RenderContext;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Renders an operation card with header (method, path, badges, jump-to-source), description,
|
|
13
|
+
* service/signature lines, parameter tables (path/query/headers), request body, responses,
|
|
14
|
+
* plugin extensions, and an optional Try-it form when `options.tryItBaseUrl` is defined.
|
|
15
|
+
*/
|
|
16
|
+
export declare function renderOperation(op: ResolvedOperation, options?: RenderOperationOptions): string;
|
|
17
|
+
//# sourceMappingURL=render-operation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-operation.d.ts","sourceRoot":"","sources":["../src/render-operation.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEnE,4FAA4F;AAC5F,wBAAgB,eAAe,CAAC,EAAE,EAAE,iBAAiB,GAAG,MAAM,CAI7D;AAED,2CAA2C;AAC3C,MAAM,WAAW,sBAAsB;IACnC,uHAAuH;IACvH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,GAAG,CAAC,EAAE,aAAa,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,iBAAiB,EAAE,OAAO,GAAE,sBAA2B,GAAG,MAAM,CAqEnG"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ContractTypeNode } from '@contractkit/core';
|
|
2
|
+
import type { RenderContext } from './types.js';
|
|
3
|
+
/** Per-field visibility to suppress when rendering. `readonly` for request inputs (server
|
|
4
|
+
* controls those), `writeonly` for response payloads. */
|
|
5
|
+
export type SchemaVisibilityFilter = 'readonly' | 'writeonly';
|
|
6
|
+
export interface RenderSchemaOptions {
|
|
7
|
+
/** Hide fields with this visibility. Pass `'readonly'` when rendering request inputs
|
|
8
|
+
* (query/path/headers/request body) so server-controlled fields don't show up as inputs. */
|
|
9
|
+
exclude?: SchemaVisibilityFilter;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Renders a request/response body schema as an indented field tree: each row shows the field
|
|
13
|
+
* name, type, required tag, description, default, and constraint chips, with nested objects/
|
|
14
|
+
* arrays indented under their parent. Falls back to `renderType` for shapes that aren't
|
|
15
|
+
* object-like (unions, primitives at the top level, etc.).
|
|
16
|
+
*/
|
|
17
|
+
export declare function renderSchemaTree(type: ContractTypeNode, ctx?: RenderContext, options?: RenderSchemaOptions): string;
|
|
18
|
+
//# sourceMappingURL=render-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-schema.d.ts","sourceRoot":"","sources":["../src/render-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAA6B,MAAM,mBAAmB,CAAC;AAKrF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD;yDACyD;AACzD,MAAM,MAAM,sBAAsB,GAAG,UAAU,GAAG,WAAW,CAAC;AAE9D,MAAM,WAAW,mBAAmB;IAChC;gGAC4F;IAC5F,OAAO,CAAC,EAAE,sBAAsB,CAAC;CACpC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC5B,IAAI,EAAE,gBAAgB,EACtB,GAAG,GAAE,aAAkB,EACvB,OAAO,GAAE,mBAAwB,GAClC,MAAM,CAER"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RenderContext, ResolvedOperation } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Renders an interactive "Try it" form for an operation. The form collects path params, query
|
|
4
|
+
* params, headers, and a JSON body, then dispatches via the host (extension or page script) on
|
|
5
|
+
* submit. The host listens for `data-tryit-action="send"` clicks via event delegation.
|
|
6
|
+
*
|
|
7
|
+
* Inputs are pre-filled with realistic faker-generated samples derived from the schema so the
|
|
8
|
+
* user can hit Send immediately instead of hand-crafting a payload. Pre-fills are
|
|
9
|
+
* deterministic (seeded by operation identity) so re-renders don't flicker the values.
|
|
10
|
+
*/
|
|
11
|
+
export declare function renderTryIt(op: ResolvedOperation, baseUrl: string, ctx?: RenderContext): string;
|
|
12
|
+
//# sourceMappingURL=render-tryit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-tryit.d.ts","sourceRoot":"","sources":["../src/render-tryit.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAGnE;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,aAAkB,GAAG,MAAM,CAuCnG"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ContractTypeNode } from '@contractkit/core';
|
|
2
|
+
import type { RenderContext } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Recursively renders a ContractTypeNode as inline HTML.
|
|
5
|
+
*
|
|
6
|
+
* When `ctx.models` is provided, `ref` types render as collapsible `<details>` containing the
|
|
7
|
+
* referenced model's fields. `ctx.visited` (set internally) prevents infinite recursion on
|
|
8
|
+
* self-referential models. Past `ctx.maxDepth` (default 4) refs collapse to plain links.
|
|
9
|
+
*/
|
|
10
|
+
export declare function renderType(type: ContractTypeNode, ctx?: RenderContext): string;
|
|
11
|
+
//# sourceMappingURL=render-type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-type.d.ts","sourceRoot":"","sources":["../src/render-type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAI1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,gBAAgB,EAAE,GAAG,GAAE,aAAkB,GAAG,MAAM,CAqClF"}
|
package/dist/render.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PreviewData } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Renders the complete API explorer as an HTML fragment. Drop the result into a container
|
|
4
|
+
* element (e.g. `root.innerHTML = renderApp(data)`) and pair with the package's `style.css`.
|
|
5
|
+
*/
|
|
6
|
+
export declare function renderApp(data: PreviewData): string;
|
|
7
|
+
//# sourceMappingURL=render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,YAAY,CAAC;AAWjE;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAoBnD"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { HttpMethod, ModelNode, OpOperationNode, ParamSource, RouteModifier, SecurityNode } from '@contractkit/core';
|
|
2
|
+
/** Threaded through type/field renderers so a `ref` can lazily expand into the model's fields inline. */
|
|
3
|
+
export interface RenderContext {
|
|
4
|
+
/** Lookup table of model name → resolved model entry (carries `filePath` so refs can jump to source). */
|
|
5
|
+
models?: Map<string, ResolvedModel>;
|
|
6
|
+
/** Names already being expanded on this branch — prevents infinite recursion on self-referential models. */
|
|
7
|
+
visited?: ReadonlySet<string>;
|
|
8
|
+
/** Cap on how deep nested model expansions render. Past this depth, refs collapse to plain links. */
|
|
9
|
+
maxDepth?: number;
|
|
10
|
+
/** Current depth — incremented by the renderer on each `ref` descent. Callers should leave this at 0. */
|
|
11
|
+
depth?: number;
|
|
12
|
+
}
|
|
13
|
+
/** A single API server entry surfaced in the overview. */
|
|
14
|
+
export interface PreviewServer {
|
|
15
|
+
url: string;
|
|
16
|
+
description?: string;
|
|
17
|
+
}
|
|
18
|
+
/** Top-level API metadata rendered in the overview section. */
|
|
19
|
+
export interface PreviewConfigMeta {
|
|
20
|
+
title: string;
|
|
21
|
+
version: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
servers?: PreviewServer[];
|
|
24
|
+
}
|
|
25
|
+
/** A non-fatal diagnostic captured while building {@link PreviewData}. */
|
|
26
|
+
export interface PreviewWarning {
|
|
27
|
+
message: string;
|
|
28
|
+
file?: string;
|
|
29
|
+
line?: number;
|
|
30
|
+
}
|
|
31
|
+
/** An operation with all cascade-resolved data the renderer needs to draw a card. */
|
|
32
|
+
export interface ResolvedOperation {
|
|
33
|
+
/** Absolute path of the source .ck file. */
|
|
34
|
+
filePath: string;
|
|
35
|
+
/** Sidebar grouping key — `ast.meta.area`, falling back to the file's relative path. */
|
|
36
|
+
fileGroup: string;
|
|
37
|
+
/** Path template (e.g. `/payments/{id}`). */
|
|
38
|
+
routePath: string;
|
|
39
|
+
method: HttpMethod;
|
|
40
|
+
/** Full operation node — carries `loc`, request/responses, plugins, etc. */
|
|
41
|
+
op: OpOperationNode;
|
|
42
|
+
/** Route-level params (path params) carried alongside the operation for rendering. */
|
|
43
|
+
routeParams?: ParamSource;
|
|
44
|
+
/** `resolveModifiers(route, op)` output — already excludes the synthetic `public` token. */
|
|
45
|
+
effectiveModifiers: RouteModifier[];
|
|
46
|
+
/** `resolveSecurity(route, op, root)` output. */
|
|
47
|
+
effectiveSecurity?: SecurityNode;
|
|
48
|
+
}
|
|
49
|
+
/** A model paired with the absolute path of the `.ck` file that declared it. */
|
|
50
|
+
export interface ResolvedModel {
|
|
51
|
+
filePath: string;
|
|
52
|
+
model: ModelNode;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Snapshot of an entire workspace's contracts and operations, pre-resolved so the renderer
|
|
56
|
+
* doesn't need to call into `@contractkit/core` at render time.
|
|
57
|
+
*/
|
|
58
|
+
export interface PreviewData {
|
|
59
|
+
configMeta: PreviewConfigMeta;
|
|
60
|
+
workspaceRoot?: string;
|
|
61
|
+
operations: ResolvedOperation[];
|
|
62
|
+
models: ResolvedModel[];
|
|
63
|
+
warnings: PreviewWarning[];
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE1H,yGAAyG;AACzG,MAAM,WAAW,aAAa;IAC1B,yGAAyG;IACzG,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACpC,4GAA4G;IAC5G,OAAO,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9B,qGAAqG;IACrG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yGAAyG;IACzG,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,0DAA0D;AAC1D,MAAM,WAAW,aAAa;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,+DAA+D;AAC/D,MAAM,WAAW,iBAAiB;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;CAC7B;AAED,0EAA0E;AAC1E,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qFAAqF;AACrF,MAAM,WAAW,iBAAiB;IAC9B,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,wFAAwF;IACxF,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,4EAA4E;IAC5E,EAAE,EAAE,eAAe,CAAC;IACpB,sFAAsF;IACtF,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,4FAA4F;IAC5F,kBAAkB,EAAE,aAAa,EAAE,CAAC;IACpC,iDAAiD;IACjD,iBAAiB,CAAC,EAAE,YAAY,CAAC;CACpC;AAED,gFAAgF;AAChF,MAAM,WAAW,aAAa;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IACxB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC9B"}
|