From 488b80a33aa86e448c87855c52f1ce68d2fc0290 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nacho=20Codo=C3=B1er?= Date: Mon, 18 Aug 2025 12:35:35 +0200 Subject: [PATCH] support css as part of the rspack integration --- npm-packages/meteor-rspack/package-lock.json | 4 +- npm-packages/meteor-rspack/package.json | 2 +- .../plugins/CleanBuildAssetsPlugin.js | 53 +++++++++++++++++++ .../plugins/RspackMeteorHtmlPlugin.js | 47 ++++++++++++++++ npm-packages/meteor-rspack/rspack.config.js | 38 +++++++++++-- packages/rspack/lib/constants.js | 2 +- 6 files changed, 139 insertions(+), 7 deletions(-) create mode 100644 npm-packages/meteor-rspack/plugins/CleanBuildAssetsPlugin.js create mode 100644 npm-packages/meteor-rspack/plugins/RspackMeteorHtmlPlugin.js diff --git a/npm-packages/meteor-rspack/package-lock.json b/npm-packages/meteor-rspack/package-lock.json index e764ca30e3..bfabbf98c1 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.17", + "version": "0.0.18", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@meteorjs/rspack", - "version": "0.0.17", + "version": "0.0.18", "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 eb35105d2f..340528917b 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.17", + "version": "0.0.18", "description": "Configuration logic for using Rspack in Meteor projects", "main": "index.js", "type": "module", diff --git a/npm-packages/meteor-rspack/plugins/CleanBuildAssetsPlugin.js b/npm-packages/meteor-rspack/plugins/CleanBuildAssetsPlugin.js new file mode 100644 index 0000000000..0e285541a3 --- /dev/null +++ b/npm-packages/meteor-rspack/plugins/CleanBuildAssetsPlugin.js @@ -0,0 +1,53 @@ +import fs from 'fs/promises'; +import path from 'path'; + +/** + * Rspack plugin to clean and recreate build directories + * before each compilation. + * + * Options: + * - targets {string[]} : Directories to clean. + * Defaults: + * - public/_build-assets + * - public/_build-bundles + * - private/_build-assets + * - verbose {boolean} : If true, logs cleaning operations. Default: false + */ +export default class CleanBuildAssetsPlugin { + constructor(options = {}) { + const defaults = [ + 'public/_build-assets', + 'public/_build-bundles', + 'private/_build-assets', + ]; + + this.targets = Array.isArray(options.targets) + ? options.targets + : defaults; + + this.verbose = options.verbose || false; + } + + apply(compiler) { + compiler.hooks.beforeCompile.tapPromise( + 'CleanBuildAssetsPlugin', + async () => { + for (const target of this.targets) { + const dir = path.resolve(compiler.context, target); + try { + await fs.rm(dir, { recursive: true, force: true }); + await fs.mkdir(dir, { recursive: true }); + if (this.verbose) { + console.log(`[CleanBuildAssetsPlugin] Cleaned: ${dir}`); + } + } catch (err) { + console.warn( + `[CleanBuildAssetsPlugin] Failed to clean ${dir}:`, + err.message + ); + } + } + } + ) + } +} diff --git a/npm-packages/meteor-rspack/plugins/RspackMeteorHtmlPlugin.js b/npm-packages/meteor-rspack/plugins/RspackMeteorHtmlPlugin.js new file mode 100644 index 0000000000..cf0764b6b7 --- /dev/null +++ b/npm-packages/meteor-rspack/plugins/RspackMeteorHtmlPlugin.js @@ -0,0 +1,47 @@ +import path from 'node:path'; +import { createRequire } from 'node:module'; + +function loadHtmlRspackPluginFromHost(compiler) { + // Prefer the compiler's context; fall back to process.cwd() + const ctx = compiler.options?.context || compiler.context || process.cwd(); + const requireFromHost = createRequire(path.join(ctx, 'package.json')); + + const core = requireFromHost('@rspack/core'); // host's instance + // Rspack exports can be shaped a couple ways; be defensive + return core.HtmlRspackPlugin || core.rspack?.HtmlRspackPlugin || core.default?.HtmlRspackPlugin; +} + +/** + * Rspack plugin to: + * 1. Remove the injected `client-rspack.js` script tag + * 2. Strip and … wrappers from the final HTML + */ +export default class RspackMeteorHtmlPlugin { + apply(compiler) { + const HtmlRspackPlugin = loadHtmlRspackPluginFromHost(compiler); + if (!HtmlRspackPlugin?.getCompilationHooks) { + throw new Error('Could not load HtmlRspackPlugin from host project.'); + } + + compiler.hooks.compilation.tap('RspackMeteorHtmlPlugin', compilation => { + const hooks = HtmlRspackPlugin.getCompilationHooks(compilation); + + // remove