120 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| Object.defineProperty(exports, '__esModule', {
 | |
|   value: true
 | |
| });
 | |
| exports.buildSnapshotResolver = exports.isSnapshotPath = exports.DOT_EXTENSION = exports.EXTENSION = void 0;
 | |
| 
 | |
| var _path = _interopRequireDefault(require('path'));
 | |
| 
 | |
| var _chalk = _interopRequireDefault(require('chalk'));
 | |
| 
 | |
| function _interopRequireDefault(obj) {
 | |
|   return obj && obj.__esModule ? obj : {default: obj};
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
 | |
|  *
 | |
|  * This source code is licensed under the MIT license found in the
 | |
|  * LICENSE file in the root directory of this source tree.
 | |
|  */
 | |
| const EXTENSION = 'snap';
 | |
| exports.EXTENSION = EXTENSION;
 | |
| const DOT_EXTENSION = '.' + EXTENSION;
 | |
| exports.DOT_EXTENSION = DOT_EXTENSION;
 | |
| 
 | |
| const isSnapshotPath = path => path.endsWith(DOT_EXTENSION);
 | |
| 
 | |
| exports.isSnapshotPath = isSnapshotPath;
 | |
| const cache = new Map();
 | |
| 
 | |
| const buildSnapshotResolver = config => {
 | |
|   const key = config.rootDir;
 | |
| 
 | |
|   if (!cache.has(key)) {
 | |
|     cache.set(key, createSnapshotResolver(config.snapshotResolver));
 | |
|   }
 | |
| 
 | |
|   return cache.get(key);
 | |
| };
 | |
| 
 | |
| exports.buildSnapshotResolver = buildSnapshotResolver;
 | |
| 
 | |
| function createSnapshotResolver(snapshotResolverPath) {
 | |
|   return typeof snapshotResolverPath === 'string'
 | |
|     ? createCustomSnapshotResolver(snapshotResolverPath)
 | |
|     : createDefaultSnapshotResolver();
 | |
| }
 | |
| 
 | |
| function createDefaultSnapshotResolver() {
 | |
|   return {
 | |
|     resolveSnapshotPath: testPath =>
 | |
|       _path.default.join(
 | |
|         _path.default.join(_path.default.dirname(testPath), '__snapshots__'),
 | |
|         _path.default.basename(testPath) + DOT_EXTENSION
 | |
|       ),
 | |
|     resolveTestPath: snapshotPath =>
 | |
|       _path.default.resolve(
 | |
|         _path.default.dirname(snapshotPath),
 | |
|         '..',
 | |
|         _path.default.basename(snapshotPath, DOT_EXTENSION)
 | |
|       ),
 | |
|     testPathForConsistencyCheck: _path.default.posix.join(
 | |
|       'consistency_check',
 | |
|       '__tests__',
 | |
|       'example.test.js'
 | |
|     )
 | |
|   };
 | |
| }
 | |
| 
 | |
| function createCustomSnapshotResolver(snapshotResolverPath) {
 | |
|   const custom = require(snapshotResolverPath);
 | |
| 
 | |
|   const keys = [
 | |
|     ['resolveSnapshotPath', 'function'],
 | |
|     ['resolveTestPath', 'function'],
 | |
|     ['testPathForConsistencyCheck', 'string']
 | |
|   ];
 | |
|   keys.forEach(([propName, requiredType]) => {
 | |
|     if (typeof custom[propName] !== requiredType) {
 | |
|       throw new TypeError(mustImplement(propName, requiredType));
 | |
|     }
 | |
|   });
 | |
|   const customResolver = {
 | |
|     resolveSnapshotPath: testPath =>
 | |
|       custom.resolveSnapshotPath(testPath, DOT_EXTENSION),
 | |
|     resolveTestPath: snapshotPath =>
 | |
|       custom.resolveTestPath(snapshotPath, DOT_EXTENSION),
 | |
|     testPathForConsistencyCheck: custom.testPathForConsistencyCheck
 | |
|   };
 | |
|   verifyConsistentTransformations(customResolver);
 | |
|   return customResolver;
 | |
| }
 | |
| 
 | |
| function mustImplement(propName, requiredType) {
 | |
|   return (
 | |
|     _chalk.default.bold(
 | |
|       `Custom snapshot resolver must implement a \`${propName}\` as a ${requiredType}.`
 | |
|     ) +
 | |
|     '\nDocumentation: https://facebook.github.io/jest/docs/en/configuration.html#snapshotResolver'
 | |
|   );
 | |
| }
 | |
| 
 | |
| function verifyConsistentTransformations(custom) {
 | |
|   const resolvedSnapshotPath = custom.resolveSnapshotPath(
 | |
|     custom.testPathForConsistencyCheck
 | |
|   );
 | |
|   const resolvedTestPath = custom.resolveTestPath(resolvedSnapshotPath);
 | |
| 
 | |
|   if (resolvedTestPath !== custom.testPathForConsistencyCheck) {
 | |
|     throw new Error(
 | |
|       _chalk.default.bold(
 | |
|         `Custom snapshot resolver functions must transform paths consistently, i.e. expects resolveTestPath(resolveSnapshotPath('${
 | |
|           custom.testPathForConsistencyCheck
 | |
|         }')) === ${resolvedTestPath}`
 | |
|       )
 | |
|     );
 | |
|   }
 | |
| }
 |