101 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			101 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Object.defineProperty(exports, '__esModule', {
							 | 
						||
| 
								 | 
							
								  value: true
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								exports.extract = extract;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var _isRegExpSupported = _interopRequireDefault(require('./isRegExpSupported'));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								// Negative look behind is only supported in Node 9+
							 | 
						||
| 
								 | 
							
								const NOT_A_DOT = (0, _isRegExpSupported.default)('(?<!\\.\\s*)')
							 | 
						||
| 
								 | 
							
								  ? '(?<!\\.\\s*)'
							 | 
						||
| 
								 | 
							
								  : '(?:^|[^.]\\s*)';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const CAPTURE_STRING_LITERAL = pos => `([\`'"])([^'"\`]*?)(?:\\${pos})`;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const WORD_SEPARATOR = '\\b';
							 | 
						||
| 
								 | 
							
								const LEFT_PARENTHESIS = '\\(';
							 | 
						||
| 
								 | 
							
								const RIGHT_PARENTHESIS = '\\)';
							 | 
						||
| 
								 | 
							
								const WHITESPACE = '\\s*';
							 | 
						||
| 
								 | 
							
								const OPTIONAL_COMMA = '(:?,\\s*)?';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function createRegExp(parts, flags) {
							 | 
						||
| 
								 | 
							
								  return new RegExp(parts.join(''), flags);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function alternatives(...parts) {
							 | 
						||
| 
								 | 
							
								  return `(?:${parts.join('|')})`;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function functionCallStart(...names) {
							 | 
						||
| 
								 | 
							
								  return [
							 | 
						||
| 
								 | 
							
								    NOT_A_DOT,
							 | 
						||
| 
								 | 
							
								    WORD_SEPARATOR,
							 | 
						||
| 
								 | 
							
								    alternatives(...names),
							 | 
						||
| 
								 | 
							
								    WHITESPACE,
							 | 
						||
| 
								 | 
							
								    LEFT_PARENTHESIS,
							 | 
						||
| 
								 | 
							
								    WHITESPACE
							 | 
						||
| 
								 | 
							
								  ];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const BLOCK_COMMENT_RE = /\/\*[^]*?\*\//g;
							 | 
						||
| 
								 | 
							
								const LINE_COMMENT_RE = /\/\/.*/g;
							 | 
						||
| 
								 | 
							
								const REQUIRE_OR_DYNAMIC_IMPORT_RE = createRegExp(
							 | 
						||
| 
								 | 
							
								  [
							 | 
						||
| 
								 | 
							
								    ...functionCallStart('require', 'import'),
							 | 
						||
| 
								 | 
							
								    CAPTURE_STRING_LITERAL(1),
							 | 
						||
| 
								 | 
							
								    WHITESPACE,
							 | 
						||
| 
								 | 
							
								    OPTIONAL_COMMA,
							 | 
						||
| 
								 | 
							
								    RIGHT_PARENTHESIS
							 | 
						||
| 
								 | 
							
								  ],
							 | 
						||
| 
								 | 
							
								  'g'
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								const IMPORT_OR_EXPORT_RE = createRegExp(
							 | 
						||
| 
								 | 
							
								  [
							 | 
						||
| 
								 | 
							
								    '\\b(?:import|export)\\s+(?!type(?:of)?\\s+)[^\'"]+\\s+from\\s+',
							 | 
						||
| 
								 | 
							
								    CAPTURE_STRING_LITERAL(1)
							 | 
						||
| 
								 | 
							
								  ],
							 | 
						||
| 
								 | 
							
								  'g'
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								const JEST_EXTENSIONS_RE = createRegExp(
							 | 
						||
| 
								 | 
							
								  [
							 | 
						||
| 
								 | 
							
								    ...functionCallStart(
							 | 
						||
| 
								 | 
							
								      'require\\s*\\.\\s*(?:requireActual|requireMock)',
							 | 
						||
| 
								 | 
							
								      'jest\\s*\\.\\s*(?:requireActual|requireMock|genMockFromModule)'
							 | 
						||
| 
								 | 
							
								    ),
							 | 
						||
| 
								 | 
							
								    CAPTURE_STRING_LITERAL(1),
							 | 
						||
| 
								 | 
							
								    WHITESPACE,
							 | 
						||
| 
								 | 
							
								    OPTIONAL_COMMA,
							 | 
						||
| 
								 | 
							
								    RIGHT_PARENTHESIS
							 | 
						||
| 
								 | 
							
								  ],
							 | 
						||
| 
								 | 
							
								  'g'
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function extract(code) {
							 | 
						||
| 
								 | 
							
								  const dependencies = new Set();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const addDependency = (match, _, dep) => {
							 | 
						||
| 
								 | 
							
								    dependencies.add(dep);
							 | 
						||
| 
								 | 
							
								    return match;
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  code
							 | 
						||
| 
								 | 
							
								    .replace(BLOCK_COMMENT_RE, '')
							 | 
						||
| 
								 | 
							
								    .replace(LINE_COMMENT_RE, '')
							 | 
						||
| 
								 | 
							
								    .replace(IMPORT_OR_EXPORT_RE, addDependency)
							 | 
						||
| 
								 | 
							
								    .replace(REQUIRE_OR_DYNAMIC_IMPORT_RE, addDependency)
							 | 
						||
| 
								 | 
							
								    .replace(JEST_EXTENSIONS_RE, addDependency);
							 | 
						||
| 
								 | 
							
								  return dependencies;
							 | 
						||
| 
								 | 
							
								}
							 |