Skip to content

Commit

Permalink
fix(bundling): rspack should allow ES config module imports (#29095)
Browse files Browse the repository at this point in the history
Reproduction repo: https://github.com/olaf-cichocki/sample

## Current Behavior
When using mjs config file we end up with following error:
```
⚠️ Unable to construct project graph.
Failed to process project graph. Run "nx reset" to fix this. Please report the issue if you keep seeing it.
Failed to process project graph. Run "nx reset" to fix this. Please report the issue if you keep seeing it.
      An error occurred while processing files for the @nx/rspack/plugin plugin.
    - apps/appA/rspack.config.mjs: require() of ES Module /Users/miro/Dev/Testbox/sample/apps/appA/rspack.config.mjs not supported.
  Instead change the require of /Users/miro/Dev/Testbox/sample/apps/appA/rspack.config.mjs to a dynamic import() which is available in all CommonJS modules.
      Error [ERR_REQUIRE_ESM]: require() of ES Module /Users/miro/Dev/Testbox/sample/apps/appA/rspack.config.mjs not supported.
      Instead change the require of /Users/miro/Dev/Testbox/sample/apps/appA/rspack.config.mjs to a dynamic import() which is available in all CommonJS modules.
          at resolveUserDefinedRspackConfig (/Users/miro/Dev/Testbox/sample/node_modules/.pnpm/@nx+rspack@20.2.0-beta.3_@babel+traverse@7.25.9_@module-federation+enhanced@0.7.6_react-dom@1_7iwdcl66l7me4m7pewq22wegge/node_modules/@nx/rspack/src/utils/resolve-user-defined-rspack-config.js:19:16)
          at createRspackTargets (/Users/miro/Dev/Testbox/sample/node_modules/.pnpm/@nx+rspack@20.2.0-beta.3_@babel+traverse@7.25.9_@module-federation+enhanced@0.7.6_react-dom@1_7iwdcl66l7me4m7pewq22wegge/node_modules/@nx/rspack/src/plugins/plugin.js:65:98)
          at createNodesInternal (/Users/miro/Dev/Testbox/sample/node_modules/.pnpm/@nx+rspack@20.2.0-beta.3_@babel+traverse@7.25.9_@module-federation+enhanced@0.7.6_react-dom@1_7iwdcl66l7me4m7pewq22wegge/node_modules/@nx/rspack/src/plugins/plugin.js:51:34)
          at async /Users/miro/Dev/Testbox/sample/node_modules/.pnpm/nx@20.2.0-beta.3/node_modules/nx/src/project-graph/plugins/utils.js:10:27
          at async Promise.all (index 0)
```

## Expected Behavior
Using EU module config files is supported

## Related Issue(s)
<!-- Please link the issue being fixed so it gets closed when this is
merged. -->

Fixes #

Thank you @olaf-cichocki for reporting the issue.
  • Loading branch information
meeroslav authored Jan 30, 2025
1 parent c7ff6d3 commit 7d864c8
Show file tree
Hide file tree
Showing 3 changed files with 5 additions and 40 deletions.
3 changes: 1 addition & 2 deletions packages/rspack/src/executors/rspack/lib/config.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { join } from 'path';
import { ExecutorContext } from '@nx/devkit';
import { type Configuration } from '@rspack/core';
import {
Expand All @@ -14,7 +13,7 @@ export async function getRspackConfigs(
options: NormalizedRspackExecutorSchema & { devServer?: any },
context: ExecutorContext
): Promise<Configuration | Configuration[]> {
let userDefinedConfig = resolveUserDefinedRspackConfig(
let userDefinedConfig = await resolveUserDefinedRspackConfig(
options.rspackConfig,
options.tsConfig
);
Expand Down
2 changes: 1 addition & 1 deletion packages/rspack/src/plugins/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ async function createRspackTargets(
): Promise<RspackTargets> {
const namedInputs = getNamedInputs(projectRoot, context);

const rspackConfig = resolveUserDefinedRspackConfig(
const rspackConfig = await resolveUserDefinedRspackConfig(
join(context.workspaceRoot, configFilePath),
getRootTsConfigPath(),
true
Expand Down
40 changes: 3 additions & 37 deletions packages/rspack/src/utils/resolve-user-defined-rspack-config.ts
Original file line number Diff line number Diff line change
@@ -1,44 +1,10 @@
import { clearRequireCache } from '@nx/devkit/src/utils/config-utils';
import { registerTsProject } from '@nx/js/src/internal';
import { loadConfigFile } from '@nx/devkit/src/utils/config-utils';

export function resolveUserDefinedRspackConfig(
export async function resolveUserDefinedRspackConfig(
path: string,
tsConfig: string,
/** Skip require cache and return latest content */
reload = false
) {
if (reload) {
// Clear cache if the path is in the cache
if (require.cache[path]) {
// Clear all entries because config may import other modules
clearRequireCache();
}
}

// Don't transpile non-TS files. This prevents workspaces libs from being registered via tsconfig-paths.
// There's an issue here with Nx workspace where loading plugins from source (via tsconfig-paths) can lead to errors.
if (!/\.(ts|mts|cts)$/.test(path)) {
return require(path);
}

const cleanupTranspiler = registerTsProject(tsConfig);
// eslint-disable-next-line @typescript-eslint/no-var-requires
const maybeCustomRspackConfig = require(path);
cleanupTranspiler();

// If the user provides a configuration in TS file
// then there are 3 cases for exploring an object. The first one is:
// `module.exports = { ... }`. And the second one is:
// `export default { ... }`. The ESM format is compiled into:
// `{ default: { ... } }`
// There is also a case of
// `{ default: { default: { ... } }`
const customRspackConfig =
'default' in maybeCustomRspackConfig
? 'default' in maybeCustomRspackConfig.default
? maybeCustomRspackConfig.default.default
: maybeCustomRspackConfig.default
: maybeCustomRspackConfig;

return customRspackConfig;
return await loadConfigFile(path);
}

0 comments on commit 7d864c8

Please sign in to comment.