fumadocs-openapi 10.4.1 → 10.6.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.
Files changed (129) hide show
  1. package/css/generated/shared.css +34 -22
  2. package/dist/generate-file.d.ts +21 -3
  3. package/dist/generate-file.d.ts.map +1 -1
  4. package/dist/generate-file.js +74 -28
  5. package/dist/generate-file.js.map +1 -1
  6. package/dist/index.d.ts +2 -2
  7. package/dist/playground/client.d.ts +27 -7
  8. package/dist/playground/client.d.ts.map +1 -1
  9. package/dist/playground/client.js +51 -44
  10. package/dist/playground/client.js.map +1 -1
  11. package/dist/playground/components/inputs.js +1 -1
  12. package/dist/playground/components/inputs.js.map +1 -1
  13. package/dist/playground/components/server-select.js +3 -4
  14. package/dist/playground/components/server-select.js.map +1 -1
  15. package/dist/playground/index.d.ts +1 -1
  16. package/dist/playground/index.d.ts.map +1 -1
  17. package/dist/playground/index.js +2 -2
  18. package/dist/playground/index.js.map +1 -1
  19. package/dist/playground/schema.d.ts +0 -1
  20. package/dist/playground/schema.d.ts.map +1 -1
  21. package/dist/playground/schema.js +11 -13
  22. package/dist/playground/schema.js.map +1 -1
  23. package/dist/requests/generators/python.d.ts +2 -1
  24. package/dist/requests/generators/python.d.ts.map +1 -1
  25. package/dist/requests/generators/python.js +13 -2
  26. package/dist/requests/generators/python.js.map +1 -1
  27. package/dist/requests/media/adapter.js +1 -1
  28. package/dist/requests/string-utils.js +1 -1
  29. package/dist/scalar/index.d.ts +2 -1
  30. package/dist/scalar/index.d.ts.map +1 -1
  31. package/dist/server/create.d.ts +2 -0
  32. package/dist/server/create.d.ts.map +1 -1
  33. package/dist/server/create.js +11 -8
  34. package/dist/server/create.js.map +1 -1
  35. package/dist/server/source-api.d.ts +9 -3
  36. package/dist/server/source-api.d.ts.map +1 -1
  37. package/dist/server/source-api.js +65 -6
  38. package/dist/server/source-api.js.map +1 -1
  39. package/dist/types.d.ts +2 -4
  40. package/dist/types.d.ts.map +1 -1
  41. package/dist/ui/api-page.d.ts +2 -2
  42. package/dist/ui/api-page.d.ts.map +1 -1
  43. package/dist/ui/api-page.js +4 -6
  44. package/dist/ui/api-page.js.map +1 -1
  45. package/dist/ui/base.d.ts +20 -16
  46. package/dist/ui/base.d.ts.map +1 -1
  47. package/dist/ui/base.js +18 -9
  48. package/dist/ui/base.js.map +1 -1
  49. package/dist/ui/{full.client.js → client/full.js} +3 -3
  50. package/dist/ui/client/full.js.map +1 -0
  51. package/dist/ui/client/index.d.ts +1 -1
  52. package/dist/ui/client/index.js.map +1 -1
  53. package/dist/ui/client/storage-key.js.map +1 -1
  54. package/dist/ui/components/server-tab.js +43 -0
  55. package/dist/ui/components/server-tab.js.map +1 -0
  56. package/dist/ui/contexts/api.js +18 -35
  57. package/dist/ui/contexts/api.js.map +1 -1
  58. package/dist/ui/create-client.d.ts +26 -0
  59. package/dist/ui/create-client.d.ts.map +1 -0
  60. package/dist/ui/create-client.js +132 -0
  61. package/dist/ui/create-client.js.map +1 -0
  62. package/dist/ui/index.d.ts +10 -2
  63. package/dist/ui/index.d.ts.map +1 -0
  64. package/dist/ui/index.js +21 -1
  65. package/dist/ui/index.js.map +1 -0
  66. package/dist/ui/operation/client.js +44 -36
  67. package/dist/ui/operation/client.js.map +1 -1
  68. package/dist/ui/operation/{request-tabs.d.ts → get-example-requests.d.ts} +2 -3
  69. package/dist/ui/operation/get-example-requests.d.ts.map +1 -0
  70. package/dist/ui/operation/get-example-requests.js +83 -0
  71. package/dist/ui/operation/get-example-requests.js.map +1 -0
  72. package/dist/ui/operation/index.js +101 -63
  73. package/dist/ui/operation/index.js.map +1 -1
  74. package/dist/ui/operation/request-tabs.js +3 -81
  75. package/dist/ui/operation/request-tabs.js.map +1 -1
  76. package/dist/ui/operation/response-tabs.d.ts +1 -1
  77. package/dist/ui/operation/response-tabs.js +57 -54
  78. package/dist/ui/operation/response-tabs.js.map +1 -1
  79. package/dist/ui/operation/usage-tabs/client.js +7 -48
  80. package/dist/ui/operation/usage-tabs/client.js.map +1 -1
  81. package/dist/ui/operation/usage-tabs/index.js +14 -10
  82. package/dist/ui/operation/usage-tabs/index.js.map +1 -1
  83. package/dist/ui/operation/usage-tabs/lazy.js +1 -2
  84. package/dist/ui/operation/usage-tabs/lazy.js.map +1 -1
  85. package/dist/ui/schema/client.d.ts +1 -0
  86. package/dist/ui/schema/client.d.ts.map +1 -1
  87. package/dist/ui/schema/index.d.ts +2 -1
  88. package/dist/ui/schema/index.d.ts.map +1 -1
  89. package/dist/ui/schema/index.js +4 -2
  90. package/dist/ui/schema/index.js.map +1 -1
  91. package/dist/utils/pages/builder.d.ts +10 -11
  92. package/dist/utils/pages/builder.d.ts.map +1 -1
  93. package/dist/utils/pages/builder.js +30 -31
  94. package/dist/utils/pages/builder.js.map +1 -1
  95. package/dist/utils/pages/preset-auto.d.ts +6 -5
  96. package/dist/utils/pages/preset-auto.d.ts.map +1 -1
  97. package/dist/utils/pages/preset-auto.js +97 -35
  98. package/dist/utils/pages/preset-auto.js.map +1 -1
  99. package/dist/utils/pages/to-text.d.ts.map +1 -1
  100. package/dist/utils/pages/to-text.js +4 -12
  101. package/dist/utils/pages/to-text.js.map +1 -1
  102. package/dist/utils/process-document.d.ts +1 -1
  103. package/dist/utils/process-document.js +1 -32
  104. package/dist/utils/process-document.js.map +1 -1
  105. package/dist/utils/schema/dereference.js +37 -0
  106. package/dist/utils/schema/dereference.js.map +1 -0
  107. package/dist/utils/{schema.d.ts → schema/index.d.ts} +3 -3
  108. package/dist/utils/schema/index.d.ts.map +1 -0
  109. package/dist/utils/{schema.js → schema/index.js} +3 -3
  110. package/dist/utils/schema/index.js.map +1 -0
  111. package/dist/utils/schema/resolve-ref.js +21 -0
  112. package/dist/utils/schema/resolve-ref.js.map +1 -0
  113. package/dist/utils/{schema-to-string.js → schema/to-string.js} +2 -2
  114. package/dist/utils/schema/to-string.js.map +1 -0
  115. package/package.json +10 -9
  116. package/dist/requests/to-python-object.js +0 -17
  117. package/dist/requests/to-python-object.js.map +0 -1
  118. package/dist/ui/full.client.js.map +0 -1
  119. package/dist/ui/full.d.ts +0 -11
  120. package/dist/ui/full.d.ts.map +0 -1
  121. package/dist/ui/full.js +0 -36
  122. package/dist/ui/full.js.map +0 -1
  123. package/dist/ui/operation/request-tabs.d.ts.map +0 -1
  124. package/dist/utils/pages/to-body.js +0 -22
  125. package/dist/utils/pages/to-body.js.map +0 -1
  126. package/dist/utils/schema-to-string.js.map +0 -1
  127. package/dist/utils/schema.d.ts.map +0 -1
  128. package/dist/utils/schema.js.map +0 -1
  129. /package/dist/utils/{schema-to-string.d.ts → schema/to-string.d.ts} +0 -0
@@ -1,7 +1,7 @@
1
- import { ReferenceObject } from "../types.js";
1
+ import { ReferenceObject } from "../../types.js";
2
2
  import { JSONSchema } from "json-schema-typed/draft-2020-12";
3
3
 
4
- //#region src/utils/schema.d.ts
4
+ //#region src/utils/schema/index.d.ts
5
5
  type NoReference<T> = T extends (infer I)[] ? NoReference<I>[] : T extends ReferenceObject ? Exclude<T, ReferenceObject> : T extends object ? { [K in keyof T]: NoReference<T[K]> } : T;
6
6
  type NoReferenceJSONSchema<T> = T extends (infer I)[] ? NoReference<I>[] : T extends {
7
7
  $ref?: string;
@@ -12,4 +12,4 @@ type ParsedSchema = (JSONSchema & {
12
12
  type ResolvedSchema = NoReferenceJSONSchema<ParsedSchema>;
13
13
  //#endregion
14
14
  export { NoReference, ParsedSchema, ResolvedSchema };
15
- //# sourceMappingURL=schema.d.ts.map
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/utils/schema/index.ts"],"mappings":";;;;KAcY,WAAA,MAAiB,CAAA,uBACzB,WAAA,CAAY,CAAA,MACZ,CAAA,SAAU,eAAA,GACR,OAAA,CAAQ,CAAA,EAAG,eAAA,IACX,CAAA,gCAEgB,CAAA,GAAI,WAAA,CAAY,CAAA,CAAE,CAAA,OAEhC,CAAA;AAAA,KAEH,qBAAA,MAA2B,CAAA,uBAC5B,WAAA,CAAY,CAAA,MACZ,CAAA;EAAY,IAAA;AAAA,IACV,IAAA,CAAK,CAAA,YACL,CAAA;AAAA,KAEM,YAAA,IACP,UAAA;EACC,mBAAA;AAAA;AAAA,KAGM,cAAA,GAAiB,qBAAA,CAAsB,YAAA"}
@@ -1,5 +1,5 @@
1
- import { idToTitle } from "./id-to-title.js";
2
- //#region src/utils/schema.ts
1
+ import { idToTitle } from "../id-to-title.js";
2
+ //#region src/utils/schema/index.ts
3
3
  const methodKeys = [
4
4
  "get",
5
5
  "post",
@@ -48,4 +48,4 @@ function pickExample(value) {
48
48
  //#endregion
49
49
  export { createMethod, getPreferredType, getTagDisplayName, methodKeys, pickExample };
50
50
 
51
- //# sourceMappingURL=schema.js.map
51
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/utils/schema/index.ts"],"sourcesContent":["import type { JSONSchema } from 'json-schema-typed/draft-2020-12';\nimport type {\n ExampleObject,\n MediaTypeObject,\n MethodInformation,\n OperationObject,\n PathItemObject,\n ReferenceObject,\n TagObject,\n} from '@/types';\nimport { idToTitle } from '@/utils/id-to-title';\n\nexport const methodKeys = ['get', 'post', 'patch', 'delete', 'head', 'put'] as const;\n\nexport type NoReference<T> = T extends (infer I)[]\n ? NoReference<I>[]\n : T extends ReferenceObject\n ? Exclude<T, ReferenceObject>\n : T extends object\n ? {\n [K in keyof T]: NoReference<T[K]>;\n }\n : T;\n\ntype NoReferenceJSONSchema<T> = T extends (infer I)[]\n ? NoReference<I>[]\n : T extends { $ref?: string }\n ? Omit<T, '$ref'>\n : T;\n\nexport type ParsedSchema =\n | (JSONSchema & {\n 'x-playground-lazy'?: boolean;\n })\n | boolean;\nexport type ResolvedSchema = NoReferenceJSONSchema<ParsedSchema>;\n\nexport function getPreferredType(body: Record<string, unknown>): string | undefined {\n if ('application/json' in body) return 'application/json';\n\n return Object.keys(body)[0];\n}\n\nexport function getTagDisplayName(tag: TagObject): string {\n if ('x-displayName' in tag && typeof tag['x-displayName'] === 'string')\n return tag['x-displayName'];\n\n if (tag.summary) return tag.summary;\n return idToTitle(tag.name!);\n}\n\n/**\n * Summarize method endpoint information\n */\nexport function createMethod(\n method: string,\n path: NoReference<PathItemObject>,\n operation: NoReference<OperationObject>,\n): MethodInformation {\n return {\n description: path.description,\n summary: path.summary,\n ...operation,\n servers: operation.servers ?? path.servers,\n parameters: [...(operation.parameters ?? []), ...(path.parameters ?? [])],\n method: method.toUpperCase(),\n };\n}\n\ninterface ExampleLike {\n example?: unknown;\n examples?: {\n [media: string]: ExampleObject;\n };\n content?: {\n [media: string]: MediaTypeObject;\n };\n}\n\nexport function pickExample(value: ExampleLike): unknown | undefined {\n if (value.example !== undefined) {\n return value.example;\n }\n\n if (value.content) {\n const type = getPreferredType(value.content);\n const content = type ? value.content[type] : undefined;\n\n if (type && content) {\n const out = value.examples?.[type].value ?? pickExample(content);\n if (out !== undefined) return out;\n }\n }\n\n if (value.examples) {\n const examples = Object.values(value.examples);\n if (examples.length > 0) return examples[0].value;\n }\n}\n"],"mappings":";;AAYA,MAAa,aAAa;CAAC;CAAO;CAAQ;CAAS;CAAU;CAAQ;CAAM;AAyB3E,SAAgB,iBAAiB,MAAmD;AAClF,KAAI,sBAAsB,KAAM,QAAO;AAEvC,QAAO,OAAO,KAAK,KAAK,CAAC;;AAG3B,SAAgB,kBAAkB,KAAwB;AACxD,KAAI,mBAAmB,OAAO,OAAO,IAAI,qBAAqB,SAC5D,QAAO,IAAI;AAEb,KAAI,IAAI,QAAS,QAAO,IAAI;AAC5B,QAAO,UAAU,IAAI,KAAM;;;;;AAM7B,SAAgB,aACd,QACA,MACA,WACmB;AACnB,QAAO;EACL,aAAa,KAAK;EAClB,SAAS,KAAK;EACd,GAAG;EACH,SAAS,UAAU,WAAW,KAAK;EACnC,YAAY,CAAC,GAAI,UAAU,cAAc,EAAE,EAAG,GAAI,KAAK,cAAc,EAAE,CAAE;EACzE,QAAQ,OAAO,aAAa;EAC7B;;AAaH,SAAgB,YAAY,OAAyC;AACnE,KAAI,MAAM,YAAY,KAAA,EACpB,QAAO,MAAM;AAGf,KAAI,MAAM,SAAS;EACjB,MAAM,OAAO,iBAAiB,MAAM,QAAQ;EAC5C,MAAM,UAAU,OAAO,MAAM,QAAQ,QAAQ,KAAA;AAE7C,MAAI,QAAQ,SAAS;GACnB,MAAM,MAAM,MAAM,WAAW,MAAM,SAAS,YAAY,QAAQ;AAChE,OAAI,QAAQ,KAAA,EAAW,QAAO;;;AAIlC,KAAI,MAAM,UAAU;EAClB,MAAM,WAAW,OAAO,OAAO,MAAM,SAAS;AAC9C,MAAI,SAAS,SAAS,EAAG,QAAO,SAAS,GAAG"}
@@ -0,0 +1,21 @@
1
+ //#region src/utils/schema/resolve-ref.ts
2
+ function resolveRefSync(ref, schema) {
3
+ if (!ref.startsWith("#")) return;
4
+ const segments = ref.slice(1).split("/");
5
+ let current = schema;
6
+ for (const seg of segments) {
7
+ if (seg.length === 0) continue;
8
+ if (isPlainObject(current)) current = current[seg];
9
+ else return;
10
+ }
11
+ return current;
12
+ }
13
+ function isPlainObject(value) {
14
+ if (typeof value !== "object" || value === null) return false;
15
+ const prototype = Object.getPrototypeOf(value);
16
+ return prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null;
17
+ }
18
+ //#endregion
19
+ export { resolveRefSync };
20
+
21
+ //# sourceMappingURL=resolve-ref.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-ref.js","names":[],"sources":["../../../src/utils/schema/resolve-ref.ts"],"sourcesContent":["import type { JSONSchema } from 'json-schema-typed/draft-2020-12';\n\nexport function resolveRefSync(ref: string, schema: JSONSchema): unknown | undefined {\n if (!ref.startsWith('#')) return;\n const segments = ref.slice(1).split('/');\n let current: unknown = schema;\n\n for (const seg of segments) {\n if (seg.length === 0) continue;\n\n if (isPlainObject(current)) current = current[seg];\n else return;\n }\n\n return current;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return (\n prototype === null ||\n prototype === Object.prototype ||\n Object.getPrototypeOf(prototype) === null\n );\n}\n"],"mappings":";AAEA,SAAgB,eAAe,KAAa,QAAyC;AACnF,KAAI,CAAC,IAAI,WAAW,IAAI,CAAE;CAC1B,MAAM,WAAW,IAAI,MAAM,EAAE,CAAC,MAAM,IAAI;CACxC,IAAI,UAAmB;AAEvB,MAAK,MAAM,OAAO,UAAU;AAC1B,MAAI,IAAI,WAAW,EAAG;AAEtB,MAAI,cAAc,QAAQ,CAAE,WAAU,QAAQ;MACzC;;AAGP,QAAO;;AAGT,SAAS,cAAc,OAAkD;AACvE,KAAI,OAAO,UAAU,YAAY,UAAU,KACzC,QAAO;CAGT,MAAM,YAAY,OAAO,eAAe,MAAM;AAC9C,QACE,cAAc,QACd,cAAc,OAAO,aACrB,OAAO,eAAe,UAAU,KAAK"}
@@ -1,4 +1,4 @@
1
- //#region src/utils/schema-to-string.ts
1
+ //#region src/utils/schema/to-string.ts
2
2
  let FormatFlags = /* @__PURE__ */ function(FormatFlags) {
3
3
  FormatFlags[FormatFlags["None"] = 0] = "None";
4
4
  FormatFlags[FormatFlags["UseAlias"] = 1] = "UseAlias";
@@ -55,4 +55,4 @@ function schemaToString(value, _resolver, flags = FormatFlags.None) {
55
55
  //#endregion
56
56
  export { FormatFlags, schemaToString };
57
57
 
58
- //# sourceMappingURL=schema-to-string.js.map
58
+ //# sourceMappingURL=to-string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-string.js","names":[],"sources":["../../../src/utils/schema/to-string.ts"],"sourcesContent":["import type { ParsedSchema, ResolvedSchema } from '@/utils/schema';\nimport type { ProcessedDocument } from '@/utils/process-document';\n\nexport enum FormatFlags {\n None = 0,\n UseAlias = 1 << 0,\n}\n\ntype Resolver = (schema: ResolvedSchema) => {\n dereferenced: ResolvedSchema;\n raw?: ParsedSchema;\n};\n\nexport function schemaToString(\n value: ResolvedSchema,\n _resolver?: ProcessedDocument | Resolver,\n flags: FormatFlags = FormatFlags.None,\n): string {\n const resolver: Resolver =\n typeof _resolver === 'function'\n ? _resolver\n : (schema) => {\n const ref =\n _resolver && typeof schema === 'object' ? _resolver.getRawRef(schema) : undefined;\n\n return {\n dereferenced: schema,\n raw: ref ? { $ref: ref } : undefined,\n };\n };\n function union(union: readonly ResolvedSchema[], sep: string, flags: FormatFlags) {\n const members = new Set();\n let nullable = false;\n\n for (const item of union) {\n const result = run(item, flags | FormatFlags.UseAlias);\n\n if (result === 'null') {\n nullable = true;\n } else if (result !== 'unknown') {\n members.add(result);\n }\n }\n\n const result = Array.from(members).join(sep);\n return nullable ? `${result} | null` : result;\n }\n\n function run(schema: ResolvedSchema, flags: FormatFlags): string {\n const resolved = resolver(schema);\n schema = resolved.dereferenced;\n\n if (schema === true) return 'any';\n else if (schema === false) return 'never';\n\n if ((flags & FormatFlags.UseAlias) === FormatFlags.UseAlias) {\n if (schema.title) return schema.title;\n\n if (typeof resolved.raw === 'object' && resolved.raw.$ref) {\n const ref = resolved.raw.$ref.split('/');\n if (ref.length > 0) return ref[ref.length - 1];\n }\n }\n\n if (Array.isArray(schema.type)) {\n return union(\n schema.type.map((type) => ({\n ...schema,\n type,\n })),\n ' | ',\n flags,\n );\n }\n\n if (schema.type === 'array')\n return `array<${schema.items ? run(schema.items, flags | FormatFlags.UseAlias) : 'unknown'}>`;\n\n const or = schema.oneOf ?? schema.anyOf;\n if (schema.oneOf && schema.anyOf) {\n return `(${union(schema.oneOf, ' | ', flags)}) & (${union(schema.anyOf, ' | ', flags)})`;\n } else if (or) {\n return union(or, ' | ', flags);\n }\n\n if (schema.allOf) {\n return union(schema.allOf, ' & ', flags);\n }\n\n if (schema.not) return `not ${run(schema.not, flags)}`;\n if (schema.type === 'string' && schema.format === 'binary') return 'file';\n\n if (schema.type && Array.isArray(schema.type)) {\n return schema.type.filter((v) => v !== 'null').join(' | ');\n }\n\n if (schema.type) {\n return schema.type as string;\n }\n\n return 'unknown';\n }\n\n return run(value, flags);\n}\n"],"mappings":";AAGA,IAAY,cAAL,yBAAA,aAAA;AACL,aAAA,YAAA,UAAA,KAAA;AACA,aAAA,YAAA,cAAA,KAAA;;KACD;AAOD,SAAgB,eACd,OACA,WACA,QAAqB,YAAY,MACzB;CACR,MAAM,WACJ,OAAO,cAAc,aACjB,aACC,WAAW;EACV,MAAM,MACJ,aAAa,OAAO,WAAW,WAAW,UAAU,UAAU,OAAO,GAAG,KAAA;AAE1E,SAAO;GACL,cAAc;GACd,KAAK,MAAM,EAAE,MAAM,KAAK,GAAG,KAAA;GAC5B;;CAET,SAAS,MAAM,OAAkC,KAAa,OAAoB;EAChF,MAAM,0BAAU,IAAI,KAAK;EACzB,IAAI,WAAW;AAEf,OAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,SAAS,IAAI,MAAM,QAAQ,YAAY,SAAS;AAEtD,OAAI,WAAW,OACb,YAAW;YACF,WAAW,UACpB,SAAQ,IAAI,OAAO;;EAIvB,MAAM,SAAS,MAAM,KAAK,QAAQ,CAAC,KAAK,IAAI;AAC5C,SAAO,WAAW,GAAG,OAAO,WAAW;;CAGzC,SAAS,IAAI,QAAwB,OAA4B;EAC/D,MAAM,WAAW,SAAS,OAAO;AACjC,WAAS,SAAS;AAElB,MAAI,WAAW,KAAM,QAAO;WACnB,WAAW,MAAO,QAAO;AAElC,OAAK,QAAQ,YAAY,cAAc,YAAY,UAAU;AAC3D,OAAI,OAAO,MAAO,QAAO,OAAO;AAEhC,OAAI,OAAO,SAAS,QAAQ,YAAY,SAAS,IAAI,MAAM;IACzD,MAAM,MAAM,SAAS,IAAI,KAAK,MAAM,IAAI;AACxC,QAAI,IAAI,SAAS,EAAG,QAAO,IAAI,IAAI,SAAS;;;AAIhD,MAAI,MAAM,QAAQ,OAAO,KAAK,CAC5B,QAAO,MACL,OAAO,KAAK,KAAK,UAAU;GACzB,GAAG;GACH;GACD,EAAE,EACH,OACA,MACD;AAGH,MAAI,OAAO,SAAS,QAClB,QAAO,SAAS,OAAO,QAAQ,IAAI,OAAO,OAAO,QAAQ,YAAY,SAAS,GAAG,UAAU;EAE7F,MAAM,KAAK,OAAO,SAAS,OAAO;AAClC,MAAI,OAAO,SAAS,OAAO,MACzB,QAAO,IAAI,MAAM,OAAO,OAAO,OAAO,MAAM,CAAC,OAAO,MAAM,OAAO,OAAO,OAAO,MAAM,CAAC;WAC7E,GACT,QAAO,MAAM,IAAI,OAAO,MAAM;AAGhC,MAAI,OAAO,MACT,QAAO,MAAM,OAAO,OAAO,OAAO,MAAM;AAG1C,MAAI,OAAO,IAAK,QAAO,OAAO,IAAI,OAAO,KAAK,MAAM;AACpD,MAAI,OAAO,SAAS,YAAY,OAAO,WAAW,SAAU,QAAO;AAEnE,MAAI,OAAO,QAAQ,MAAM,QAAQ,OAAO,KAAK,CAC3C,QAAO,OAAO,KAAK,QAAQ,MAAM,MAAM,OAAO,CAAC,KAAK,MAAM;AAG5D,MAAI,OAAO,KACT,QAAO,OAAO;AAGhB,SAAO;;AAGT,QAAO,IAAI,OAAO,MAAM"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fumadocs-openapi",
3
- "version": "10.4.1",
3
+ "version": "10.6.0",
4
4
  "description": "Generate MDX docs for your OpenAPI spec",
5
5
  "keywords": [
6
6
  "Docs",
@@ -36,6 +36,7 @@
36
36
  "./ui": "./dist/ui/index.js",
37
37
  "./ui/base": "./dist/ui/base.js",
38
38
  "./ui/client": "./dist/ui/client/index.js",
39
+ "./ui/create-client": "./dist/ui/create-client.js",
39
40
  "./package.json": "./package.json",
40
41
  "./css/*": "./css/*"
41
42
  },
@@ -50,17 +51,17 @@
50
51
  "@radix-ui/react-select": "^2.2.6",
51
52
  "@radix-ui/react-slot": "^1.2.4",
52
53
  "@scalar/json-magic": "^0.12.4",
53
- "@scalar/openapi-upgrader": "^0.2.1",
54
+ "@scalar/openapi-upgrader": "^0.2.2",
54
55
  "ajv": "^8.18.0",
56
+ "chokidar": "^5.0.0",
55
57
  "class-variance-authority": "^0.7.1",
56
- "dereference-json-schema": "^0.2.2",
57
58
  "github-slugger": "^2.0.0",
58
59
  "hast-util-to-jsx-runtime": "^2.3.6",
59
60
  "js-yaml": "^4.1.1",
60
- "lucide-react": "^0.577.0",
61
+ "lucide-react": "^1.6.0",
61
62
  "next-themes": "^0.4.6",
62
63
  "openapi-sampler": "^1.7.2",
63
- "react-hook-form": "^7.71.2",
64
+ "react-hook-form": "^7.72.0",
64
65
  "remark": "^15.0.1",
65
66
  "remark-rehype": "^11.1.2",
66
67
  "tailwind-merge": "^3.5.0",
@@ -68,7 +69,7 @@
68
69
  "@fumari/stf": "1.0.3"
69
70
  },
70
71
  "devDependencies": {
71
- "@scalar/api-client-react": "^1.4.11",
72
+ "@scalar/api-client-react": "^1.4.14",
72
73
  "@types/js-yaml": "^4.0.9",
73
74
  "@types/node": "25.5.0",
74
75
  "@types/openapi-sampler": "^1.0.3",
@@ -76,11 +77,11 @@
76
77
  "json-schema-typed": "^8.0.2",
77
78
  "shiki": "^4.0.2",
78
79
  "tailwindcss": "^4.2.2",
79
- "tsdown": "0.21.4",
80
+ "tsdown": "0.21.5",
80
81
  "@fumadocs/tailwind": "0.0.3",
81
82
  "eslint-config-custom": "0.0.0",
82
- "fumadocs-core": "16.7.1",
83
- "fumadocs-ui": "16.7.1",
83
+ "fumadocs-core": "16.7.7",
84
+ "fumadocs-ui": "16.7.7",
84
85
  "tsconfig": "0.0.0"
85
86
  },
86
87
  "peerDependencies": {
@@ -1,17 +0,0 @@
1
- //#region src/requests/to-python-object.ts
2
- function generatePythonObject(v, imports = /* @__PURE__ */ new Set()) {
3
- if (v === null) return "None";
4
- else if (typeof v === "boolean") return v ? "True" : "False";
5
- else if (typeof v === "string") return JSON.stringify(v);
6
- else if (typeof v === "number") return v.toString();
7
- else if (Array.isArray(v)) return `[${v.map((item) => generatePythonObject(item, imports)).join(", ")}]`;
8
- else if (v instanceof Date) {
9
- imports.add("datetime");
10
- return `datetime.datetime(${v.getFullYear()}, ${v.getMonth() + 1}, ${v.getDate()}, ${v.getHours()}, ${v.getMinutes()}, ${v.getSeconds()}, ${v.getMilliseconds()})`;
11
- } else if (typeof v === "object") return `{\n${Object.entries(v).map(([key, value]) => ` ${JSON.stringify(key)}: ${generatePythonObject(value, imports)}`).join(", \n")}\n}`;
12
- else throw new Error(`Unsupported type: ${typeof v}`);
13
- }
14
- //#endregion
15
- export { generatePythonObject };
16
-
17
- //# sourceMappingURL=to-python-object.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"to-python-object.js","names":[],"sources":["../../src/requests/to-python-object.ts"],"sourcesContent":["export function generatePythonObject(v: unknown, imports = new Set()): string {\n if (v === null) {\n return 'None';\n } else if (typeof v === 'boolean') {\n return v ? 'True' : 'False';\n } else if (typeof v === 'string') {\n return JSON.stringify(v);\n } else if (typeof v === 'number') {\n return v.toString();\n } else if (Array.isArray(v)) {\n const items = v.map((item) => generatePythonObject(item, imports));\n return `[${items.join(', ')}]`;\n } else if (v instanceof Date) {\n imports.add('datetime');\n return `datetime.datetime(${v.getFullYear()}, ${v.getMonth() + 1}, ${v.getDate()}, ${v.getHours()}, ${v.getMinutes()}, ${v.getSeconds()}, ${v.getMilliseconds()})`;\n } else if (typeof v === 'object') {\n const entries = Object.entries(v).map(\n ([key, value]) => ` ${JSON.stringify(key)}: ${generatePythonObject(value, imports)}`,\n );\n return `{\\n${entries.join(', \\n')}\\n}`;\n } else {\n throw new Error(`Unsupported type: ${typeof v}`);\n }\n}\n"],"mappings":";AAAA,SAAgB,qBAAqB,GAAY,0BAAU,IAAI,KAAK,EAAU;AAC5E,KAAI,MAAM,KACR,QAAO;UACE,OAAO,MAAM,UACtB,QAAO,IAAI,SAAS;UACX,OAAO,MAAM,SACtB,QAAO,KAAK,UAAU,EAAE;UACf,OAAO,MAAM,SACtB,QAAO,EAAE,UAAU;UACV,MAAM,QAAQ,EAAE,CAEzB,QAAO,IADO,EAAE,KAAK,SAAS,qBAAqB,MAAM,QAAQ,CAAC,CACjD,KAAK,KAAK,CAAC;UACnB,aAAa,MAAM;AAC5B,UAAQ,IAAI,WAAW;AACvB,SAAO,qBAAqB,EAAE,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,iBAAiB,CAAC;YACvJ,OAAO,MAAM,SAItB,QAAO,MAHS,OAAO,QAAQ,EAAE,CAAC,KAC/B,CAAC,KAAK,WAAW,KAAK,KAAK,UAAU,IAAI,CAAC,IAAI,qBAAqB,OAAO,QAAQ,GACpF,CACoB,KAAK,OAAO,CAAC;KAElC,OAAM,IAAI,MAAM,qBAAqB,OAAO,IAAI"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"full.client.js","names":[],"sources":["../../src/ui/full.client.tsx"],"sourcesContent":["'use client';\nimport type { ReactNode } from 'react';\nimport { ClientCodeBlockProvider } from './components/codeblock';\nimport { defaultShikiFactory } from 'fumadocs-core/highlight/shiki/full';\n\nexport function FullProvider({ children }: { children: ReactNode }) {\n return (\n <ClientCodeBlockProvider factory={defaultShikiFactory}>{children}</ClientCodeBlockProvider>\n );\n}\n"],"mappings":";;;;;AAKA,SAAgB,aAAa,EAAE,YAAqC;AAClE,QACE,oBAAC,yBAAD;EAAyB,SAAS;EAAsB;EAAmC,CAAA"}
package/dist/ui/full.d.ts DELETED
@@ -1,11 +0,0 @@
1
- import { OpenAPIServer } from "../server/create.js";
2
- import { ApiPageProps } from "./api-page.js";
3
- import { CreateAPIPageOptions as CreateAPIPageOptions$1 } from "./base.js";
4
- import * as react_jsx_runtime0 from "react/jsx-runtime";
5
-
6
- //#region src/ui/full.d.ts
7
- type CreateAPIPageOptions = Partial<CreateAPIPageOptions$1>;
8
- declare function createAPIPage(server: OpenAPIServer, options?: CreateAPIPageOptions): (props: ApiPageProps) => react_jsx_runtime0.JSX.Element;
9
- //#endregion
10
- export { CreateAPIPageOptions, createAPIPage };
11
- //# sourceMappingURL=full.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"full.d.ts","names":[],"sources":["../../src/ui/full.tsx"],"mappings":";;;;;;KAMY,oBAAA,GAAuB,OAAA,CAAQ,sBAAA;AAAA,iBAE3B,aAAA,CAAc,MAAA,EAAQ,aAAA,EAAe,OAAA,GAAS,oBAAA,IAsBhC,KAAA,EAAO,YAAA,KAAY,kBAAA,CAAA,GAAA,CAAA,OAAA"}
package/dist/ui/full.js DELETED
@@ -1,36 +0,0 @@
1
- import { createAPIPage as createAPIPage$1 } from "./base.js";
2
- import { FullProvider } from "./full.client.js";
3
- import { jsx } from "react/jsx-runtime";
4
- import { defaultShikiFactory } from "fumadocs-core/highlight/shiki/full";
5
- //#region src/ui/full.tsx
6
- function createAPIPage(server, options = {}) {
7
- const APIPage = createAPIPage$1(server, {
8
- shiki: defaultShikiFactory,
9
- shikiOptions: { themes: {
10
- light: "github-light",
11
- dark: "github-dark"
12
- } },
13
- async generateTypeScriptDefinitions(schema, ctx) {
14
- if (typeof schema !== "object") return;
15
- const { compile } = await import("@fumari/json-schema-ts");
16
- try {
17
- return compile(schema, {
18
- name: "Response",
19
- readOnly: ctx.readOnly,
20
- writeOnly: ctx.writeOnly,
21
- getSchemaId: ctx.schema.getRawRef
22
- });
23
- } catch (e) {
24
- console.warn("Failed to generate typescript schema:", e);
25
- }
26
- },
27
- ...options
28
- });
29
- return function APIPageFull(props) {
30
- return /* @__PURE__ */ jsx(FullProvider, { children: /* @__PURE__ */ jsx(APIPage, { ...props }) });
31
- };
32
- }
33
- //#endregion
34
- export { createAPIPage };
35
-
36
- //# sourceMappingURL=full.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"full.js","names":["base.createAPIPage"],"sources":["../../src/ui/full.tsx"],"sourcesContent":["import type { OpenAPIServer } from '@/server';\nimport * as base from './base';\nimport type { ApiPageProps } from './api-page';\nimport { defaultShikiFactory } from 'fumadocs-core/highlight/shiki/full';\nimport { FullProvider } from './full.client';\n\nexport type CreateAPIPageOptions = Partial<base.CreateAPIPageOptions>;\n\nexport function createAPIPage(server: OpenAPIServer, options: CreateAPIPageOptions = {}) {\n const APIPage = base.createAPIPage(server, {\n shiki: defaultShikiFactory,\n shikiOptions: { themes: { light: 'github-light', dark: 'github-dark' } },\n async generateTypeScriptDefinitions(schema, ctx) {\n if (typeof schema !== 'object') return;\n const { compile } = await import('@fumari/json-schema-ts');\n\n try {\n return compile(schema, {\n name: 'Response',\n readOnly: ctx.readOnly,\n writeOnly: ctx.writeOnly,\n getSchemaId: ctx.schema.getRawRef,\n });\n } catch (e) {\n console.warn('Failed to generate typescript schema:', e);\n }\n },\n ...options,\n });\n\n return function APIPageFull(props: ApiPageProps) {\n return (\n <FullProvider>\n <APIPage {...props} />\n </FullProvider>\n );\n };\n}\n"],"mappings":";;;;;AAQA,SAAgB,cAAc,QAAuB,UAAgC,EAAE,EAAE;CACvF,MAAM,UAAUA,gBAAmB,QAAQ;EACzC,OAAO;EACP,cAAc,EAAE,QAAQ;GAAE,OAAO;GAAgB,MAAM;GAAe,EAAE;EACxE,MAAM,8BAA8B,QAAQ,KAAK;AAC/C,OAAI,OAAO,WAAW,SAAU;GAChC,MAAM,EAAE,YAAY,MAAM,OAAO;AAEjC,OAAI;AACF,WAAO,QAAQ,QAAQ;KACrB,MAAM;KACN,UAAU,IAAI;KACd,WAAW,IAAI;KACf,aAAa,IAAI,OAAO;KACzB,CAAC;YACK,GAAG;AACV,YAAQ,KAAK,yCAAyC,EAAE;;;EAG5D,GAAG;EACJ,CAAC;AAEF,QAAO,SAAS,YAAY,OAAqB;AAC/C,SACE,oBAAC,cAAD,EAAA,UACE,oBAAC,SAAD,EAAS,GAAI,OAAS,CAAA,EACT,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"request-tabs.d.ts","names":[],"sources":["../../../src/ui/operation/request-tabs.tsx"],"mappings":";;;UAkBiB,kBAAA;EACf,EAAA;EACA,IAAA;EACA,WAAA;EACA,IAAA,EAAM,cAAA;EACN,OAAA,EAAS,WAAA;AAAA"}
@@ -1,22 +0,0 @@
1
- //#region src/utils/pages/to-body.ts
2
- function toBody(entry) {
3
- if (entry.type === "operation") return {
4
- document: entry.schemaId,
5
- operations: [entry.item]
6
- };
7
- if (entry.type === "webhook") return {
8
- document: entry.schemaId,
9
- webhooks: [entry.item]
10
- };
11
- return {
12
- showTitle: true,
13
- showDescription: true,
14
- document: entry.schemaId,
15
- operations: entry.operations,
16
- webhooks: entry.webhooks
17
- };
18
- }
19
- //#endregion
20
- export { toBody };
21
-
22
- //# sourceMappingURL=to-body.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"to-body.js","names":[],"sources":["../../../src/utils/pages/to-body.ts"],"sourcesContent":["import type { ApiPageProps } from '@/ui/api-page';\nimport type { OutputEntry } from '@/utils/pages/builder';\n\nexport function toBody(entry: OutputEntry): ApiPageProps {\n if (entry.type === 'operation')\n return {\n document: entry.schemaId,\n operations: [entry.item],\n };\n if (entry.type === 'webhook')\n return {\n document: entry.schemaId,\n webhooks: [entry.item],\n };\n\n return {\n showTitle: true,\n showDescription: true,\n document: entry.schemaId,\n operations: entry.operations,\n webhooks: entry.webhooks,\n };\n}\n"],"mappings":";AAGA,SAAgB,OAAO,OAAkC;AACvD,KAAI,MAAM,SAAS,YACjB,QAAO;EACL,UAAU,MAAM;EAChB,YAAY,CAAC,MAAM,KAAK;EACzB;AACH,KAAI,MAAM,SAAS,UACjB,QAAO;EACL,UAAU,MAAM;EAChB,UAAU,CAAC,MAAM,KAAK;EACvB;AAEH,QAAO;EACL,WAAW;EACX,iBAAiB;EACjB,UAAU,MAAM;EAChB,YAAY,MAAM;EAClB,UAAU,MAAM;EACjB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema-to-string.js","names":[],"sources":["../../src/utils/schema-to-string.ts"],"sourcesContent":["import type { ParsedSchema, ResolvedSchema } from '@/utils/schema';\nimport type { ProcessedDocument } from '@/utils/process-document';\n\nexport enum FormatFlags {\n None = 0,\n UseAlias = 1 << 0,\n}\n\ntype Resolver = (schema: ResolvedSchema) => {\n dereferenced: ResolvedSchema;\n raw?: ParsedSchema;\n};\n\nexport function schemaToString(\n value: ResolvedSchema,\n _resolver?: ProcessedDocument | Resolver,\n flags: FormatFlags = FormatFlags.None,\n): string {\n const resolver: Resolver =\n typeof _resolver === 'function'\n ? _resolver\n : (schema) => {\n const ref =\n _resolver && typeof schema === 'object' ? _resolver.getRawRef(schema) : undefined;\n\n return {\n dereferenced: schema,\n raw: ref ? { $ref: ref } : undefined,\n };\n };\n function union(union: readonly ResolvedSchema[], sep: string, flags: FormatFlags) {\n const members = new Set();\n let nullable = false;\n\n for (const item of union) {\n const result = run(item, flags | FormatFlags.UseAlias);\n\n if (result === 'null') {\n nullable = true;\n } else if (result !== 'unknown') {\n members.add(result);\n }\n }\n\n const result = Array.from(members).join(sep);\n return nullable ? `${result} | null` : result;\n }\n\n function run(schema: ResolvedSchema, flags: FormatFlags): string {\n const resolved = resolver(schema);\n schema = resolved.dereferenced;\n\n if (schema === true) return 'any';\n else if (schema === false) return 'never';\n\n if ((flags & FormatFlags.UseAlias) === FormatFlags.UseAlias) {\n if (schema.title) return schema.title;\n\n if (typeof resolved.raw === 'object' && resolved.raw.$ref) {\n const ref = resolved.raw.$ref.split('/');\n if (ref.length > 0) return ref[ref.length - 1];\n }\n }\n\n if (Array.isArray(schema.type)) {\n return union(\n schema.type.map((type) => ({\n ...schema,\n type,\n })),\n ' | ',\n flags,\n );\n }\n\n if (schema.type === 'array')\n return `array<${schema.items ? run(schema.items, flags | FormatFlags.UseAlias) : 'unknown'}>`;\n\n const or = schema.oneOf ?? schema.anyOf;\n if (schema.oneOf && schema.anyOf) {\n return `(${union(schema.oneOf, ' | ', flags)}) & (${union(schema.anyOf, ' | ', flags)})`;\n } else if (or) {\n return union(or, ' | ', flags);\n }\n\n if (schema.allOf) {\n return union(schema.allOf, ' & ', flags);\n }\n\n if (schema.not) return `not ${run(schema.not, flags)}`;\n if (schema.type === 'string' && schema.format === 'binary') return 'file';\n\n if (schema.type && Array.isArray(schema.type)) {\n return schema.type.filter((v) => v !== 'null').join(' | ');\n }\n\n if (schema.type) {\n return schema.type as string;\n }\n\n return 'unknown';\n }\n\n return run(value, flags);\n}\n"],"mappings":";AAGA,IAAY,cAAL,yBAAA,aAAA;AACL,aAAA,YAAA,UAAA,KAAA;AACA,aAAA,YAAA,cAAA,KAAA;;KACD;AAOD,SAAgB,eACd,OACA,WACA,QAAqB,YAAY,MACzB;CACR,MAAM,WACJ,OAAO,cAAc,aACjB,aACC,WAAW;EACV,MAAM,MACJ,aAAa,OAAO,WAAW,WAAW,UAAU,UAAU,OAAO,GAAG,KAAA;AAE1E,SAAO;GACL,cAAc;GACd,KAAK,MAAM,EAAE,MAAM,KAAK,GAAG,KAAA;GAC5B;;CAET,SAAS,MAAM,OAAkC,KAAa,OAAoB;EAChF,MAAM,0BAAU,IAAI,KAAK;EACzB,IAAI,WAAW;AAEf,OAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,SAAS,IAAI,MAAM,QAAQ,YAAY,SAAS;AAEtD,OAAI,WAAW,OACb,YAAW;YACF,WAAW,UACpB,SAAQ,IAAI,OAAO;;EAIvB,MAAM,SAAS,MAAM,KAAK,QAAQ,CAAC,KAAK,IAAI;AAC5C,SAAO,WAAW,GAAG,OAAO,WAAW;;CAGzC,SAAS,IAAI,QAAwB,OAA4B;EAC/D,MAAM,WAAW,SAAS,OAAO;AACjC,WAAS,SAAS;AAElB,MAAI,WAAW,KAAM,QAAO;WACnB,WAAW,MAAO,QAAO;AAElC,OAAK,QAAQ,YAAY,cAAc,YAAY,UAAU;AAC3D,OAAI,OAAO,MAAO,QAAO,OAAO;AAEhC,OAAI,OAAO,SAAS,QAAQ,YAAY,SAAS,IAAI,MAAM;IACzD,MAAM,MAAM,SAAS,IAAI,KAAK,MAAM,IAAI;AACxC,QAAI,IAAI,SAAS,EAAG,QAAO,IAAI,IAAI,SAAS;;;AAIhD,MAAI,MAAM,QAAQ,OAAO,KAAK,CAC5B,QAAO,MACL,OAAO,KAAK,KAAK,UAAU;GACzB,GAAG;GACH;GACD,EAAE,EACH,OACA,MACD;AAGH,MAAI,OAAO,SAAS,QAClB,QAAO,SAAS,OAAO,QAAQ,IAAI,OAAO,OAAO,QAAQ,YAAY,SAAS,GAAG,UAAU;EAE7F,MAAM,KAAK,OAAO,SAAS,OAAO;AAClC,MAAI,OAAO,SAAS,OAAO,MACzB,QAAO,IAAI,MAAM,OAAO,OAAO,OAAO,MAAM,CAAC,OAAO,MAAM,OAAO,OAAO,OAAO,MAAM,CAAC;WAC7E,GACT,QAAO,MAAM,IAAI,OAAO,MAAM;AAGhC,MAAI,OAAO,MACT,QAAO,MAAM,OAAO,OAAO,OAAO,MAAM;AAG1C,MAAI,OAAO,IAAK,QAAO,OAAO,IAAI,OAAO,KAAK,MAAM;AACpD,MAAI,OAAO,SAAS,YAAY,OAAO,WAAW,SAAU,QAAO;AAEnE,MAAI,OAAO,QAAQ,MAAM,QAAQ,OAAO,KAAK,CAC3C,QAAO,OAAO,KAAK,QAAQ,MAAM,MAAM,OAAO,CAAC,KAAK,MAAM;AAG5D,MAAI,OAAO,KACT,QAAO,OAAO;AAGhB,SAAO;;AAGT,QAAO,IAAI,OAAO,MAAM"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.d.ts","names":[],"sources":["../../src/utils/schema.ts"],"mappings":";;;;KAcY,WAAA,MAAiB,CAAA,uBACzB,WAAA,CAAY,CAAA,MACZ,CAAA,SAAU,eAAA,GACR,OAAA,CAAQ,CAAA,EAAG,eAAA,IACX,CAAA,gCAEgB,CAAA,GAAI,WAAA,CAAY,CAAA,CAAE,CAAA,OAEhC,CAAA;AAAA,KAEH,qBAAA,MAA2B,CAAA,uBAC5B,WAAA,CAAY,CAAA,MACZ,CAAA;EAAY,IAAA;AAAA,IACV,IAAA,CAAK,CAAA,YACL,CAAA;AAAA,KAEM,YAAA,IACP,UAAA;EACC,mBAAA;AAAA;AAAA,KAGM,cAAA,GAAiB,qBAAA,CAAsB,YAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.js","names":[],"sources":["../../src/utils/schema.ts"],"sourcesContent":["import type { JSONSchema } from 'json-schema-typed/draft-2020-12';\nimport type {\n ExampleObject,\n MediaTypeObject,\n MethodInformation,\n OperationObject,\n PathItemObject,\n ReferenceObject,\n TagObject,\n} from '@/types';\nimport { idToTitle } from '@/utils/id-to-title';\n\nexport const methodKeys = ['get', 'post', 'patch', 'delete', 'head', 'put'] as const;\n\nexport type NoReference<T> = T extends (infer I)[]\n ? NoReference<I>[]\n : T extends ReferenceObject\n ? Exclude<T, ReferenceObject>\n : T extends object\n ? {\n [K in keyof T]: NoReference<T[K]>;\n }\n : T;\n\ntype NoReferenceJSONSchema<T> = T extends (infer I)[]\n ? NoReference<I>[]\n : T extends { $ref?: string }\n ? Omit<T, '$ref'>\n : T;\n\nexport type ParsedSchema =\n | (JSONSchema & {\n 'x-playground-lazy'?: boolean;\n })\n | boolean;\nexport type ResolvedSchema = NoReferenceJSONSchema<ParsedSchema>;\n\nexport function getPreferredType(body: Record<string, unknown>): string | undefined {\n if ('application/json' in body) return 'application/json';\n\n return Object.keys(body)[0];\n}\n\nexport function getTagDisplayName(tag: TagObject): string {\n if ('x-displayName' in tag && typeof tag['x-displayName'] === 'string')\n return tag['x-displayName'];\n\n if (tag.summary) return tag.summary;\n return idToTitle(tag.name!);\n}\n\n/**\n * Summarize method endpoint information\n */\nexport function createMethod(\n method: string,\n path: NoReference<PathItemObject>,\n operation: NoReference<OperationObject>,\n): MethodInformation {\n return {\n description: path.description,\n summary: path.summary,\n ...operation,\n servers: operation.servers ?? path.servers,\n parameters: [...(operation.parameters ?? []), ...(path.parameters ?? [])],\n method: method.toUpperCase(),\n };\n}\n\ninterface ExampleLike {\n example?: unknown;\n examples?: {\n [media: string]: ExampleObject;\n };\n content?: {\n [media: string]: MediaTypeObject;\n };\n}\n\nexport function pickExample(value: ExampleLike): unknown | undefined {\n if (value.example !== undefined) {\n return value.example;\n }\n\n if (value.content) {\n const type = getPreferredType(value.content);\n const content = type ? value.content[type] : undefined;\n\n if (type && content) {\n const out = value.examples?.[type].value ?? pickExample(content);\n if (out !== undefined) return out;\n }\n }\n\n if (value.examples) {\n const examples = Object.values(value.examples);\n if (examples.length > 0) return examples[0].value;\n }\n}\n"],"mappings":";;AAYA,MAAa,aAAa;CAAC;CAAO;CAAQ;CAAS;CAAU;CAAQ;CAAM;AAyB3E,SAAgB,iBAAiB,MAAmD;AAClF,KAAI,sBAAsB,KAAM,QAAO;AAEvC,QAAO,OAAO,KAAK,KAAK,CAAC;;AAG3B,SAAgB,kBAAkB,KAAwB;AACxD,KAAI,mBAAmB,OAAO,OAAO,IAAI,qBAAqB,SAC5D,QAAO,IAAI;AAEb,KAAI,IAAI,QAAS,QAAO,IAAI;AAC5B,QAAO,UAAU,IAAI,KAAM;;;;;AAM7B,SAAgB,aACd,QACA,MACA,WACmB;AACnB,QAAO;EACL,aAAa,KAAK;EAClB,SAAS,KAAK;EACd,GAAG;EACH,SAAS,UAAU,WAAW,KAAK;EACnC,YAAY,CAAC,GAAI,UAAU,cAAc,EAAE,EAAG,GAAI,KAAK,cAAc,EAAE,CAAE;EACzE,QAAQ,OAAO,aAAa;EAC7B;;AAaH,SAAgB,YAAY,OAAyC;AACnE,KAAI,MAAM,YAAY,KAAA,EACpB,QAAO,MAAM;AAGf,KAAI,MAAM,SAAS;EACjB,MAAM,OAAO,iBAAiB,MAAM,QAAQ;EAC5C,MAAM,UAAU,OAAO,MAAM,QAAQ,QAAQ,KAAA;AAE7C,MAAI,QAAQ,SAAS;GACnB,MAAM,MAAM,MAAM,WAAW,MAAM,SAAS,YAAY,QAAQ;AAChE,OAAI,QAAQ,KAAA,EAAW,QAAO;;;AAIlC,KAAI,MAAM,UAAU;EAClB,MAAM,WAAW,OAAO,OAAO,MAAM,SAAS;AAC9C,MAAI,SAAS,SAAS,EAAG,QAAO,SAAS,GAAG"}