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 7a81a3203..ab054b8b0 100644 Binary files a/packages/commonjs/test/snapshots/function.js.snap and b/packages/commonjs/test/snapshots/function.js.snap differ