Skip to content

Commit 2aa0ac9

Browse files
committed
feat(commonjs): Infer type for unidentified modules (#1038)
1 parent 2b3d215 commit 2aa0ac9

File tree

50 files changed

+220
-63
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+220
-63
lines changed

β€Žpackages/commonjs/src/index.js

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,11 @@ export default function commonjs(options = {}) {
6060
: () =>
6161
typeof defaultIsModuleExportsOption === 'boolean' ? defaultIsModuleExportsOption : 'auto';
6262

63-
const { resolveRequireSourcesAndGetMeta, getWrappedIds } = getResolveRequireSourcesAndGetMeta(
64-
extensions,
65-
detectCycles
66-
);
63+
const {
64+
resolveRequireSourcesAndGetMeta,
65+
getWrappedIds,
66+
isRequiredId
67+
} = getResolveRequireSourcesAndGetMeta(extensions, detectCycles);
6768
const dynamicRequireModuleSet = getDynamicRequireModuleSet(options.dynamicRequireTargets);
6869
const isDynamicRequireModulesEnabled = dynamicRequireModuleSet.size > 0;
6970
const commonDir = isDynamicRequireModulesEnabled
@@ -115,7 +116,8 @@ export default function commonjs(options = {}) {
115116

116117
if (
117118
!dynamicRequireModuleSet.has(normalizePathSlashes(id)) &&
118-
(!hasCjsKeywords(code, ignoreGlobal) || (isEsModule && !options.transformMixedEsModules))
119+
(!(hasCjsKeywords(code, ignoreGlobal) || isRequiredId(id)) ||
120+
(isEsModule && !options.transformMixedEsModules))
119121
) {
120122
return { meta: { commonjs: { isCommonJS: false } } };
121123
}
@@ -140,13 +142,28 @@ export default function commonjs(options = {}) {
140142
ast,
141143
getDefaultIsModuleExports(id),
142144
needsRequireWrapper,
143-
resolveRequireSourcesAndGetMeta(this)
145+
resolveRequireSourcesAndGetMeta(this),
146+
isRequiredId(id)
144147
);
145148
}
146149

147150
return {
148151
name: 'commonjs',
149152

153+
options(options) {
154+
// Always sort the node-resolve plugin after the commonjs plugin as otherwise CommonJS entries
155+
// will not work with strictRequires: true
156+
const { plugins } = options;
157+
if (Array.isArray(plugins)) {
158+
const cjsIndex = plugins.findIndex((plugin) => plugin.name === 'commonjs');
159+
const nodeResolveIndex = plugins.findIndex((plugin) => plugin.name === 'node-resolve');
160+
if (nodeResolveIndex >= 0 && nodeResolveIndex < cjsIndex) {
161+
plugins.splice(cjsIndex + 1, 0, plugins[nodeResolveIndex]);
162+
plugins.splice(nodeResolveIndex, 1);
163+
}
164+
}
165+
},
166+
150167
buildStart() {
151168
validateRollupVersion(this.meta.rollupVersion, peerDependencies.rollup);
152169
if (options.namedExports != null) {

β€Žpackages/commonjs/src/resolve-require-sources.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { resolveExtensions } from './resolve-id';
33

44
export function getResolveRequireSourcesAndGetMeta(extensions, detectCycles) {
55
const knownCjsModuleTypes = Object.create(null);
6+
const requiredIds = Object.create(null);
67
const dependentModules = Object.create(null);
78
const getDependentModules = (id) =>
89
dependentModules[id] || (dependentModules[id] = Object.create(null));
@@ -12,6 +13,7 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCycles) {
1213
Object.keys(knownCjsModuleTypes).filter(
1314
(id) => knownCjsModuleTypes[id] === IS_WRAPPED_COMMONJS
1415
),
16+
isRequiredId: (id) => requiredIds[id],
1517
resolveRequireSourcesAndGetMeta: (rollupContext) => async (id, isParentCommonJS, sources) => {
1618
knownCjsModuleTypes[id] = isParentCommonJS;
1719
const requireTargets = await Promise.all(
@@ -34,6 +36,7 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCycles) {
3436
if (resolved.external) {
3537
return { id: wrapId(childId, EXTERNAL_SUFFIX), allowProxy: false };
3638
}
39+
requiredIds[childId] = true;
3740
const parentDependentModules = getDependentModules(id);
3841
const childDependentModules = getDependentModules(childId);
3942
childDependentModules[id] = true;

β€Žpackages/commonjs/src/transform-commonjs.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ export default async function transformCommonjs(
5151
astCache,
5252
defaultIsModuleExports,
5353
needsRequireWrapper,
54-
resolveRequireSourcesAndGetMeta
54+
resolveRequireSourcesAndGetMeta,
55+
isRequired
5556
) {
5657
const ast = astCache || tryParse(parse, code, id);
5758
const magicString = new MagicString(code);
@@ -418,6 +419,7 @@ export default async function transformCommonjs(
418419
if (
419420
!(
420421
shouldWrap ||
422+
isRequired ||
421423
uses.module ||
422424
uses.exports ||
423425
uses.require ||

0 commit comments

Comments
Β (0)