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;
 | |
| }
 |