Merge branch 'modern-bundler-integration' into release-3.4

This commit is contained in:
Nacho Codoñer
2025-09-04 15:21:50 +02:00
22 changed files with 49 additions and 28 deletions

View File

@@ -267,6 +267,14 @@ export function mergeSplitOverlap(...configs) {
return splitOverlapRulesMerge(aRules, bRules);
}
// Ensure custom extensions first
if (key === 'resolve.extensions') {
const aRules = Array.isArray(a) ? a : [];
const bRules = Array.isArray(b) ? b : [];
const merged = [...bRules, ...aRules];
return [...new Set(merged)];
}
// Handle plugins uniqueness
if (key === 'plugins') {
return unique(

View File

@@ -1,12 +1,12 @@
{
"name": "@meteorjs/rspack",
"version": "0.0.36",
"version": "0.0.40",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@meteorjs/rspack",
"version": "0.0.36",
"version": "0.0.40",
"license": "ISC",
"dependencies": {
"ignore-loader": "^0.1.2",

View File

@@ -1,6 +1,6 @@
{
"name": "@meteorjs/rspack",
"version": "0.0.36",
"version": "0.0.40",
"description": "Configuration logic for using Rspack in Meteor projects",
"main": "index.js",
"type": "module",

View File

@@ -118,7 +118,9 @@ export default function (inMeteor = {}, argv = {}) {
const isDev = !!Meteor.isDevelopment || !isProd;
const isTest = !!Meteor.isTest;
const isClient = !!Meteor.isClient;
const isServer = !!Meteor.isServer;
const isRun = !!Meteor.isRun;
const isBuild = !!Meteor.isBuild;
const isReactEnabled = !!Meteor.isReactEnabled;
const isTestModule = !!Meteor.isTestModule;
const isTestEager = !!Meteor.isTestEager;
@@ -203,12 +205,13 @@ export default function (inMeteor = {}, argv = {}) {
console.log('[i] Meteor flags:', Meteor);
}
const enableSwcExternalHelpers = !isServer && swcExternalHelpers;
const isDevEnvironment = isRun && isDev && !isTest && !isNative;
const swcConfigRule = createSwcConfig({
isTypescriptEnabled,
isJsxEnabled,
isTsxEnabled,
externalHelpers: swcExternalHelpers,
externalHelpers: enableSwcExternalHelpers,
isDevEnvironment,
});
// Expose swc config to use in custom configs
@@ -248,7 +251,7 @@ export default function (inMeteor = {}, argv = {}) {
lastImports: [`./${outputFilename}`],
}),
}),
enableGlobalPolyfill: isDevEnvironment,
enableGlobalPolyfill: isDevEnvironment && !isServer,
});
const rsdoctorModule = isBundleVisualizerEnabled
@@ -261,6 +264,14 @@ export default function (inMeteor = {}, argv = {}) {
}),
]
: [];
const bannerPluginConfig = !isBuild
? [
new BannerPlugin({
banner: bannerOutput,
entryOnly: true,
}),
]
: [];
const clientNameConfig = `[${(isTest && 'test-') || ''}${
(isTestModule && 'module') || 'client'
@@ -269,7 +280,7 @@ export default function (inMeteor = {}, argv = {}) {
let clientConfig = {
name: clientNameConfig,
target: 'web',
mode: 'development',
mode,
entry: path.resolve(process.cwd(), buildContext, entryPath),
output: {
path: clientOutputDir,
@@ -322,10 +333,7 @@ export default function (inMeteor = {}, argv = {}) {
'Meteor.isDevelopment': JSON.stringify(isDev),
'Meteor.isProduction': JSON.stringify(isProd),
}),
new BannerPlugin({
banner: bannerOutput,
entryOnly: true,
}),
...bannerPluginConfig,
Meteor.HtmlRspackPlugin(),
...doctorPluginConfig,
],
@@ -404,11 +412,8 @@ export default function (inMeteor = {}, argv = {}) {
'Meteor.isProduction': JSON.stringify(isProd),
},
),
new BannerPlugin({
banner: bannerOutput,
entryOnly: true,
}),
isTestModule && requireExternalsPlugin,
...bannerPluginConfig,
requireExternalsPlugin,
...doctorPluginConfig,
],
watchOptions,

View File

@@ -281,7 +281,8 @@ BCp.processOneFileForTarget = function (inputFile, source) {
const features = Object.assign({}, this.extraFeatures);
const arch = inputFile.getArch();
if (arch.startsWith("os.")) {
const isNodeTarget = arch.startsWith("os.");
if (isNodeTarget) {
// Start with a much simpler set of Babel presets and plugins if
// we're compiling for Node 8.
features.nodeMajorVersion = parseInt(process.versions.node, 10);
@@ -355,6 +356,7 @@ BCp.processOneFileForTarget = function (inputFile, source) {
tsx: hasTSXSupport,
},
...(hasSwcHelpersAvailable &&
!isNodeTarget &&
(packageName == null ||
!['modules-runtime'].includes(packageName)) && {
externalHelpers: true,

View File

@@ -5,7 +5,7 @@
export const DEFAULT_RSPACK_VERSION = '1.5.0';
export const DEFAULT_METEOR_RSPACK_VERSION = '0.0.36';
export const DEFAULT_METEOR_RSPACK_VERSION = '0.0.40';
export const DEFAULT_METEOR_RSPACK_REACT_HMR_VERSION = '1.4.3';

View File

@@ -17,6 +17,7 @@ export default defineConfig(Meteor => {
'@helper/alias': '/imports/helpers/alias.js',
'@react/alias': '/node_modules/react',
},
extensions: ['.jsx'],
},
module: {
rules: [

View File

@@ -4,6 +4,7 @@ import { LinksCollection } from '/imports/api/links';
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
import '@helper/alias';
import ReactAlias from '@react/alias';
import './resolve-extensions/first';
console.log('@react/alias loaded', ReactAlias.version);

View File

@@ -0,0 +1 @@
console.log('first.jsx loaded');

View File

@@ -0,0 +1 @@
console.log('first.tsx loaded');

View File

@@ -17,7 +17,7 @@
"vue-router": "^4.2.5"
},
"devDependencies": {
"@meteorjs/rspack": "^0.0.36",
"@meteorjs/rspack": "^0.0.40",
"@rspack/cli": "^1.4.8",
"@rspack/core": "^1.4.8",
"@tailwindcss/postcss": "^4.1.12",

View File

@@ -35,6 +35,8 @@ describe('ReactRouter App Bundling /', () => {
await waitForMeteorOutput(result.outputLines, /.*default-package loaded.*/);
// custom-package loading
await waitForMeteorOutput(result.outputLines, /.*custom-package loaded.*/);
// resolve.extensions loading
await waitForMeteorOutput(result.outputLines, /.*first\.jsx loaded.*/);
},
afterRunRebuildClient: async ({ allConsoleLogs }) => {
// Check for HMR output as enabled by default

View File

@@ -20,7 +20,7 @@
"devDependencies": {
"@graphql-tools/webpack-loader": "^7.0.0",
"@rsdoctor/rspack-plugin": "^1.2.3",
"@meteorjs/rspack": "^0.0.36",
"@meteorjs/rspack": "^0.0.40",
"@rspack/cli": "^1.5.0",
"@rspack/core": "^1.5.0",
"@rspack/plugin-react-refresh": "^1.4.3",

View File

@@ -14,7 +14,7 @@
"meteor-node-stubs": "^1.2.12"
},
"devDependencies": {
"@meteorjs/rspack": "^0.0.36",
"@meteorjs/rspack": "^0.0.40",
"@rsdoctor/rspack-plugin": "^1.2.3",
"@rspack/cli": "^1.5.0",
"@rspack/core": "^1.5.0",

View File

@@ -21,7 +21,7 @@
"react-dom": "^18.2.0"
},
"devDependencies": {
"@meteorjs/rspack": "^0.0.36",
"@meteorjs/rspack": "^0.0.40",
"@rsdoctor/rspack-plugin": "^1.2.3",
"@rspack/cli": "^1.5.0",
"@rspack/core": "^1.5.0",

View File

@@ -12,7 +12,7 @@
"meteor-node-stubs": "^1.2.12"
},
"devDependencies": {
"@meteorjs/rspack": "^0.0.36",
"@meteorjs/rspack": "^0.0.40",
"@rsdoctor/rspack-plugin": "^1.2.3",
"@rspack/cli": "^1.5.0",
"@rspack/core": "^1.5.0",

View File

@@ -15,7 +15,7 @@
"react-dom": "^18.2.0"
},
"devDependencies": {
"@meteorjs/rspack": "^0.0.36",
"@meteorjs/rspack": "^0.0.40",
"@rsdoctor/rspack-plugin": "^1.2.3",
"@rspack/cli": "^1.5.0",
"@rspack/core": "^1.5.0",

View File

@@ -14,7 +14,7 @@
"picocolors": "^1.1.1"
},
"devDependencies": {
"@meteorjs/rspack": "^0.0.36",
"@meteorjs/rspack": "^0.0.40",
"@rsdoctor/rspack-plugin": "^1.2.3",
"@rspack/cli": "^1.5.0",
"@rspack/core": "^1.5.0",

View File

@@ -13,7 +13,7 @@
"meteor-node-stubs": "^1.2.12"
},
"devDependencies": {
"@meteorjs/rspack": "^0.0.36",
"@meteorjs/rspack": "^0.0.40",
"@rsdoctor/rspack-plugin": "^1.2.3",
"@rspack/cli": "^1.5.0",
"@rspack/core": "^1.5.0",

View File

@@ -16,7 +16,7 @@
"react-dom": "^17.0.2"
},
"devDependencies": {
"@meteorjs/rspack": "^0.0.36",
"@meteorjs/rspack": "^0.0.40",
"@rsdoctor/rspack-plugin": "^1.2.3",
"@rspack/cli": "^1.5.0",
"@rspack/core": "^1.5.0",

View File

@@ -15,7 +15,7 @@
"react-dom": "^18.2.0"
},
"devDependencies": {
"@meteorjs/rspack": "^0.0.36",
"@meteorjs/rspack": "^0.0.40",
"@rsdoctor/rspack-plugin": "^1.2.3",
"@rspack/cli": "^1.5.0",
"@rspack/core": "^1.5.0",

View File

@@ -17,7 +17,7 @@
"vue-router": "^4.2.5"
},
"devDependencies": {
"@meteorjs/rspack": "^0.0.36",
"@meteorjs/rspack": "^0.0.40",
"@rsdoctor/rspack-plugin": "^1.2.3",
"@rspack/cli": "^1.5.0",
"@rspack/core": "^1.5.0",