@sdk-it/readme 0.26.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -293,17 +293,18 @@ var PropEmitter = class {
293
293
  };
294
294
 
295
295
  // packages/readme/src/lib/readme.ts
296
- function generateTableOfContents(spec) {
296
+ function toTOC(spec) {
297
297
  const tocLines = [];
298
298
  const sidebar = toSidebar(spec);
299
- tocLines.push("## Table of Contents");
300
- tocLines.push("");
299
+ const contents = [];
301
300
  for (const category of sidebar) {
302
301
  if (category.category) {
303
302
  tocLines.push(`### ${category.category}`);
304
303
  tocLines.push("");
305
304
  }
306
305
  for (const item of category.items) {
306
+ if (item.id === "generated-introduction") continue;
307
+ contents.push(item.content || "");
307
308
  if (item.items && item.items.length > 0) {
308
309
  tocLines.push(`- **${item.title}**`);
309
310
  for (const subItem of item.items) {
@@ -320,21 +321,28 @@ function generateTableOfContents(spec) {
320
321
  tocLines.push("- [Schemas](#schemas)");
321
322
  tocLines.push("");
322
323
  }
323
- return tocLines;
324
+ return { tocLines, contents };
324
325
  }
325
326
  function toReadme(spec, generators) {
326
- const markdown = [];
327
327
  const propEmitter = new PropEmitter(spec);
328
- markdown.push("# API Reference");
329
- markdown.push("");
328
+ const toc = toTOC(spec);
329
+ const markdown = [];
330
+ const generatedIntro = spec["x-docs"].flatMap((it) => it.items).find((doc) => doc.id === "generated-introduction");
331
+ if (generatedIntro && generatedIntro.content) {
332
+ markdown.push(generatedIntro.content);
333
+ }
334
+ markdown.push("---");
335
+ markdown.push("## Table of Contents");
336
+ markdown.push(...toc.tocLines);
337
+ markdown.push("---");
330
338
  markdown.push(
331
339
  "This document provides an overview of the API endpoints available in this service. Each endpoint includes a brief description, example usage, and details about request and response formats."
332
340
  );
333
341
  markdown.push("");
334
- markdown.unshift(...generateTableOfContents(spec));
335
342
  markdown.push("");
336
- markdown.push("```\n" + generators.client() + "\n```");
343
+ markdown.push("```ts\n" + generators.client() + "\n```");
337
344
  markdown.push("");
345
+ markdown.push(toc.contents.join("\n\n"));
338
346
  forEachOperation(spec, (entry, operation) => {
339
347
  const { method, path } = entry;
340
348
  markdown.push(
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/lib/readme.ts", "../src/lib/prop.emitter.ts"],
4
- "sourcesContent": ["import { isEmpty } from '@sdk-it/core';\nimport {\n type OurOpenAPIObject,\n forEachOperation,\n toSidebar,\n} from '@sdk-it/spec';\n\nimport type { Generator } from './generator.ts';\nimport { PropEmitter } from './prop.emitter.ts';\n\n/**\n * Generate Table of Contents from sidebar data\n */\nfunction generateTableOfContents(spec: OurOpenAPIObject): string[] {\n const tocLines: string[] = [];\n const sidebar = toSidebar(spec);\n\n tocLines.push('## Table of Contents');\n tocLines.push('');\n\n // Generate TOC based on sidebar structure\n for (const category of sidebar) {\n if (category.category) {\n tocLines.push(`### ${category.category}`);\n tocLines.push('');\n }\n\n for (const item of category.items) {\n if (item.items && item.items.length > 0) {\n // This is a tag/group with operations\n tocLines.push(`- **${item.title}**`);\n\n // Add each operation in this tag\n for (const subItem of item.items) {\n // Create anchor that matches the markdown header format\n const anchor = `#${subItem.title\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/\\s+/g, '-')}`;\n tocLines.push(` - [${subItem.title}](${anchor})`);\n }\n } else {\n // This might be a standalone item\n tocLines.push(`- **${item.title}**`);\n }\n }\n tocLines.push('');\n }\n\n // Add link to Schemas section if it exists\n if (spec.components?.schemas) {\n tocLines.push('- [Schemas](#schemas)');\n tocLines.push('');\n }\n\n return tocLines;\n}\n\nexport function toReadme(spec: OurOpenAPIObject, generators: Generator) {\n // table of content is the navigation headers in apiref\n const markdown: string[] = [];\n const propEmitter = new PropEmitter(spec);\n\n markdown.push('# API Reference');\n markdown.push('');\n markdown.push(\n 'This document provides an overview of the API endpoints available in this service. Each endpoint includes a brief description, example usage, and details about request and response formats.',\n );\n markdown.push('');\n markdown.unshift(...generateTableOfContents(spec));\n markdown.push('');\n markdown.push('```\\n' + generators.client() + '\\n```');\n markdown.push('');\n\n forEachOperation(spec, (entry, operation) => {\n const { method, path } = entry;\n markdown.push(\n `#### ${operation['x-fn-name']} | ${`_${method.toUpperCase()} ${path}_`}`,\n );\n markdown.push(operation.summary || '');\n\n const snippet = generators.snippet(entry, operation);\n markdown.push(`##### Example usage`);\n markdown.push(snippet);\n\n // Process request body using the refactored emitter\n const requestBodyContent = propEmitter.requestBody(operation.requestBody);\n if (requestBodyContent.length > 1) {\n // Check if more than just the header was added\n markdown.push(requestBodyContent.join('\\n\\n'));\n }\n\n markdown.push(`##### Responses`);\n for (const status in operation.responses) {\n const response = operation.responses[status];\n // Wrap each response in its own toggle\n markdown.push(`<details>`);\n markdown.push(\n `<summary><b>${status}</b> <i>${response.description}</i></summary>`,\n );\n if (!isEmpty(response.content)) {\n for (const [contentType, mediaType] of Object.entries(\n response.content,\n )) {\n markdown.push(`\\n**Content Type:** \\`${contentType}\\``);\n if (mediaType.schema) {\n const schemaDocs = propEmitter.handle(mediaType.schema);\n // hide emitter output under the toggle\n markdown.push(...schemaDocs.map((l) => `\\n${l}`));\n }\n }\n }\n markdown.push(`</details>`);\n }\n }); // Add schemas section at the bottom\n if (spec.components?.schemas) {\n markdown.push('## Schemas');\n markdown.push('');\n\n for (const [schemaName, schema] of Object.entries(\n spec.components.schemas,\n )) {\n // Include all schemas except ValidationError which is internal\n if (schemaName === 'ValidationError') {\n continue;\n }\n\n markdown.push(`<details>`);\n markdown.push(\n `<summary><h3 id=\"${schemaName.toLowerCase()}\">${schemaName}</h3></summary>`,\n );\n markdown.push('');\n\n const schemaDocs = propEmitter.handle(schema);\n markdown.push(...schemaDocs.map((line) => line.trim()));\n\n markdown.push('');\n markdown.push(`</details>`);\n markdown.push('');\n }\n }\n\n // Generate Table of Contents\n\n return markdown.join('\\n\\n');\n}\n", "import type {\n OpenAPIObject,\n ReferenceObject,\n RequestBodyObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\n\nimport { followRef, isRef } from '@sdk-it/core';\nimport { coerceTypes } from '@sdk-it/spec';\n\n/**\n * PropEmitter handles converting OpenAPI schemas to Markdown documentation\n * Similar structure to ZodDeserializer but for generating markdown props documentation\n */\nexport class PropEmitter {\n #spec: OpenAPIObject;\n\n constructor(spec: OpenAPIObject) {\n this.#spec = spec;\n }\n\n /**\n * Handle objects (properties)\n */\n #object(schema: SchemaObject): string[] {\n const lines: string[] = [];\n const properties = schema.properties || {};\n\n if (Object.keys(properties).length > 0) {\n lines.push(`**Properties:**`);\n\n for (const [propName, propSchema] of Object.entries(properties)) {\n const isRequired = (schema.required ?? []).includes(propName);\n lines.push(...this.#property(propName, propSchema, isRequired));\n }\n }\n\n // Handle additionalProperties\n if (schema.additionalProperties) {\n lines.push(`**Additional Properties:**`);\n if (typeof schema.additionalProperties === 'boolean') {\n lines.push(`- Allowed: ${schema.additionalProperties}`);\n } else {\n // Indent the schema documentation for additional properties\n lines.push(\n ...this.handle(schema.additionalProperties).map((l) => ` ${l}`),\n );\n }\n }\n\n return lines;\n }\n\n /**\n * Format a property with its type and description\n */\n #property(\n name: string,\n schema: SchemaObject | ReferenceObject,\n required: boolean,\n ): string[] {\n // get full docs and extract the type line\n const docs = this.handle(schema);\n const rawType = docs[0]\n .replace('**Type:** ', '')\n .replace(' (nullable)', '|null');\n\n // detect default if present on the schema\n const defaultVal =\n !isRef(schema) && (schema as SchemaObject).default !== undefined\n ? ` default: ${JSON.stringify((schema as SchemaObject).default)}`\n : '';\n\n // build summary line\n const reqMark = required ? ' required' : '';\n const summary = `- \\`${name}\\` ${rawType}${reqMark}${defaultVal}:`;\n\n // assemble final lines (skip the type and any default in details)\n const detailLines = docs\n .slice(1)\n .filter((l) => !l.startsWith('**Default:**'))\n .map((l) => ` ${l}`);\n\n return [summary, ...detailLines];\n }\n\n /**\n * Handle array schemas\n */\n #array(schema: SchemaObject): string[] {\n const lines: string[] = [];\n lines.push(`**Array items:**`);\n\n if (schema.items) {\n // Get documentation for the items schema\n const itemDocs = this.handle(schema.items);\n // Indent item documentation\n lines.push(...itemDocs.map((line) => ` ${line}`));\n } else {\n lines.push(` **Type:** \\`unknown\\``); // Array of unknown items\n }\n // Add array constraints\n if (schema.minItems !== undefined)\n lines.push(`- Minimum items: ${schema.minItems}`);\n if (schema.maxItems !== undefined)\n lines.push(`- Maximum items: ${schema.maxItems}`);\n if (schema.uniqueItems) lines.push(`- Items must be unique.`);\n\n return lines;\n }\n\n #ref($ref: string): string[] {\n const schemaName = $ref.split('/').pop() || 'object';\n const resolved = followRef<SchemaObject>(this.#spec, $ref);\n // Link to the schema definition (assuming heading anchors are generated elsewhere)\n const lines = [\n `**Type:** [\\`${schemaName}\\`](#${schemaName.toLowerCase()})`,\n ];\n if (resolved.description) {\n lines.push(resolved.description);\n }\n // Avoid deep recursion by default, just link and show description.\n // If more detail is needed, the linked definition should provide it.\n return lines;\n }\n\n #allOf(schemas: (SchemaObject | ReferenceObject)[]): string[] {\n const lines = ['**All of (Intersection):**'];\n schemas.forEach((subSchema, index) => {\n lines.push(`- **Constraint ${index + 1}:**`);\n const subLines = this.handle(subSchema);\n lines.push(...subLines.map((l) => ` ${l}`)); // Indent sub-schema docs\n });\n return lines;\n }\n\n #anyOf(schemas: (SchemaObject | ReferenceObject)[]): string[] {\n const lines = ['**Any of (Union):**'];\n schemas.forEach((subSchema, index) => {\n lines.push(`- **Option ${index + 1}:**`);\n const subLines = this.handle(subSchema);\n lines.push(...subLines.map((l) => ` ${l}`));\n });\n return lines;\n }\n\n #oneOf(schemas: (SchemaObject | ReferenceObject)[]): string[] {\n const lines = ['**One of (Exclusive Union):**'];\n schemas.forEach((subSchema, index) => {\n lines.push(`- **Option ${index + 1}:**`);\n const subLines = this.handle(subSchema);\n lines.push(...subLines.map((l) => ` ${l}`));\n });\n return lines;\n }\n\n #enum(schema: SchemaObject): string[] {\n const lines = [`**Type:** \\`${schema.type || 'unknown'}\\` (enum)`];\n if (schema.description) lines.push(schema.description);\n lines.push('**Allowed values:**');\n lines.push(\n ...(schema.enum || []).map((val) => `- \\`${JSON.stringify(val)}\\``),\n );\n if (schema.default !== undefined) {\n lines.push(`**Default:** \\`${JSON.stringify(schema.default)}\\``);\n }\n return lines;\n }\n\n #normal(type: string, schema: SchemaObject, nullable: boolean): string[] {\n const lines: string[] = [];\n const nullableSuffix = nullable ? ' (nullable)' : '';\n const description = schema.description ? [schema.description] : [];\n\n switch (type) {\n case 'string':\n lines.push(\n `**Type:** \\`string\\`${schema.format ? ` (format: ${schema.format})` : ''}${nullableSuffix}`,\n );\n lines.push(...description);\n if (schema.minLength !== undefined)\n lines.push(`- Minimum length: ${schema.minLength}`);\n if (schema.maxLength !== undefined)\n lines.push(`- Maximum length: ${schema.maxLength}`);\n if (schema.pattern !== undefined)\n lines.push(`- Pattern: \\`${schema.pattern}\\``);\n break;\n case 'number':\n case 'integer':\n lines.push(\n `**Type:** \\`${type}\\`${schema.format ? ` (format: ${schema.format})` : ''}${nullableSuffix}`,\n );\n lines.push(...description);\n // Add number constraints (OpenAPI 3.1)\n if (schema.minimum !== undefined) {\n // Check if exclusiveMinimum is a number (OAS 3.1)\n const exclusiveMin = typeof schema.exclusiveMinimum === 'number';\n lines.push(\n `- Minimum: ${schema.minimum}${exclusiveMin ? ' (exclusive)' : ''}`,\n );\n if (exclusiveMin) {\n lines.push(\n `- Must be strictly greater than: ${schema.exclusiveMinimum}`,\n );\n }\n } else if (typeof schema.exclusiveMinimum === 'number') {\n lines.push(\n `- Must be strictly greater than: ${schema.exclusiveMinimum}`,\n );\n }\n\n if (schema.maximum !== undefined) {\n // Check if exclusiveMaximum is a number (OAS 3.1)\n const exclusiveMax = typeof schema.exclusiveMaximum === 'number';\n lines.push(\n `- Maximum: ${schema.maximum}${exclusiveMax ? ' (exclusive)' : ''}`,\n );\n if (exclusiveMax) {\n lines.push(\n `- Must be strictly less than: ${schema.exclusiveMaximum}`,\n );\n }\n } else if (typeof schema.exclusiveMaximum === 'number') {\n lines.push(\n `- Must be strictly less than: ${schema.exclusiveMaximum}`,\n );\n }\n if (schema.multipleOf !== undefined)\n lines.push(`- Must be a multiple of: ${schema.multipleOf}`);\n break;\n case 'boolean':\n lines.push(`**Type:** \\`boolean\\`${nullableSuffix}`);\n lines.push(...description);\n break;\n case 'object':\n lines.push(`**Type:** \\`object\\`${nullableSuffix}`);\n lines.push(...description);\n lines.push(...this.#object(schema));\n break;\n case 'array':\n lines.push(`**Type:** \\`array\\`${nullableSuffix}`);\n lines.push(...description);\n lines.push(...this.#array(schema));\n break;\n case 'null':\n lines.push(`**Type:** \\`null\\``);\n lines.push(...description);\n break;\n default:\n lines.push(`**Type:** \\`${type}\\`${nullableSuffix}`);\n lines.push(...description);\n }\n if (schema.default !== undefined) {\n lines.push(`**Default:** \\`${JSON.stringify(schema.default)}\\``);\n }\n return lines.filter((l) => l); // Filter out empty description lines\n }\n\n /**\n * Handle schemas by resolving references and delegating to appropriate handler\n */\n public handle(schemaOrRef: SchemaObject | ReferenceObject): string[] {\n if (isRef(schemaOrRef)) {\n return this.#ref(schemaOrRef.$ref);\n }\n\n const schema = schemaOrRef;\n\n // Handle composition keywords first\n if (schema.allOf && Array.isArray(schema.allOf)) {\n return this.#allOf(schema.allOf);\n }\n if (schema.anyOf && Array.isArray(schema.anyOf)) {\n return this.#anyOf(schema.anyOf);\n }\n if (schema.oneOf && Array.isArray(schema.oneOf)) {\n return this.#oneOf(schema.oneOf);\n }\n\n // Handle enums\n if (schema.enum && Array.isArray(schema.enum)) {\n return this.#enum(schema);\n }\n\n // Determine type(s) and nullability\n let types = coerceTypes(schema);\n let nullable = false; // Default to false\n\n if (types.includes('null')) {\n nullable = true;\n types = types.filter((t) => t !== 'null');\n }\n\n // Infer type if not explicitly set\n if (types.length === 0) {\n if (schema.properties || schema.additionalProperties) {\n types = ['object'];\n } else if (schema.items) {\n types = ['array'];\n }\n // Add other inferences if needed (e.g., based on format)\n }\n\n // If still no type, treat as unknown or any\n if (types.length === 0) {\n const lines = ['**Type:** `unknown`'];\n if (schema.description) lines.push(schema.description);\n if (schema.default !== undefined)\n lines.push(`**Default:** \\`${JSON.stringify(schema.default)}\\``);\n return lines;\n }\n\n // Handle single type (potentially nullable)\n if (types.length === 1) {\n return this.#normal(types[0], schema, nullable);\n }\n\n // Handle union of multiple non-null types (potentially nullable overall)\n const typeString = types.join(' | ');\n const nullableSuffix = nullable ? ' (nullable)' : '';\n const lines = [`**Type:** \\`${typeString}\\`${nullableSuffix}`];\n if (schema.description) lines.push(schema.description);\n if (schema.default !== undefined)\n lines.push(`**Default:** \\`${JSON.stringify(schema.default)}\\``);\n return lines;\n }\n\n /**\n * Process a request body and return markdown documentation\n */\n requestBody(requestBody?: RequestBodyObject): string[] {\n if (!requestBody) return [];\n\n const lines: string[] = [];\n lines.push(`##### Request Body`);\n\n if (requestBody.description) {\n lines.push(requestBody.description);\n }\n\n if (requestBody.content) {\n const contentEntries = Object.entries(requestBody.content);\n\n // If only one content type, show it directly without toggles\n if (contentEntries.length === 1) {\n const [contentType, mediaType] = contentEntries[0];\n lines.push(`**Content Type:** \\`${contentType}\\``);\n\n if (mediaType.schema) {\n const schemaDocs = this.handle(mediaType.schema);\n lines.push(...schemaDocs);\n }\n } else {\n // Multiple content types - use collapsible toggles\n for (const [contentType, mediaType] of contentEntries) {\n lines.push(`<details>`);\n lines.push(\n `<summary><b>Content Type:</b> \\`${contentType}\\`</summary>`,\n );\n lines.push('');\n\n if (mediaType.schema) {\n const schemaDocs = this.handle(mediaType.schema);\n lines.push(...schemaDocs.map((l) => l));\n }\n\n lines.push('');\n lines.push(`</details>`);\n }\n }\n }\n\n return lines;\n }\n}\n"],
5
- "mappings": ";AAAA,SAAS,eAAe;AACxB;AAAA,EAEE;AAAA,EACA;AAAA,OACK;;;ACEP,SAAS,WAAW,aAAa;AACjC,SAAS,mBAAmB;AAMrB,IAAM,cAAN,MAAkB;AAAA,EACvB;AAAA,EAEA,YAAY,MAAqB;AAC/B,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,QAAgC;AACtC,UAAM,QAAkB,CAAC;AACzB,UAAM,aAAa,OAAO,cAAc,CAAC;AAEzC,QAAI,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AACtC,YAAM,KAAK,iBAAiB;AAE5B,iBAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC/D,cAAM,cAAc,OAAO,YAAY,CAAC,GAAG,SAAS,QAAQ;AAC5D,cAAM,KAAK,GAAG,KAAK,UAAU,UAAU,YAAY,UAAU,CAAC;AAAA,MAChE;AAAA,IACF;AAGA,QAAI,OAAO,sBAAsB;AAC/B,YAAM,KAAK,4BAA4B;AACvC,UAAI,OAAO,OAAO,yBAAyB,WAAW;AACpD,cAAM,KAAK,cAAc,OAAO,oBAAoB,EAAE;AAAA,MACxD,OAAO;AAEL,cAAM;AAAA,UACJ,GAAG,KAAK,OAAO,OAAO,oBAAoB,EAAE,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UACE,MACA,QACA,UACU;AAEV,UAAM,OAAO,KAAK,OAAO,MAAM;AAC/B,UAAM,UAAU,KAAK,CAAC,EACnB,QAAQ,cAAc,EAAE,EACxB,QAAQ,eAAe,OAAO;AAGjC,UAAM,aACJ,CAAC,MAAM,MAAM,KAAM,OAAwB,YAAY,SACnD,aAAa,KAAK,UAAW,OAAwB,OAAO,CAAC,KAC7D;AAGN,UAAM,UAAU,WAAW,cAAc;AACzC,UAAM,UAAU,OAAO,IAAI,MAAM,OAAO,GAAG,OAAO,GAAG,UAAU;AAG/D,UAAM,cAAc,KACjB,MAAM,CAAC,EACP,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,cAAc,CAAC,EAC3C,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AAEtB,WAAO,CAAC,SAAS,GAAG,WAAW;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAgC;AACrC,UAAM,QAAkB,CAAC;AACzB,UAAM,KAAK,kBAAkB;AAE7B,QAAI,OAAO,OAAO;AAEhB,YAAM,WAAW,KAAK,OAAO,OAAO,KAAK;AAEzC,YAAM,KAAK,GAAG,SAAS,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;AAAA,IACnD,OAAO;AACL,YAAM,KAAK,yBAAyB;AAAA,IACtC;AAEA,QAAI,OAAO,aAAa;AACtB,YAAM,KAAK,oBAAoB,OAAO,QAAQ,EAAE;AAClD,QAAI,OAAO,aAAa;AACtB,YAAM,KAAK,oBAAoB,OAAO,QAAQ,EAAE;AAClD,QAAI,OAAO,YAAa,OAAM,KAAK,yBAAyB;AAE5D,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,MAAwB;AAC3B,UAAM,aAAa,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK;AAC5C,UAAM,WAAW,UAAwB,KAAK,OAAO,IAAI;AAEzD,UAAM,QAAQ;AAAA,MACZ,gBAAgB,UAAU,QAAQ,WAAW,YAAY,CAAC;AAAA,IAC5D;AACA,QAAI,SAAS,aAAa;AACxB,YAAM,KAAK,SAAS,WAAW;AAAA,IACjC;AAGA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,SAAuD;AAC5D,UAAM,QAAQ,CAAC,4BAA4B;AAC3C,YAAQ,QAAQ,CAAC,WAAW,UAAU;AACpC,YAAM,KAAK,kBAAkB,QAAQ,CAAC,KAAK;AAC3C,YAAM,WAAW,KAAK,OAAO,SAAS;AACtC,YAAM,KAAK,GAAG,SAAS,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;AAAA,IAC7C,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,SAAuD;AAC5D,UAAM,QAAQ,CAAC,qBAAqB;AACpC,YAAQ,QAAQ,CAAC,WAAW,UAAU;AACpC,YAAM,KAAK,cAAc,QAAQ,CAAC,KAAK;AACvC,YAAM,WAAW,KAAK,OAAO,SAAS;AACtC,YAAM,KAAK,GAAG,SAAS,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;AAAA,IAC7C,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,SAAuD;AAC5D,UAAM,QAAQ,CAAC,+BAA+B;AAC9C,YAAQ,QAAQ,CAAC,WAAW,UAAU;AACpC,YAAM,KAAK,cAAc,QAAQ,CAAC,KAAK;AACvC,YAAM,WAAW,KAAK,OAAO,SAAS;AACtC,YAAM,KAAK,GAAG,SAAS,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;AAAA,IAC7C,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAgC;AACpC,UAAM,QAAQ,CAAC,eAAe,OAAO,QAAQ,SAAS,WAAW;AACjE,QAAI,OAAO,YAAa,OAAM,KAAK,OAAO,WAAW;AACrD,UAAM,KAAK,qBAAqB;AAChC,UAAM;AAAA,MACJ,IAAI,OAAO,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ,OAAO,KAAK,UAAU,GAAG,CAAC,IAAI;AAAA,IACpE;AACA,QAAI,OAAO,YAAY,QAAW;AAChC,YAAM,KAAK,kBAAkB,KAAK,UAAU,OAAO,OAAO,CAAC,IAAI;AAAA,IACjE;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,MAAc,QAAsB,UAA6B;AACvE,UAAM,QAAkB,CAAC;AACzB,UAAM,iBAAiB,WAAW,gBAAgB;AAClD,UAAM,cAAc,OAAO,cAAc,CAAC,OAAO,WAAW,IAAI,CAAC;AAEjE,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,cAAM;AAAA,UACJ,uBAAuB,OAAO,SAAS,aAAa,OAAO,MAAM,MAAM,EAAE,GAAG,cAAc;AAAA,QAC5F;AACA,cAAM,KAAK,GAAG,WAAW;AACzB,YAAI,OAAO,cAAc;AACvB,gBAAM,KAAK,qBAAqB,OAAO,SAAS,EAAE;AACpD,YAAI,OAAO,cAAc;AACvB,gBAAM,KAAK,qBAAqB,OAAO,SAAS,EAAE;AACpD,YAAI,OAAO,YAAY;AACrB,gBAAM,KAAK,gBAAgB,OAAO,OAAO,IAAI;AAC/C;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,cAAM;AAAA,UACJ,eAAe,IAAI,KAAK,OAAO,SAAS,aAAa,OAAO,MAAM,MAAM,EAAE,GAAG,cAAc;AAAA,QAC7F;AACA,cAAM,KAAK,GAAG,WAAW;AAEzB,YAAI,OAAO,YAAY,QAAW;AAEhC,gBAAM,eAAe,OAAO,OAAO,qBAAqB;AACxD,gBAAM;AAAA,YACJ,cAAc,OAAO,OAAO,GAAG,eAAe,iBAAiB,EAAE;AAAA,UACnE;AACA,cAAI,cAAc;AAChB,kBAAM;AAAA,cACJ,oCAAoC,OAAO,gBAAgB;AAAA,YAC7D;AAAA,UACF;AAAA,QACF,WAAW,OAAO,OAAO,qBAAqB,UAAU;AACtD,gBAAM;AAAA,YACJ,oCAAoC,OAAO,gBAAgB;AAAA,UAC7D;AAAA,QACF;AAEA,YAAI,OAAO,YAAY,QAAW;AAEhC,gBAAM,eAAe,OAAO,OAAO,qBAAqB;AACxD,gBAAM;AAAA,YACJ,cAAc,OAAO,OAAO,GAAG,eAAe,iBAAiB,EAAE;AAAA,UACnE;AACA,cAAI,cAAc;AAChB,kBAAM;AAAA,cACJ,iCAAiC,OAAO,gBAAgB;AAAA,YAC1D;AAAA,UACF;AAAA,QACF,WAAW,OAAO,OAAO,qBAAqB,UAAU;AACtD,gBAAM;AAAA,YACJ,iCAAiC,OAAO,gBAAgB;AAAA,UAC1D;AAAA,QACF;AACA,YAAI,OAAO,eAAe;AACxB,gBAAM,KAAK,4BAA4B,OAAO,UAAU,EAAE;AAC5D;AAAA,MACF,KAAK;AACH,cAAM,KAAK,wBAAwB,cAAc,EAAE;AACnD,cAAM,KAAK,GAAG,WAAW;AACzB;AAAA,MACF,KAAK;AACH,cAAM,KAAK,uBAAuB,cAAc,EAAE;AAClD,cAAM,KAAK,GAAG,WAAW;AACzB,cAAM,KAAK,GAAG,KAAK,QAAQ,MAAM,CAAC;AAClC;AAAA,MACF,KAAK;AACH,cAAM,KAAK,sBAAsB,cAAc,EAAE;AACjD,cAAM,KAAK,GAAG,WAAW;AACzB,cAAM,KAAK,GAAG,KAAK,OAAO,MAAM,CAAC;AACjC;AAAA,MACF,KAAK;AACH,cAAM,KAAK,oBAAoB;AAC/B,cAAM,KAAK,GAAG,WAAW;AACzB;AAAA,MACF;AACE,cAAM,KAAK,eAAe,IAAI,KAAK,cAAc,EAAE;AACnD,cAAM,KAAK,GAAG,WAAW;AAAA,IAC7B;AACA,QAAI,OAAO,YAAY,QAAW;AAChC,YAAM,KAAK,kBAAkB,KAAK,UAAU,OAAO,OAAO,CAAC,IAAI;AAAA,IACjE;AACA,WAAO,MAAM,OAAO,CAAC,MAAM,CAAC;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKO,OAAO,aAAuD;AACnE,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO,KAAK,KAAK,YAAY,IAAI;AAAA,IACnC;AAEA,UAAM,SAAS;AAGf,QAAI,OAAO,SAAS,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC/C,aAAO,KAAK,OAAO,OAAO,KAAK;AAAA,IACjC;AACA,QAAI,OAAO,SAAS,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC/C,aAAO,KAAK,OAAO,OAAO,KAAK;AAAA,IACjC;AACA,QAAI,OAAO,SAAS,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC/C,aAAO,KAAK,OAAO,OAAO,KAAK;AAAA,IACjC;AAGA,QAAI,OAAO,QAAQ,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC7C,aAAO,KAAK,MAAM,MAAM;AAAA,IAC1B;AAGA,QAAI,QAAQ,YAAY,MAAM;AAC9B,QAAI,WAAW;AAEf,QAAI,MAAM,SAAS,MAAM,GAAG;AAC1B,iBAAW;AACX,cAAQ,MAAM,OAAO,CAAC,MAAM,MAAM,MAAM;AAAA,IAC1C;AAGA,QAAI,MAAM,WAAW,GAAG;AACtB,UAAI,OAAO,cAAc,OAAO,sBAAsB;AACpD,gBAAQ,CAAC,QAAQ;AAAA,MACnB,WAAW,OAAO,OAAO;AACvB,gBAAQ,CAAC,OAAO;AAAA,MAClB;AAAA,IAEF;AAGA,QAAI,MAAM,WAAW,GAAG;AACtB,YAAMA,SAAQ,CAAC,qBAAqB;AACpC,UAAI,OAAO,YAAa,CAAAA,OAAM,KAAK,OAAO,WAAW;AACrD,UAAI,OAAO,YAAY;AACrB,QAAAA,OAAM,KAAK,kBAAkB,KAAK,UAAU,OAAO,OAAO,CAAC,IAAI;AACjE,aAAOA;AAAA,IACT;AAGA,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO,KAAK,QAAQ,MAAM,CAAC,GAAG,QAAQ,QAAQ;AAAA,IAChD;AAGA,UAAM,aAAa,MAAM,KAAK,KAAK;AACnC,UAAM,iBAAiB,WAAW,gBAAgB;AAClD,UAAM,QAAQ,CAAC,eAAe,UAAU,KAAK,cAAc,EAAE;AAC7D,QAAI,OAAO,YAAa,OAAM,KAAK,OAAO,WAAW;AACrD,QAAI,OAAO,YAAY;AACrB,YAAM,KAAK,kBAAkB,KAAK,UAAU,OAAO,OAAO,CAAC,IAAI;AACjE,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,aAA2C;AACrD,QAAI,CAAC,YAAa,QAAO,CAAC;AAE1B,UAAM,QAAkB,CAAC;AACzB,UAAM,KAAK,oBAAoB;AAE/B,QAAI,YAAY,aAAa;AAC3B,YAAM,KAAK,YAAY,WAAW;AAAA,IACpC;AAEA,QAAI,YAAY,SAAS;AACvB,YAAM,iBAAiB,OAAO,QAAQ,YAAY,OAAO;AAGzD,UAAI,eAAe,WAAW,GAAG;AAC/B,cAAM,CAAC,aAAa,SAAS,IAAI,eAAe,CAAC;AACjD,cAAM,KAAK,uBAAuB,WAAW,IAAI;AAEjD,YAAI,UAAU,QAAQ;AACpB,gBAAM,aAAa,KAAK,OAAO,UAAU,MAAM;AAC/C,gBAAM,KAAK,GAAG,UAAU;AAAA,QAC1B;AAAA,MACF,OAAO;AAEL,mBAAW,CAAC,aAAa,SAAS,KAAK,gBAAgB;AACrD,gBAAM,KAAK,WAAW;AACtB,gBAAM;AAAA,YACJ,mCAAmC,WAAW;AAAA,UAChD;AACA,gBAAM,KAAK,EAAE;AAEb,cAAI,UAAU,QAAQ;AACpB,kBAAM,aAAa,KAAK,OAAO,UAAU,MAAM;AAC/C,kBAAM,KAAK,GAAG,WAAW,IAAI,CAAC,MAAM,CAAC,CAAC;AAAA,UACxC;AAEA,gBAAM,KAAK,EAAE;AACb,gBAAM,KAAK,YAAY;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;ADzWA,SAAS,wBAAwB,MAAkC;AACjE,QAAM,WAAqB,CAAC;AAC5B,QAAM,UAAU,UAAU,IAAI;AAE9B,WAAS,KAAK,sBAAsB;AACpC,WAAS,KAAK,EAAE;AAGhB,aAAW,YAAY,SAAS;AAC9B,QAAI,SAAS,UAAU;AACrB,eAAS,KAAK,OAAO,SAAS,QAAQ,EAAE;AACxC,eAAS,KAAK,EAAE;AAAA,IAClB;AAEA,eAAW,QAAQ,SAAS,OAAO;AACjC,UAAI,KAAK,SAAS,KAAK,MAAM,SAAS,GAAG;AAEvC,iBAAS,KAAK,OAAO,KAAK,KAAK,IAAI;AAGnC,mBAAW,WAAW,KAAK,OAAO;AAEhC,gBAAM,SAAS,IAAI,QAAQ,MACxB,YAAY,EACZ,QAAQ,aAAa,EAAE,EACvB,QAAQ,QAAQ,GAAG,CAAC;AACvB,mBAAS,KAAK,QAAQ,QAAQ,KAAK,KAAK,MAAM,GAAG;AAAA,QACnD;AAAA,MACF,OAAO;AAEL,iBAAS,KAAK,OAAO,KAAK,KAAK,IAAI;AAAA,MACrC;AAAA,IACF;AACA,aAAS,KAAK,EAAE;AAAA,EAClB;AAGA,MAAI,KAAK,YAAY,SAAS;AAC5B,aAAS,KAAK,uBAAuB;AACrC,aAAS,KAAK,EAAE;AAAA,EAClB;AAEA,SAAO;AACT;AAEO,SAAS,SAAS,MAAwB,YAAuB;AAEtE,QAAM,WAAqB,CAAC;AAC5B,QAAM,cAAc,IAAI,YAAY,IAAI;AAExC,WAAS,KAAK,iBAAiB;AAC/B,WAAS,KAAK,EAAE;AAChB,WAAS;AAAA,IACP;AAAA,EACF;AACA,WAAS,KAAK,EAAE;AAChB,WAAS,QAAQ,GAAG,wBAAwB,IAAI,CAAC;AACjD,WAAS,KAAK,EAAE;AAChB,WAAS,KAAK,UAAU,WAAW,OAAO,IAAI,OAAO;AACrD,WAAS,KAAK,EAAE;AAEhB,mBAAiB,MAAM,CAAC,OAAO,cAAc;AAC3C,UAAM,EAAE,QAAQ,KAAK,IAAI;AACzB,aAAS;AAAA,MACP,QAAQ,UAAU,WAAW,CAAC,MAAM,IAAI,OAAO,YAAY,CAAC,IAAI,IAAI,GAAG;AAAA,IACzE;AACA,aAAS,KAAK,UAAU,WAAW,EAAE;AAErC,UAAM,UAAU,WAAW,QAAQ,OAAO,SAAS;AACnD,aAAS,KAAK,qBAAqB;AACnC,aAAS,KAAK,OAAO;AAGrB,UAAM,qBAAqB,YAAY,YAAY,UAAU,WAAW;AACxE,QAAI,mBAAmB,SAAS,GAAG;AAEjC,eAAS,KAAK,mBAAmB,KAAK,MAAM,CAAC;AAAA,IAC/C;AAEA,aAAS,KAAK,iBAAiB;AAC/B,eAAW,UAAU,UAAU,WAAW;AACxC,YAAM,WAAW,UAAU,UAAU,MAAM;AAE3C,eAAS,KAAK,WAAW;AACzB,eAAS;AAAA,QACP,eAAe,MAAM,YAAY,SAAS,WAAW;AAAA,MACvD;AACA,UAAI,CAAC,QAAQ,SAAS,OAAO,GAAG;AAC9B,mBAAW,CAAC,aAAa,SAAS,KAAK,OAAO;AAAA,UAC5C,SAAS;AAAA,QACX,GAAG;AACD,mBAAS,KAAK;AAAA,sBAAyB,WAAW,IAAI;AACtD,cAAI,UAAU,QAAQ;AACpB,kBAAM,aAAa,YAAY,OAAO,UAAU,MAAM;AAEtD,qBAAS,KAAK,GAAG,WAAW,IAAI,CAAC,MAAM;AAAA,EAAK,CAAC,EAAE,CAAC;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AACA,eAAS,KAAK,YAAY;AAAA,IAC5B;AAAA,EACF,CAAC;AACD,MAAI,KAAK,YAAY,SAAS;AAC5B,aAAS,KAAK,YAAY;AAC1B,aAAS,KAAK,EAAE;AAEhB,eAAW,CAAC,YAAY,MAAM,KAAK,OAAO;AAAA,MACxC,KAAK,WAAW;AAAA,IAClB,GAAG;AAED,UAAI,eAAe,mBAAmB;AACpC;AAAA,MACF;AAEA,eAAS,KAAK,WAAW;AACzB,eAAS;AAAA,QACP,oBAAoB,WAAW,YAAY,CAAC,KAAK,UAAU;AAAA,MAC7D;AACA,eAAS,KAAK,EAAE;AAEhB,YAAM,aAAa,YAAY,OAAO,MAAM;AAC5C,eAAS,KAAK,GAAG,WAAW,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC;AAEtD,eAAS,KAAK,EAAE;AAChB,eAAS,KAAK,YAAY;AAC1B,eAAS,KAAK,EAAE;AAAA,IAClB;AAAA,EACF;AAIA,SAAO,SAAS,KAAK,MAAM;AAC7B;",
4
+ "sourcesContent": ["import { isEmpty } from '@sdk-it/core';\nimport {\n type OurOpenAPIObject,\n forEachOperation,\n toSidebar,\n} from '@sdk-it/spec';\n\nimport type { Generator } from './generator.ts';\nimport { PropEmitter } from './prop.emitter.ts';\n\nfunction toTOC(spec: OurOpenAPIObject) {\n const tocLines: string[] = [];\n const sidebar = toSidebar(spec);\n const contents: string[] = [];\n\n for (const category of sidebar) {\n if (category.category) {\n tocLines.push(`### ${category.category}`);\n tocLines.push('');\n }\n\n for (const item of category.items) {\n if (item.id === 'generated-introduction') continue;\n\n contents.push(item.content || '');\n if (item.items && item.items.length > 0) {\n // This is a tag/group with operations\n tocLines.push(`- **${item.title}**`);\n\n // Add each operation in this tag\n for (const subItem of item.items) {\n // Create anchor that matches the markdown header format\n const anchor = `#${subItem.title\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/\\s+/g, '-')}`;\n tocLines.push(` - [${subItem.title}](${anchor})`);\n }\n } else {\n // This might be a standalone item\n tocLines.push(`- **${item.title}**`);\n }\n }\n tocLines.push('');\n }\n\n if (spec.components?.schemas) {\n tocLines.push('- [Schemas](#schemas)');\n tocLines.push('');\n }\n\n return { tocLines, contents };\n}\n\nexport function toReadme(spec: OurOpenAPIObject, generators: Generator) {\n const propEmitter = new PropEmitter(spec);\n const toc = toTOC(spec);\n const markdown: string[] = [];\n\n const generatedIntro = spec['x-docs']\n .flatMap((it) => it.items)\n .find((doc) => doc.id === 'generated-introduction');\n\n if (generatedIntro && generatedIntro.content) {\n markdown.push(generatedIntro.content);\n }\n\n markdown.push('---');\n markdown.push('## Table of Contents');\n markdown.push(...toc.tocLines);\n markdown.push('---');\n\n markdown.push(\n 'This document provides an overview of the API endpoints available in this service. Each endpoint includes a brief description, example usage, and details about request and response formats.',\n );\n markdown.push('');\n markdown.push('');\n markdown.push('```ts\\n' + generators.client() + '\\n```');\n markdown.push('');\n\n markdown.push(toc.contents.join('\\n\\n'));\n\n forEachOperation(spec, (entry, operation) => {\n const { method, path } = entry;\n markdown.push(\n `#### ${operation['x-fn-name']} | ${`_${method.toUpperCase()} ${path}_`}`,\n );\n markdown.push(operation.summary || '');\n\n const snippet = generators.snippet(entry, operation);\n markdown.push(`##### Example usage`);\n markdown.push(snippet);\n\n // Process request body using the refactored emitter\n const requestBodyContent = propEmitter.requestBody(operation.requestBody);\n if (requestBodyContent.length > 1) {\n // Check if more than just the header was added\n markdown.push(requestBodyContent.join('\\n\\n'));\n }\n\n markdown.push(`##### Responses`);\n for (const status in operation.responses) {\n const response = operation.responses[status];\n // Wrap each response in its own toggle\n markdown.push(`<details>`);\n markdown.push(\n `<summary><b>${status}</b> <i>${response.description}</i></summary>`,\n );\n if (!isEmpty(response.content)) {\n for (const [contentType, mediaType] of Object.entries(\n response.content,\n )) {\n markdown.push(`\\n**Content Type:** \\`${contentType}\\``);\n if (mediaType.schema) {\n const schemaDocs = propEmitter.handle(mediaType.schema);\n // hide emitter output under the toggle\n markdown.push(...schemaDocs.map((l) => `\\n${l}`));\n }\n }\n }\n markdown.push(`</details>`);\n }\n }); // Add schemas section at the bottom\n if (spec.components?.schemas) {\n markdown.push('## Schemas');\n markdown.push('');\n\n for (const [schemaName, schema] of Object.entries(\n spec.components.schemas,\n )) {\n // Include all schemas except ValidationError which is internal\n if (schemaName === 'ValidationError') {\n continue;\n }\n\n markdown.push(`<details>`);\n markdown.push(\n `<summary><h3 id=\"${schemaName.toLowerCase()}\">${schemaName}</h3></summary>`,\n );\n markdown.push('');\n\n const schemaDocs = propEmitter.handle(schema);\n markdown.push(...schemaDocs.map((line) => line.trim()));\n\n markdown.push('');\n markdown.push(`</details>`);\n markdown.push('');\n }\n }\n\n // Generate Table of Contents\n\n return markdown.join('\\n\\n');\n}\n", "import type {\n OpenAPIObject,\n ReferenceObject,\n RequestBodyObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\n\nimport { followRef, isRef } from '@sdk-it/core';\nimport { coerceTypes } from '@sdk-it/spec';\n\n/**\n * PropEmitter handles converting OpenAPI schemas to Markdown documentation\n */\nexport class PropEmitter {\n #spec: OpenAPIObject;\n\n constructor(spec: OpenAPIObject) {\n this.#spec = spec;\n }\n\n /**\n * Handle objects (properties)\n */\n #object(schema: SchemaObject): string[] {\n const lines: string[] = [];\n const properties = schema.properties || {};\n\n if (Object.keys(properties).length > 0) {\n lines.push(`**Properties:**`);\n\n for (const [propName, propSchema] of Object.entries(properties)) {\n const isRequired = (schema.required ?? []).includes(propName);\n lines.push(...this.#property(propName, propSchema, isRequired));\n }\n }\n\n // Handle additionalProperties\n if (schema.additionalProperties) {\n lines.push(`**Additional Properties:**`);\n if (typeof schema.additionalProperties === 'boolean') {\n lines.push(`- Allowed: ${schema.additionalProperties}`);\n } else {\n // Indent the schema documentation for additional properties\n lines.push(\n ...this.handle(schema.additionalProperties).map((l) => ` ${l}`),\n );\n }\n }\n\n return lines;\n }\n\n /**\n * Format a property with its type and description\n */\n #property(\n name: string,\n schema: SchemaObject | ReferenceObject,\n required: boolean,\n ): string[] {\n // get full docs and extract the type line\n const docs = this.handle(schema);\n const rawType = docs[0]\n .replace('**Type:** ', '')\n .replace(' (nullable)', '|null');\n\n // detect default if present on the schema\n const defaultVal =\n !isRef(schema) && (schema as SchemaObject).default !== undefined\n ? ` default: ${JSON.stringify((schema as SchemaObject).default)}`\n : '';\n\n // build summary line\n const reqMark = required ? ' required' : '';\n const summary = `- \\`${name}\\` ${rawType}${reqMark}${defaultVal}:`;\n\n // assemble final lines (skip the type and any default in details)\n const detailLines = docs\n .slice(1)\n .filter((l) => !l.startsWith('**Default:**'))\n .map((l) => ` ${l}`);\n\n return [summary, ...detailLines];\n }\n\n /**\n * Handle array schemas\n */\n #array(schema: SchemaObject): string[] {\n const lines: string[] = [];\n lines.push(`**Array items:**`);\n\n if (schema.items) {\n // Get documentation for the items schema\n const itemDocs = this.handle(schema.items);\n // Indent item documentation\n lines.push(...itemDocs.map((line) => ` ${line}`));\n } else {\n lines.push(` **Type:** \\`unknown\\``); // Array of unknown items\n }\n // Add array constraints\n if (schema.minItems !== undefined)\n lines.push(`- Minimum items: ${schema.minItems}`);\n if (schema.maxItems !== undefined)\n lines.push(`- Maximum items: ${schema.maxItems}`);\n if (schema.uniqueItems) lines.push(`- Items must be unique.`);\n\n return lines;\n }\n\n #ref($ref: string): string[] {\n const schemaName = $ref.split('/').pop() || 'object';\n const resolved = followRef<SchemaObject>(this.#spec, $ref);\n // Link to the schema definition (assuming heading anchors are generated elsewhere)\n const lines = [\n `**Type:** [\\`${schemaName}\\`](#${schemaName.toLowerCase()})`,\n ];\n if (resolved.description) {\n lines.push(resolved.description);\n }\n // Avoid deep recursion by default, just link and show description.\n // If more detail is needed, the linked definition should provide it.\n return lines;\n }\n\n #allOf(schemas: (SchemaObject | ReferenceObject)[]): string[] {\n const lines = ['**All of (Intersection):**'];\n schemas.forEach((subSchema, index) => {\n lines.push(`- **Constraint ${index + 1}:**`);\n const subLines = this.handle(subSchema);\n lines.push(...subLines.map((l) => ` ${l}`)); // Indent sub-schema docs\n });\n return lines;\n }\n\n #anyOf(schemas: (SchemaObject | ReferenceObject)[]): string[] {\n const lines = ['**Any of (Union):**'];\n schemas.forEach((subSchema, index) => {\n lines.push(`- **Option ${index + 1}:**`);\n const subLines = this.handle(subSchema);\n lines.push(...subLines.map((l) => ` ${l}`));\n });\n return lines;\n }\n\n #oneOf(schemas: (SchemaObject | ReferenceObject)[]): string[] {\n const lines = ['**One of (Exclusive Union):**'];\n schemas.forEach((subSchema, index) => {\n lines.push(`- **Option ${index + 1}:**`);\n const subLines = this.handle(subSchema);\n lines.push(...subLines.map((l) => ` ${l}`));\n });\n return lines;\n }\n\n #enum(schema: SchemaObject): string[] {\n const lines = [`**Type:** \\`${schema.type || 'unknown'}\\` (enum)`];\n if (schema.description) lines.push(schema.description);\n lines.push('**Allowed values:**');\n lines.push(\n ...(schema.enum || []).map((val) => `- \\`${JSON.stringify(val)}\\``),\n );\n if (schema.default !== undefined) {\n lines.push(`**Default:** \\`${JSON.stringify(schema.default)}\\``);\n }\n return lines;\n }\n\n #normal(type: string, schema: SchemaObject, nullable: boolean): string[] {\n const lines: string[] = [];\n const nullableSuffix = nullable ? ' (nullable)' : '';\n const description = schema.description ? [schema.description] : [];\n\n switch (type) {\n case 'string':\n lines.push(\n `**Type:** \\`string\\`${schema.format ? ` (format: ${schema.format})` : ''}${nullableSuffix}`,\n );\n lines.push(...description);\n if (schema.minLength !== undefined)\n lines.push(`- Minimum length: ${schema.minLength}`);\n if (schema.maxLength !== undefined)\n lines.push(`- Maximum length: ${schema.maxLength}`);\n if (schema.pattern !== undefined)\n lines.push(`- Pattern: \\`${schema.pattern}\\``);\n break;\n case 'number':\n case 'integer':\n lines.push(\n `**Type:** \\`${type}\\`${schema.format ? ` (format: ${schema.format})` : ''}${nullableSuffix}`,\n );\n lines.push(...description);\n // Add number constraints (OpenAPI 3.1)\n if (schema.minimum !== undefined) {\n // Check if exclusiveMinimum is a number (OAS 3.1)\n const exclusiveMin = typeof schema.exclusiveMinimum === 'number';\n lines.push(\n `- Minimum: ${schema.minimum}${exclusiveMin ? ' (exclusive)' : ''}`,\n );\n if (exclusiveMin) {\n lines.push(\n `- Must be strictly greater than: ${schema.exclusiveMinimum}`,\n );\n }\n } else if (typeof schema.exclusiveMinimum === 'number') {\n lines.push(\n `- Must be strictly greater than: ${schema.exclusiveMinimum}`,\n );\n }\n\n if (schema.maximum !== undefined) {\n // Check if exclusiveMaximum is a number (OAS 3.1)\n const exclusiveMax = typeof schema.exclusiveMaximum === 'number';\n lines.push(\n `- Maximum: ${schema.maximum}${exclusiveMax ? ' (exclusive)' : ''}`,\n );\n if (exclusiveMax) {\n lines.push(\n `- Must be strictly less than: ${schema.exclusiveMaximum}`,\n );\n }\n } else if (typeof schema.exclusiveMaximum === 'number') {\n lines.push(\n `- Must be strictly less than: ${schema.exclusiveMaximum}`,\n );\n }\n if (schema.multipleOf !== undefined)\n lines.push(`- Must be a multiple of: ${schema.multipleOf}`);\n break;\n case 'boolean':\n lines.push(`**Type:** \\`boolean\\`${nullableSuffix}`);\n lines.push(...description);\n break;\n case 'object':\n lines.push(`**Type:** \\`object\\`${nullableSuffix}`);\n lines.push(...description);\n lines.push(...this.#object(schema));\n break;\n case 'array':\n lines.push(`**Type:** \\`array\\`${nullableSuffix}`);\n lines.push(...description);\n lines.push(...this.#array(schema));\n break;\n case 'null':\n lines.push(`**Type:** \\`null\\``);\n lines.push(...description);\n break;\n default:\n lines.push(`**Type:** \\`${type}\\`${nullableSuffix}`);\n lines.push(...description);\n }\n if (schema.default !== undefined) {\n lines.push(`**Default:** \\`${JSON.stringify(schema.default)}\\``);\n }\n return lines.filter((l) => l); // Filter out empty description lines\n }\n\n /**\n * Handle schemas by resolving references and delegating to appropriate handler\n */\n public handle(schemaOrRef: SchemaObject | ReferenceObject): string[] {\n if (isRef(schemaOrRef)) {\n return this.#ref(schemaOrRef.$ref);\n }\n\n const schema = schemaOrRef;\n\n // Handle composition keywords first\n if (schema.allOf && Array.isArray(schema.allOf)) {\n return this.#allOf(schema.allOf);\n }\n if (schema.anyOf && Array.isArray(schema.anyOf)) {\n return this.#anyOf(schema.anyOf);\n }\n if (schema.oneOf && Array.isArray(schema.oneOf)) {\n return this.#oneOf(schema.oneOf);\n }\n\n // Handle enums\n if (schema.enum && Array.isArray(schema.enum)) {\n return this.#enum(schema);\n }\n\n // Determine type(s) and nullability\n let types = coerceTypes(schema);\n let nullable = false; // Default to false\n\n if (types.includes('null')) {\n nullable = true;\n types = types.filter((t) => t !== 'null');\n }\n\n // Infer type if not explicitly set\n if (types.length === 0) {\n if (schema.properties || schema.additionalProperties) {\n types = ['object'];\n } else if (schema.items) {\n types = ['array'];\n }\n // Add other inferences if needed (e.g., based on format)\n }\n\n // If still no type, treat as unknown or any\n if (types.length === 0) {\n const lines = ['**Type:** `unknown`'];\n if (schema.description) lines.push(schema.description);\n if (schema.default !== undefined)\n lines.push(`**Default:** \\`${JSON.stringify(schema.default)}\\``);\n return lines;\n }\n\n // Handle single type (potentially nullable)\n if (types.length === 1) {\n return this.#normal(types[0], schema, nullable);\n }\n\n // Handle union of multiple non-null types (potentially nullable overall)\n const typeString = types.join(' | ');\n const nullableSuffix = nullable ? ' (nullable)' : '';\n const lines = [`**Type:** \\`${typeString}\\`${nullableSuffix}`];\n if (schema.description) lines.push(schema.description);\n if (schema.default !== undefined)\n lines.push(`**Default:** \\`${JSON.stringify(schema.default)}\\``);\n return lines;\n }\n\n /**\n * Process a request body and return markdown documentation\n */\n requestBody(requestBody?: RequestBodyObject): string[] {\n if (!requestBody) return [];\n\n const lines: string[] = [];\n lines.push(`##### Request Body`);\n\n if (requestBody.description) {\n lines.push(requestBody.description);\n }\n\n if (requestBody.content) {\n const contentEntries = Object.entries(requestBody.content);\n\n // If only one content type, show it directly without toggles\n if (contentEntries.length === 1) {\n const [contentType, mediaType] = contentEntries[0];\n lines.push(`**Content Type:** \\`${contentType}\\``);\n\n if (mediaType.schema) {\n const schemaDocs = this.handle(mediaType.schema);\n lines.push(...schemaDocs);\n }\n } else {\n // Multiple content types - use collapsible toggles\n for (const [contentType, mediaType] of contentEntries) {\n lines.push(`<details>`);\n lines.push(\n `<summary><b>Content Type:</b> \\`${contentType}\\`</summary>`,\n );\n lines.push('');\n\n if (mediaType.schema) {\n const schemaDocs = this.handle(mediaType.schema);\n lines.push(...schemaDocs.map((l) => l));\n }\n\n lines.push('');\n lines.push(`</details>`);\n }\n }\n }\n\n return lines;\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["lines"]
7
7
  }
@@ -2,5 +2,18 @@ import type { OperationEntry, TunedOperationObject } from '@sdk-it/spec/types.js
2
2
  export interface Generator {
3
3
  client(): string;
4
4
  snippet(entry: OperationEntry, operation: TunedOperationObject): string;
5
+ clientSetupDocs(): string;
6
+ clientInstallDocs(): string;
7
+ configurationOptions(): {
8
+ sections: string[];
9
+ hasServers: boolean;
10
+ baseUrl: string;
11
+ hasApiKey: boolean;
12
+ };
13
+ configurationUpdateDocs(): string;
14
+ paginationDocs(): string;
15
+ errorHandlingDocs(): string;
16
+ authenticationDocs(): string;
17
+ generalUsageDocs(): string;
5
18
  }
6
19
  //# sourceMappingURL=generator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/lib/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACrB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,SAAS;IACxB,MAAM,IAAI,MAAM,CAAC;IACjB,OAAO,CAAC,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,oBAAoB,GAAG,MAAM,CAAC;CACzE"}
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/lib/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACrB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,SAAS;IACxB,MAAM,IAAI,MAAM,CAAC;IACjB,OAAO,CAAC,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,oBAAoB,GAAG,MAAM,CAAC;IACxE,eAAe,IAAI,MAAM,CAAC;IAC1B,iBAAiB,IAAI,MAAM,CAAC;IAC5B,oBAAoB,IAAI;QACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,uBAAuB,IAAI,MAAM,CAAC;IAClC,cAAc,IAAI,MAAM,CAAC;IACzB,iBAAiB,IAAI,MAAM,CAAC;IAC5B,kBAAkB,IAAI,MAAM,CAAC;IAC7B,gBAAgB,IAAI,MAAM,CAAC;CAC5B"}
@@ -1,7 +1,6 @@
1
1
  import type { OpenAPIObject, ReferenceObject, RequestBodyObject, SchemaObject } from 'openapi3-ts/oas31';
2
2
  /**
3
3
  * PropEmitter handles converting OpenAPI schemas to Markdown documentation
4
- * Similar structure to ZodDeserializer but for generating markdown props documentation
5
4
  */
6
5
  export declare class PropEmitter {
7
6
  #private;
@@ -1 +1 @@
1
- {"version":3,"file":"prop.emitter.d.ts","sourceRoot":"","sources":["../../src/lib/prop.emitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,YAAY,EACb,MAAM,mBAAmB,CAAC;AAK3B;;;GAGG;AACH,qBAAa,WAAW;;gBAGV,IAAI,EAAE,aAAa;IAiP/B;;OAEG;IACI,MAAM,CAAC,WAAW,EAAE,YAAY,GAAG,eAAe,GAAG,MAAM,EAAE;IAkEpE;;OAEG;IACH,WAAW,CAAC,WAAW,CAAC,EAAE,iBAAiB,GAAG,MAAM,EAAE;CA4CvD"}
1
+ {"version":3,"file":"prop.emitter.d.ts","sourceRoot":"","sources":["../../src/lib/prop.emitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,YAAY,EACb,MAAM,mBAAmB,CAAC;AAK3B;;GAEG;AACH,qBAAa,WAAW;;gBAGV,IAAI,EAAE,aAAa;IAiP/B;;OAEG;IACI,MAAM,CAAC,WAAW,EAAE,YAAY,GAAG,eAAe,GAAG,MAAM,EAAE;IAkEpE;;OAEG;IACH,WAAW,CAAC,WAAW,CAAC,EAAE,iBAAiB,GAAG,MAAM,EAAE;CA4CvD"}
@@ -1 +1 @@
1
- {"version":3,"file":"readme.d.ts","sourceRoot":"","sources":["../../src/lib/readme.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,gBAAgB,EAGtB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAmDhD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,EAAE,UAAU,EAAE,SAAS,UAuFrE"}
1
+ {"version":3,"file":"readme.d.ts","sourceRoot":"","sources":["../../src/lib/readme.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,gBAAgB,EAGtB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AA+ChD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,EAAE,UAAU,EAAE,SAAS,UAmGrE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sdk-it/readme",
3
- "version": "0.26.0",
3
+ "version": "0.27.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -21,7 +21,7 @@
21
21
  "!**/*.tsbuildinfo"
22
22
  ],
23
23
  "dependencies": {
24
- "@sdk-it/core": "0.26.0",
25
- "@sdk-it/spec": "0.26.0"
24
+ "@sdk-it/core": "0.27.0",
25
+ "@sdk-it/spec": "0.27.0"
26
26
  }
27
27
  }