docusaurus-theme-openapi-docs 4.1.0 → 4.3.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 (56) hide show
  1. package/lib/theme/ApiExplorer/ApiCodeBlock/Line/_Line.scss +0 -12
  2. package/lib/theme/ApiExplorer/Authorization/index.js +3 -0
  3. package/lib/theme/ApiExplorer/Body/index.js +11 -2
  4. package/lib/theme/ApiExplorer/CodeSnippets/index.js +2 -1
  5. package/lib/theme/ApiExplorer/CodeTabs/_CodeTabs.scss +50 -0
  6. package/lib/theme/ApiItem/Layout/index.js +6 -2
  7. package/lib/theme/ApiItem/index.js +15 -4
  8. package/lib/theme/ApiTabs/_ApiTabs.scss +0 -1
  9. package/lib/theme/ArrayBrackets/index.d.ts +3 -0
  10. package/lib/theme/ArrayBrackets/index.js +50 -0
  11. package/lib/theme/Markdown/Details/_Details.scss +5 -2
  12. package/lib/theme/Markdown/index.js +160 -18
  13. package/lib/theme/ParamsDetails/index.d.ts +6 -0
  14. package/lib/theme/ParamsDetails/index.js +134 -0
  15. package/lib/theme/ParamsItem/index.d.ts +1 -0
  16. package/lib/theme/ParamsItem/index.js +11 -48
  17. package/lib/theme/RequestSchema/index.d.ts +15 -0
  18. package/lib/theme/RequestSchema/index.js +243 -0
  19. package/lib/theme/ResponseExamples/index.d.ts +18 -0
  20. package/lib/theme/ResponseExamples/index.js +194 -0
  21. package/lib/theme/ResponseHeaders/index.d.ts +13 -0
  22. package/lib/theme/ResponseHeaders/index.js +39 -0
  23. package/lib/theme/ResponseSchema/index.d.ts +15 -0
  24. package/lib/theme/ResponseSchema/index.js +208 -0
  25. package/lib/theme/Schema/index.d.ts +8 -0
  26. package/lib/theme/Schema/index.js +887 -0
  27. package/lib/theme/SchemaItem/index.d.ts +8 -8
  28. package/lib/theme/SchemaItem/index.js +11 -41
  29. package/lib/theme/SkeletonLoader/index.d.ts +6 -0
  30. package/lib/theme/SkeletonLoader/index.js +20 -0
  31. package/lib/theme/StatusCodes/index.d.ts +9 -0
  32. package/lib/theme/StatusCodes/index.js +81 -0
  33. package/lib/theme/styles.scss +56 -9
  34. package/package.json +13 -8
  35. package/src/theme/ApiExplorer/ApiCodeBlock/Line/_Line.scss +0 -12
  36. package/src/theme/ApiExplorer/Authorization/index.tsx +3 -0
  37. package/src/theme/ApiExplorer/Body/index.tsx +3 -2
  38. package/src/theme/ApiExplorer/CodeSnippets/index.tsx +2 -1
  39. package/src/theme/ApiExplorer/CodeTabs/_CodeTabs.scss +50 -0
  40. package/src/theme/ApiItem/Layout/index.tsx +5 -2
  41. package/src/theme/ApiItem/index.tsx +14 -2
  42. package/src/theme/ApiTabs/_ApiTabs.scss +0 -1
  43. package/src/theme/ArrayBrackets/index.tsx +37 -0
  44. package/src/theme/Markdown/Details/_Details.scss +5 -2
  45. package/src/theme/Markdown/index.js +160 -18
  46. package/src/theme/ParamsDetails/index.tsx +88 -0
  47. package/src/theme/ParamsItem/index.tsx +9 -36
  48. package/src/theme/RequestSchema/index.tsx +164 -0
  49. package/src/theme/ResponseExamples/index.tsx +192 -0
  50. package/src/theme/ResponseHeaders/index.tsx +49 -0
  51. package/src/theme/ResponseSchema/index.tsx +151 -0
  52. package/src/theme/Schema/index.tsx +935 -0
  53. package/src/theme/SchemaItem/index.tsx +21 -43
  54. package/src/theme/SkeletonLoader/index.tsx +18 -0
  55. package/src/theme/StatusCodes/index.tsx +72 -0
  56. package/src/theme/styles.scss +56 -9
@@ -0,0 +1,887 @@
1
+ "use strict";
2
+ /* ============================================================================
3
+ * Copyright (c) Palo Alto Networks
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ * ========================================================================== */
8
+ var __importDefault =
9
+ (this && this.__importDefault) ||
10
+ function (mod) {
11
+ return mod && mod.__esModule ? mod : { default: mod };
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ const react_1 = __importDefault(require("react"));
15
+ const ArrayBrackets_1 = require("@theme/ArrayBrackets");
16
+ const Details_1 = __importDefault(require("@theme/Details"));
17
+ const DiscriminatorTabs_1 = __importDefault(
18
+ require("@theme/DiscriminatorTabs")
19
+ );
20
+ const Markdown_1 = __importDefault(require("@theme/Markdown"));
21
+ const SchemaItem_1 = __importDefault(require("@theme/SchemaItem"));
22
+ const SchemaTabs_1 = __importDefault(require("@theme/SchemaTabs"));
23
+ const TabItem_1 = __importDefault(require("@theme/TabItem"));
24
+ // eslint-disable-next-line import/no-extraneous-dependencies
25
+ const allof_merge_1 = require("allof-merge");
26
+ const clsx_1 = __importDefault(require("clsx"));
27
+ const schema_1 = require("docusaurus-plugin-openapi-docs/lib/markdown/schema");
28
+ const isEmpty_1 = __importDefault(require("lodash/isEmpty"));
29
+ // eslint-disable-next-line import/no-extraneous-dependencies
30
+ // const jsonSchemaMergeAllOf = require("json-schema-merge-allof");
31
+ const mergeAllOf = (allOf) => {
32
+ const onMergeError = (msg) => {
33
+ console.warn(msg);
34
+ };
35
+ const mergedSchemas = (0, allof_merge_1.merge)(allOf, { onMergeError });
36
+ return mergedSchemas;
37
+ };
38
+ // Renders string as markdown, useful for descriptions and qualifiers
39
+ const MarkdownWrapper = ({ text }) => {
40
+ return react_1.default.createElement(
41
+ "div",
42
+ { style: { marginTop: ".5rem", marginBottom: ".5rem" } },
43
+ react_1.default.createElement(Markdown_1.default, null, text)
44
+ );
45
+ };
46
+ const Summary = ({ name, schemaName, schema, required }) => {
47
+ const { deprecated, nullable } = schema;
48
+ const isRequired = Array.isArray(required)
49
+ ? required.includes(name)
50
+ : required === true;
51
+ return react_1.default.createElement(
52
+ "summary",
53
+ null,
54
+ react_1.default.createElement(
55
+ "span",
56
+ { className: "openapi-schema__container" },
57
+ react_1.default.createElement(
58
+ "strong",
59
+ {
60
+ className: (0, clsx_1.default)("openapi-schema__property", {
61
+ "openapi-schema__strikethrough": deprecated,
62
+ }),
63
+ },
64
+ name
65
+ ),
66
+ react_1.default.createElement(
67
+ "span",
68
+ { className: "openapi-schema__name" },
69
+ " ",
70
+ schemaName
71
+ ),
72
+ (isRequired || deprecated || nullable) &&
73
+ react_1.default.createElement("span", {
74
+ className: "openapi-schema__divider",
75
+ }),
76
+ nullable &&
77
+ react_1.default.createElement(
78
+ "span",
79
+ { className: "openapi-schema__nullable" },
80
+ "nullable"
81
+ ),
82
+ isRequired &&
83
+ react_1.default.createElement(
84
+ "span",
85
+ { className: "openapi-schema__required" },
86
+ "required"
87
+ ),
88
+ deprecated &&
89
+ react_1.default.createElement(
90
+ "span",
91
+ { className: "openapi-schema__deprecated" },
92
+ "deprecated"
93
+ )
94
+ )
95
+ );
96
+ };
97
+ const AnyOneOf = ({ schema, schemaType }) => {
98
+ const type = schema.oneOf ? "oneOf" : "anyOf";
99
+ return react_1.default.createElement(
100
+ react_1.default.Fragment,
101
+ null,
102
+ react_1.default.createElement(
103
+ "span",
104
+ { className: "badge badge--info", style: { marginBottom: "1rem" } },
105
+ type
106
+ ),
107
+ react_1.default.createElement(
108
+ SchemaTabs_1.default,
109
+ null,
110
+ schema[type]?.map((anyOneSchema, index) => {
111
+ const label = anyOneSchema.title || `MOD${index + 1}`;
112
+ return (
113
+ // @ts-ignore
114
+ react_1.default.createElement(
115
+ TabItem_1.default,
116
+ { key: index, label: label, value: `${index}-item-properties` },
117
+ ["string", "number", "integer", "boolean"].includes(
118
+ anyOneSchema.type
119
+ ) &&
120
+ react_1.default.createElement(SchemaItem_1.default, {
121
+ collapsible: false,
122
+ name: undefined,
123
+ schemaName: anyOneSchema.type,
124
+ qualifierMessage: (0, schema_1.getQualifierMessage)(
125
+ anyOneSchema
126
+ ),
127
+ schema: anyOneSchema,
128
+ discriminator: false,
129
+ children: null,
130
+ }),
131
+ anyOneSchema.type === "object" &&
132
+ !anyOneSchema.properties &&
133
+ !anyOneSchema.allOf &&
134
+ !anyOneSchema.oneOf &&
135
+ !anyOneSchema.anyOf &&
136
+ react_1.default.createElement(SchemaItem_1.default, {
137
+ collapsible: false,
138
+ name: undefined,
139
+ schemaName: anyOneSchema.type,
140
+ qualifierMessage: (0, schema_1.getQualifierMessage)(
141
+ anyOneSchema
142
+ ),
143
+ schema: anyOneSchema,
144
+ discriminator: false,
145
+ children: null,
146
+ }),
147
+ anyOneSchema.type === "object" &&
148
+ anyOneSchema.properties &&
149
+ react_1.default.createElement(Properties, {
150
+ schema: anyOneSchema,
151
+ schemaType: schemaType,
152
+ }),
153
+ anyOneSchema.allOf &&
154
+ react_1.default.createElement(SchemaNode, {
155
+ schema: anyOneSchema,
156
+ schemaType: schemaType,
157
+ }),
158
+ anyOneSchema.oneOf &&
159
+ react_1.default.createElement(SchemaNode, {
160
+ schema: anyOneSchema,
161
+ schemaType: schemaType,
162
+ }),
163
+ anyOneSchema.anyOf &&
164
+ react_1.default.createElement(SchemaNode, {
165
+ schema: anyOneSchema,
166
+ schemaType: schemaType,
167
+ }),
168
+ anyOneSchema.items &&
169
+ react_1.default.createElement(Items, {
170
+ schema: anyOneSchema,
171
+ schemaType: schemaType,
172
+ })
173
+ )
174
+ );
175
+ })
176
+ )
177
+ );
178
+ };
179
+ const Properties = ({ schema, schemaType }) => {
180
+ const discriminator = schema.discriminator;
181
+ if (discriminator && !discriminator.mapping) {
182
+ const anyOneOf = schema.oneOf ?? schema.anyOf ?? {};
183
+ const inferredMapping = {};
184
+ Object.entries(anyOneOf).map(([_, anyOneSchema]) => {
185
+ // ensure discriminated property only renders once
186
+ if (
187
+ schema.properties[discriminator.propertyName] &&
188
+ anyOneSchema.properties[discriminator.propertyName]
189
+ )
190
+ delete anyOneSchema.properties[discriminator.propertyName];
191
+ return (inferredMapping[anyOneSchema.title] = anyOneSchema);
192
+ });
193
+ discriminator["mapping"] = inferredMapping;
194
+ }
195
+ if (Object.keys(schema.properties).length === 0) {
196
+ return react_1.default.createElement(SchemaItem_1.default, {
197
+ collapsible: false,
198
+ name: "",
199
+ required: false,
200
+ schemaName: "object",
201
+ qualifierMessage: undefined,
202
+ schema: {},
203
+ });
204
+ }
205
+ return react_1.default.createElement(
206
+ react_1.default.Fragment,
207
+ null,
208
+ Object.entries(schema.properties).map(([key, val]) =>
209
+ react_1.default.createElement(SchemaEdge, {
210
+ key: key,
211
+ name: key,
212
+ schema: val,
213
+ required: Array.isArray(schema.required)
214
+ ? schema.required.includes(key)
215
+ : false,
216
+ discriminator: discriminator,
217
+ schemaType: schemaType,
218
+ })
219
+ )
220
+ );
221
+ };
222
+ const PropertyDiscriminator = ({
223
+ name,
224
+ schemaName,
225
+ schema,
226
+ schemaType,
227
+ discriminator,
228
+ required,
229
+ }) => {
230
+ if (!schema) {
231
+ return null;
232
+ }
233
+ return react_1.default.createElement(
234
+ react_1.default.Fragment,
235
+ null,
236
+ react_1.default.createElement(
237
+ "div",
238
+ { className: "openapi-discriminator__item openapi-schema__list-item" },
239
+ react_1.default.createElement(
240
+ "div",
241
+ null,
242
+ react_1.default.createElement(
243
+ "span",
244
+ { className: "openapi-schema__container" },
245
+ react_1.default.createElement(
246
+ "strong",
247
+ {
248
+ className: "openapi-discriminator__name openapi-schema__property",
249
+ },
250
+ name
251
+ ),
252
+ schemaName &&
253
+ react_1.default.createElement(
254
+ "span",
255
+ { className: "openapi-schema__name" },
256
+ " ",
257
+ schemaName
258
+ ),
259
+ required &&
260
+ react_1.default.createElement("span", {
261
+ className: "openapi-schema__divider",
262
+ }),
263
+ required &&
264
+ react_1.default.createElement(
265
+ "span",
266
+ { className: "openapi-schema__required" },
267
+ "required"
268
+ )
269
+ ),
270
+ react_1.default.createElement(
271
+ "div",
272
+ { style: { marginLeft: "1rem" } },
273
+ schema.description &&
274
+ react_1.default.createElement(MarkdownWrapper, {
275
+ text: schema.description,
276
+ }),
277
+ (0, schema_1.getQualifierMessage)(discriminator) &&
278
+ react_1.default.createElement(MarkdownWrapper, {
279
+ text: (0, schema_1.getQualifierMessage)(discriminator),
280
+ })
281
+ ),
282
+ react_1.default.createElement(
283
+ DiscriminatorTabs_1.default,
284
+ { className: "openapi-tabs__discriminator" },
285
+ Object.keys(discriminator.mapping).map((key, index) =>
286
+ // @ts-ignore
287
+ react_1.default.createElement(
288
+ TabItem_1.default,
289
+ { key: index, label: key, value: `${index}-item-discriminator` },
290
+ react_1.default.createElement(SchemaNode, {
291
+ schema: discriminator.mapping[key],
292
+ schemaType: schemaType,
293
+ })
294
+ )
295
+ )
296
+ )
297
+ )
298
+ ),
299
+ schema.properties &&
300
+ Object.entries(schema.properties).map(
301
+ ([key, val]) =>
302
+ key !== discriminator.propertyName &&
303
+ react_1.default.createElement(SchemaEdge, {
304
+ key: key,
305
+ name: key,
306
+ schema: val,
307
+ required: Array.isArray(schema.required)
308
+ ? schema.required.includes(key)
309
+ : false,
310
+ discriminator: false,
311
+ schemaType: schemaType,
312
+ })
313
+ )
314
+ );
315
+ };
316
+ const DiscriminatorNode = ({ discriminator, schema, schemaType }) => {
317
+ let discriminatedSchemas = {};
318
+ let inferredMapping = {};
319
+ // default to empty object if no parent-level properties exist
320
+ const discriminatorProperty = schema.properties
321
+ ? schema.properties[discriminator.propertyName]
322
+ : {};
323
+ if (schema.allOf) {
324
+ const mergedSchemas = mergeAllOf(schema);
325
+ if (mergedSchemas.oneOf || mergedSchemas.anyOf) {
326
+ discriminatedSchemas = mergedSchemas.oneOf || mergedSchemas.anyOf;
327
+ }
328
+ } else if (schema.oneOf || schema.anyOf) {
329
+ discriminatedSchemas = schema.oneOf || schema.anyOf;
330
+ }
331
+ // Handle case where no mapping is defined
332
+ if (!discriminator.mapping) {
333
+ Object.entries(discriminatedSchemas).forEach(([_, subschema], index) => {
334
+ inferredMapping[subschema.title ?? `PROP${index}`] = subschema;
335
+ });
336
+ discriminator.mapping = inferredMapping;
337
+ }
338
+ // Merge sub schema discriminator property with parent
339
+ Object.keys(discriminator.mapping).forEach((key) => {
340
+ const subSchema = discriminator.mapping[key];
341
+ // Handle discriminated schema with allOf
342
+ let mergedSubSchema = {};
343
+ if (subSchema.allOf) {
344
+ mergedSubSchema = mergeAllOf(subSchema);
345
+ }
346
+ const subProperties = subSchema.properties || mergedSubSchema.properties;
347
+ if (subProperties[discriminator.propertyName]) {
348
+ if (schema.properties) {
349
+ schema.properties[discriminator.propertyName] = {
350
+ ...schema.properties[discriminator.propertyName],
351
+ ...subProperties[discriminator.propertyName],
352
+ };
353
+ if (subSchema.required && !schema.required) {
354
+ schema.required = subSchema.required;
355
+ }
356
+ // Avoid duplicating property
357
+ delete subProperties[discriminator.propertyName];
358
+ } else {
359
+ schema.properties = {};
360
+ schema.properties[discriminator.propertyName] =
361
+ subProperties[discriminator.propertyName];
362
+ // Avoid duplicating property
363
+ delete subProperties[discriminator.propertyName];
364
+ }
365
+ }
366
+ });
367
+ const name = discriminator.propertyName;
368
+ const schemaName = (0, schema_1.getSchemaName)(discriminatorProperty);
369
+ // Default case for discriminator without oneOf/anyOf/allOf
370
+ return react_1.default.createElement(PropertyDiscriminator, {
371
+ name: name,
372
+ schemaName: schemaName,
373
+ schema: schema,
374
+ schemaType: schemaType,
375
+ discriminator: discriminator,
376
+ required: Array.isArray(schema.required)
377
+ ? schema.required.includes(name)
378
+ : schema.required,
379
+ });
380
+ };
381
+ const AdditionalProperties = ({ schema, schemaType }) => {
382
+ const additionalProperties = schema.additionalProperties;
383
+ if (!additionalProperties) return null;
384
+ // Handle free-form objects
385
+ if (
386
+ additionalProperties === true ||
387
+ (0, isEmpty_1.default)(additionalProperties)
388
+ ) {
389
+ return react_1.default.createElement(SchemaItem_1.default, {
390
+ name: "property name*",
391
+ required: false,
392
+ schemaName: "any",
393
+ qualifierMessage: (0, schema_1.getQualifierMessage)(schema),
394
+ schema: schema,
395
+ collapsible: false,
396
+ discriminator: false,
397
+ });
398
+ }
399
+ // Handle objects, arrays, complex schemas
400
+ if (
401
+ additionalProperties.properties ||
402
+ additionalProperties.items ||
403
+ additionalProperties.allOf ||
404
+ additionalProperties.additionalProperties ||
405
+ additionalProperties.oneOf ||
406
+ additionalProperties.anyOf
407
+ ) {
408
+ const title =
409
+ additionalProperties.title ||
410
+ (0, schema_1.getSchemaName)(additionalProperties);
411
+ const required = schema.required || false;
412
+ return react_1.default.createElement(SchemaNodeDetails, {
413
+ name: "property name*",
414
+ schemaName: title,
415
+ required: required,
416
+ nullable: schema.nullable,
417
+ schema: additionalProperties,
418
+ schemaType: schemaType,
419
+ });
420
+ }
421
+ // Handle primitive types
422
+ if (
423
+ additionalProperties.type === "string" ||
424
+ additionalProperties.type === "boolean" ||
425
+ additionalProperties.type === "integer" ||
426
+ additionalProperties.type === "number" ||
427
+ additionalProperties.type === "object"
428
+ ) {
429
+ const schemaName = (0, schema_1.getSchemaName)(additionalProperties);
430
+ return react_1.default.createElement(SchemaItem_1.default, {
431
+ name: "property name*",
432
+ required: false,
433
+ schemaName: schemaName,
434
+ qualifierMessage: (0, schema_1.getQualifierMessage)(schema),
435
+ schema: additionalProperties,
436
+ collapsible: false,
437
+ discriminator: false,
438
+ children: null,
439
+ });
440
+ }
441
+ // Unknown type
442
+ return null;
443
+ };
444
+ const SchemaNodeDetails = ({
445
+ name,
446
+ schemaName,
447
+ schema,
448
+ required,
449
+ schemaType,
450
+ }) => {
451
+ return react_1.default.createElement(
452
+ SchemaItem_1.default,
453
+ { collapsible: true },
454
+ react_1.default.createElement(
455
+ Details_1.default,
456
+ {
457
+ className: "openapi-markdown__details",
458
+ summary: react_1.default.createElement(Summary, {
459
+ name: name,
460
+ schemaName: schemaName,
461
+ schema: schema,
462
+ required: required,
463
+ }),
464
+ },
465
+ react_1.default.createElement(
466
+ "div",
467
+ { style: { marginLeft: "1rem" } },
468
+ schema.description &&
469
+ react_1.default.createElement(MarkdownWrapper, {
470
+ text: schema.description,
471
+ }),
472
+ (0, schema_1.getQualifierMessage)(schema) &&
473
+ react_1.default.createElement(MarkdownWrapper, {
474
+ text: (0, schema_1.getQualifierMessage)(schema),
475
+ }),
476
+ react_1.default.createElement(SchemaNode, {
477
+ schema: schema,
478
+ schemaType: schemaType,
479
+ })
480
+ )
481
+ )
482
+ );
483
+ };
484
+ const Items = ({ schema, schemaType }) => {
485
+ // Handles case when schema.items has properties
486
+ if (schema.items?.properties) {
487
+ return react_1.default.createElement(
488
+ react_1.default.Fragment,
489
+ null,
490
+ react_1.default.createElement(ArrayBrackets_1.OpeningArrayBracket, null),
491
+ react_1.default.createElement(Properties, {
492
+ schema: schema.items,
493
+ schemaType: schemaType,
494
+ }),
495
+ react_1.default.createElement(ArrayBrackets_1.ClosingArrayBracket, null)
496
+ );
497
+ }
498
+ // Handles case when schema.items has additionalProperties
499
+ if (schema.items?.additionalProperties) {
500
+ return react_1.default.createElement(
501
+ react_1.default.Fragment,
502
+ null,
503
+ react_1.default.createElement(ArrayBrackets_1.OpeningArrayBracket, null),
504
+ react_1.default.createElement(AdditionalProperties, {
505
+ schema: schema.items,
506
+ schemaType: schemaType,
507
+ }),
508
+ react_1.default.createElement(ArrayBrackets_1.ClosingArrayBracket, null)
509
+ );
510
+ }
511
+ // Handles case when schema.items has oneOf or anyOf
512
+ if (schema.items?.oneOf || schema.items?.anyOf) {
513
+ return react_1.default.createElement(
514
+ react_1.default.Fragment,
515
+ null,
516
+ react_1.default.createElement(ArrayBrackets_1.OpeningArrayBracket, null),
517
+ react_1.default.createElement(AnyOneOf, {
518
+ schema: schema.items,
519
+ schemaType: schemaType,
520
+ }),
521
+ react_1.default.createElement(ArrayBrackets_1.ClosingArrayBracket, null)
522
+ );
523
+ }
524
+ // Handles case when schema.items has allOf
525
+ if (schema.items?.allOf) {
526
+ const mergedSchemas = mergeAllOf(schema.items);
527
+ // Handles combo anyOf/oneOf + properties
528
+ if (
529
+ (mergedSchemas.oneOf || mergedSchemas.anyOf) &&
530
+ mergedSchemas.properties
531
+ ) {
532
+ return react_1.default.createElement(
533
+ react_1.default.Fragment,
534
+ null,
535
+ react_1.default.createElement(
536
+ ArrayBrackets_1.OpeningArrayBracket,
537
+ null
538
+ ),
539
+ react_1.default.createElement(AnyOneOf, {
540
+ schema: mergedSchemas,
541
+ schemaType: schemaType,
542
+ }),
543
+ react_1.default.createElement(Properties, {
544
+ schema: mergedSchemas,
545
+ schemaType: schemaType,
546
+ }),
547
+ react_1.default.createElement(ArrayBrackets_1.ClosingArrayBracket, null)
548
+ );
549
+ }
550
+ // Handles only anyOf/oneOf
551
+ if (mergedSchemas.oneOf || mergedSchemas.anyOf) {
552
+ return react_1.default.createElement(
553
+ react_1.default.Fragment,
554
+ null,
555
+ react_1.default.createElement(
556
+ ArrayBrackets_1.OpeningArrayBracket,
557
+ null
558
+ ),
559
+ react_1.default.createElement(AnyOneOf, {
560
+ schema: mergedSchemas,
561
+ schemaType: schemaType,
562
+ }),
563
+ react_1.default.createElement(ArrayBrackets_1.ClosingArrayBracket, null)
564
+ );
565
+ }
566
+ // Handles properties
567
+ if (mergedSchemas.properties) {
568
+ return react_1.default.createElement(
569
+ react_1.default.Fragment,
570
+ null,
571
+ react_1.default.createElement(
572
+ ArrayBrackets_1.OpeningArrayBracket,
573
+ null
574
+ ),
575
+ react_1.default.createElement(Properties, {
576
+ schema: mergedSchemas,
577
+ schemaType: schemaType,
578
+ }),
579
+ react_1.default.createElement(ArrayBrackets_1.ClosingArrayBracket, null)
580
+ );
581
+ }
582
+ }
583
+ // Handles basic types (string, number, integer, boolean, object)
584
+ if (
585
+ schema.items?.type === "string" ||
586
+ schema.items?.type === "number" ||
587
+ schema.items?.type === "integer" ||
588
+ schema.items?.type === "boolean" ||
589
+ schema.items?.type === "object"
590
+ ) {
591
+ return react_1.default.createElement(
592
+ "div",
593
+ { style: { marginLeft: ".5rem" } },
594
+ react_1.default.createElement(ArrayBrackets_1.OpeningArrayBracket, null),
595
+ react_1.default.createElement(SchemaItem_1.default, {
596
+ collapsible: false,
597
+ name: "", // No name for array items
598
+ schemaName: (0, schema_1.getSchemaName)(schema.items),
599
+ qualifierMessage: (0, schema_1.getQualifierMessage)(schema.items),
600
+ schema: schema.items,
601
+ discriminator: false,
602
+ children: null,
603
+ }),
604
+ react_1.default.createElement(ArrayBrackets_1.ClosingArrayBracket, null)
605
+ );
606
+ }
607
+ // Handles fallback case (use createEdges logic)
608
+ return react_1.default.createElement(
609
+ react_1.default.Fragment,
610
+ null,
611
+ react_1.default.createElement(ArrayBrackets_1.OpeningArrayBracket, null),
612
+ Object.entries(schema.items || {}).map(([key, val]) =>
613
+ react_1.default.createElement(SchemaEdge, {
614
+ key: key,
615
+ name: key,
616
+ schema: val,
617
+ schemaType: schemaType,
618
+ required: Array.isArray(schema.required)
619
+ ? schema.required.includes(key)
620
+ : false,
621
+ })
622
+ ),
623
+ react_1.default.createElement(ArrayBrackets_1.ClosingArrayBracket, null)
624
+ );
625
+ };
626
+ const SchemaEdge = ({ name, schema, required, discriminator, schemaType }) => {
627
+ if (
628
+ (schemaType === "request" && schema.readOnly) ||
629
+ (schemaType === "response" && schema.writeOnly)
630
+ ) {
631
+ return null;
632
+ }
633
+ const schemaName = (0, schema_1.getSchemaName)(schema);
634
+ if (discriminator && discriminator.propertyName === name) {
635
+ return react_1.default.createElement(PropertyDiscriminator, {
636
+ name: name,
637
+ schemaName: schemaName,
638
+ schema: schema,
639
+ schemaType: schemaType,
640
+ discriminator: discriminator,
641
+ required: required,
642
+ });
643
+ }
644
+ if (schema.oneOf || schema.anyOf) {
645
+ // return <AnyOneOf schema={schema} schemaType={schemaType} />;
646
+ return react_1.default.createElement(SchemaNodeDetails, {
647
+ name: name,
648
+ schemaName: schemaName,
649
+ schemaType: schemaType,
650
+ required: required,
651
+ schema: schema,
652
+ nullable: schema.nullable,
653
+ });
654
+ }
655
+ if (schema.properties) {
656
+ return react_1.default.createElement(SchemaNodeDetails, {
657
+ name: name,
658
+ schemaName: schemaName,
659
+ schemaType: schemaType,
660
+ required: required,
661
+ schema: schema,
662
+ nullable: schema.nullable,
663
+ });
664
+ }
665
+ if (schema.additionalProperties) {
666
+ return react_1.default.createElement(SchemaNodeDetails, {
667
+ name: name,
668
+ schemaName: schemaName,
669
+ schemaType: schemaType,
670
+ required: required,
671
+ schema: schema,
672
+ nullable: schema.nullable,
673
+ });
674
+ }
675
+ if (schema.items?.properties) {
676
+ return react_1.default.createElement(SchemaNodeDetails, {
677
+ name: name,
678
+ schemaName: schemaName,
679
+ required: required,
680
+ nullable: schema.nullable,
681
+ schema: schema,
682
+ schemaType: schemaType,
683
+ });
684
+ }
685
+ if (schema.items?.anyOf || schema.items?.oneOf) {
686
+ return react_1.default.createElement(SchemaNodeDetails, {
687
+ name: name,
688
+ schemaName: schemaName,
689
+ required: required,
690
+ nullable: schema.nullable,
691
+ schema: schema,
692
+ schemaType: schemaType,
693
+ });
694
+ }
695
+ if (schema.allOf) {
696
+ // handle circular properties
697
+ if (
698
+ schema.allOf &&
699
+ schema.allOf.length &&
700
+ schema.allOf.length === 1 &&
701
+ typeof schema.allOf[0] === "string"
702
+ ) {
703
+ return react_1.default.createElement(SchemaItem_1.default, {
704
+ collapsible: false,
705
+ name: name,
706
+ required: Array.isArray(required) ? required.includes(name) : required,
707
+ schemaName: schema.allOf[0],
708
+ qualifierMessage: undefined,
709
+ schema: schema.allOf[0],
710
+ discriminator: false,
711
+ children: null,
712
+ });
713
+ }
714
+ const mergedSchemas = mergeAllOf(schema);
715
+ if (
716
+ (schemaType === "request" && mergedSchemas.readOnly) ||
717
+ (schemaType === "response" && mergedSchemas.writeOnly)
718
+ ) {
719
+ return null;
720
+ }
721
+ const mergedSchemaName = (0, schema_1.getSchemaName)(mergedSchemas);
722
+ if (mergedSchemas.oneOf || mergedSchemas.anyOf) {
723
+ return react_1.default.createElement(SchemaNodeDetails, {
724
+ name: name,
725
+ schemaName: mergedSchemaName,
726
+ required: Array.isArray(mergedSchemas.required)
727
+ ? mergedSchemas.required.includes(name)
728
+ : mergedSchemas.required,
729
+ nullable: mergedSchemas.nullable,
730
+ schema: mergedSchemas,
731
+ schemaType: schemaType,
732
+ });
733
+ }
734
+ if (mergedSchemas.properties !== undefined) {
735
+ return react_1.default.createElement(SchemaNodeDetails, {
736
+ name: name,
737
+ schemaName: mergedSchemaName,
738
+ required: Array.isArray(mergedSchemas.required)
739
+ ? mergedSchemas.required.includes(name)
740
+ : mergedSchemas.required,
741
+ nullable: mergedSchemas.nullable,
742
+ schema: mergedSchemas,
743
+ schemaType: schemaType,
744
+ });
745
+ }
746
+ if (mergedSchemas.items?.properties) {
747
+ react_1.default.createElement(SchemaNodeDetails, {
748
+ name: name,
749
+ schemaName: mergedSchemaName,
750
+ required: Array.isArray(mergedSchemas.required)
751
+ ? mergedSchemas.required.includes(name)
752
+ : mergedSchemas.required,
753
+ nullable: mergedSchemas.nullable,
754
+ schema: mergedSchemas,
755
+ schemaType: schemaType,
756
+ });
757
+ }
758
+ return react_1.default.createElement(SchemaItem_1.default, {
759
+ collapsible: false,
760
+ name: name,
761
+ required: Array.isArray(required) ? required.includes(name) : required,
762
+ schemaName: mergedSchemaName,
763
+ qualifierMessage: (0, schema_1.getQualifierMessage)(mergedSchemas),
764
+ schema: mergedSchemas,
765
+ discriminator: false,
766
+ children: null,
767
+ });
768
+ }
769
+ return react_1.default.createElement(SchemaItem_1.default, {
770
+ collapsible: false,
771
+ name: name,
772
+ required: Array.isArray(required) ? required.includes(name) : required,
773
+ schemaName: schemaName,
774
+ qualifierMessage: (0, schema_1.getQualifierMessage)(schema),
775
+ schema: schema,
776
+ discriminator: false,
777
+ children: null,
778
+ });
779
+ };
780
+ const SchemaNode = ({ schema, schemaType }) => {
781
+ if (
782
+ (schemaType === "request" && schema.readOnly) ||
783
+ (schemaType === "response" && schema.writeOnly)
784
+ ) {
785
+ return null;
786
+ }
787
+ if (schema.discriminator) {
788
+ const { discriminator } = schema;
789
+ return react_1.default.createElement(DiscriminatorNode, {
790
+ discriminator: discriminator,
791
+ schema: schema,
792
+ schemaType: schemaType,
793
+ });
794
+ }
795
+ // Handle allOf, oneOf, anyOf without discriminators
796
+ if (schema.allOf) {
797
+ const mergedSchemas = mergeAllOf(schema);
798
+ if (
799
+ (schemaType === "request" && mergedSchemas.readOnly) ||
800
+ (schemaType === "response" && mergedSchemas.writeOnly)
801
+ ) {
802
+ return null;
803
+ }
804
+ return react_1.default.createElement(
805
+ "div",
806
+ null,
807
+ mergedSchemas.oneOf &&
808
+ react_1.default.createElement(AnyOneOf, {
809
+ schema: mergedSchemas,
810
+ schemaType: schemaType,
811
+ }),
812
+ mergedSchemas.anyOf &&
813
+ react_1.default.createElement(AnyOneOf, {
814
+ schema: mergedSchemas,
815
+ schemaType: schemaType,
816
+ }),
817
+ mergedSchemas.properties &&
818
+ react_1.default.createElement(Properties, {
819
+ schema: mergedSchemas,
820
+ schemaType: schemaType,
821
+ }),
822
+ mergedSchemas.items &&
823
+ react_1.default.createElement(Items, {
824
+ schema: mergedSchemas,
825
+ schemaType: schemaType,
826
+ })
827
+ );
828
+ }
829
+ if (schema.oneOf || schema.anyOf) {
830
+ return react_1.default.createElement(AnyOneOf, {
831
+ schema: schema,
832
+ schemaType: schemaType,
833
+ });
834
+ }
835
+ // Handle primitives
836
+ if (
837
+ schema.type &&
838
+ !schema.oneOf &&
839
+ !schema.anyOf &&
840
+ !schema.properties &&
841
+ !schema.allOf &&
842
+ !schema.items &&
843
+ !schema.additionalProperties
844
+ ) {
845
+ const schemaName = (0, schema_1.getSchemaName)(schema);
846
+ return react_1.default.createElement(SchemaItem_1.default, {
847
+ collapsible: false,
848
+ name: schema.type,
849
+ required: Boolean(schema.required),
850
+ schemaName: schemaName,
851
+ qualifierMessage: (0, schema_1.getQualifierMessage)(schema),
852
+ schema: schema,
853
+ discriminator: false,
854
+ children: null,
855
+ });
856
+ }
857
+ return react_1.default.createElement(
858
+ "div",
859
+ null,
860
+ schema.oneOf &&
861
+ react_1.default.createElement(AnyOneOf, {
862
+ schema: schema,
863
+ schemaType: schemaType,
864
+ }),
865
+ schema.anyOf &&
866
+ react_1.default.createElement(AnyOneOf, {
867
+ schema: schema,
868
+ schemaType: schemaType,
869
+ }),
870
+ schema.properties &&
871
+ react_1.default.createElement(Properties, {
872
+ schema: schema,
873
+ schemaType: schemaType,
874
+ }),
875
+ schema.additionalProperties &&
876
+ react_1.default.createElement(AdditionalProperties, {
877
+ schema: schema,
878
+ schemaType: schemaType,
879
+ }),
880
+ schema.items &&
881
+ react_1.default.createElement(Items, {
882
+ schema: schema,
883
+ schemaType: schemaType,
884
+ })
885
+ );
886
+ };
887
+ exports.default = SchemaNode;