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