Skip to content

Commit

Permalink
ADD support for renamed modules && ADD support for modules moved from…
Browse files Browse the repository at this point in the history
… es7 to es && REFACTOR to not have nested try-catch
  • Loading branch information
ndelangen committed Jun 13, 2019
1 parent 4ff325e commit d9d3bd8
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 31 deletions.
6 changes: 0 additions & 6 deletions dist-ts/index.d.ts

This file was deleted.

30 changes: 30 additions & 0 deletions src/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,3 +82,33 @@ describe('rewriteCoreJsRequest', () => {
);
});
});

describe('rewriteCoreJsRequest with downgrade option enabled', () => {
const fakeRequire = jest.mock();

describe('rewrite `core-js/modules/*`', () => {
it('should rewrite `core-js/modules/es6.*` import to `core-js/modules/es.*`', () => {
expect(rewriteCoreJsRequest('core-js/modules/es6.object.is-frozen.js', true)).toBe(
'core-js/modules/es.object.is-frozen.js'
);
});

it('should rewrite `core-js/modules/es7.*` import to `core-js/modules/es.*`', () => {
expect(rewriteCoreJsRequest('core-js/modules/es7.symbol.async-iterator', true)).toBe(
'core-js/modules/es.symbol.async-iterator'
);
});

it('should rewrite `core-js/modules/es.*` import to `core-js/modules/es.*`', () => {
expect(rewriteCoreJsRequest('core-js/modules/es.object.is-frozen.js', true)).toBe(
'core-js/modules/es.object.is-frozen.js'
);
});

it('should rewrite `core-js/modules/esnext.*` import to `core-js/modules/esnext.*`', () => {
expect(rewriteCoreJsRequest('core-js/modules/esnext.set.some.js', true)).toBe(
'core-js/modules/esnext.set.some.js'
);
});
});
});
83 changes: 58 additions & 25 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,44 +8,65 @@ const rewriteAndPreservePrefix = (originalRequest: string, newPath: string, newM
return `${requestPrefix}${newModuleName}/${newPath}`;
};

export const rewriteCoreJsRequest = (originalRequest: string) => {
const rewriteRenamedModules = (path: string) => {
if (path === 'web.dom.iterable') {
return path.replace('web.dom.', 'web.dom-collections.')
}

return path;
}

export const rewriteCoreJsRequest = (originalRequest: string, lowerVersion = false) => {
if (!originalRequest) {
throw new Error('no originalRequest')
}
if (/core-js\/modules\/es(6|7)\.(.*)/.test(originalRequest)) {
const [,esVersion, originalPath] = originalRequest.match(/core-js\/modules\/es(6|7)\.(.*)/);
const [,matchedVersion, matchedPath] = originalRequest.match(/core-js\/modules\/es(6|7)\.(.*)/);

const version = matchedVersion;
const path = rewriteRenamedModules(matchedPath);

if (esVersion === '6') {
return rewriteAndPreservePrefix(originalRequest, `modules/es.${originalPath}`);
if (version === '6' || lowerVersion) {
return rewriteAndPreservePrefix(originalRequest, `modules/es.${path}`);
}
if (esVersion === '7') {
return rewriteAndPreservePrefix(originalRequest, `modules/esnext.${originalPath}`);
if (version === '7') {
return rewriteAndPreservePrefix(originalRequest, `modules/esnext.${path}`);
}
}

if (/core-js\/library\/fn\/(.*)/.test(originalRequest)) {
const [,originalPath] = originalRequest.match(/core-js\/library\/fn\/(.*)/);
const [,matchedPath] = originalRequest.match(/core-js\/library\/fn\/(.*)/);

return rewriteAndPreservePrefix(originalRequest, `features/${originalPath}`, 'core-js-pure');
const path = rewriteRenamedModules(matchedPath);

return rewriteAndPreservePrefix(originalRequest, `features/${path}`, 'core-js-pure');
}

if (/core-js\/es(5|6|7)(.*)/.test(originalRequest)) {
const [,esVersion, originalPath] = originalRequest.match(/core-js\/es(5|6|7)(.*)?/);
const [,matchedVersion, matchedPath] = originalRequest.match(/core-js\/es(5|6|7)(.*)?/);

if (esVersion === '5') {
const version = matchedVersion;

if (version === '5') {
return null;
}
if (esVersion === '6') {
const asAModule = originalPath.replace('.js', '');
if (version === '6' || lowerVersion) {
const asAModule = matchedPath.replace('.js', '');
const path = rewriteRenamedModules(asAModule);

return rewriteAndPreservePrefix(originalRequest, `es${asAModule}`);
return rewriteAndPreservePrefix(originalRequest, `es${path}`);
}
if (esVersion === '7') {
if (version === '7') {
return null;
}
}

if (/core-js\/(object)\/(.*)/.test(originalRequest)) {
const [,originalPath] = originalRequest.match(/core-js\/(.*)?/);
const [,matchedPath] = originalRequest.match(/core-js\/(.*)?/);

const path = rewriteRenamedModules(matchedPath);

return rewriteAndPreservePrefix(originalRequest, `features/${originalPath}`);
return rewriteAndPreservePrefix(originalRequest, `features/${path}`);
}

return originalRequest;
Expand All @@ -68,19 +89,31 @@ export default function CoreJSUpgradeWebpackPlugin(options: Options) {
if (originalRequest.startsWith('./') || originalRequest.startsWith('../')) {
return;
}

try {
resolve(originalRequest);
require.resolve(originalRequest);
} catch (originalError) {
const newRequest = rewriteCoreJsRequest(originalRequest);
if (!newRequest) {
throw originalError;
let error = true;

// attempt to upgrade the path from core-js v2 to v3
if (error) {
try {
// eslint-disable-next-line no-param-reassign
resource.request = resolve(rewriteCoreJsRequest(originalRequest));
error = false;
} catch (e) {}
}

// attempt to downgrade the path from es7 to es6
if (error) {
try {
// eslint-disable-next-line no-param-reassign
resource.request = resolve(rewriteCoreJsRequest(originalRequest, true));
error = false;
} catch (e) {}
}

try {
// eslint-disable-next-line no-param-reassign
resource.request = resolve(newRequest);
} catch (newRequestError) {
if (error) {
throw originalError;
}
}
Expand Down

0 comments on commit d9d3bd8

Please sign in to comment.