1 | 'use strict';
|
2 |
|
3 | Object.defineProperty(exports, '__esModule', {
|
4 | value: true
|
5 | });
|
6 | exports.extract = extract;
|
7 |
|
8 | var _isRegExpSupported = _interopRequireDefault(require('./isRegExpSupported'));
|
9 |
|
10 | function _interopRequireDefault(obj) {
|
11 | return obj && obj.__esModule ? obj : {default: obj};
|
12 | }
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 | const NOT_A_DOT = (0, _isRegExpSupported.default)('(?<!\\.\\s*)')
|
22 | ? '(?<!\\.\\s*)'
|
23 | : '(?:^|[^.]\\s*)';
|
24 |
|
25 | const CAPTURE_STRING_LITERAL = pos => `([\`'"])([^'"\`]*?)(?:\\${pos})`;
|
26 |
|
27 | const WORD_SEPARATOR = '\\b';
|
28 | const LEFT_PARENTHESIS = '\\(';
|
29 | const RIGHT_PARENTHESIS = '\\)';
|
30 | const WHITESPACE = '\\s*';
|
31 | const OPTIONAL_COMMA = '(:?,\\s*)?';
|
32 |
|
33 | function createRegExp(parts, flags) {
|
34 | return new RegExp(parts.join(''), flags);
|
35 | }
|
36 |
|
37 | function alternatives(...parts) {
|
38 | return `(?:${parts.join('|')})`;
|
39 | }
|
40 |
|
41 | function functionCallStart(...names) {
|
42 | return [
|
43 | NOT_A_DOT,
|
44 | WORD_SEPARATOR,
|
45 | alternatives(...names),
|
46 | WHITESPACE,
|
47 | LEFT_PARENTHESIS,
|
48 | WHITESPACE
|
49 | ];
|
50 | }
|
51 |
|
52 | const BLOCK_COMMENT_RE = /\/\*[^]*?\*\//g;
|
53 | const LINE_COMMENT_RE = /\/\/.*/g;
|
54 | const REQUIRE_OR_DYNAMIC_IMPORT_RE = createRegExp(
|
55 | [
|
56 | ...functionCallStart('require', 'import'),
|
57 | CAPTURE_STRING_LITERAL(1),
|
58 | WHITESPACE,
|
59 | OPTIONAL_COMMA,
|
60 | RIGHT_PARENTHESIS
|
61 | ],
|
62 | 'g'
|
63 | );
|
64 | const IMPORT_OR_EXPORT_RE = createRegExp(
|
65 | [
|
66 | '\\b(?:import|export)\\s+(?!type(?:of)?\\s+)(?:[^\'"]+\\s+from\\s+)?',
|
67 | CAPTURE_STRING_LITERAL(1)
|
68 | ],
|
69 | 'g'
|
70 | );
|
71 | const JEST_EXTENSIONS_RE = createRegExp(
|
72 | [
|
73 | ...functionCallStart(
|
74 | 'jest\\s*\\.\\s*(?:requireActual|requireMock|genMockFromModule|createMockFromModule)'
|
75 | ),
|
76 | CAPTURE_STRING_LITERAL(1),
|
77 | WHITESPACE,
|
78 | OPTIONAL_COMMA,
|
79 | RIGHT_PARENTHESIS
|
80 | ],
|
81 | 'g'
|
82 | );
|
83 |
|
84 | function extract(code) {
|
85 | const dependencies = new Set();
|
86 |
|
87 | const addDependency = (match, _, dep) => {
|
88 | dependencies.add(dep);
|
89 | return match;
|
90 | };
|
91 |
|
92 | code
|
93 | .replace(BLOCK_COMMENT_RE, '')
|
94 | .replace(LINE_COMMENT_RE, '')
|
95 | .replace(IMPORT_OR_EXPORT_RE, addDependency)
|
96 | .replace(REQUIRE_OR_DYNAMIC_IMPORT_RE, addDependency)
|
97 | .replace(JEST_EXTENSIONS_RE, addDependency);
|
98 | return dependencies;
|
99 | }
|