diff --git a/npm-packages/meteor-rspack/lib/mergeRulesSplitOverlap.js b/npm-packages/meteor-rspack/lib/mergeRulesSplitOverlap.js index 2b8e946939..5fd2e03dfb 100644 --- a/npm-packages/meteor-rspack/lib/mergeRulesSplitOverlap.js +++ b/npm-packages/meteor-rspack/lib/mergeRulesSplitOverlap.js @@ -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( diff --git a/npm-packages/meteor-rspack/package-lock.json b/npm-packages/meteor-rspack/package-lock.json index 4212d497e0..14092166c2 100644 --- a/npm-packages/meteor-rspack/package-lock.json +++ b/npm-packages/meteor-rspack/package-lock.json @@ -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", diff --git a/npm-packages/meteor-rspack/package.json b/npm-packages/meteor-rspack/package.json index ae82b79cbe..5aaf6296b3 100644 --- a/npm-packages/meteor-rspack/package.json +++ b/npm-packages/meteor-rspack/package.json @@ -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", diff --git a/npm-packages/meteor-rspack/rspack.config.js b/npm-packages/meteor-rspack/rspack.config.js index 6353ea1c74..e8934cec5c 100644 --- a/npm-packages/meteor-rspack/rspack.config.js +++ b/npm-packages/meteor-rspack/rspack.config.js @@ -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, diff --git a/packages/babel-compiler/babel-compiler.js b/packages/babel-compiler/babel-compiler.js index 860061818a..2cf561970d 100644 --- a/packages/babel-compiler/babel-compiler.js +++ b/packages/babel-compiler/babel-compiler.js @@ -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, diff --git a/packages/rspack/lib/constants.js b/packages/rspack/lib/constants.js index be6612be89..7d63269724 100644 --- a/packages/rspack/lib/constants.js +++ b/packages/rspack/lib/constants.js @@ -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'; diff --git a/tools/modern-tests/apps/react-router/rspack.config.js b/tools/modern-tests/apps/react-router/rspack.config.js index 330dc69908..cd2548629d 100644 --- a/tools/modern-tests/apps/react-router/rspack.config.js +++ b/tools/modern-tests/apps/react-router/rspack.config.js @@ -17,6 +17,7 @@ export default defineConfig(Meteor => { '@helper/alias': '/imports/helpers/alias.js', '@react/alias': '/node_modules/react', }, + extensions: ['.jsx'], }, module: { rules: [ diff --git a/tools/modern-tests/apps/react-router/server/main.js b/tools/modern-tests/apps/react-router/server/main.js index 6beb7c30b7..cdb3e6ccfd 100644 --- a/tools/modern-tests/apps/react-router/server/main.js +++ b/tools/modern-tests/apps/react-router/server/main.js @@ -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); diff --git a/tools/modern-tests/apps/react-router/server/resolve-extensions/first.jsx b/tools/modern-tests/apps/react-router/server/resolve-extensions/first.jsx new file mode 100644 index 0000000000..f4a34cd479 --- /dev/null +++ b/tools/modern-tests/apps/react-router/server/resolve-extensions/first.jsx @@ -0,0 +1 @@ +console.log('first.jsx loaded'); diff --git a/tools/modern-tests/apps/react-router/server/resolve-extensions/first.tsx b/tools/modern-tests/apps/react-router/server/resolve-extensions/first.tsx new file mode 100644 index 0000000000..fafcfe4cf4 --- /dev/null +++ b/tools/modern-tests/apps/react-router/server/resolve-extensions/first.tsx @@ -0,0 +1 @@ +console.log('first.tsx loaded'); diff --git a/tools/modern-tests/apps/vue/package.json b/tools/modern-tests/apps/vue/package.json index 8bc5421981..1d34694d27 100644 --- a/tools/modern-tests/apps/vue/package.json +++ b/tools/modern-tests/apps/vue/package.json @@ -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", diff --git a/tools/modern-tests/react-router.test.js b/tools/modern-tests/react-router.test.js index 47c42fcf08..0c811ae9a0 100644 --- a/tools/modern-tests/react-router.test.js +++ b/tools/modern-tests/react-router.test.js @@ -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 diff --git a/tools/static-assets/skel-apollo/package.json b/tools/static-assets/skel-apollo/package.json index 8b34c505a0..c3f8a702f3 100644 --- a/tools/static-assets/skel-apollo/package.json +++ b/tools/static-assets/skel-apollo/package.json @@ -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", diff --git a/tools/static-assets/skel-blaze/package.json b/tools/static-assets/skel-blaze/package.json index 7ea28f6ab9..ae64482e78 100644 --- a/tools/static-assets/skel-blaze/package.json +++ b/tools/static-assets/skel-blaze/package.json @@ -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", diff --git a/tools/static-assets/skel-chakra-ui/package.json b/tools/static-assets/skel-chakra-ui/package.json index d0fd93c897..d1b00f4b37 100644 --- a/tools/static-assets/skel-chakra-ui/package.json +++ b/tools/static-assets/skel-chakra-ui/package.json @@ -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", diff --git a/tools/static-assets/skel-full/package.json b/tools/static-assets/skel-full/package.json index 99b2e31efa..52bc60066d 100644 --- a/tools/static-assets/skel-full/package.json +++ b/tools/static-assets/skel-full/package.json @@ -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", diff --git a/tools/static-assets/skel-react/package.json b/tools/static-assets/skel-react/package.json index faa5d657c6..806556ff16 100644 --- a/tools/static-assets/skel-react/package.json +++ b/tools/static-assets/skel-react/package.json @@ -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", diff --git a/tools/static-assets/skel-solid/package.json b/tools/static-assets/skel-solid/package.json index a71f81a14d..0ecd1f51ef 100644 --- a/tools/static-assets/skel-solid/package.json +++ b/tools/static-assets/skel-solid/package.json @@ -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", diff --git a/tools/static-assets/skel-svelte/package.json b/tools/static-assets/skel-svelte/package.json index ac079c09c7..2f38169f3e 100644 --- a/tools/static-assets/skel-svelte/package.json +++ b/tools/static-assets/skel-svelte/package.json @@ -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", diff --git a/tools/static-assets/skel-tailwind/package.json b/tools/static-assets/skel-tailwind/package.json index 10b1b30628..2df7afc9c1 100644 --- a/tools/static-assets/skel-tailwind/package.json +++ b/tools/static-assets/skel-tailwind/package.json @@ -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", diff --git a/tools/static-assets/skel-typescript/package.json b/tools/static-assets/skel-typescript/package.json index b765302749..2a2542758f 100644 --- a/tools/static-assets/skel-typescript/package.json +++ b/tools/static-assets/skel-typescript/package.json @@ -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", diff --git a/tools/static-assets/skel-vue/package.json b/tools/static-assets/skel-vue/package.json index b1a8dd36ad..dccb833cd5 100644 --- a/tools/static-assets/skel-vue/package.json +++ b/tools/static-assets/skel-vue/package.json @@ -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",