fumadocs-openapi 10.6.6 → 10.6.8
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/css/generated/shared.css +29 -5
- package/dist/_virtual/_rolldown/runtime.js +2 -1
- package/dist/i18n.d.ts +2 -1
- package/dist/i18n.js +5 -3
- package/dist/node_modules/.pnpm/@fastify_deepmerge@3.2.1/node_modules/@fastify/deepmerge/index.js +108 -0
- package/dist/node_modules/.pnpm/fast-content-type-parse@3.0.0/node_modules/fast-content-type-parse/index.js +115 -0
- package/dist/playground/client.d.ts +3 -11
- package/dist/playground/client.js +3 -37
- package/dist/playground/components/inputs.js +2 -2
- package/dist/playground/components/oauth-dialog.js +18 -12
- package/dist/playground/components/result-display.d.ts +16 -0
- package/dist/playground/components/result-display.js +142 -0
- package/dist/playground/components/server-select.js +1 -1
- package/dist/playground/fetcher.d.ts +9 -3
- package/dist/playground/fetcher.js +7 -18
- package/dist/playground/schema.js +1 -1
- package/dist/playground/status-info.js +27 -23
- package/dist/scalar/client.js +14 -23
- package/dist/ui/base.js +1 -1
- package/dist/ui/client/i18n.js +6 -4
- package/dist/ui/components/dialog.js +1 -1
- package/dist/ui/operation/client.js +1 -1
- package/dist/ui/operation/get-example-requests.js +1 -1
- package/dist/ui/operation/index.js +1 -1
- package/dist/ui/operation/request-tabs.js +1 -1
- package/dist/ui/operation/response-tabs.js +1 -1
- package/dist/ui/operation/usage-tabs/client.js +1 -1
- package/dist/ui/schema/client.js +2 -2
- package/dist/ui/schema/index.js +1 -1
- package/dist/utils/schema/sample.js +442 -0
- package/package.json +18 -16
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
import { require_deepmerge } from "../../node_modules/.pnpm/@fastify_deepmerge@3.2.1/node_modules/@fastify/deepmerge/index.js";
|
|
2
|
+
import { isPlainObject } from "../is-plain-object.js";
|
|
3
|
+
import { resolveRefSync } from "./resolve-ref.js";
|
|
4
|
+
const mergeDeep = (0, require_deepmerge().deepmerge)({
|
|
5
|
+
all: true,
|
|
6
|
+
isMergeableObject(value) {
|
|
7
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) && !(value instanceof RegExp) && !(value instanceof Date);
|
|
8
|
+
}
|
|
9
|
+
});
|
|
10
|
+
const SKIP = Symbol("skip");
|
|
11
|
+
const defaultOptions = {
|
|
12
|
+
skipReadOnly: false,
|
|
13
|
+
maxSampleDepth: 15
|
|
14
|
+
};
|
|
15
|
+
let refResolving = {};
|
|
16
|
+
const seenObjectStack = [];
|
|
17
|
+
function clearCaches() {
|
|
18
|
+
refResolving = {};
|
|
19
|
+
seenObjectStack.length = 0;
|
|
20
|
+
}
|
|
21
|
+
function popStack(context) {
|
|
22
|
+
if (context) seenObjectStack.pop();
|
|
23
|
+
}
|
|
24
|
+
function inferType(schema) {
|
|
25
|
+
if (schema.type !== void 0) {
|
|
26
|
+
const t = schema.type;
|
|
27
|
+
return Array.isArray(t) ? t.length === 0 ? null : String(t[0]) : String(t);
|
|
28
|
+
}
|
|
29
|
+
for (const [kw, ty] of Object.entries({
|
|
30
|
+
multipleOf: "number",
|
|
31
|
+
maximum: "number",
|
|
32
|
+
exclusiveMaximum: "number",
|
|
33
|
+
minimum: "number",
|
|
34
|
+
exclusiveMinimum: "number",
|
|
35
|
+
maxLength: "string",
|
|
36
|
+
minLength: "string",
|
|
37
|
+
pattern: "string",
|
|
38
|
+
items: "array",
|
|
39
|
+
maxItems: "array",
|
|
40
|
+
minItems: "array",
|
|
41
|
+
uniqueItems: "array",
|
|
42
|
+
additionalItems: "array",
|
|
43
|
+
maxProperties: "object",
|
|
44
|
+
minProperties: "object",
|
|
45
|
+
required: "object",
|
|
46
|
+
additionalProperties: "object",
|
|
47
|
+
properties: "object",
|
|
48
|
+
patternProperties: "object",
|
|
49
|
+
dependencies: "object"
|
|
50
|
+
})) if (schema[kw] !== void 0) return ty;
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
function getCircularPlaceholder(type) {
|
|
54
|
+
if (type === "object") return {};
|
|
55
|
+
if (type === "array") return [];
|
|
56
|
+
}
|
|
57
|
+
function hashCode(str) {
|
|
58
|
+
let hash = 0;
|
|
59
|
+
for (let i = 0; i < str.length; i++) {
|
|
60
|
+
hash = (hash << 5) - hash + str.charCodeAt(i);
|
|
61
|
+
hash |= 0;
|
|
62
|
+
}
|
|
63
|
+
return hash;
|
|
64
|
+
}
|
|
65
|
+
function jsf32(a, b, c, d) {
|
|
66
|
+
return () => {
|
|
67
|
+
a |= 0;
|
|
68
|
+
b |= 0;
|
|
69
|
+
c |= 0;
|
|
70
|
+
d |= 0;
|
|
71
|
+
const t = a - (b << 27 | b >>> 5) | 0;
|
|
72
|
+
a = b ^ (c << 17 | c >>> 15);
|
|
73
|
+
b = c + d | 0;
|
|
74
|
+
c = d + t | 0;
|
|
75
|
+
d = a + t | 0;
|
|
76
|
+
return (d >>> 0) / 4294967296;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function uuidFromSeed(str) {
|
|
80
|
+
const hash = hashCode(str);
|
|
81
|
+
const random = jsf32(hash, hash, hash, hash);
|
|
82
|
+
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
|
|
83
|
+
const r = random() * 16 | 0;
|
|
84
|
+
return (c === "x" ? r : r & 3 | 8).toString(16);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
function toRFCDateTime(date, omitTime, omitDate, ms) {
|
|
88
|
+
const pad = (n) => n < 10 ? `0${n}` : `${n}`;
|
|
89
|
+
let res = omitDate ? "" : `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}-${pad(date.getUTCDate())}`;
|
|
90
|
+
if (!omitTime) {
|
|
91
|
+
res += `T${pad(date.getUTCHours())}:${pad(date.getUTCMinutes())}:${pad(date.getUTCSeconds())}`;
|
|
92
|
+
if (ms) res += `.${(date.getUTCMilliseconds() / 1e3).toFixed(3).slice(2, 5)}`;
|
|
93
|
+
res += "Z";
|
|
94
|
+
}
|
|
95
|
+
return res;
|
|
96
|
+
}
|
|
97
|
+
function ensureMinLength(sample, min) {
|
|
98
|
+
if (min > sample.length) return sample.repeat(Math.trunc(min / sample.length) + 1).substring(0, min);
|
|
99
|
+
return sample;
|
|
100
|
+
}
|
|
101
|
+
function sampleBoolean() {
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
function sampleNumber(schema) {
|
|
105
|
+
let res = 0;
|
|
106
|
+
if (schema.type === "number" && (schema.format === "float" || schema.format === "double")) res = .1;
|
|
107
|
+
const exMinB = typeof schema.exclusiveMinimum === "boolean";
|
|
108
|
+
const exMaxB = typeof schema.exclusiveMaximum === "boolean";
|
|
109
|
+
if (exMinB || exMaxB) {
|
|
110
|
+
if (schema.maximum != null && schema.minimum != null) {
|
|
111
|
+
const min = schema.minimum;
|
|
112
|
+
const max = schema.maximum;
|
|
113
|
+
res = schema.exclusiveMinimum ? Math.floor(min) + 1 : min;
|
|
114
|
+
if (schema.exclusiveMaximum && res >= max || !schema.exclusiveMaximum && res > max) res = (max + min) / 2;
|
|
115
|
+
return res;
|
|
116
|
+
}
|
|
117
|
+
if (schema.minimum != null) {
|
|
118
|
+
const min = schema.minimum;
|
|
119
|
+
return schema.exclusiveMinimum ? Math.floor(min) + 1 : min;
|
|
120
|
+
}
|
|
121
|
+
if (schema.maximum != null) {
|
|
122
|
+
const max = schema.maximum;
|
|
123
|
+
if (schema.exclusiveMaximum) return max > 0 ? 0 : Math.floor(max) - 1;
|
|
124
|
+
return max > 0 ? 0 : max;
|
|
125
|
+
}
|
|
126
|
+
} else {
|
|
127
|
+
if (schema.minimum != null) return schema.minimum;
|
|
128
|
+
if (schema.exclusiveMinimum != null) {
|
|
129
|
+
res = Math.floor(schema.exclusiveMinimum) + 1;
|
|
130
|
+
if (res === schema.exclusiveMaximum) res = (res + Math.floor(schema.exclusiveMaximum) - 1) / 2;
|
|
131
|
+
} else if (schema.exclusiveMaximum != null) res = Math.floor(schema.exclusiveMaximum) - 1;
|
|
132
|
+
else if (schema.maximum != null) res = schema.maximum;
|
|
133
|
+
}
|
|
134
|
+
return res;
|
|
135
|
+
}
|
|
136
|
+
function defaultStringSample(min, max, pattern, enablePatterns) {
|
|
137
|
+
if (pattern && enablePatterns) return patternSample(pattern);
|
|
138
|
+
let res = ensureMinLength("string", min);
|
|
139
|
+
if (max != null && res.length > max) res = res.substring(0, max);
|
|
140
|
+
return res;
|
|
141
|
+
}
|
|
142
|
+
/** Minimal pattern sampler for `enablePatterns` (subset of openapi-sampler). */
|
|
143
|
+
function patternSample(pattern) {
|
|
144
|
+
const stripped = pattern.replace(/^\^?/, "").replace(/\$?$/, "");
|
|
145
|
+
const m = stripped.match(/^(.)\{(\d+)\}$/);
|
|
146
|
+
if (m) return m[1].repeat(parseInt(m[2], 10));
|
|
147
|
+
return stripped.length > 0 ? stripped : "x";
|
|
148
|
+
}
|
|
149
|
+
function sampleString(schema, options, _spec, context) {
|
|
150
|
+
const format = schema.format || "default";
|
|
151
|
+
const propertyName = context?.propertyName;
|
|
152
|
+
const min = schema.minLength ?? 0;
|
|
153
|
+
const max = schema.maxLength;
|
|
154
|
+
const pattern = schema.pattern;
|
|
155
|
+
const fixed = /* @__PURE__ */ new Date("2019-08-24T14:15:22.123Z");
|
|
156
|
+
const formats = {
|
|
157
|
+
email: () => "user@example.com",
|
|
158
|
+
"idn-email": () => "пошта@укр.нет",
|
|
159
|
+
password: () => {
|
|
160
|
+
let res = "pa$$word";
|
|
161
|
+
if (min > res.length) {
|
|
162
|
+
res += "_";
|
|
163
|
+
res += ensureMinLength("qwerty!@#$%^123456", min - res.length).substring(0, min - res.length);
|
|
164
|
+
}
|
|
165
|
+
return res;
|
|
166
|
+
},
|
|
167
|
+
"date-time": () => toRFCDateTime(fixed, false, false, false),
|
|
168
|
+
date: () => toRFCDateTime(fixed, true, false, false),
|
|
169
|
+
time: () => toRFCDateTime(fixed, false, true, false).slice(1),
|
|
170
|
+
ipv4: () => "192.168.0.1",
|
|
171
|
+
ipv6: () => "2001:0db8:85a3:0000:0000:8a2e:0370:7334",
|
|
172
|
+
hostname: () => "example.com",
|
|
173
|
+
"idn-hostname": () => "приклад.укр",
|
|
174
|
+
uri: () => "http://example.com",
|
|
175
|
+
"uri-reference": () => "../dictionary",
|
|
176
|
+
"uri-template": () => "http://example.com/{endpoint}",
|
|
177
|
+
iri: () => "http://example.com/entity/1",
|
|
178
|
+
"iri-reference": () => "/entity/1",
|
|
179
|
+
uuid: () => uuidFromSeed(propertyName || "id"),
|
|
180
|
+
"json-pointer": () => "/json/pointer",
|
|
181
|
+
"relative-json-pointer": () => "1/relative/json/pointer",
|
|
182
|
+
regex: () => "/regex/",
|
|
183
|
+
default: () => defaultStringSample(min, max, pattern, options.enablePatterns)
|
|
184
|
+
};
|
|
185
|
+
return (formats[format] ?? formats.default)();
|
|
186
|
+
}
|
|
187
|
+
function sampleArray(schema, options, spec, context) {
|
|
188
|
+
const depth = context?.depth ?? 1;
|
|
189
|
+
let arrayLength = Math.min(schema.maxItems != null ? schema.maxItems : Number.POSITIVE_INFINITY, schema.minItems ?? 1);
|
|
190
|
+
const items = schema.prefixItems ?? schema.items ?? schema.contains;
|
|
191
|
+
if (Array.isArray(items)) arrayLength = Math.max(arrayLength, items.length);
|
|
192
|
+
const itemSchemaGetter = (i) => {
|
|
193
|
+
if (Array.isArray(items)) return items[i] ?? {};
|
|
194
|
+
return items ?? {};
|
|
195
|
+
};
|
|
196
|
+
const res = [];
|
|
197
|
+
if (!items) return res;
|
|
198
|
+
for (let i = 0; i < arrayLength; i++) {
|
|
199
|
+
const { value } = traverse(itemSchemaGetter(i), options, spec, {
|
|
200
|
+
depth: depth + 1,
|
|
201
|
+
propertyName: context?.propertyName
|
|
202
|
+
});
|
|
203
|
+
res.push(value);
|
|
204
|
+
}
|
|
205
|
+
return res;
|
|
206
|
+
}
|
|
207
|
+
function sampleObject(schema, options, spec, context) {
|
|
208
|
+
let res = {};
|
|
209
|
+
const depth = context?.depth ?? 1;
|
|
210
|
+
if (schema.properties && typeof schema.properties === "object") {
|
|
211
|
+
const required = Array.isArray(schema.required) ? schema.required : [];
|
|
212
|
+
const requiredSet = new Set(required);
|
|
213
|
+
for (const propertyName of Object.keys(schema.properties)) {
|
|
214
|
+
if (options.skipNonRequired && !requiredSet.has(propertyName)) continue;
|
|
215
|
+
const propSchema = schema.properties[propertyName];
|
|
216
|
+
const sample = traverse(propSchema, options, spec, {
|
|
217
|
+
propertyName,
|
|
218
|
+
depth: depth + 1
|
|
219
|
+
});
|
|
220
|
+
if (options.skipReadOnly && sample.readOnly) {
|
|
221
|
+
if (context?.isAllOfChild) res[propertyName] = SKIP;
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
if (options.skipWriteOnly && sample.writeOnly) {
|
|
225
|
+
if (context?.isAllOfChild) res[propertyName] = SKIP;
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
res[propertyName] = sample.value;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (schema.additionalProperties && typeof schema.additionalProperties === "object") {
|
|
232
|
+
const ap = schema.additionalProperties;
|
|
233
|
+
const baseName = ap["x-additionalPropertiesName"] || "property";
|
|
234
|
+
res[`${String(baseName)}1`] = traverse(ap, options, spec, { depth: depth + 1 }).value;
|
|
235
|
+
res[`${String(baseName)}2`] = traverse(ap, options, spec, { depth: depth + 1 }).value;
|
|
236
|
+
}
|
|
237
|
+
if (schema.properties && typeof schema.properties === "object" && typeof schema.maxProperties === "number" && Object.keys(res).length > schema.maxProperties) {
|
|
238
|
+
const filtered = {};
|
|
239
|
+
let added = 0;
|
|
240
|
+
const req = Array.isArray(schema.required) ? schema.required : [];
|
|
241
|
+
for (const name of req) if (res[name] !== void 0) {
|
|
242
|
+
filtered[name] = res[name];
|
|
243
|
+
added++;
|
|
244
|
+
}
|
|
245
|
+
for (const name of Object.keys(res)) if (added < schema.maxProperties && !(name in filtered)) {
|
|
246
|
+
filtered[name] = res[name];
|
|
247
|
+
added++;
|
|
248
|
+
}
|
|
249
|
+
res = filtered;
|
|
250
|
+
}
|
|
251
|
+
return res;
|
|
252
|
+
}
|
|
253
|
+
function inferExample(schema) {
|
|
254
|
+
if (schema.const !== void 0) return schema.const;
|
|
255
|
+
if (Array.isArray(schema.examples) && schema.examples.length > 0) return schema.examples[0];
|
|
256
|
+
if (Array.isArray(schema.enum) && schema.enum.length > 0) return schema.enum[0];
|
|
257
|
+
if (schema.default !== void 0) return schema.default;
|
|
258
|
+
}
|
|
259
|
+
function tryInferExample(schema) {
|
|
260
|
+
const example = inferExample(schema);
|
|
261
|
+
if (example !== void 0) return {
|
|
262
|
+
value: example,
|
|
263
|
+
readOnly: schema.readOnly,
|
|
264
|
+
writeOnly: schema.writeOnly,
|
|
265
|
+
type: null
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
function allOfSample(into, children, options, spec, context) {
|
|
269
|
+
const res = traverse(into, options, spec);
|
|
270
|
+
const subSamples = [];
|
|
271
|
+
for (const subSchema of children) {
|
|
272
|
+
const { type, readOnly, writeOnly, value } = traverse({
|
|
273
|
+
type: res.type,
|
|
274
|
+
...subSchema
|
|
275
|
+
}, options, spec, {
|
|
276
|
+
...context,
|
|
277
|
+
depth: context?.depth ?? 1,
|
|
278
|
+
isAllOfChild: true
|
|
279
|
+
});
|
|
280
|
+
if (res.type && type && type !== res.type) {
|
|
281
|
+
if (!options.quiet) console.warn("allOf: schemas with different types can't be merged");
|
|
282
|
+
res.type = type;
|
|
283
|
+
}
|
|
284
|
+
res.type = res.type ?? type;
|
|
285
|
+
res.readOnly = res.readOnly || readOnly;
|
|
286
|
+
res.writeOnly = res.writeOnly || writeOnly;
|
|
287
|
+
if (value != null) subSamples.push(value);
|
|
288
|
+
}
|
|
289
|
+
if (res.type === "object") {
|
|
290
|
+
const merged = mergeDeep(res.value || {}, ...subSamples.filter((s) => typeof s === "object" && s !== null));
|
|
291
|
+
for (const key of Object.keys(merged)) if (merged[key] === SKIP) delete merged[key];
|
|
292
|
+
return {
|
|
293
|
+
...res,
|
|
294
|
+
value: merged
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
if (res.type === "array") {
|
|
298
|
+
if (!options.quiet) console.warn("OpenAPI Sampler: found allOf with \"array\" type. Result may be incorrect");
|
|
299
|
+
}
|
|
300
|
+
const last = subSamples[subSamples.length - 1];
|
|
301
|
+
return {
|
|
302
|
+
...res,
|
|
303
|
+
value: last != null ? last : res.value
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
const typeSamplers = {
|
|
307
|
+
array: sampleArray,
|
|
308
|
+
boolean: sampleBoolean,
|
|
309
|
+
integer: sampleNumber,
|
|
310
|
+
number: sampleNumber,
|
|
311
|
+
object: sampleObject,
|
|
312
|
+
string: sampleString
|
|
313
|
+
};
|
|
314
|
+
function traverseOneOrAnyOf(parent, selectedSubSchema, options, spec, context) {
|
|
315
|
+
const inferred = tryInferExample(parent);
|
|
316
|
+
if (inferred !== void 0) return inferred;
|
|
317
|
+
const localExample = traverse({
|
|
318
|
+
...parent,
|
|
319
|
+
oneOf: void 0,
|
|
320
|
+
anyOf: void 0
|
|
321
|
+
}, options, spec, context);
|
|
322
|
+
const subExample = traverse(selectedSubSchema, options, spec, context);
|
|
323
|
+
if (typeof localExample.value === "object" && localExample.value !== null && typeof subExample.value === "object" && subExample.value !== null) {
|
|
324
|
+
const mergedExample = mergeDeep(localExample.value, subExample.value);
|
|
325
|
+
return {
|
|
326
|
+
...subExample,
|
|
327
|
+
value: mergedExample
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
return subExample;
|
|
331
|
+
}
|
|
332
|
+
function traverse(schema, options, spec, context) {
|
|
333
|
+
if (context) {
|
|
334
|
+
if (seenObjectStack.includes(schema)) return {
|
|
335
|
+
value: getCircularPlaceholder(inferType(schema)),
|
|
336
|
+
type: null
|
|
337
|
+
};
|
|
338
|
+
seenObjectStack.push(schema);
|
|
339
|
+
}
|
|
340
|
+
if (context && (context.depth ?? 1) > options.maxSampleDepth) {
|
|
341
|
+
popStack(context);
|
|
342
|
+
return {
|
|
343
|
+
value: getCircularPlaceholder(inferType(schema)),
|
|
344
|
+
type: null
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
if (!isPlainObject(schema)) {
|
|
348
|
+
popStack(context);
|
|
349
|
+
return {
|
|
350
|
+
value: schema,
|
|
351
|
+
type: null
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
const s = schema;
|
|
355
|
+
if (typeof s.$ref === "string") {
|
|
356
|
+
if (spec == null) throw new Error("Your schema contains $ref. You must provide full specification in the third parameter.");
|
|
357
|
+
const ref = decodeURIComponent(s.$ref);
|
|
358
|
+
if (!ref.startsWith("#")) throw new Error("Your schema contains $ref. Only in-document references (`#/…`) are supported.");
|
|
359
|
+
if (refResolving[ref]) {
|
|
360
|
+
const referencedType = inferType(resolveRefSync(ref, spec) ?? {});
|
|
361
|
+
popStack(context);
|
|
362
|
+
return {
|
|
363
|
+
value: getCircularPlaceholder(referencedType),
|
|
364
|
+
type: null
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
refResolving[ref] = true;
|
|
368
|
+
const referenced = resolveRefSync(ref, spec);
|
|
369
|
+
if (referenced === void 0) {
|
|
370
|
+
refResolving[ref] = false;
|
|
371
|
+
popStack(context);
|
|
372
|
+
throw new Error(`Could not resolve $ref: ${s.$ref}`);
|
|
373
|
+
}
|
|
374
|
+
const result = traverse(referenced, options, spec, context);
|
|
375
|
+
refResolving[ref] = false;
|
|
376
|
+
popStack(context);
|
|
377
|
+
return result;
|
|
378
|
+
}
|
|
379
|
+
if (s.example !== void 0) {
|
|
380
|
+
popStack(context);
|
|
381
|
+
return {
|
|
382
|
+
value: s.example,
|
|
383
|
+
readOnly: s.readOnly,
|
|
384
|
+
writeOnly: s.writeOnly,
|
|
385
|
+
type: s.type
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
if (s.allOf !== void 0) {
|
|
389
|
+
popStack(context);
|
|
390
|
+
return tryInferExample(s) ?? allOfSample({
|
|
391
|
+
...s,
|
|
392
|
+
allOf: void 0
|
|
393
|
+
}, s.allOf, options, spec, context);
|
|
394
|
+
}
|
|
395
|
+
if (s.oneOf && Array.isArray(s.oneOf) && s.oneOf.length > 0) {
|
|
396
|
+
if (s.anyOf && !options.quiet) console.warn("oneOf and anyOf are not supported on the same level. Skipping anyOf");
|
|
397
|
+
popStack(context);
|
|
398
|
+
return traverseOneOrAnyOf(s, Object.assign({
|
|
399
|
+
readOnly: s.readOnly,
|
|
400
|
+
writeOnly: s.writeOnly
|
|
401
|
+
}, s.oneOf[0]), options, spec, context);
|
|
402
|
+
}
|
|
403
|
+
if (s.anyOf && Array.isArray(s.anyOf) && s.anyOf.length > 0) {
|
|
404
|
+
popStack(context);
|
|
405
|
+
return traverseOneOrAnyOf(s, Object.assign({
|
|
406
|
+
readOnly: s.readOnly,
|
|
407
|
+
writeOnly: s.writeOnly
|
|
408
|
+
}, s.anyOf[0]), options, spec, context);
|
|
409
|
+
}
|
|
410
|
+
if (s.if && s.then) {
|
|
411
|
+
popStack(context);
|
|
412
|
+
const { if: ifSchema, then, ...rest } = s;
|
|
413
|
+
return traverse(mergeDeep(rest, ifSchema, then), options, spec, context);
|
|
414
|
+
}
|
|
415
|
+
let example = inferExample(s);
|
|
416
|
+
let type = null;
|
|
417
|
+
if (example === void 0) {
|
|
418
|
+
example = null;
|
|
419
|
+
type = s.type;
|
|
420
|
+
if (Array.isArray(type) && type.length > 0) type = type[0];
|
|
421
|
+
if (!type) type = inferType(s);
|
|
422
|
+
const sampler = type ? typeSamplers[type] : void 0;
|
|
423
|
+
if (sampler) example = sampler(s, options, spec, context);
|
|
424
|
+
}
|
|
425
|
+
popStack(context);
|
|
426
|
+
return {
|
|
427
|
+
value: example,
|
|
428
|
+
readOnly: s.readOnly,
|
|
429
|
+
writeOnly: s.writeOnly,
|
|
430
|
+
type
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
function sample(schema, options, spec) {
|
|
434
|
+
const opts = {
|
|
435
|
+
...defaultOptions,
|
|
436
|
+
...options
|
|
437
|
+
};
|
|
438
|
+
clearCaches();
|
|
439
|
+
return traverse(schema, opts, spec).value;
|
|
440
|
+
}
|
|
441
|
+
//#endregion
|
|
442
|
+
export { sample };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fumadocs-openapi",
|
|
3
|
-
"version": "10.6.
|
|
3
|
+
"version": "10.6.8",
|
|
4
4
|
"description": "Generate MDX docs for your OpenAPI spec",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Docs",
|
|
@@ -43,47 +43,45 @@
|
|
|
43
43
|
"access": "public"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@fastify/deepmerge": "^3.2.1",
|
|
47
46
|
"@fumari/json-schema-ts": "^0.0.2",
|
|
48
47
|
"@radix-ui/react-accordion": "^1.2.12",
|
|
49
48
|
"@radix-ui/react-dialog": "^1.1.15",
|
|
50
49
|
"@radix-ui/react-select": "^2.2.6",
|
|
51
50
|
"@radix-ui/react-slot": "^1.2.4",
|
|
52
|
-
"@scalar/json-magic": "^0.12.
|
|
53
|
-
"@scalar/openapi-upgrader": "^0.2.
|
|
51
|
+
"@scalar/json-magic": "^0.12.5",
|
|
52
|
+
"@scalar/openapi-upgrader": "^0.2.4",
|
|
54
53
|
"ajv": "^8.18.0",
|
|
55
54
|
"chokidar": "^5.0.0",
|
|
56
55
|
"class-variance-authority": "^0.7.1",
|
|
57
56
|
"github-slugger": "^2.0.0",
|
|
58
57
|
"hast-util-to-jsx-runtime": "^2.3.6",
|
|
59
58
|
"js-yaml": "^4.1.1",
|
|
60
|
-
"lucide-react": "^1.
|
|
59
|
+
"lucide-react": "^1.8.0",
|
|
61
60
|
"next-themes": "^0.4.6",
|
|
62
|
-
"openapi-sampler": "^1.7.2",
|
|
63
|
-
"react-hook-form": "^7.72.0",
|
|
64
61
|
"remark": "^15.0.1",
|
|
65
62
|
"remark-rehype": "^11.1.2",
|
|
66
63
|
"tailwind-merge": "^3.5.0",
|
|
67
64
|
"xml-js": "^1.6.11",
|
|
68
|
-
"@fumari/stf": "1.0.
|
|
65
|
+
"@fumari/stf": "1.0.5"
|
|
69
66
|
},
|
|
70
67
|
"devDependencies": {
|
|
71
|
-
"@
|
|
68
|
+
"@fastify/deepmerge": "^3.2.1",
|
|
69
|
+
"@scalar/api-client-react": "^2.0.1",
|
|
72
70
|
"@types/js-yaml": "^4.0.9",
|
|
73
|
-
"@types/node": "25.
|
|
74
|
-
"@types/openapi-sampler": "^1.0.3",
|
|
71
|
+
"@types/node": "25.6.0",
|
|
75
72
|
"@types/react": "^19.2.14",
|
|
73
|
+
"fast-content-type-parse": "^3.0.0",
|
|
76
74
|
"json-schema-typed": "^8.0.2",
|
|
77
75
|
"shiki": "^4.0.2",
|
|
78
76
|
"tailwindcss": "^4.2.2",
|
|
79
|
-
"tsdown": "0.21.
|
|
80
|
-
"@fumadocs/tailwind": "0.0.
|
|
81
|
-
"fumadocs-core": "16.7.
|
|
82
|
-
"fumadocs-ui": "16.7.
|
|
77
|
+
"tsdown": "0.21.7",
|
|
78
|
+
"@fumadocs/tailwind": "0.0.4",
|
|
79
|
+
"fumadocs-core": "16.7.13",
|
|
80
|
+
"fumadocs-ui": "16.7.13",
|
|
83
81
|
"tsconfig": "0.0.0"
|
|
84
82
|
},
|
|
85
83
|
"peerDependencies": {
|
|
86
|
-
"@scalar/api-client-react": "
|
|
84
|
+
"@scalar/api-client-react": "2.x.x",
|
|
87
85
|
"@types/react": "*",
|
|
88
86
|
"fumadocs-core": "^16.7.0",
|
|
89
87
|
"fumadocs-ui": "^16.7.0",
|
|
@@ -106,6 +104,10 @@
|
|
|
106
104
|
"optional": true
|
|
107
105
|
}
|
|
108
106
|
},
|
|
107
|
+
"inlinedDependencies": {
|
|
108
|
+
"@fastify/deepmerge": "3.2.1",
|
|
109
|
+
"fast-content-type-parse": "3.0.0"
|
|
110
|
+
},
|
|
109
111
|
"scripts": {
|
|
110
112
|
"build": "tsdown --config-loader unrun",
|
|
111
113
|
"clean": "rimraf dist",
|