@@ -14,10 +14,18 @@ module.exports = dereference;
14
14
* @param {$RefParser } parser
15
15
* @param {$RefParserOptions } options
16
16
*/
17
- function dereference ( parser , options ) {
17
+ async function dereference ( parser , options ) {
18
18
parser . $refs . propertyMap = { } ; // we assign a new object prior to another dereference process
19
19
// console.log('Dereferencing $ref pointers in %s', parser.$refs._root$Ref.path);
20
- let dereferenced = crawl ( parser . schema , parser . $refs . _root$Ref . path , "#" , [ ] , { } , parser . $refs , options ) ;
20
+ let dereferenced = await crawl (
21
+ parser . schema ,
22
+ parser . $refs . _root$Ref . path ,
23
+ "#" ,
24
+ [ ] ,
25
+ { } ,
26
+ parser . $refs ,
27
+ options
28
+ ) ;
21
29
parser . $refs . circular = dereferenced . circular ;
22
30
parser . schema = dereferenced . value ;
23
31
}
@@ -34,46 +42,75 @@ function dereference (parser, options) {
34
42
* @param {$RefParserOptions } options
35
43
* @returns {{value: object, circular: boolean} }
36
44
*/
37
- function crawl ( obj , path , pathFromRoot , parents , dereferencedCache , $refs , options ) {
45
+ async function crawl (
46
+ obj ,
47
+ path ,
48
+ pathFromRoot ,
49
+ parents ,
50
+ dereferencedCache ,
51
+ $refs ,
52
+ options
53
+ ) {
38
54
let dereferenced ;
39
55
let result = {
40
56
value : obj ,
41
- circular : false
57
+ circular : false ,
42
58
} ;
43
59
44
60
if ( obj && typeof obj === "object" && ! ArrayBuffer . isView ( obj ) ) {
45
61
parents . push ( obj ) ;
46
62
47
63
if ( $Ref . isAllowed$Ref ( obj , options ) ) {
48
- dereferenced = dereference$Ref ( obj , path , pathFromRoot , parents , dereferencedCache , $refs , options ) ;
64
+ dereferenced = await dereference$Ref (
65
+ obj ,
66
+ path ,
67
+ pathFromRoot ,
68
+ parents ,
69
+ dereferencedCache ,
70
+ $refs ,
71
+ options
72
+ ) ;
49
73
result . circular = dereferenced . circular ;
50
74
result . value = dereferenced . value ;
51
- }
52
- else {
75
+ } else {
53
76
for ( let key of Object . keys ( obj ) ) {
54
77
let keyPath = Pointer . join ( path , key ) ;
55
78
let keyPathFromRoot = Pointer . join ( pathFromRoot , key ) ;
56
79
let value = obj [ key ] ;
57
80
let circular = false ;
58
81
59
82
if ( $Ref . isAllowed$Ref ( value , options ) ) {
60
- dereferenced = dereference$Ref ( value , keyPath , keyPathFromRoot , parents , dereferencedCache , $refs , options ) ;
83
+ dereferenced = await dereference$Ref (
84
+ value ,
85
+ keyPath ,
86
+ keyPathFromRoot ,
87
+ parents ,
88
+ dereferencedCache ,
89
+ $refs ,
90
+ options
91
+ ) ;
61
92
circular = dereferenced . circular ;
62
93
// Avoid pointless mutations; breaks frozen objects to no profit
63
94
if ( obj [ key ] !== dereferenced . value ) {
64
95
obj [ key ] = dereferenced . value ;
65
96
}
66
- }
67
- else {
97
+ } else {
68
98
if ( parents . indexOf ( value ) === - 1 ) {
69
- dereferenced = crawl ( value , keyPath , keyPathFromRoot , parents , dereferencedCache , $refs , options ) ;
99
+ dereferenced = await crawl (
100
+ value ,
101
+ keyPath ,
102
+ keyPathFromRoot ,
103
+ parents ,
104
+ dereferencedCache ,
105
+ $refs ,
106
+ options
107
+ ) ;
70
108
circular = dereferenced . circular ;
71
109
// Avoid pointless mutations; breaks frozen objects to no profit
72
110
if ( obj [ key ] !== dereferenced . value ) {
73
111
obj [ key ] = dereferenced . value ;
74
112
}
75
- }
76
- else {
113
+ } else {
77
114
circular = foundCircularReference ( keyPath , $refs , options ) ;
78
115
}
79
116
}
@@ -101,7 +138,15 @@ function crawl (obj, path, pathFromRoot, parents, dereferencedCache, $refs, opti
101
138
* @param {$RefParserOptions } options
102
139
* @returns {{value: object, circular: boolean} }
103
140
*/
104
- function dereference$Ref ( $ref , path , pathFromRoot , parents , dereferencedCache , $refs , options ) {
141
+ async function dereference$Ref (
142
+ $ref ,
143
+ path ,
144
+ pathFromRoot ,
145
+ parents ,
146
+ dereferencedCache ,
147
+ $refs ,
148
+ options
149
+ ) {
105
150
// console.log('Dereferencing $ref pointer "%s" at %s', $ref.$ref, path);
106
151
107
152
let $refPath = url . resolve ( path , $ref . $ref ) ;
@@ -147,12 +192,24 @@ function dereference$Ref ($ref, path, pathFromRoot, parents, dereferencedCache,
147
192
// Crawl the dereferenced value (unless it's circular)
148
193
if ( ! circular ) {
149
194
// Determine if the dereferenced value is circular
150
- let dereferenced = crawl ( dereferencedValue , pointer . path , pathFromRoot , parents , dereferencedCache , $refs , options ) ;
195
+ let dereferenced = await crawl (
196
+ dereferencedValue ,
197
+ pointer . path ,
198
+ pathFromRoot ,
199
+ parents ,
200
+ dereferencedCache ,
201
+ $refs ,
202
+ options
203
+ ) ;
151
204
circular = dereferenced . circular ;
152
205
dereferencedValue = dereferenced . value ;
153
206
}
154
207
155
- if ( circular && ! directCircular && options . dereference . circular === "ignore" ) {
208
+ if (
209
+ circular &&
210
+ ! directCircular &&
211
+ options . dereference . circular === "ignore"
212
+ ) {
156
213
// The user has chosen to "ignore" circular references, so don't change the value
157
214
dereferencedValue = $ref ;
158
215
}
@@ -165,7 +222,7 @@ function dereference$Ref ($ref, path, pathFromRoot, parents, dereferencedCache,
165
222
166
223
const dereferencedObject = {
167
224
circular,
168
- value : dereferencedValue
225
+ value : dereferencedValue ,
169
226
} ;
170
227
171
228
// only cache if no extra properties than $ref
@@ -185,7 +242,7 @@ function dereference$Ref ($ref, path, pathFromRoot, parents, dereferencedCache,
185
242
* @param {$RefParserOptions } options
186
243
* @returns {boolean } - always returns true, to indicate that a circular reference was found
187
244
*/
188
- function foundCircularReference ( keyPath , $refs , options ) {
245
+ function foundCircularReference ( keyPath , $refs , options ) {
189
246
$refs . circular = true ;
190
247
if ( ! options . dereference . circular ) {
191
248
throw ono . reference ( `Circular $ref pointer found at ${ keyPath } ` ) ;
0 commit comments