/
coreJsAutoUpgradePlugin.js
81 lines (66 loc) · 2.57 KB
/
coreJsAutoUpgradePlugin.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import { NormalModuleReplacementPlugin } from 'webpack';
const rewriteAndPreservePrefix = (originalRequest, newPath, newModuleName = 'core-js') => {
const result = originalRequest.match(/(.*\/)core-js\/.*/);
const requestPrefix = result ? result[1] : '';
return `${requestPrefix}${newModuleName}/${newPath}`;
};
export const upgradeCoreJsRequest = originalRequest => {
if (/core-js\/modules\/(.*)/.test(originalRequest)) {
const modulesInformations = originalRequest.match(/core-js\/modules\/es(6|7)\.(.*)/);
const esVersion = modulesInformations[1];
const originalPath = modulesInformations[2];
if (esVersion === '6') {
return rewriteAndPreservePrefix(originalRequest, `modules/es.${originalPath}`);
}
if (esVersion === '7') {
return rewriteAndPreservePrefix(originalRequest, `modules/esnext.${originalPath}`);
}
}
if (/core-js\/library\/fn\/(.*)/.test(originalRequest)) {
const modulesInformations = originalRequest.match(/core-js\/library\/fn\/(.*)/);
const originalPath = modulesInformations[1];
return rewriteAndPreservePrefix(originalRequest, `features/${originalPath}`, 'core-js-pure');
}
if (/core-js\/es(5|6|7)(.*)/.test(originalRequest)) {
const modulesInformations = originalRequest.match(/core-js\/es(5|6|7)(.*)?/);
const esVersion = modulesInformations[1];
const originalPath = modulesInformations[2];
if (esVersion === '5') {
return null;
}
if (esVersion === '6') {
const asAModule = originalPath.replace('.js', '');
return rewriteAndPreservePrefix(originalRequest, `es${asAModule}`);
}
if (esVersion === '7') {
return null;
}
}
if (/core-js\/(object)\/(.*)/.test(originalRequest)) {
const modulesInformations = originalRequest.match(/core-js\/(.*)?/);
const originalPath = modulesInformations[1];
return rewriteAndPreservePrefix(originalRequest, `features/${originalPath}`);
}
return originalRequest;
};
export default require =>
new NormalModuleReplacementPlugin(/core-js/, resource => {
const originalRequest = resource.request;
if (originalRequest.startsWith('./') || originalRequest.startsWith('../')) {
return;
}
try {
require.resolve(originalRequest);
} catch (originalError) {
const newRequest = upgradeCoreJsRequest(originalRequest);
if (!newRequest) {
throw originalError;
}
try {
// eslint-disable-next-line no-param-reassign
resource.request = require.resolve(newRequest);
} catch (newRequestError) {
throw originalError;
}
}
});