From e8dd3c3f1d2219e58284ae527e020ad95a979e02 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Sat, 6 Nov 2021 07:13:04 +0100 Subject: [PATCH] feat(commonjs): add strictRequires option to wrap modules (#1038) --- packages/commonjs/src/generate-exports.js | 87 ++-- packages/commonjs/src/generate-imports.js | 84 +-- packages/commonjs/src/helpers.js | 2 + packages/commonjs/src/index.js | 122 +---- packages/commonjs/src/proxies.js | 23 +- packages/commonjs/src/resolve-id.js | 3 +- .../commonjs/src/resolve-require-sources.js | 54 ++ packages/commonjs/src/transform-commonjs.js | 12 +- .../output.js | 4 +- .../output.js | 4 +- .../output.js | 4 +- .../form/typeof-module-exports/output.js | 18 +- .../_config.js | 6 + .../strict-require-semantic-circular/main.js | 2 + .../strict-require-semantic-circular/other.js | 1 + .../strict-require-semantic-entry/_config.js | 20 + .../strict-require-semantic-entry/main.js | 1 + .../strict-require-semantic-entry/other.js | 1 + .../_config.js | 2 +- .../assignExports.js | 1 + .../main.js | 16 +- .../reassignModuleExports.js | 3 - .../wrappedExports.js | 4 + .../_config.js | 6 + .../assignModuleAndExports.js | 3 + .../assignModuleExports.js | 6 + .../main.js | 17 + .../wrappedModuleExports.js | 3 + .../_config.js | 6 + .../main.js | 5 + .../replaceModuleExports.js | 2 + .../_config.js | 6 + .../strict-require-semantic-from-esm/dep.js | 1 + .../strict-require-semantic-from-esm/main.js | 4 + .../strict.js | 1 + .../samples/cjs-with-esm-property/lib.js | 10 +- .../samples/cjs-with-esm-property/main.js | 4 +- .../commonjs/test/snapshots/function.js.md | 491 +++++++++++++----- .../commonjs/test/snapshots/function.js.snap | Bin 17777 -> 18579 bytes 39 files changed, 711 insertions(+), 328 deletions(-) create mode 100644 packages/commonjs/src/resolve-require-sources.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-circular/_config.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-circular/main.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-circular/other.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-entry/_config.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-entry/main.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-entry/other.js delete mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/reassignModuleExports.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/wrappedExports.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/_config.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/assignModuleAndExports.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/assignModuleExports.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/main.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/wrappedModuleExports.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/_config.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/main.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/replaceModuleExports.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/_config.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/dep.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/main.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/strict.js diff --git a/packages/commonjs/src/generate-exports.js b/packages/commonjs/src/generate-exports.js index 7dcb2cdaa..1c5faa41d 100644 --- a/packages/commonjs/src/generate-exports.js +++ b/packages/commonjs/src/generate-exports.js @@ -11,8 +11,9 @@ export function wrapCode(magicString, uses, moduleName, exportsName) { } magicString .trim() + .indent('\t') .prepend(`(function (${args.join(', ')}) {\n`) - .append(`\n}(${passedArgs.join(', ')}));`); + .append(`\n} (${passedArgs.join(', ')}));`); } export function rewriteExportsAndGetExportsBlock( @@ -38,34 +39,18 @@ export function rewriteExportsAndGetExportsBlock( const exportDeclarations = []; if (usesRequireWrapper) { - // TODO Lukas Extract - if (exportMode === 'replace') { - for (const { left } of moduleExportsAssignments) { - magicString.overwrite(left.start, left.end, exportsName); - } - } else { - // Collect and rewrite module.exports assignments - for (const { left } of moduleExportsAssignments) { - magicString.overwrite(left.start, left.end, `${moduleName}.exports`); - } - // Collect and rewrite named exports - for (const [exportName, { nodes }] of exportsAssignmentsByName) { - for (const node of nodes) { - magicString.overwrite(node.start, node.left.end, `${exportsName}.${exportName}`); - } - } - // Collect and rewrite exports.__esModule assignments - for (const expression of defineCompiledEsmExpressions) { - const moduleExportsExpression = - expression.type === 'CallExpression' ? expression.arguments[0] : expression.left.object; - magicString.overwrite( - moduleExportsExpression.start, - moduleExportsExpression.end, - exportsName - ); - } - } - exports.push(`${requireName} as __require`); + getExportsWhenUsingRequireWrapper( + magicString, + wrapped, + exportMode, + exports, + moduleExportsAssignments, + exportsAssignmentsByName, + moduleName, + exportsName, + requireName, + defineCompiledEsmExpressions + ); } else if (exportMode === 'replace') { getExportsForReplacedModuleExports( magicString, @@ -109,6 +94,49 @@ export function rewriteExportsAndGetExportsBlock( return `\n\n${exportDeclarations.join('\n')}`; } +function getExportsWhenUsingRequireWrapper( + magicString, + wrapped, + exportMode, + exports, + moduleExportsAssignments, + exportsAssignmentsByName, + moduleName, + exportsName, + requireName, + defineCompiledEsmExpressions +) { + if (!wrapped) { + if (exportMode === 'replace') { + for (const { left } of moduleExportsAssignments) { + magicString.overwrite(left.start, left.end, exportsName); + } + } else { + // Collect and rewrite module.exports assignments + for (const { left } of moduleExportsAssignments) { + magicString.overwrite(left.start, left.end, `${moduleName}.exports`); + } + // Collect and rewrite named exports + for (const [exportName, { nodes }] of exportsAssignmentsByName) { + for (const node of nodes) { + magicString.overwrite(node.start, node.left.end, `${exportsName}.${exportName}`); + } + } + // Collect and rewrite exports.__esModule assignments + for (const expression of defineCompiledEsmExpressions) { + const moduleExportsExpression = + expression.type === 'CallExpression' ? expression.arguments[0] : expression.left.object; + magicString.overwrite( + moduleExportsExpression.start, + moduleExportsExpression.end, + exportsName + ); + } + } + } + exports.push(`${requireName} as __require`); +} + function getExportsForReplacedModuleExports( magicString, exports, @@ -196,7 +224,6 @@ function getExports( } if (!isRestorableCompiledEsm || defaultIsModuleExports === true) { - // TODO Lukas handle ESM importing CommonJS exports.push(`${exportsName} as default`); } else if (moduleExportsAssignments.length === 0 || defaultIsModuleExports === false) { exports.push(`${deconflictedDefaultExportName || exportsName} as default`); diff --git a/packages/commonjs/src/generate-imports.js b/packages/commonjs/src/generate-imports.js index 8f621a260..22a59027d 100644 --- a/packages/commonjs/src/generate-imports.js +++ b/packages/commonjs/src/generate-imports.js @@ -2,7 +2,14 @@ import { dirname, resolve } from 'path'; import { sync as nodeResolveSync } from 'resolve'; -import { DYNAMIC_MODULES_ID, EXPORTS_SUFFIX, HELPERS_ID, MODULE_SUFFIX, wrapId } from './helpers'; +import { + DYNAMIC_MODULES_ID, + EXPORTS_SUFFIX, + HELPERS_ID, + IS_WRAPPED_COMMONJS, + MODULE_SUFFIX, + wrapId +} from './helpers'; import { normalizePathSlashes } from './utils'; export function isRequireStatement(node, scope) { @@ -106,6 +113,7 @@ export function getRequireHandlers() { exportMode, resolveRequireSourcesAndGetMeta, usesRequireWrapper, + isEsModule, usesRequire ) { const imports = []; @@ -127,40 +135,12 @@ export function getRequireHandlers() { ); } const requiresBySource = collectSources(requireExpressions); - // TODO Lukas consider extracting stuff - const result = await resolveRequireSourcesAndGetMeta( - usesRequireWrapper ? 'withRequireFunction' : true, + const requireTargets = await resolveRequireSourcesAndGetMeta( + id, + usesRequireWrapper ? IS_WRAPPED_COMMONJS : !isEsModule, Object.keys(requiresBySource) ); - let uid = 0; - for (const { source, id: resolveId, isCommonJS } of result) { - const requires = requiresBySource[source]; - let usesRequired = false; - let name; - const hasNameConflict = ({ scope }) => scope.contains(name); - do { - name = `require$$${uid}`; - uid += 1; - } while (requires.some(hasNameConflict)); - - // TODO Lukas extract constant - if (isCommonJS === 'withRequireFunction') { - for (const { node } of requires) { - magicString.overwrite(node.start, node.end, `${name}()`); - } - imports.push(`import { __require as ${name} } from ${JSON.stringify(resolveId)};`); - } else { - for (const { node, usesReturnValue, toBeRemoved } of requires) { - if (usesReturnValue) { - usesRequired = true; - magicString.overwrite(node.start, node.end, name); - } else { - magicString.remove(toBeRemoved.start, toBeRemoved.end); - } - } - imports.push(`import ${usesRequired ? `${name} from ` : ''}${JSON.stringify(resolveId)};`); - } - } + processRequireExpressions(imports, requireTargets, requiresBySource, magicString); return imports.length ? `${imports.join('\n')}\n\n` : ''; } @@ -181,3 +161,41 @@ function collectSources(requireExpressions) { } return requiresBySource; } + +function processRequireExpressions(imports, requireTargets, requiresBySource, magicString) { + const generateRequireName = getGenerateRequireName(); + for (const { source, id: resolveId, isCommonJS } of requireTargets) { + const requires = requiresBySource[source]; + const name = generateRequireName(requires); + if (isCommonJS === IS_WRAPPED_COMMONJS) { + for (const { node } of requires) { + magicString.overwrite(node.start, node.end, `${name}()`); + } + imports.push(`import { __require as ${name} } from ${JSON.stringify(resolveId)};`); + } else { + let usesRequired = false; + for (const { node, usesReturnValue, toBeRemoved } of requires) { + if (usesReturnValue) { + usesRequired = true; + magicString.overwrite(node.start, node.end, name); + } else { + magicString.remove(toBeRemoved.start, toBeRemoved.end); + } + } + imports.push(`import ${usesRequired ? `${name} from ` : ''}${JSON.stringify(resolveId)};`); + } + } +} + +function getGenerateRequireName() { + let uid = 0; + return (requires) => { + let name; + const hasNameConflict = ({ scope }) => scope.contains(name); + do { + name = `require$$${uid}`; + uid += 1; + } while (requires.some(hasNameConflict)); + return name; + }; +} diff --git a/packages/commonjs/src/helpers.js b/packages/commonjs/src/helpers.js index 381761110..fe080ee0e 100644 --- a/packages/commonjs/src/helpers.js +++ b/packages/commonjs/src/helpers.js @@ -11,6 +11,8 @@ export const ES_IMPORT_SUFFIX = '?es-import'; export const DYNAMIC_MODULES_ID = '\0commonjs-dynamic-modules'; export const HELPERS_ID = '\0commonjsHelpers.js'; +export const IS_WRAPPED_COMMONJS = 'withRequireFunction'; + // `x['default']` is used instead of `x.default` for backward compatibility with ES3 browsers. // Minifiers like uglify will usually transpile it back if compatibility with ES3 is not enabled. // This could be improved by inspecting Rollup's "generatedCode" option diff --git a/packages/commonjs/src/index.js b/packages/commonjs/src/index.js index af9afcc37..5fa50e419 100644 --- a/packages/commonjs/src/index.js +++ b/packages/commonjs/src/index.js @@ -19,17 +19,24 @@ import { isWrappedId, MODULE_SUFFIX, PROXY_SUFFIX, - unwrapId, - wrapId + unwrapId } from './helpers'; import { hasCjsKeywords } from './parse'; -import { getStaticRequireProxy, getUnknownRequireProxy } from './proxies'; -import getResolveId, { resolveExtensions } from './resolve-id'; +import { getEsImportProxy, getStaticRequireProxy, getUnknownRequireProxy } from './proxies'; +import getResolveId from './resolve-id'; +import { getResolveRequireSourcesAndGetMeta } from './resolve-require-sources'; import validateRollupVersion from './rollup-version'; import transformCommonjs from './transform-commonjs'; -import { capitalize, getName, normalizePathSlashes } from './utils'; +import { getName, normalizePathSlashes } from './utils'; export default function commonjs(options = {}) { + const { + ignoreGlobal, + ignoreDynamicRequires, + requireReturnsDefault: requireReturnsDefaultOption, + defaultIsModuleExports: defaultIsModuleExportsOption, + esmExternals + } = options; const extensions = options.extensions || ['.js']; const filter = createFilter(options.include, options.exclude); const strictRequireSemanticFilter = @@ -38,17 +45,12 @@ export default function commonjs(options = {}) { : !options.strictRequireSemantic ? () => false : createFilter(options.strictRequireSemantic); - const { - ignoreGlobal, - ignoreDynamicRequires, - requireReturnsDefault: requireReturnsDefaultOption, - defaultIsModuleExports: defaultIsModuleExportsOption, - esmExternals - } = options; + const getRequireReturnsDefault = typeof requireReturnsDefaultOption === 'function' ? requireReturnsDefaultOption : () => requireReturnsDefaultOption; + let esmExternalIds; const isEsmExternal = typeof esmExternals === 'function' @@ -56,13 +58,14 @@ export default function commonjs(options = {}) { : Array.isArray(esmExternals) ? ((esmExternalIds = new Set(esmExternals)), (id) => esmExternalIds.has(id)) : () => esmExternals; + const getDefaultIsModuleExports = typeof defaultIsModuleExportsOption === 'function' ? defaultIsModuleExportsOption : () => typeof defaultIsModuleExportsOption === 'boolean' ? defaultIsModuleExportsOption : 'auto'; - const knownCjsModuleTypes = Object.create(null); + const resolveRequireSourcesAndGetMeta = getResolveRequireSourcesAndGetMeta(extensions); const dynamicRequireModuleSet = getDynamicRequireModuleSet(options.dynamicRequireTargets); const isDynamicRequireModulesEnabled = dynamicRequireModuleSet.size > 0; const commonDir = isDynamicRequireModulesEnabled @@ -119,17 +122,10 @@ export default function commonjs(options = {}) { return { meta: { commonjs: { isCommonJS: false } } }; } - // TODO Lukas - // * test import from ESM -> additional proxy - // * test entry point - // * test interaction with dynamic require targets - // * test circular dependency: We must not use this.load without circularity check -> error in Rollup? - // When we write the imports, we already know that we are commonjs or mixed so we can rely on usesRequireWrapper and write that into a table const usesRequireWrapper = !isEsModule && (dynamicRequireModuleSet.has(normalizePathSlashes(id)) || strictRequireSemanticFilter(id)); - // TODO Lukas extract helpers return transformCommonjs( this.parse, code, @@ -146,54 +142,7 @@ export default function commonjs(options = {}) { ast, getDefaultIsModuleExports(id), usesRequireWrapper, - // TODO Lukas extract - (isParentCommonJS, sources) => { - knownCjsModuleTypes[id] = isParentCommonJS; - return Promise.all( - sources.map(async (source) => { - // Never analyze or proxy internal modules - if (source.startsWith('\0')) { - return { source, id: source, isCommonJS: false }; - } - const resolved = - (await this.resolve(source, id, { - skipSelf: true, - custom: { - 'node-resolve': { isRequire: true } - } - })) || resolveExtensions(source, id, extensions); - if (!resolved) { - return { source, id: wrapId(source, EXTERNAL_SUFFIX), isCommonJS: false }; - } - if (resolved.external) { - return { source, id: wrapId(resolved.id, EXTERNAL_SUFFIX), isCommonJS: false }; - } - if (resolved.id in knownCjsModuleTypes) { - return { - source, - id: - knownCjsModuleTypes[resolved.id] === true - ? wrapId(resolved.id, PROXY_SUFFIX) - : resolved.id, - isCommonJS: knownCjsModuleTypes[resolved.id] - }; - } - const { - meta: { commonjs: commonjsMeta } - } = await this.load(resolved); - const isCommonJS = commonjsMeta && commonjsMeta.isCommonJS; - return { - source, - id: - // TODO Lukas extract constant - isCommonJS === 'withRequireFunction' - ? resolved.id - : wrapId(resolved.id, PROXY_SUFFIX), - isCommonJS - }; - }) - ); - } + resolveRequireSourcesAndGetMeta(this) ); } @@ -241,40 +190,17 @@ export default function commonjs(options = {}) { ); } - // TODO Lukas extract if (isWrappedId(id, ES_IMPORT_SUFFIX)) { - const actualId = unwrapId(id, ES_IMPORT_SUFFIX); - const name = getName(actualId); - const exportsName = `${name}Exports`; - const requireModule = `require${capitalize(name)}`; - // TODO Lukas the ES wrapper might also just forward the exports object - let code = - `import { getDefaultExportFromCjs } from "${HELPERS_ID}";\n` + - `import { __require as ${requireModule} } from ${JSON.stringify(actualId)};\n` + - `var ${exportsName} = ${requireModule}();\n` + - `export { ${exportsName} as __moduleExports };`; - if (defaultIsModuleExports) { - code += `\nexport { ${exportsName} as default };`; - } else { - code += `export default /*@__PURE__*/getDefaultExportFromCjs(${exportsName});`; - } - return { - code, - syntheticNamedExports: '__moduleExports', - meta: { commonjs: { isCommonJS: false } } - }; + return getEsImportProxy(unwrapId(id, ES_IMPORT_SUFFIX), defaultIsModuleExports); } if (id === DYNAMIC_MODULES_ID) { - return { - code: getDynamicRequireModules( - isDynamicRequireModulesEnabled, - dynamicRequireModuleSet, - commonDir, - ignoreDynamicRequires - ), - meta: { commonjs: { isCommonJS: false } } - }; + return getDynamicRequireModules( + isDynamicRequireModulesEnabled, + dynamicRequireModuleSet, + commonDir, + ignoreDynamicRequires + ); } if (isWrappedId(id, PROXY_SUFFIX)) { diff --git a/packages/commonjs/src/proxies.js b/packages/commonjs/src/proxies.js index 7fd0b0234..2935612ac 100644 --- a/packages/commonjs/src/proxies.js +++ b/packages/commonjs/src/proxies.js @@ -1,5 +1,5 @@ import { HELPERS_ID } from './helpers'; -import { getName } from './utils'; +import { capitalize, getName } from './utils'; export function getUnknownRequireProxy(id, requireReturnsDefault) { if (requireReturnsDefault === true || id.endsWith('.json')) { @@ -46,3 +46,24 @@ export async function getStaticRequireProxy( } return `export { default } from ${JSON.stringify(id)};`; } + +export function getEsImportProxy(id, defaultIsModuleExports) { + const name = getName(id); + const exportsName = `${name}Exports`; + const requireModule = `require${capitalize(name)}`; + let code = + `import { getDefaultExportFromCjs } from "${HELPERS_ID}";\n` + + `import { __require as ${requireModule} } from ${JSON.stringify(id)};\n` + + `var ${exportsName} = ${requireModule}();\n` + + `export { ${exportsName} as __moduleExports };`; + if (defaultIsModuleExports) { + code += `\nexport { ${exportsName} as default };`; + } else { + code += `export default /*@__PURE__*/getDefaultExportFromCjs(${exportsName});`; + } + return { + code, + syntheticNamedExports: '__moduleExports', + meta: { commonjs: { isCommonJS: false } } + }; +} diff --git a/packages/commonjs/src/resolve-id.js b/packages/commonjs/src/resolve-id.js index ac59be3a8..d87309bc7 100644 --- a/packages/commonjs/src/resolve-id.js +++ b/packages/commonjs/src/resolve-id.js @@ -9,6 +9,7 @@ import { EXPORTS_SUFFIX, EXTERNAL_SUFFIX, HELPERS_ID, + IS_WRAPPED_COMMONJS, isWrappedId, MODULE_SUFFIX, PROXY_SUFFIX, @@ -96,7 +97,7 @@ export default function getResolveId(extensions) { const { meta: { commonjs: commonjsMeta } } = await this.load(resolved); - if (commonjsMeta && commonjsMeta.isCommonJS === 'withRequireFunction') { + if (commonjsMeta && commonjsMeta.isCommonJS === IS_WRAPPED_COMMONJS) { return wrapId(resolved.id, ES_IMPORT_SUFFIX); } } diff --git a/packages/commonjs/src/resolve-require-sources.js b/packages/commonjs/src/resolve-require-sources.js new file mode 100644 index 000000000..5be46a0c9 --- /dev/null +++ b/packages/commonjs/src/resolve-require-sources.js @@ -0,0 +1,54 @@ +import { EXTERNAL_SUFFIX, IS_WRAPPED_COMMONJS, PROXY_SUFFIX, wrapId } from './helpers'; +import { resolveExtensions } from './resolve-id'; + +// TODO Lukas auto-detect circular dependencies +// * only return once all dependencies have been analyzed +// * wait for this.load dependencies unless they already have an entry in knownCjsModuleTypes to avoid deadlocks +// as those have already started being processed +// * only analyze cycles if we do not have an explicit config +export function getResolveRequireSourcesAndGetMeta(extensions) { + const knownCjsModuleTypes = Object.create(null); + return (rollupContext) => (id, isParentCommonJS, sources) => { + knownCjsModuleTypes[id] = isParentCommonJS; + return Promise.all( + sources.map(async (source) => { + // Never analyze or proxy internal modules + if (source.startsWith('\0')) { + return { source, id: source, isCommonJS: false }; + } + const resolved = + (await rollupContext.resolve(source, id, { + skipSelf: true, + custom: { + 'node-resolve': { isRequire: true } + } + })) || resolveExtensions(source, id, extensions); + if (!resolved) { + return { source, id: wrapId(source, EXTERNAL_SUFFIX), isCommonJS: false }; + } + if (resolved.external) { + return { source, id: wrapId(resolved.id, EXTERNAL_SUFFIX), isCommonJS: false }; + } + if (resolved.id in knownCjsModuleTypes) { + return { + source, + id: + knownCjsModuleTypes[resolved.id] === IS_WRAPPED_COMMONJS + ? resolved.id + : wrapId(resolved.id, PROXY_SUFFIX), + isCommonJS: knownCjsModuleTypes[resolved.id] + }; + } + const { + meta: { commonjs: commonjsMeta } + } = await rollupContext.load(resolved); + const isCommonJS = commonjsMeta && commonjsMeta.isCommonJS; + return { + source, + id: isCommonJS === IS_WRAPPED_COMMONJS ? resolved.id : wrapId(resolved.id, PROXY_SUFFIX), + isCommonJS + }; + }) + ); + }; +} diff --git a/packages/commonjs/src/transform-commonjs.js b/packages/commonjs/src/transform-commonjs.js index eda4632fc..3716e6f35 100644 --- a/packages/commonjs/src/transform-commonjs.js +++ b/packages/commonjs/src/transform-commonjs.js @@ -27,6 +27,7 @@ import { isRequireStatement, isStaticRequireStatement } from './generate-imports'; +import { IS_WRAPPED_COMMONJS } from './helpers'; import { tryParse } from './parse'; import { capitalize, deconflict, getName, getVirtualPathForDynamicRequirePath } from './utils'; @@ -195,7 +196,7 @@ export default async function transformCommonjs( node.callee.property.name === 'resolve' && hasDynamicModuleForPath(id, '/', dynamicRequireModuleSet) ) { - // TODO Lukas reimplement + // TODO Lukas reimplement? uses.require = true; const requireNode = node.callee.object; magicString.appendLeft( @@ -219,7 +220,6 @@ export default async function transformCommonjs( skippedNodes.add(node.callee); uses.require = true; - // TODO Lukas can the remaining logic be moved to generate-imports? if (!isIgnoredRequireStatement(node, ignoreRequire)) { const usesReturnValue = parent.type !== 'ExpressionStatement'; @@ -315,10 +315,6 @@ export default async function transformCommonjs( } } return; - // TODO Lukas instead of wrapping, we rewrite everything - // module.exports -> exportsVar, except if it is an assignment, then it is moduleVar.exports - // module -> moduleVar - // only exceptions: Direct assignments to module or exports. Would work with new logic, though. case 'module': case 'exports': shouldWrap = true; @@ -464,6 +460,7 @@ export default async function transformCommonjs( exportMode, resolveRequireSourcesAndGetMeta, usesRequireWrapper, + isEsModule, uses.require ); const exportBlock = isEsModule @@ -521,9 +518,8 @@ function ${requireName} () { map: sourceMap ? magicString.generateMap() : null, syntheticNamedExports: isEsModule || usesRequireWrapper ? false : '__moduleExports', meta: { - // TODO Lukas extract constant commonjs: { - isCommonJS: !isEsModule && (usesRequireWrapper ? 'withRequireFunction' : true), + isCommonJS: !isEsModule && (usesRequireWrapper ? IS_WRAPPED_COMMONJS : true), isMixedModule: isEsModule } } diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-reassign-exports-__esModule/output.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-reassign-exports-__esModule/output.js index 54f0fd3f5..5d2e8817a 100644 --- a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-reassign-exports-__esModule/output.js +++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-reassign-exports-__esModule/output.js @@ -2,8 +2,8 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { __module as inputModule, exports as input } from "\u0000fixtures/form/defaultIsModuleExports-auto-reassign-exports-__esModule/input.js?commonjs-module" (function (module) { -module.exports = { __esModule: true, default: { foo: 'bar' }} -}(inputModule)); + module.exports = { __esModule: true, default: { foo: 'bar' }} +} (inputModule)); export default /*@__PURE__*/commonjsHelpers.getDefaultExportFromCjs(input); export { input as __moduleExports }; diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-reassign-exports-__esModule/output.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-reassign-exports-__esModule/output.js index 3d98b2c44..06b76067d 100644 --- a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-reassign-exports-__esModule/output.js +++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-reassign-exports-__esModule/output.js @@ -2,8 +2,8 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { __module as inputModule, exports as input } from "\u0000fixtures/form/defaultIsModuleExports-false-reassign-exports-__esModule/input.js?commonjs-module" (function (module) { -module.exports = { __esModule: true, default: { foo: 'bar' }}; -}(inputModule)); + module.exports = { __esModule: true, default: { foo: 'bar' }}; +} (inputModule)); export default input.default; export { input as __moduleExports }; diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-reassign-exports-no-__esModule/output.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-reassign-exports-no-__esModule/output.js index 2c8183e6e..448a18947 100644 --- a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-reassign-exports-no-__esModule/output.js +++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-reassign-exports-no-__esModule/output.js @@ -2,8 +2,8 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { __module as inputModule, exports as input } from "\u0000fixtures/form/defaultIsModuleExports-false-reassign-exports-no-__esModule/input.js?commonjs-module" (function (module) { -module.exports = { default: { foo: 'bar' }}; -}(inputModule)); + module.exports = { default: { foo: 'bar' }}; +} (inputModule)); export default input.default; export { input as __moduleExports }; diff --git a/packages/commonjs/test/fixtures/form/typeof-module-exports/output.js b/packages/commonjs/test/fixtures/form/typeof-module-exports/output.js index 174b58185..17e00f801 100644 --- a/packages/commonjs/test/fixtures/form/typeof-module-exports/output.js +++ b/packages/commonjs/test/fixtures/form/typeof-module-exports/output.js @@ -2,16 +2,16 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { __module as inputModule, exports as input } from "\u0000fixtures/form/typeof-module-exports/input.js?commonjs-module" (function (module, exports) { -var foo = 42; + var foo = 42; -if ( 'object' === 'object' && 'object' === 'object' ) { - module.exports = foo; -} else if ( typeof undefined === 'function' && undefined.amd ) { - undefined([], function () { return foo; }); -} else { - window.foo = foo; -} -}(inputModule, input)); + if ( 'object' === 'object' && 'object' === 'object' ) { + module.exports = foo; + } else if ( typeof undefined === 'function' && undefined.amd ) { + undefined([], function () { return foo; }); + } else { + window.foo = foo; + } +} (inputModule, input)); export default input; export { input as __moduleExports }; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/_config.js new file mode 100644 index 000000000..073d40526 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/_config.js @@ -0,0 +1,6 @@ +module.exports = { + description: 'handles circular dependencies with strict require semantic', + pluginOptions: { + strictRequireSemantic: true + } +}; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/main.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/main.js new file mode 100644 index 000000000..b49deee73 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/main.js @@ -0,0 +1,2 @@ +exports.foo = 'foo'; +t.is(require('./other.js').foo, 'foo'); diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/other.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/other.js new file mode 100644 index 000000000..fbe0d2a97 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/other.js @@ -0,0 +1 @@ +exports.foo = require('./main.js').foo; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/_config.js new file mode 100644 index 000000000..0ba3d13b4 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/_config.js @@ -0,0 +1,20 @@ +const assert = require('assert'); + +module.exports = { + description: 'strict require semantic modules can be entry points', + options: { + input: [ + 'fixtures/function/strict-require-semantic-entry/main.js', + 'fixtures/function/strict-require-semantic-entry/other.js' + ], + output: { + chunkFileNames: 'generated-[name].js' + } + }, + pluginOptions: { + strictRequireSemantic: ['fixtures/function/strict-require-semantic-entry/main.js'] + }, + exports(exports) { + assert.deepStrictEqual(exports, { foo: 'foo' }); + } +}; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/main.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/main.js new file mode 100644 index 000000000..94ecacb72 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/main.js @@ -0,0 +1 @@ +exports.foo = 'foo'; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/other.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/other.js new file mode 100644 index 000000000..44c7e1527 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/other.js @@ -0,0 +1 @@ +t.is(require('./main.js').foo, 'foo'); diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/_config.js index 30b61d0c5..dde0e4242 100644 --- a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/_config.js +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/_config.js @@ -1,5 +1,5 @@ module.exports = { - description: 'supports using function wrappers for modules', + description: 'supports using function wrappers for modules for export mode "exports"', pluginOptions: { strictRequireSemantic: ['fixtures/function/strict-require-semantic-exportmode-exports/*E*.js'] } diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/assignExports.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/assignExports.js index 5e58a22e5..8c69cda39 100644 --- a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/assignExports.js +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/assignExports.js @@ -1,2 +1,3 @@ exports.foo = 'foo'; +module.exports.bar = 'bar'; global.hasAssignExportsRun = true; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/main.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/main.js index 90fca158f..c8523a512 100644 --- a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/main.js +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/main.js @@ -1,17 +1,17 @@ t.is(global.hasAssignExportsRun, undefined, 'before require'); -t.is(require('./assignExports.js').foo, 'foo'); +t.deepEqual(require('./assignExports.js'), { foo: 'foo', bar: 'bar' }); t.is(global.hasAssignExportsRun, true, 'after require'); delete global.hasAssignExportsRun; -t.is(global.hasReassignModuleExportsRun, undefined, 'before require'); -t.is(require('./reassignModuleExports.js').foo, 'foo'); - -t.is(global.hasReassignModuleExportsRun, true, 'after require'); -delete global.hasReassignModuleExportsRun; - t.is(global.hasCompiledEsmRun, undefined, 'before require'); -t.is(require('./compiledEsm.js').foo, 'foo'); +t.deepEqual(require('./compiledEsm.js'), { foo: 'foo', __esModule: true }); t.is(global.hasCompiledEsmRun, true, 'after require'); delete global.hasCompiledEsmRun; + +t.is(global.hasWrappedExportsRun, undefined, 'before require'); +t.deepEqual(require('./wrappedExports.js'), { foo: 'foo' }); + +t.is(global.hasWrappedExportsRun, true, 'after require'); +delete global.hasWrappedExportsRun; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/reassignModuleExports.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/reassignModuleExports.js deleted file mode 100644 index d988c04a8..000000000 --- a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/reassignModuleExports.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { bar: 'bar' }; -module.exports.foo = 'foo'; -global.hasReassignModuleExportsRun = true; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/wrappedExports.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/wrappedExports.js new file mode 100644 index 000000000..11c17d4cc --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/wrappedExports.js @@ -0,0 +1,4 @@ +exports.foo = 'foo'; +exports = {}; +exports.bar = 'bar'; +global.hasWrappedExportsRun = true; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/_config.js new file mode 100644 index 000000000..e8dd75b4f --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/_config.js @@ -0,0 +1,6 @@ +module.exports = { + description: 'supports using function wrappers for modules for export mode "module"', + pluginOptions: { + strictRequireSemantic: ['fixtures/function/strict-require-semantic-exportmode-module/*E*.js'] + } +}; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/assignModuleAndExports.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/assignModuleAndExports.js new file mode 100644 index 000000000..887e1707f --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/assignModuleAndExports.js @@ -0,0 +1,3 @@ +module.exports = { foo: 'foo' }; +module.exports.bar = 'bar'; +global.hasAssignModuleAndExportsRun = true; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/assignModuleExports.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/assignModuleExports.js new file mode 100644 index 000000000..654fd144a --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/assignModuleExports.js @@ -0,0 +1,6 @@ +if (Math.random() > 0.5) { + module.exports = { foo: 'foo' }; +} else { + module.exports = { foo: 'foo' }; +} +global.hasAssignModuleExportsRun = true; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/main.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/main.js new file mode 100644 index 000000000..3e28a77a2 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/main.js @@ -0,0 +1,17 @@ +t.is(global.hasAssignModuleExportsRun, undefined, 'before require'); +t.is(require('./assignModuleExports.js').foo, 'foo'); + +t.is(global.hasAssignModuleExportsRun, true, 'after require'); +delete global.hasAssignModuleExportsRun; + +t.is(global.hasAssignModuleAndExportsRun, undefined, 'before require'); +t.is(require('./assignModuleAndExports.js').foo, 'foo'); + +t.is(global.hasAssignModuleAndExportsRun, true, 'after require'); +delete global.hasAssignModuleAndExportsRun; + +t.is(global.hasWrappedModuleExportsRun, undefined, 'before require'); +t.is(require('./wrappedModuleExports.js').foo, 'foo'); + +t.is(global.hasWrappedModuleExportsRun, true, 'after require'); +delete global.hasWrappedModuleExportsRun; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/wrappedModuleExports.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/wrappedModuleExports.js new file mode 100644 index 000000000..00b083b31 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/wrappedModuleExports.js @@ -0,0 +1,3 @@ +module.exports = { foo: 'foo' }; +exports = {}; +global.hasWrappedModuleExportsRun = true; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/_config.js new file mode 100644 index 000000000..6f9c03a62 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/_config.js @@ -0,0 +1,6 @@ +module.exports = { + description: 'supports using function wrappers for modules for export mode "replace"', + pluginOptions: { + strictRequireSemantic: ['fixtures/function/strict-require-semantic-exportmode-replace/*E*.js'] + } +}; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/main.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/main.js new file mode 100644 index 000000000..4b6423503 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/main.js @@ -0,0 +1,5 @@ +t.is(global.hasReplaceModuleExportsRun, undefined, 'before require'); +t.is(require('./replaceModuleExports.js').foo, 'foo'); + +t.is(global.hasReplaceModuleExportsRun, true, 'after require'); +delete global.hasReplaceModuleExportsRun; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/replaceModuleExports.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/replaceModuleExports.js new file mode 100644 index 000000000..07a8f2e9a --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/replaceModuleExports.js @@ -0,0 +1,2 @@ +module.exports = { foo: 'foo' }; +global.hasReplaceModuleExportsRun = true; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/_config.js new file mode 100644 index 000000000..56fdd8541 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/_config.js @@ -0,0 +1,6 @@ +module.exports = { + description: 'handles importing wrapped modules from ESM', + pluginOptions: { + strictRequireSemantic: ['fixtures/function/strict-require-semantic-from-esm/strict.js'] + } +}; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/dep.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/dep.js new file mode 100644 index 000000000..242f91140 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/dep.js @@ -0,0 +1 @@ +t.is(require('./strict').foo, 'foo'); diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/main.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/main.js new file mode 100644 index 000000000..95d8d3beb --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/main.js @@ -0,0 +1,4 @@ +import { foo } from './strict.js'; +import './dep.js'; + +t.is(foo, 'foo'); diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/strict.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/strict.js new file mode 100644 index 000000000..94ecacb72 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/strict.js @@ -0,0 +1 @@ +exports.foo = 'foo'; diff --git a/packages/commonjs/test/fixtures/samples/cjs-with-esm-property/lib.js b/packages/commonjs/test/fixtures/samples/cjs-with-esm-property/lib.js index 657003611..46d1bf449 100644 --- a/packages/commonjs/test/fixtures/samples/cjs-with-esm-property/lib.js +++ b/packages/commonjs/test/fixtures/samples/cjs-with-esm-property/lib.js @@ -1,4 +1,6 @@ -module.exports = { - "default": () => { console.log('beep') }, - __esModule: true -}; \ No newline at end of file +module.exports = { + default: () => { + t.is('beep', 'beep'); + }, + __esModule: true +}; diff --git a/packages/commonjs/test/fixtures/samples/cjs-with-esm-property/main.js b/packages/commonjs/test/fixtures/samples/cjs-with-esm-property/main.js index aed3937f1..e97281701 100644 --- a/packages/commonjs/test/fixtures/samples/cjs-with-esm-property/main.js +++ b/packages/commonjs/test/fixtures/samples/cjs-with-esm-property/main.js @@ -1,3 +1,3 @@ -import fn from './lib' +import fn from './lib'; -fn() \ No newline at end of file +fn(); diff --git a/packages/commonjs/test/snapshots/function.js.md b/packages/commonjs/test/snapshots/function.js.md index 48dcc52e9..5715c0ae2 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -128,27 +128,27 @@ Generated by [AVA](https://avajs.dev). var dep = {};␊ ␊ (function (exports) {␊ - const main$1 = main;␊ + const main$1 = main;␊ ␊ - addExports(exports);␊ + addExports(exports);␊ ␊ - function addExports(exported) {␊ - // eslint-disable-next-line no-param-reassign␊ - exported.getMain = () => main$1;␊ - }␊ - }(dep));␊ + function addExports(exported) {␊ + // eslint-disable-next-line no-param-reassign␊ + exported.getMain = () => main$1;␊ + }␊ + } (dep));␊ ␊ (function (exports) {␊ - const dep$1 = dep;␊ + const dep$1 = dep;␊ ␊ - addExports();␊ - t.is(dep$1.getMain().foo, 'foo');␊ + addExports();␊ + t.is(dep$1.getMain().foo, 'foo');␊ ␊ - function addExports(exported) {␊ - // eslint-disable-next-line no-param-reassign␊ - exports.foo = 'foo';␊ - }␊ - }(main));␊ + function addExports(exported) {␊ + // eslint-disable-next-line no-param-reassign␊ + exports.foo = 'foo';␊ + }␊ + } (main));␊ ␊ exports["default"] = main;␊ `, @@ -2478,16 +2478,16 @@ Generated by [AVA](https://avajs.dev). if (hasRequiredCustomModule) return customModule.exports;␊ hasRequiredCustomModule = 1;␊ (function (module) {␊ - const circular = requireCircular();␊ + const circular = requireCircular();␊ ␊ - circular.extend1(module.exports);␊ + circular.extend1(module.exports);␊ ␊ - customModule.exports.get1 = function () {␊ - return 'all good';␊ - };␊ + module.exports.get1 = function () {␊ + return 'all good';␊ + };␊ ␊ - circular.extend2(module.exports);␊ - }(customModule));␊ + circular.extend2(module.exports);␊ + } (customModule));␊ return customModule.exports;␊ }␊ ␊ @@ -3364,10 +3364,10 @@ Generated by [AVA](https://avajs.dev). var dep$1 = {exports: {}};␊ ␊ (function (module, exports) {␊ - exports.foo = 'foo';␊ - module.exports = { replaced: true };␊ - exports.bar = 'bar';␊ - }(dep$1, dep$1.exports));␊ + exports.foo = 'foo';␊ + module.exports = { replaced: true };␊ + exports.bar = 'bar';␊ + } (dep$1, dep$1.exports));␊ ␊ const dep = dep$1.exports;␊ ␊ @@ -3477,13 +3477,13 @@ Generated by [AVA](https://avajs.dev). var encode = {};␊ ␊ (function (exports) {␊ - exports.encodeURIComponent = function () {␊ - return encodeURIComponent(this.str);␊ - };␊ + exports.encodeURIComponent = function () {␊ + return encodeURIComponent(this.str);␊ + };␊ ␊ - // to ensure module is wrapped␊ - commonjsGlobal.foo = exports;␊ - }(encode));␊ + // to ensure module is wrapped␊ + commonjsGlobal.foo = exports;␊ + } (encode));␊ ␊ /* eslint-disable */␊ ␊ @@ -4380,15 +4380,15 @@ Generated by [AVA](https://avajs.dev). var other = {exports: {}};␊ ␊ (function (module, exports) {␊ - exports.default = 42;␊ + exports.default = 42;␊ ␊ - addCompiledMarker(module.exports);␊ + addCompiledMarker(module.exports);␊ ␊ - function addCompiledMarker(exports) {␊ - // eslint-disable-next-line no-param-reassign␊ - exports.__esModule = true;␊ - }␊ - }(other, other.exports));␊ + function addCompiledMarker(exports) {␊ + // eslint-disable-next-line no-param-reassign␊ + exports.__esModule = true;␊ + }␊ + } (other, other.exports));␊ ␊ var foo = /*@__PURE__*/getDefaultExportFromCjs(other.exports);␊ ␊ @@ -4406,13 +4406,13 @@ Generated by [AVA](https://avajs.dev). var other = {exports: {}};␊ ␊ (function (module) {␊ - addDefaultExport(module.exports);␊ + addDefaultExport(module.exports);␊ ␊ - function addDefaultExport(exports) {␊ - // eslint-disable-next-line no-param-reassign␊ - exports.default = 42;␊ - }␊ - }(other));␊ + function addDefaultExport(exports) {␊ + // eslint-disable-next-line no-param-reassign␊ + exports.default = 42;␊ + }␊ + } (other));␊ ␊ var foo = other.exports;␊ ␊ @@ -4519,13 +4519,13 @@ Generated by [AVA](https://avajs.dev). ␊ (function (exports) {␊ ␊ - modifyExports(exports);␊ + modifyExports(exports);␊ ␊ - function modifyExports(exported) {␊ - // eslint-disable-next-line no-param-reassign␊ - exported.foo = 'bar';␊ - }␊ - }(main));␊ + function modifyExports(exported) {␊ + // eslint-disable-next-line no-param-reassign␊ + exported.foo = 'bar';␊ + }␊ + } (main));␊ ␊ module.exports = main;␊ `, @@ -4632,10 +4632,10 @@ Generated by [AVA](https://avajs.dev). var x = {exports: {}};␊ ␊ (function (module) {␊ - window.addExport = (key, value) => {␊ - module.exports[key] = value;␊ - };␊ - }(x));␊ + window.addExport = (key, value) => {␊ + module.exports[key] = value;␊ + };␊ + } (x));␊ ␊ t.is(x.exports.named, undefined);␊ ␊ @@ -4655,13 +4655,13 @@ Generated by [AVA](https://avajs.dev). var x = {exports: {}};␊ ␊ (function (module) {␊ - Object.defineProperty(module.exports, 'named', {␊ - enumerable: true,␊ - get: function get() {␊ - return 'foo';␊ - }␊ - });␊ - }(x));␊ + Object.defineProperty(module.exports, 'named', {␊ + enumerable: true,␊ + get: function get() {␊ + return 'foo';␊ + }␊ + });␊ + } (x));␊ ␊ t.is(x.exports.named, 'foo');␊ `, @@ -4733,8 +4733,8 @@ Generated by [AVA](https://avajs.dev). ␊ (function (exports) {␊ ␊ - exports.default = 'foo';␊ - }(foo$1));␊ + exports.default = 'foo';␊ + } (foo$1));␊ ␊ var foo = /*@__PURE__*/getDefaultExportFromCjs(foo$1);␊ ␊ @@ -4756,14 +4756,14 @@ Generated by [AVA](https://avajs.dev). var foo$1 = {};␊ ␊ (function (exports) {␊ - Object.defineProperty(exports, '__esModule', { value: true });␊ + Object.defineProperty(exports, '__esModule', { value: true });␊ ␊ - {␊ - Object.defineProperty(exports, '__esModule', { value: true });␊ - }␊ + {␊ + Object.defineProperty(exports, '__esModule', { value: true });␊ + }␊ ␊ - exports.default = 'foo';␊ - }(foo$1));␊ + exports.default = 'foo';␊ + } (foo$1));␊ ␊ var foo = /*@__PURE__*/getDefaultExportFromCjs(foo$1);␊ ␊ @@ -4988,30 +4988,30 @@ Generated by [AVA](https://avajs.dev). var identifier$1 = {};␊ ␊ (function (exports) {␊ - exports = 'foo';␊ - t.is(exports, 'foo');␊ - }(identifier$1));␊ + exports = 'foo';␊ + t.is(exports, 'foo');␊ + } (identifier$1));␊ ␊ var property$1 = {};␊ ␊ (function (exports) {␊ - ({ foo: exports } = { foo: 'foo' });␊ - t.is(exports, 'foo');␊ - }(property$1));␊ + ({ foo: exports } = { foo: 'foo' });␊ + t.is(exports, 'foo');␊ + } (property$1));␊ ␊ var arrayPattern$1 = {};␊ ␊ (function (exports) {␊ - [exports] = ['foo'];␊ - t.is(exports, 'foo');␊ - }(arrayPattern$1));␊ + [exports] = ['foo'];␊ + t.is(exports, 'foo');␊ + } (arrayPattern$1));␊ ␊ var assignmentPattern$1 = {};␊ ␊ (function (exports) {␊ - ({ exports = 'foo' } = {});␊ - t.is(exports, 'foo');␊ - }(assignmentPattern$1));␊ + ({ exports = 'foo' } = {});␊ + t.is(exports, 'foo');␊ + } (assignmentPattern$1));␊ ␊ const identifier = identifier$1;␊ const property = property$1;␊ @@ -5039,34 +5039,34 @@ Generated by [AVA](https://avajs.dev). var identifier$1 = {exports: {}};␊ ␊ (function (module) {␊ - // eslint-disable-next-line no-global-assign␊ - module = 'foo';␊ - t.is(module, 'foo');␊ - }(identifier$1));␊ + // eslint-disable-next-line no-global-assign␊ + module = 'foo';␊ + t.is(module, 'foo');␊ + } (identifier$1));␊ ␊ var property$1 = {exports: {}};␊ ␊ (function (module) {␊ - // eslint-disable-next-line no-global-assign␊ - ({ foo: module } = { foo: 'foo' });␊ - t.is(module, 'foo');␊ - }(property$1));␊ + // eslint-disable-next-line no-global-assign␊ + ({ foo: module } = { foo: 'foo' });␊ + t.is(module, 'foo');␊ + } (property$1));␊ ␊ var arrayPattern$1 = {exports: {}};␊ ␊ (function (module) {␊ - // eslint-disable-next-line no-global-assign␊ - [module] = ['foo'];␊ - t.is(module, 'foo');␊ - }(arrayPattern$1));␊ + // eslint-disable-next-line no-global-assign␊ + [module] = ['foo'];␊ + t.is(module, 'foo');␊ + } (arrayPattern$1));␊ ␊ var assignmentPattern$1 = {exports: {}};␊ ␊ (function (module) {␊ - // eslint-disable-next-line no-global-assign␊ - ({ module = 'foo' } = {});␊ - t.is(module, 'foo');␊ - }(assignmentPattern$1));␊ + // eslint-disable-next-line no-global-assign␊ + ({ module = 'foo' } = {});␊ + t.is(module, 'foo');␊ + } (assignmentPattern$1));␊ ␊ const identifier = identifier$1.exports;␊ const property = property$1.exports;␊ @@ -5442,6 +5442,82 @@ Generated by [AVA](https://avajs.dev). `, } +## strict-require-semantic-circular + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + var other = {};␊ + ␊ + var hasRequiredOther;␊ + ␊ + function requireOther () {␊ + if (hasRequiredOther) return other;␊ + hasRequiredOther = 1;␊ + other.foo = requireMain().foo;␊ + return other;␊ + }␊ + ␊ + var hasRequiredMain;␊ + ␊ + function requireMain () {␊ + if (hasRequiredMain) return main;␊ + hasRequiredMain = 1;␊ + main.foo = 'foo';␊ + t.is(requireOther().foo, 'foo');␊ + return main;␊ + }␊ + ␊ + var mainExports = requireMain();␊ + ␊ + module.exports = mainExports;␊ + `, + } + +## strict-require-semantic-entry + +> Snapshot 1 + + { + 'generated-main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + var hasRequiredMain;␊ + ␊ + function requireMain () {␊ + if (hasRequiredMain) return main;␊ + hasRequiredMain = 1;␊ + main.foo = 'foo';␊ + return main;␊ + }␊ + ␊ + exports.requireMain = requireMain;␊ + `, + 'main.js': `'use strict';␊ + ␊ + var main = require('./generated-main.js');␊ + ␊ + var mainExports = main.requireMain();␊ + ␊ + module.exports = mainExports;␊ + `, + 'other.js': `'use strict';␊ + ␊ + var main = require('./generated-main.js');␊ + ␊ + var other = {};␊ + ␊ + t.is(main.requireMain().foo, 'foo');␊ + ␊ + module.exports = other;␊ + `, + } + ## strict-require-semantic-exportmode-exports > Snapshot 1 @@ -5461,23 +5537,11 @@ Generated by [AVA](https://avajs.dev). if (hasRequiredAssignExports) return assignExports;␊ hasRequiredAssignExports = 1;␊ assignExports.foo = 'foo';␊ + assignExports.bar = 'bar';␊ commonjsGlobal.hasAssignExportsRun = true;␊ return assignExports;␊ }␊ ␊ - var reassignModuleExports = {exports: {}};␊ - ␊ - var hasRequiredReassignModuleExports;␊ - ␊ - function requireReassignModuleExports () {␊ - if (hasRequiredReassignModuleExports) return reassignModuleExports.exports;␊ - hasRequiredReassignModuleExports = 1;␊ - reassignModuleExports.exports = { bar: 'bar' };␊ - reassignModuleExports.exports.foo = 'foo';␊ - commonjsGlobal.hasReassignModuleExportsRun = true;␊ - return reassignModuleExports.exports;␊ - }␊ - ␊ var compiledEsm = {};␊ ␊ var hasRequiredCompiledEsm;␊ @@ -5492,28 +5556,178 @@ Generated by [AVA](https://avajs.dev). return compiledEsm;␊ }␊ ␊ + var wrappedExports = {};␊ + ␊ + var hasRequiredWrappedExports;␊ + ␊ + function requireWrappedExports () {␊ + if (hasRequiredWrappedExports) return wrappedExports;␊ + hasRequiredWrappedExports = 1;␊ + (function (exports) {␊ + exports.foo = 'foo';␊ + exports = {};␊ + exports.bar = 'bar';␊ + commonjsGlobal.hasWrappedExportsRun = true;␊ + } (wrappedExports));␊ + return wrappedExports;␊ + }␊ + ␊ t.is(commonjsGlobal.hasAssignExportsRun, undefined, 'before require');␊ - t.is(requireAssignExports().foo, 'foo');␊ + t.deepEqual(requireAssignExports(), { foo: 'foo', bar: 'bar' });␊ ␊ t.is(commonjsGlobal.hasAssignExportsRun, true, 'after require');␊ delete commonjsGlobal.hasAssignExportsRun;␊ ␊ - t.is(commonjsGlobal.hasReassignModuleExportsRun, undefined, 'before require');␊ - t.is(requireReassignModuleExports().foo, 'foo');␊ - ␊ - t.is(commonjsGlobal.hasReassignModuleExportsRun, true, 'after require');␊ - delete commonjsGlobal.hasReassignModuleExportsRun;␊ - ␊ t.is(commonjsGlobal.hasCompiledEsmRun, undefined, 'before require');␊ - t.is(requireCompiledEsm().foo, 'foo');␊ + t.deepEqual(requireCompiledEsm(), { foo: 'foo', __esModule: true });␊ ␊ t.is(commonjsGlobal.hasCompiledEsmRun, true, 'after require');␊ delete commonjsGlobal.hasCompiledEsmRun;␊ ␊ + t.is(commonjsGlobal.hasWrappedExportsRun, undefined, 'before require');␊ + t.deepEqual(requireWrappedExports(), { foo: 'foo' });␊ + ␊ + t.is(commonjsGlobal.hasWrappedExportsRun, true, 'after require');␊ + delete commonjsGlobal.hasWrappedExportsRun;␊ + ␊ module.exports = main;␊ `, } +## strict-require-semantic-exportmode-module + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};␊ + ␊ + var main = {};␊ + ␊ + var assignModuleExports = {exports: {}};␊ + ␊ + var hasRequiredAssignModuleExports;␊ + ␊ + function requireAssignModuleExports () {␊ + if (hasRequiredAssignModuleExports) return assignModuleExports.exports;␊ + hasRequiredAssignModuleExports = 1;␊ + if (Math.random() > 0.5) {␊ + assignModuleExports.exports = { foo: 'foo' };␊ + } else {␊ + assignModuleExports.exports = { foo: 'foo' };␊ + }␊ + commonjsGlobal.hasAssignModuleExportsRun = true;␊ + return assignModuleExports.exports;␊ + }␊ + ␊ + var assignModuleAndExports = {exports: {}};␊ + ␊ + var hasRequiredAssignModuleAndExports;␊ + ␊ + function requireAssignModuleAndExports () {␊ + if (hasRequiredAssignModuleAndExports) return assignModuleAndExports.exports;␊ + hasRequiredAssignModuleAndExports = 1;␊ + assignModuleAndExports.exports = { foo: 'foo' };␊ + assignModuleAndExports.exports.bar = 'bar';␊ + commonjsGlobal.hasAssignModuleAndExportsRun = true;␊ + return assignModuleAndExports.exports;␊ + }␊ + ␊ + var wrappedModuleExports = {exports: {}};␊ + ␊ + var hasRequiredWrappedModuleExports;␊ + ␊ + function requireWrappedModuleExports () {␊ + if (hasRequiredWrappedModuleExports) return wrappedModuleExports.exports;␊ + hasRequiredWrappedModuleExports = 1;␊ + (function (module, exports) {␊ + module.exports = { foo: 'foo' };␊ + commonjsGlobal.hasWrappedModuleExportsRun = true;␊ + } (wrappedModuleExports));␊ + return wrappedModuleExports.exports;␊ + }␊ + ␊ + t.is(commonjsGlobal.hasAssignModuleExportsRun, undefined, 'before require');␊ + t.is(requireAssignModuleExports().foo, 'foo');␊ + ␊ + t.is(commonjsGlobal.hasAssignModuleExportsRun, true, 'after require');␊ + delete commonjsGlobal.hasAssignModuleExportsRun;␊ + ␊ + t.is(commonjsGlobal.hasAssignModuleAndExportsRun, undefined, 'before require');␊ + t.is(requireAssignModuleAndExports().foo, 'foo');␊ + ␊ + t.is(commonjsGlobal.hasAssignModuleAndExportsRun, true, 'after require');␊ + delete commonjsGlobal.hasAssignModuleAndExportsRun;␊ + ␊ + t.is(commonjsGlobal.hasWrappedModuleExportsRun, undefined, 'before require');␊ + t.is(requireWrappedModuleExports().foo, 'foo');␊ + ␊ + t.is(commonjsGlobal.hasWrappedModuleExportsRun, true, 'after require');␊ + delete commonjsGlobal.hasWrappedModuleExportsRun;␊ + ␊ + module.exports = main;␊ + `, + } + +## strict-require-semantic-exportmode-replace + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};␊ + ␊ + var main = {};␊ + ␊ + var replaceModuleExports;␊ + var hasRequiredReplaceModuleExports;␊ + ␊ + function requireReplaceModuleExports () {␊ + if (hasRequiredReplaceModuleExports) return replaceModuleExports;␊ + hasRequiredReplaceModuleExports = 1;␊ + replaceModuleExports = { foo: 'foo' };␊ + commonjsGlobal.hasReplaceModuleExportsRun = true;␊ + return replaceModuleExports;␊ + }␊ + ␊ + t.is(commonjsGlobal.hasReplaceModuleExportsRun, undefined, 'before require');␊ + t.is(requireReplaceModuleExports().foo, 'foo');␊ + ␊ + t.is(commonjsGlobal.hasReplaceModuleExportsRun, true, 'after require');␊ + delete commonjsGlobal.hasReplaceModuleExportsRun;␊ + ␊ + module.exports = main;␊ + `, + } + +## strict-require-semantic-from-esm + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var strict = {};␊ + ␊ + var hasRequiredStrict;␊ + ␊ + function requireStrict () {␊ + if (hasRequiredStrict) return strict;␊ + hasRequiredStrict = 1;␊ + strict.foo = 'foo';␊ + return strict;␊ + }␊ + ␊ + var strictExports = requireStrict();␊ + ␊ + t.is(requireStrict().foo, 'foo');␊ + ␊ + t.is(strictExports.foo, 'foo');␊ + `, + } + ## this > Snapshot 1 @@ -5612,11 +5826,11 @@ Generated by [AVA](https://avajs.dev). ␊ (function (module) {␊ ␊ - module.exports = 'bar';␊ - {␊ - return;␊ - }␊ - }(foo$1));␊ + module.exports = 'bar';␊ + {␊ + return;␊ + }␊ + } (foo$1));␊ ␊ const foo = foo$1.exports;␊ ␊ @@ -6364,3 +6578,32 @@ Generated by [AVA](https://avajs.dev). module.exports = main;␊ `, } + +## require-mixed-module + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + var other = 'foo';␊ + ␊ + const foo = other;␊ + ␊ + var dep$1 = 'default';␊ + ␊ + var dep$2 = /*#__PURE__*/Object.freeze({␊ + __proto__: null,␊ + foo: foo,␊ + 'default': dep$1␊ + });␊ + ␊ + const dep = dep$2;␊ + ␊ + t.deepEqual(dep, { default: 'default', ns: { default: 'bar', foo: 'foo' } });␊ + ␊ + module.exports = main;␊ + `, + } diff --git a/packages/commonjs/test/snapshots/function.js.snap b/packages/commonjs/test/snapshots/function.js.snap index 7a81a3203873a762eb6a06beac2e7ad476cb0729..ab054b8b038a4b16352f76ba1c8b9ceeb9ccad87 100644 GIT binary patch literal 18579 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 GR{{V(xZ`{P literal 17777 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

r{x^+&2wo4-mT~Qpt6?sIA+V=&g6o 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 CPjJ2f