You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.3 KiB
99 lines
2.3 KiB
'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( |
|
'jest\\s*\\.\\s*(?:requireActual|requireMock|genMockFromModule|createMockFromModule)' |
|
), |
|
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; |
|
}
|
|
|