@@ -23,6 +23,7 @@ const {
2323 validateArray,
2424 validateFunction,
2525 validateObject,
26+ validateString,
2627} = require ( 'internal/validators' ) ;
2728const { strictEqual } = require ( 'assert' ) ;
2829const { mkdirSync, readFileSync, writeFileSync } = require ( 'fs' ) ;
@@ -109,16 +110,7 @@ class SnapshotFile {
109110 }
110111 this . loaded = true ;
111112 } 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 ) ;
122114 }
123115 }
124116
@@ -132,11 +124,7 @@ class SnapshotFile {
132124 mkdirSync ( dirname ( this . snapshotFile ) , { __proto__ : null , recursive : true } ) ;
133125 writeFileSync ( this . snapshotFile , output , 'utf8' ) ;
134126 } 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 ) ;
140128 }
141129 }
142130}
@@ -171,21 +159,18 @@ class SnapshotManager {
171159
172160 serialize ( input , serializers = serializerFns ) {
173161 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 ) ;
181163 return `\n${ templateEscape ( value ) } \n` ;
182164 } 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 ) ;
189174 }
190175 }
191176
@@ -222,6 +207,80 @@ class SnapshotManager {
222207 }
223208 } ;
224209 }
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 ;
225284}
226285
227286function validateFunctionArray ( fns , name ) {
0 commit comments