@@ -23,6 +23,7 @@ const {
23
23
validateArray,
24
24
validateFunction,
25
25
validateObject,
26
+ validateString,
26
27
} = require ( 'internal/validators' ) ;
27
28
const { strictEqual } = require ( 'assert' ) ;
28
29
const { mkdirSync, readFileSync, writeFileSync } = require ( 'fs' ) ;
@@ -109,16 +110,7 @@ class SnapshotFile {
109
110
}
110
111
this . loaded = true ;
111
112
} catch ( err ) {
112
- let msg = `Cannot read snapshot file '${ this . snapshotFile } .'` ;
113
-
114
- if ( err ?. code === 'ENOENT' ) {
115
- msg += ` ${ kMissingSnapshotTip } ` ;
116
- }
117
-
118
- const error = new ERR_INVALID_STATE ( msg ) ;
119
- error . cause = err ;
120
- error . filename = this . snapshotFile ;
121
- throw error ;
113
+ throwReadError ( err , this . snapshotFile ) ;
122
114
}
123
115
}
124
116
@@ -132,11 +124,7 @@ class SnapshotFile {
132
124
mkdirSync ( dirname ( this . snapshotFile ) , { __proto__ : null , recursive : true } ) ;
133
125
writeFileSync ( this . snapshotFile , output , 'utf8' ) ;
134
126
} catch ( err ) {
135
- const msg = `Cannot write snapshot file '${ this . snapshotFile } .'` ;
136
- const error = new ERR_INVALID_STATE ( msg ) ;
137
- error . cause = err ;
138
- error . filename = this . snapshotFile ;
139
- throw error ;
127
+ throwWriteError ( err , this . snapshotFile ) ;
140
128
}
141
129
}
142
130
}
@@ -171,21 +159,18 @@ class SnapshotManager {
171
159
172
160
serialize ( input , serializers = serializerFns ) {
173
161
try {
174
- let value = input ;
175
-
176
- for ( let i = 0 ; i < serializers . length ; ++ i ) {
177
- const fn = serializers [ i ] ;
178
- value = fn ( value ) ;
179
- }
180
-
162
+ const value = serializeValue ( input , serializers ) ;
181
163
return `\n${ templateEscape ( value ) } \n` ;
182
164
} catch ( err ) {
183
- const error = new ERR_INVALID_STATE (
184
- 'The provided serializers did not generate a string.' ,
185
- ) ;
186
- error . input = input ;
187
- error . cause = err ;
188
- throw error ;
165
+ throwSerializationError ( input , err ) ;
166
+ }
167
+ }
168
+
169
+ serializeWithoutEscape ( input , serializers = serializerFns ) {
170
+ try {
171
+ return serializeValue ( input , serializers ) ;
172
+ } catch ( err ) {
173
+ throwSerializationError ( input , err ) ;
189
174
}
190
175
}
191
176
@@ -222,6 +207,80 @@ class SnapshotManager {
222
207
}
223
208
} ;
224
209
}
210
+
211
+ createFileAssert ( ) {
212
+ const manager = this ;
213
+
214
+ return function fileSnapshotAssertion ( actual , path , options = kEmptyObject ) {
215
+ validateString ( path , 'path' ) ;
216
+ validateObject ( options , 'options' ) ;
217
+ const {
218
+ serializers = serializerFns ,
219
+ } = options ;
220
+ validateFunctionArray ( serializers , 'options.serializers' ) ;
221
+ const value = manager . serializeWithoutEscape ( actual , serializers ) ;
222
+
223
+ if ( manager . updateSnapshots ) {
224
+ try {
225
+ mkdirSync ( dirname ( path ) , { __proto__ : null , recursive : true } ) ;
226
+ writeFileSync ( path , value , 'utf8' ) ;
227
+ } catch ( err ) {
228
+ throwWriteError ( err , path ) ;
229
+ }
230
+ } else {
231
+ let expected ;
232
+
233
+ try {
234
+ expected = readFileSync ( path , 'utf8' ) ;
235
+ } catch ( err ) {
236
+ throwReadError ( err , path ) ;
237
+ }
238
+
239
+ strictEqual ( value , expected ) ;
240
+ }
241
+ } ;
242
+ }
243
+ }
244
+
245
+ function throwReadError ( err , filename ) {
246
+ let msg = `Cannot read snapshot file '${ filename } .'` ;
247
+
248
+ if ( err ?. code === 'ENOENT' ) {
249
+ msg += ` ${ kMissingSnapshotTip } ` ;
250
+ }
251
+
252
+ const error = new ERR_INVALID_STATE ( msg ) ;
253
+ error . cause = err ;
254
+ error . filename = filename ;
255
+ throw error ;
256
+ }
257
+
258
+ function throwWriteError ( err , filename ) {
259
+ const msg = `Cannot write snapshot file '${ filename } .'` ;
260
+ const error = new ERR_INVALID_STATE ( msg ) ;
261
+ error . cause = err ;
262
+ error . filename = filename ;
263
+ throw error ;
264
+ }
265
+
266
+ function throwSerializationError ( input , err ) {
267
+ const error = new ERR_INVALID_STATE (
268
+ 'The provided serializers did not generate a string.' ,
269
+ ) ;
270
+ error . input = input ;
271
+ error . cause = err ;
272
+ throw error ;
273
+ }
274
+
275
+ function serializeValue ( value , serializers ) {
276
+ let v = value ;
277
+
278
+ for ( let i = 0 ; i < serializers . length ; ++ i ) {
279
+ const fn = serializers [ i ] ;
280
+ v = fn ( v ) ;
281
+ }
282
+
283
+ return v ;
225
284
}
226
285
227
286
function validateFunctionArray ( fns , name ) {
0 commit comments