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.
Files changed (31) hide show
  1. package/css/generated/shared.css +29 -5
  2. package/dist/_virtual/_rolldown/runtime.js +2 -1
  3. package/dist/i18n.d.ts +2 -1
  4. package/dist/i18n.js +5 -3
  5. package/dist/node_modules/.pnpm/@fastify_deepmerge@3.2.1/node_modules/@fastify/deepmerge/index.js +108 -0
  6. package/dist/node_modules/.pnpm/fast-content-type-parse@3.0.0/node_modules/fast-content-type-parse/index.js +115 -0
  7. package/dist/playground/client.d.ts +3 -11
  8. package/dist/playground/client.js +3 -37
  9. package/dist/playground/components/inputs.js +2 -2
  10. package/dist/playground/components/oauth-dialog.js +18 -12
  11. package/dist/playground/components/result-display.d.ts +16 -0
  12. package/dist/playground/components/result-display.js +142 -0
  13. package/dist/playground/components/server-select.js +1 -1
  14. package/dist/playground/fetcher.d.ts +9 -3
  15. package/dist/playground/fetcher.js +7 -18
  16. package/dist/playground/schema.js +1 -1
  17. package/dist/playground/status-info.js +27 -23
  18. package/dist/scalar/client.js +14 -23
  19. package/dist/ui/base.js +1 -1
  20. package/dist/ui/client/i18n.js +6 -4
  21. package/dist/ui/components/dialog.js +1 -1
  22. package/dist/ui/operation/client.js +1 -1
  23. package/dist/ui/operation/get-example-requests.js +1 -1
  24. package/dist/ui/operation/index.js +1 -1
  25. package/dist/ui/operation/request-tabs.js +1 -1
  26. package/dist/ui/operation/response-tabs.js +1 -1
  27. package/dist/ui/operation/usage-tabs/client.js +1 -1
  28. package/dist/ui/schema/client.js +2 -2
  29. package/dist/ui/schema/index.js +1 -1
  30. package/dist/utils/schema/sample.js +442 -0
  31. 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.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.4",
53
- "@scalar/openapi-upgrader": "^0.2.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.7.0",
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.4"
65
+ "@fumari/stf": "1.0.5"
69
66
  },
70
67
  "devDependencies": {
71
- "@scalar/api-client-react": "^1.4.15",
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.5.0",
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.6",
80
- "@fumadocs/tailwind": "0.0.3",
81
- "fumadocs-core": "16.7.10",
82
- "fumadocs-ui": "16.7.10",
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",