Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/rspack-config/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ const getConfig: GetConfig = async (options) => {
module: {
rules: [
{
test: /\.(jsx?|tsx?|mjs)$/,
test: /\.(jsx?|tsx?|mjs|cjs)$/,
...(excludeRule ? { exclude: new RegExp(excludeRule) } : {}),
use: {
loader: 'builtin:compilation-loader',
Expand Down
2 changes: 1 addition & 1 deletion packages/shared-config/src/unPlugins/compilation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ const compilationPlugin = (options: Options): UnpluginOptions => {
return /(.*)src\/app.(ts|tsx|js|jsx)/.test(id);
}

const extensionRegex = /\.(jsx?|tsx?|mjs)$/;
const extensionRegex = /\.(jsx?|tsx?|mjs|cjs)$/;
return {
name: 'compilation-plugin',
transformInclude(id) {
Expand Down
58 changes: 58 additions & 0 deletions packages/shared-config/tests/compileDependencies.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import * as path from 'path';
import { fileURLToPath } from 'url';
import { expect, describe, it } from 'vitest';
import compilationPlugin from '../src/unPlugins/compilation';
import compileExcludes from '../src/compileExcludes';

const __dirname = path.dirname(fileURLToPath(import.meta.url));

/** Bundler-style ids use forward slashes; match compileDependencies RegExp sources. */
const toPosix = (p: string) => p.split(path.sep).join('/');

/**
* Mirrors compileDependencies -> compileIncludes for a single package name
* (non-speed-up mode), so dependency paths under node_modules match.
*/
const compileIncludesForPkg = (pkg: string) => [new RegExp(`node_modules/?.+${pkg}/`)];

describe('compileDependencies (compilation transformInclude)', () => {
const rootDir = path.join(__dirname, '..');

const createPlugin = (compileIncludes: (string | RegExp)[]) =>
compilationPlugin({
rootDir,
mode: 'production',
fastRefresh: false,
compileIncludes,
compileExcludes,
enableEnv: true,
});

it('includes .cjs files from a dependency matched by compileIncludes in the transpile pipeline', () => {
const { transformInclude, transform } = createPlugin(compileIncludesForPkg('animejs'));
const id = toPosix(path.join(rootDir, 'node_modules', 'animejs', 'dist', 'modules', 'index.cjs'));

expect(transformInclude!(id)).toBe(true);

const src = 'const o = null;\nconst z = o?.x;\nexport { z };\n';
return expect(transform!.call({}, src, id)).resolves.toMatchObject({
code: expect.any(String),
});
});

it('still includes .mjs, .js, .jsx, .ts, and .tsx for matched dependencies', () => {
const { transformInclude } = createPlugin(compileIncludesForPkg('animejs'));
const base = toPosix(path.join(rootDir, 'node_modules', 'animejs', 'dist', 'modules', 'index'));
expect(transformInclude!(`${base}.mjs`)).toBe(true);
expect(transformInclude!(`${base}.js`)).toBe(true);
expect(transformInclude!(`${base}.jsx`)).toBe(true);
expect(transformInclude!(`${base}.ts`)).toBe(true);
expect(transformInclude!(`${base}.tsx`)).toBe(true);
});

it('skips .cjs under node_modules when the package is not matched by compileIncludes', () => {
const { transformInclude } = createPlugin(compileIncludesForPkg('animejs'));
const id = toPosix(path.join(rootDir, 'node_modules', 'other-pkg', 'dist', 'index.cjs'));
expect(transformInclude!(id)).toBe(false);
});
});