docusaurus-plugin-openapi-docs 0.0.0-572 → 0.0.0-574

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.
@@ -373,7 +373,7 @@ function createItems(schema) {
373
373
  // }),
374
374
  // });
375
375
  // }
376
- function createDetailsNode(name, schemaName, schema, required) {
376
+ function createDetailsNode(name, schemaName, schema, required, nullable) {
377
377
  return (0, utils_1.create)("SchemaItem", {
378
378
  collapsible: true,
379
379
  className: "schemaItem",
@@ -387,7 +387,8 @@ function createDetailsNode(name, schemaName, schema, required) {
387
387
  style: { opacity: "0.6" },
388
388
  children: ` ${schemaName}`,
389
389
  }),
390
- (0, utils_1.guard)(schema.nullable && schema.nullable === true, () => [
390
+ (0, utils_1.guard)((schema.nullable && schema.nullable === true) ||
391
+ (nullable && nullable === true), () => [
391
392
  (0, utils_1.create)("strong", {
392
393
  style: {
393
394
  fontSize: "var(--ifm-code-font-size)",
@@ -498,24 +499,24 @@ function createEdges({ name, schema, required, discriminator, }) {
498
499
  return createPropertyDiscriminator(name, "string", schema, discriminator, required);
499
500
  }
500
501
  if (schema.oneOf !== undefined || schema.anyOf !== undefined) {
501
- return createDetailsNode(name, schemaName, schema, required);
502
+ return createDetailsNode(name, schemaName, schema, required, schema.nullable);
502
503
  }
503
504
  if (schema.allOf !== undefined) {
504
505
  const { mergedSchemas, required, } = mergeAllOf(schema.allOf);
505
506
  const mergedSchemaName = (0, schema_1.getSchemaName)(mergedSchemas);
506
507
  if (mergedSchemas.oneOf !== undefined ||
507
508
  mergedSchemas.anyOf !== undefined) {
508
- return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
509
+ return createDetailsNode(name, mergedSchemaName, mergedSchemas, required, schema.nullable);
509
510
  }
510
511
  if (mergedSchemas.properties !== undefined) {
511
- return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
512
+ return createDetailsNode(name, mergedSchemaName, mergedSchemas, required, schema.nullable);
512
513
  }
513
514
  if (mergedSchemas.additionalProperties !== undefined) {
514
- return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
515
+ return createDetailsNode(name, mergedSchemaName, mergedSchemas, required, schema.nullable);
515
516
  }
516
517
  // array of objects
517
518
  if (((_a = mergedSchemas.items) === null || _a === void 0 ? void 0 : _a.properties) !== undefined) {
518
- return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
519
+ return createDetailsNode(name, mergedSchemaName, mergedSchemas, required, schema.nullable);
519
520
  }
520
521
  if (mergedSchemas.readOnly && mergedSchemas.readOnly === true) {
521
522
  return undefined;
@@ -530,17 +531,17 @@ function createEdges({ name, schema, required, discriminator, }) {
530
531
  });
531
532
  }
532
533
  if (schema.properties !== undefined) {
533
- return createDetailsNode(name, schemaName, schema, required);
534
+ return createDetailsNode(name, schemaName, schema, required, schema.nullable);
534
535
  }
535
536
  if (schema.additionalProperties !== undefined) {
536
- return createDetailsNode(name, schemaName, schema, required);
537
+ return createDetailsNode(name, schemaName, schema, required, schema.nullable);
537
538
  }
538
539
  // array of objects
539
540
  if (((_b = schema.items) === null || _b === void 0 ? void 0 : _b.properties) !== undefined) {
540
- return createDetailsNode(name, schemaName, schema, required);
541
+ return createDetailsNode(name, schemaName, schema, required, schema.nullable);
541
542
  }
542
543
  if (((_c = schema.items) === null || _c === void 0 ? void 0 : _c.anyOf) !== undefined || ((_d = schema.items) === null || _d === void 0 ? void 0 : _d.oneOf) !== undefined) {
543
- return createDetailsNode(name, schemaName, schema, required);
544
+ return createDetailsNode(name, schemaName, schema, required, schema.nullable);
544
545
  }
545
546
  if (schema.readOnly && schema.readOnly === true) {
546
547
  return undefined;
@@ -610,9 +611,10 @@ function createNodes(schema) {
610
611
  }
611
612
  // Unknown node/schema type should return undefined
612
613
  // So far, haven't seen this hit in testing
613
- return undefined;
614
+ return "any";
614
615
  }
615
616
  function createRequestSchema({ title, body, ...rest }) {
617
+ var _a;
616
618
  if (body === undefined ||
617
619
  body.content === undefined ||
618
620
  Object.keys(body).length === 0 ||
@@ -681,7 +683,7 @@ function createRequestSchema({ title, body, ...rest }) {
681
683
  });
682
684
  }
683
685
  const randomFirstKey = Object.keys(body.content)[0];
684
- const firstBody = body.content[randomFirstKey].schema;
686
+ const firstBody = (_a = body.content[randomFirstKey].schema) !== null && _a !== void 0 ? _a : body.content[randomFirstKey];
685
687
  if (firstBody === undefined) {
686
688
  return undefined;
687
689
  }
@@ -374,7 +374,7 @@ function createItems(schema) {
374
374
  // }),
375
375
  // });
376
376
  // }
377
- function createDetailsNode(name, schemaName, schema, required) {
377
+ function createDetailsNode(name, schemaName, schema, required, nullable) {
378
378
  return (0, utils_1.create)("SchemaItem", {
379
379
  collapsible: true,
380
380
  className: "schemaItem",
@@ -388,7 +388,8 @@ function createDetailsNode(name, schemaName, schema, required) {
388
388
  style: { opacity: "0.6" },
389
389
  children: ` ${schemaName}`,
390
390
  }),
391
- (0, utils_1.guard)(schema.nullable && schema.nullable === true, () => [
391
+ (0, utils_1.guard)((schema.nullable && schema.nullable === true) ||
392
+ (nullable && nullable === true), () => [
392
393
  (0, utils_1.create)("strong", {
393
394
  style: {
394
395
  fontSize: "var(--ifm-code-font-size)",
@@ -499,24 +500,24 @@ function createEdges({ name, schema, required, discriminator, }) {
499
500
  return createPropertyDiscriminator(name, "string", schema, discriminator, required);
500
501
  }
501
502
  if (schema.oneOf !== undefined || schema.anyOf !== undefined) {
502
- return createDetailsNode(name, schemaName, schema, required);
503
+ return createDetailsNode(name, schemaName, schema, required, schema.nullable);
503
504
  }
504
505
  if (schema.allOf !== undefined) {
505
506
  const { mergedSchemas, required, } = mergeAllOf(schema.allOf);
506
507
  const mergedSchemaName = (0, schema_1.getSchemaName)(mergedSchemas);
507
508
  if (mergedSchemas.oneOf !== undefined ||
508
509
  mergedSchemas.anyOf !== undefined) {
509
- return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
510
+ return createDetailsNode(name, mergedSchemaName, mergedSchemas, required, schema.nullable);
510
511
  }
511
512
  if (mergedSchemas.properties !== undefined) {
512
- return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
513
+ return createDetailsNode(name, mergedSchemaName, mergedSchemas, required, schema.nullable);
513
514
  }
514
515
  if (mergedSchemas.additionalProperties !== undefined) {
515
- return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
516
+ return createDetailsNode(name, mergedSchemaName, mergedSchemas, required, schema.nullable);
516
517
  }
517
518
  // array of objects
518
519
  if (((_a = mergedSchemas.items) === null || _a === void 0 ? void 0 : _a.properties) !== undefined) {
519
- return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
520
+ return createDetailsNode(name, mergedSchemaName, mergedSchemas, required, schema.nullable);
520
521
  }
521
522
  if (mergedSchemas.writeOnly && mergedSchemas.writeOnly === true) {
522
523
  return undefined;
@@ -531,17 +532,17 @@ function createEdges({ name, schema, required, discriminator, }) {
531
532
  });
532
533
  }
533
534
  if (schema.properties !== undefined) {
534
- return createDetailsNode(name, schemaName, schema, required);
535
+ return createDetailsNode(name, schemaName, schema, required, schema.nullable);
535
536
  }
536
537
  if (schema.additionalProperties !== undefined) {
537
- return createDetailsNode(name, schemaName, schema, required);
538
+ return createDetailsNode(name, schemaName, schema, required, schema.nullable);
538
539
  }
539
540
  // array of objects
540
541
  if (((_b = schema.items) === null || _b === void 0 ? void 0 : _b.properties) !== undefined) {
541
- return createDetailsNode(name, schemaName, schema, required);
542
+ return createDetailsNode(name, schemaName, schema, required, schema.nullable);
542
543
  }
543
544
  if (((_c = schema.items) === null || _c === void 0 ? void 0 : _c.anyOf) !== undefined || ((_d = schema.items) === null || _d === void 0 ? void 0 : _d.oneOf) !== undefined) {
544
- return createDetailsNode(name, schemaName, schema, required);
545
+ return createDetailsNode(name, schemaName, schema, required, schema.nullable);
545
546
  }
546
547
  if (schema.writeOnly && schema.writeOnly === true) {
547
548
  return undefined;
@@ -613,7 +614,7 @@ function createNodes(schema) {
613
614
  }
614
615
  // Unknown node/schema type should return undefined
615
616
  // So far, haven't seen this hit in testing
616
- return undefined;
617
+ return "any";
617
618
  }
618
619
  function createResponseSchema({ title, body, ...rest }) {
619
620
  if (body === undefined ||
@@ -628,9 +629,10 @@ function createResponseSchema({ title, body, ...rest }) {
628
629
  return (0, utils_1.create)("MimeTabs", {
629
630
  schemaType: "response",
630
631
  children: mimeTypes.map((mimeType) => {
632
+ var _a;
631
633
  const responseExamples = body.content[mimeType].examples;
632
634
  const responseExample = body.content[mimeType].example;
633
- const firstBody = body.content[mimeType].schema;
635
+ const firstBody = (_a = body.content[mimeType].schema) !== null && _a !== void 0 ? _a : body.content[mimeType];
634
636
  if (firstBody === undefined &&
635
637
  responseExample === undefined &&
636
638
  responseExamples === undefined) {
@@ -114,6 +114,19 @@ async function loadAndResolveSpec(specUrlOrObject) {
114
114
  // Force dereference ?
115
115
  // bundleOpts["dereference"] = true;
116
116
  const { bundle: { parsed }, } = await (0, openapi_core_1.bundle)(bundleOpts);
117
+ //Pre-processing before resolving JSON refs
118
+ if (parsed.components) {
119
+ for (let [component, type] of Object.entries(parsed.components)) {
120
+ if (component === "schemas") {
121
+ for (let [schemaKey, schemaValue] of Object.entries(type)) {
122
+ const title = schemaValue["title"];
123
+ if (!title) {
124
+ schemaValue.title = schemaKey;
125
+ }
126
+ }
127
+ }
128
+ }
129
+ }
117
130
  const resolved = await resolveJsonRefs(parsed);
118
131
  // Force serialization and replace circular $ref pointers
119
132
  // @ts-ignore
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "docusaurus-plugin-openapi-docs",
3
3
  "description": "OpenAPI plugin for Docusaurus.",
4
- "version": "0.0.0-572",
4
+ "version": "0.0.0-574",
5
5
  "license": "MIT",
6
6
  "keywords": [
7
7
  "openapi",
@@ -68,5 +68,5 @@
68
68
  "engines": {
69
69
  "node": ">=14"
70
70
  },
71
- "gitHead": "2dbf8d2c4a044df1d44eba705d794f51c8709c0f"
71
+ "gitHead": "a0e1aa8a02e04184438688baeb587e6e92df312e"
72
72
  }
@@ -436,7 +436,8 @@ function createDetailsNode(
436
436
  name: string,
437
437
  schemaName: string,
438
438
  schema: SchemaObject,
439
- required: string[] | boolean
439
+ required: string[] | boolean,
440
+ nullable: boolean | unknown
440
441
  ): any {
441
442
  return create("SchemaItem", {
442
443
  collapsible: true,
@@ -451,15 +452,19 @@ function createDetailsNode(
451
452
  style: { opacity: "0.6" },
452
453
  children: ` ${schemaName}`,
453
454
  }),
454
- guard(schema.nullable && schema.nullable === true, () => [
455
- create("strong", {
456
- style: {
457
- fontSize: "var(--ifm-code-font-size)",
458
- color: "var(--openapi-nullable)",
459
- },
460
- children: " nullable",
461
- }),
462
- ]),
455
+ guard(
456
+ (schema.nullable && schema.nullable === true) ||
457
+ (nullable && nullable === true),
458
+ () => [
459
+ create("strong", {
460
+ style: {
461
+ fontSize: "var(--ifm-code-font-size)",
462
+ color: "var(--openapi-nullable)",
463
+ },
464
+ children: " nullable",
465
+ }),
466
+ ]
467
+ ),
463
468
  guard(
464
469
  Array.isArray(required)
465
470
  ? required.includes(name)
@@ -604,7 +609,13 @@ function createEdges({
604
609
  }
605
610
 
606
611
  if (schema.oneOf !== undefined || schema.anyOf !== undefined) {
607
- return createDetailsNode(name, schemaName, schema, required);
612
+ return createDetailsNode(
613
+ name,
614
+ schemaName,
615
+ schema,
616
+ required,
617
+ schema.nullable
618
+ );
608
619
  }
609
620
 
610
621
  if (schema.allOf !== undefined) {
@@ -619,20 +630,44 @@ function createEdges({
619
630
  mergedSchemas.oneOf !== undefined ||
620
631
  mergedSchemas.anyOf !== undefined
621
632
  ) {
622
- return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
633
+ return createDetailsNode(
634
+ name,
635
+ mergedSchemaName,
636
+ mergedSchemas,
637
+ required,
638
+ schema.nullable
639
+ );
623
640
  }
624
641
 
625
642
  if (mergedSchemas.properties !== undefined) {
626
- return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
643
+ return createDetailsNode(
644
+ name,
645
+ mergedSchemaName,
646
+ mergedSchemas,
647
+ required,
648
+ schema.nullable
649
+ );
627
650
  }
628
651
 
629
652
  if (mergedSchemas.additionalProperties !== undefined) {
630
- return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
653
+ return createDetailsNode(
654
+ name,
655
+ mergedSchemaName,
656
+ mergedSchemas,
657
+ required,
658
+ schema.nullable
659
+ );
631
660
  }
632
661
 
633
662
  // array of objects
634
663
  if (mergedSchemas.items?.properties !== undefined) {
635
- return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
664
+ return createDetailsNode(
665
+ name,
666
+ mergedSchemaName,
667
+ mergedSchemas,
668
+ required,
669
+ schema.nullable
670
+ );
636
671
  }
637
672
 
638
673
  if (mergedSchemas.readOnly && mergedSchemas.readOnly === true) {
@@ -650,20 +685,44 @@ function createEdges({
650
685
  }
651
686
 
652
687
  if (schema.properties !== undefined) {
653
- return createDetailsNode(name, schemaName, schema, required);
688
+ return createDetailsNode(
689
+ name,
690
+ schemaName,
691
+ schema,
692
+ required,
693
+ schema.nullable
694
+ );
654
695
  }
655
696
 
656
697
  if (schema.additionalProperties !== undefined) {
657
- return createDetailsNode(name, schemaName, schema, required);
698
+ return createDetailsNode(
699
+ name,
700
+ schemaName,
701
+ schema,
702
+ required,
703
+ schema.nullable
704
+ );
658
705
  }
659
706
 
660
707
  // array of objects
661
708
  if (schema.items?.properties !== undefined) {
662
- return createDetailsNode(name, schemaName, schema, required);
709
+ return createDetailsNode(
710
+ name,
711
+ schemaName,
712
+ schema,
713
+ required,
714
+ schema.nullable
715
+ );
663
716
  }
664
717
 
665
718
  if (schema.items?.anyOf !== undefined || schema.items?.oneOf !== undefined) {
666
- return createDetailsNode(name, schemaName, schema, required);
719
+ return createDetailsNode(
720
+ name,
721
+ schemaName,
722
+ schema,
723
+ required,
724
+ schema.nullable
725
+ );
667
726
  }
668
727
 
669
728
  if (schema.readOnly && schema.readOnly === true) {
@@ -751,7 +810,7 @@ function createNodes(schema: SchemaObject): any {
751
810
 
752
811
  // Unknown node/schema type should return undefined
753
812
  // So far, haven't seen this hit in testing
754
- return undefined;
813
+ return "any";
755
814
  }
756
815
 
757
816
  interface Props {
@@ -840,7 +899,8 @@ export function createRequestSchema({ title, body, ...rest }: Props) {
840
899
  }
841
900
 
842
901
  const randomFirstKey = Object.keys(body.content)[0];
843
- const firstBody = body.content[randomFirstKey].schema;
902
+ const firstBody: any =
903
+ body.content[randomFirstKey].schema ?? body.content![randomFirstKey];
844
904
 
845
905
  if (firstBody === undefined) {
846
906
  return undefined;
@@ -442,7 +442,8 @@ function createDetailsNode(
442
442
  name: string,
443
443
  schemaName: string,
444
444
  schema: SchemaObject,
445
- required: string[] | boolean
445
+ required: string[] | boolean,
446
+ nullable: boolean | unknown
446
447
  ): any {
447
448
  return create("SchemaItem", {
448
449
  collapsible: true,
@@ -457,15 +458,19 @@ function createDetailsNode(
457
458
  style: { opacity: "0.6" },
458
459
  children: ` ${schemaName}`,
459
460
  }),
460
- guard(schema.nullable && schema.nullable === true, () => [
461
- create("strong", {
462
- style: {
463
- fontSize: "var(--ifm-code-font-size)",
464
- color: "var(--openapi-nullable)",
465
- },
466
- children: " nullable",
467
- }),
468
- ]),
461
+ guard(
462
+ (schema.nullable && schema.nullable === true) ||
463
+ (nullable && nullable === true),
464
+ () => [
465
+ create("strong", {
466
+ style: {
467
+ fontSize: "var(--ifm-code-font-size)",
468
+ color: "var(--openapi-nullable)",
469
+ },
470
+ children: " nullable",
471
+ }),
472
+ ]
473
+ ),
469
474
  guard(
470
475
  Array.isArray(required)
471
476
  ? required.includes(name)
@@ -610,7 +615,13 @@ function createEdges({
610
615
  }
611
616
 
612
617
  if (schema.oneOf !== undefined || schema.anyOf !== undefined) {
613
- return createDetailsNode(name, schemaName, schema, required);
618
+ return createDetailsNode(
619
+ name,
620
+ schemaName,
621
+ schema,
622
+ required,
623
+ schema.nullable
624
+ );
614
625
  }
615
626
 
616
627
  if (schema.allOf !== undefined) {
@@ -625,20 +636,44 @@ function createEdges({
625
636
  mergedSchemas.oneOf !== undefined ||
626
637
  mergedSchemas.anyOf !== undefined
627
638
  ) {
628
- return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
639
+ return createDetailsNode(
640
+ name,
641
+ mergedSchemaName,
642
+ mergedSchemas,
643
+ required,
644
+ schema.nullable
645
+ );
629
646
  }
630
647
 
631
648
  if (mergedSchemas.properties !== undefined) {
632
- return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
649
+ return createDetailsNode(
650
+ name,
651
+ mergedSchemaName,
652
+ mergedSchemas,
653
+ required,
654
+ schema.nullable
655
+ );
633
656
  }
634
657
 
635
658
  if (mergedSchemas.additionalProperties !== undefined) {
636
- return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
659
+ return createDetailsNode(
660
+ name,
661
+ mergedSchemaName,
662
+ mergedSchemas,
663
+ required,
664
+ schema.nullable
665
+ );
637
666
  }
638
667
 
639
668
  // array of objects
640
669
  if (mergedSchemas.items?.properties !== undefined) {
641
- return createDetailsNode(name, mergedSchemaName, mergedSchemas, required);
670
+ return createDetailsNode(
671
+ name,
672
+ mergedSchemaName,
673
+ mergedSchemas,
674
+ required,
675
+ schema.nullable
676
+ );
642
677
  }
643
678
 
644
679
  if (mergedSchemas.writeOnly && mergedSchemas.writeOnly === true) {
@@ -656,20 +691,44 @@ function createEdges({
656
691
  }
657
692
 
658
693
  if (schema.properties !== undefined) {
659
- return createDetailsNode(name, schemaName, schema, required);
694
+ return createDetailsNode(
695
+ name,
696
+ schemaName,
697
+ schema,
698
+ required,
699
+ schema.nullable
700
+ );
660
701
  }
661
702
 
662
703
  if (schema.additionalProperties !== undefined) {
663
- return createDetailsNode(name, schemaName, schema, required);
704
+ return createDetailsNode(
705
+ name,
706
+ schemaName,
707
+ schema,
708
+ required,
709
+ schema.nullable
710
+ );
664
711
  }
665
712
 
666
713
  // array of objects
667
714
  if (schema.items?.properties !== undefined) {
668
- return createDetailsNode(name, schemaName, schema, required);
715
+ return createDetailsNode(
716
+ name,
717
+ schemaName,
718
+ schema,
719
+ required,
720
+ schema.nullable
721
+ );
669
722
  }
670
723
 
671
724
  if (schema.items?.anyOf !== undefined || schema.items?.oneOf !== undefined) {
672
- return createDetailsNode(name, schemaName, schema, required);
725
+ return createDetailsNode(
726
+ name,
727
+ schemaName,
728
+ schema,
729
+ required,
730
+ schema.nullable
731
+ );
673
732
  }
674
733
 
675
734
  if (schema.writeOnly && schema.writeOnly === true) {
@@ -702,7 +761,6 @@ function createNodes(schema: SchemaObject): any {
702
761
 
703
762
  if (schema.allOf !== undefined) {
704
763
  const { mergedSchemas } = mergeAllOf(schema.allOf);
705
-
706
764
  if (mergedSchemas.properties !== undefined) {
707
765
  nodes.push(createProperties(mergedSchemas));
708
766
  }
@@ -760,7 +818,7 @@ function createNodes(schema: SchemaObject): any {
760
818
 
761
819
  // Unknown node/schema type should return undefined
762
820
  // So far, haven't seen this hit in testing
763
- return undefined;
821
+ return "any";
764
822
  }
765
823
 
766
824
  interface Props {
@@ -794,7 +852,8 @@ export function createResponseSchema({ title, body, ...rest }: Props) {
794
852
  children: mimeTypes.map((mimeType: any) => {
795
853
  const responseExamples = body.content![mimeType].examples;
796
854
  const responseExample = body.content![mimeType].example;
797
- const firstBody = body.content![mimeType].schema;
855
+ const firstBody: any =
856
+ body.content![mimeType].schema ?? body.content![mimeType];
798
857
 
799
858
  if (
800
859
  firstBody === undefined &&
@@ -128,6 +128,21 @@ export async function loadAndResolveSpec(specUrlOrObject: object | string) {
128
128
  const {
129
129
  bundle: { parsed },
130
130
  } = await bundle(bundleOpts);
131
+
132
+ //Pre-processing before resolving JSON refs
133
+ if (parsed.components) {
134
+ for (let [component, type] of Object.entries(parsed.components) as any) {
135
+ if (component === "schemas") {
136
+ for (let [schemaKey, schemaValue] of Object.entries(type) as any) {
137
+ const title: string | undefined = schemaValue["title"];
138
+ if (!title) {
139
+ schemaValue.title = schemaKey;
140
+ }
141
+ }
142
+ }
143
+ }
144
+ }
145
+
131
146
  const resolved = await resolveJsonRefs(parsed);
132
147
 
133
148
  // Force serialization and replace circular $ref pointers