@@ -16,7 +16,7 @@ module.exports = dereference;
16
16
*/
17
17
function dereference ( parser , options ) {
18
18
// console.log('Dereferencing $ref pointers in %s', parser.$refs._root$Ref.path);
19
- let dereferenced = crawl ( parser . schema , parser . $refs . _root$Ref . path , "#" , [ ] , [ ] , { } , parser . $refs , options ) ;
19
+ let dereferenced = crawl ( parser . schema , parser . $refs . _root$Ref . path , "#" , [ ] , { } , parser . $refs , options ) ;
20
20
parser . $refs . circular = dereferenced . circular ;
21
21
parser . schema = dereferenced . value ;
22
22
}
@@ -28,65 +28,61 @@ function dereference (parser, options) {
28
28
* @param {string } path - The full path of `obj`, possibly with a JSON Pointer in the hash
29
29
* @param {string } pathFromRoot - The path of `obj` from the schema root
30
30
* @param {object[] } parents - An array of the parent objects that have already been dereferenced
31
- * @param {object[] } processedObjects - An array of all the objects that have already been processed
32
31
* @param {object } dereferencedCache - An map of all the dereferenced objects
33
32
* @param {$Refs } $refs
34
33
* @param {$RefParserOptions } options
35
34
* @returns {{value: object, circular: boolean} }
36
35
*/
37
- function crawl ( obj , path , pathFromRoot , parents , processedObjects , dereferencedCache , $refs , options ) {
36
+ function crawl ( obj , path , pathFromRoot , parents , dereferencedCache , $refs , options ) {
38
37
let dereferenced ;
39
38
let result = {
40
39
value : obj ,
41
40
circular : false
42
41
} ;
43
42
44
- if ( options . dereference . circular === "ignore" || processedObjects . indexOf ( obj ) === - 1 ) {
45
- if ( obj && typeof obj === "object" && ! ArrayBuffer . isView ( obj ) ) {
46
- parents . push ( obj ) ;
47
- processedObjects . push ( obj ) ;
43
+ if ( obj && typeof obj === "object" && ! ArrayBuffer . isView ( obj ) ) {
44
+ parents . push ( obj ) ;
48
45
49
- if ( $Ref . isAllowed$Ref ( obj , options ) ) {
50
- dereferenced = dereference$Ref ( obj , path , pathFromRoot , parents , processedObjects , dereferencedCache , $refs , options ) ;
51
- result . circular = dereferenced . circular ;
52
- result . value = dereferenced . value ;
53
- }
54
- else {
55
- for ( let key of Object . keys ( obj ) ) {
56
- let keyPath = Pointer . join ( path , key ) ;
57
- let keyPathFromRoot = Pointer . join ( pathFromRoot , key ) ;
58
- let value = obj [ key ] ;
59
- let circular = false ;
60
-
61
- if ( $Ref . isAllowed$Ref ( value , options ) ) {
62
- dereferenced = dereference$Ref ( value , keyPath , keyPathFromRoot , parents , processedObjects , dereferencedCache , $refs , options ) ;
46
+ if ( $Ref . isAllowed$Ref ( obj , options ) ) {
47
+ dereferenced = dereference$Ref ( obj , path , pathFromRoot , parents , dereferencedCache , $refs , options ) ;
48
+ result . circular = dereferenced . circular ;
49
+ result . value = dereferenced . value ;
50
+ }
51
+ else {
52
+ for ( let key of Object . keys ( obj ) ) {
53
+ let keyPath = Pointer . join ( path , key ) ;
54
+ let keyPathFromRoot = Pointer . join ( pathFromRoot , key ) ;
55
+ let value = obj [ key ] ;
56
+ let circular = false ;
57
+
58
+ if ( $Ref . isAllowed$Ref ( value , options ) ) {
59
+ dereferenced = dereference$Ref ( value , keyPath , keyPathFromRoot , parents , dereferencedCache , $refs , options ) ;
60
+ circular = dereferenced . circular ;
61
+ // Avoid pointless mutations; breaks frozen objects to no profit
62
+ if ( obj [ key ] !== dereferenced . value ) {
63
+ obj [ key ] = dereferenced . value ;
64
+ }
65
+ }
66
+ else {
67
+ if ( parents . indexOf ( value ) === - 1 ) {
68
+ dereferenced = crawl ( value , keyPath , keyPathFromRoot , parents , dereferencedCache , $refs , options ) ;
63
69
circular = dereferenced . circular ;
64
70
// Avoid pointless mutations; breaks frozen objects to no profit
65
71
if ( obj [ key ] !== dereferenced . value ) {
66
72
obj [ key ] = dereferenced . value ;
67
73
}
68
74
}
69
75
else {
70
- if ( parents . indexOf ( value ) === - 1 ) {
71
- dereferenced = crawl ( value , keyPath , keyPathFromRoot , parents , processedObjects , dereferencedCache , $refs , options ) ;
72
- circular = dereferenced . circular ;
73
- // Avoid pointless mutations; breaks frozen objects to no profit
74
- if ( obj [ key ] !== dereferenced . value ) {
75
- obj [ key ] = dereferenced . value ;
76
- }
77
- }
78
- else {
79
- circular = foundCircularReference ( keyPath , $refs , options ) ;
80
- }
76
+ circular = foundCircularReference ( keyPath , $refs , options ) ;
81
77
}
82
-
83
- // Set the "isCircular" flag if this or any other property is circular
84
- result . circular = result . circular || circular ;
85
78
}
86
- }
87
79
88
- parents . pop ( ) ;
80
+ // Set the "isCircular" flag if this or any other property is circular
81
+ result . circular = result . circular || circular ;
82
+ }
89
83
}
84
+
85
+ parents . pop ( ) ;
90
86
}
91
87
92
88
return result ;
@@ -104,7 +100,7 @@ function crawl (obj, path, pathFromRoot, parents, processedObjects, dereferenced
104
100
* @param {$RefParserOptions } options
105
101
* @returns {{value: object, circular: boolean} }
106
102
*/
107
- function dereference$Ref ( $ref , path , pathFromRoot , parents , processedObjects , dereferencedCache , $refs , options ) {
103
+ function dereference$Ref ( $ref , path , pathFromRoot , parents , dereferencedCache , $refs , options ) {
108
104
// console.log('Dereferencing $ref pointer "%s" at %s', $ref.$ref, path);
109
105
110
106
let $refPath = url . resolve ( path , $ref . $ref ) ;
@@ -129,7 +125,6 @@ function dereference$Ref ($ref, path, pathFromRoot, parents, processedObjects, d
129
125
return cache ;
130
126
}
131
127
132
-
133
128
let pointer = $refs . _resolve ( $refPath , path , options ) ;
134
129
135
130
if ( pointer === null ) {
@@ -150,7 +145,7 @@ function dereference$Ref ($ref, path, pathFromRoot, parents, processedObjects, d
150
145
// Crawl the dereferenced value (unless it's circular)
151
146
if ( ! circular ) {
152
147
// Determine if the dereferenced value is circular
153
- let dereferenced = crawl ( dereferencedValue , pointer . path , pathFromRoot , parents , processedObjects , dereferencedCache , $refs , options ) ;
148
+ let dereferenced = crawl ( dereferencedValue , pointer . path , pathFromRoot , parents , dereferencedCache , $refs , options ) ;
154
149
circular = dereferenced . circular ;
155
150
dereferencedValue = dereferenced . value ;
156
151
}
0 commit comments