Evidently rspack can have trouble with Sequelize. Iβve been working for hours with the JetBrains AI agent and it finally found an rspack config that was able to load Sequelize.
const { defineConfig } = require('@meteorjs/rspack');
const rspack = require('@rspack/core');
const path = require('path');
/**
* Rspack configuration for Meteor projects.
*/
module.exports = defineConfig(Meteor => {
const config = {
module: {
rules: [
// Handle .node files as external resources (don't parse as JS)
{
test: /\.node$/,
type: 'asset/resource',
},
// CRITICAL: Block sequelize and database packages on CLIENT only
...(Meteor.isClient ? [
{
test: /node_modules[\\/](sequelize|pg|pg-hstore|pg-native|mysql2|mariadb|sqlite3|tedious|oracledb|ibm_db)/,
use: 'null-loader',
},
{
test: /[\\/]server[\\/]/,
use: 'null-loader',
},
] : []),
],
},
resolve: {
// Exclude optional native addons that should not be bundled
alias: {
kerberos: false,
'kerberos/build/Release/kerberos.node': false,
// CRITICAL: Prevent Sequelize and database packages from being resolved ON CLIENT ONLY
...(Meteor.isClient ? {
'sequelize': false,
'sequelize/lib/sequelize': false,
'sequelize/lib/dialects/postgres/hstore': false,
'pg': false,
'pg-hstore': false,
'pg-native': false,
'mysql2': false,
'mariadb': false,
'sqlite3': false,
'tedious': false,
'oracledb': false,
'ibm_db': false,
} : {}),
},
// Provide polyfills for Node.js built-in modules when building for browser
fallback: Meteor.isClient ? {
buffer: require.resolve('buffer/'),
stream: false,
util: false,
assert: false,
process: false,
fs: false,
path: false,
crypto: false,
net: false,
tls: false,
dns: false,
} : {},
},
// Externalize database packages
externals: [
...(Meteor.isClient ? [
// On CLIENT: block database packages completely
function({ context, request, contextInfo }, callback) {
const dbPackages = [
'pg',
'pg-hstore',
'pg-native',
'sequelize',
'mysql2',
'mariadb',
'sqlite3',
'tedious',
'oracledb',
'ibm_db',
];
for (const pkg of dbPackages) {
if (request === pkg || request.startsWith(pkg + '/')) {
return callback(null, 'var {}');
}
}
// On client builds, externalize server directory imports
if (context) {
const normalizedContext = context.replace(/\\/g, '/');
if (normalizedContext.includes('/imports/startup/server/') ||
normalizedContext.includes('/server/')) {
return callback(null, 'var {}');
}
}
callback();
}
] : [
// On SERVER: externalize database packages so they load from node_modules at runtime
function({ context, request, contextInfo }, callback) {
const dbPackages = [
'pg',
'pg-hstore',
'pg-native',
'pg-pool',
'sequelize',
'mysql2',
'mariadb',
'sqlite3',
'tedious',
'oracledb',
'ibm_db',
];
for (const pkg of dbPackages) {
if (request === pkg || request.startsWith(pkg + '/')) {
return callback(null, 'commonjs ' + request);
}
}
callback();
}
]),
],
externalsType: 'commonjs',
plugins: [
// Provide global Buffer variable for browser (client only)
...(Meteor.isClient ? [
new rspack.ProvidePlugin({
Buffer: ['buffer', 'Buffer'],
process: 'process/browser',
}),
] : []),
// Ignore optional MongoDB dependencies
new rspack.IgnorePlugin({
resourceRegExp: /^(kerberos|@mongodb-js\/zstd|@aws-sdk\/credential-providers|snappy|socks|gcp-metadata|mongodb-client-encryption|bson-ext)$/,
}),
// CRITICAL: Ignore database packages at the module level ON CLIENT ONLY
...(Meteor.isClient ? [
new rspack.IgnorePlugin({
resourceRegExp: /^(sequelize|pg|pg-hstore|pg-native|mysql2|mariadb|sqlite3|tedious|oracledb|ibm_db)$/,
}),
new rspack.IgnorePlugin({
resourceRegExp: /.*/,
contextRegExp: /[\\/]imports[\\/]startup[\\/]server[\\/]/,
}),
new rspack.IgnorePlugin({
resourceRegExp: /.*/,
contextRegExp: /[\\/]server[\\/]/,
}),
new rspack.NormalModuleReplacementPlugin(
/[\\/]imports[\\/]startup[\\/]server[\\/]/,
function(resource) {
resource.request = 'data:text/javascript,export default {}';
}
),
] : []),
],
ignoreWarnings: [
// Suppress warnings
{
module: /.*/,
message: /Can't resolve 'pg-hstore'/,
},
{
module: /.*/,
message: /Can't resolve 'sequelize'/,
},
{
module: /node_modules\/mongodb/,
message: /Can't resolve/,
},
{
module: /node_modules\/mongoose/,
message: /Can't resolve/,
},
{
module: /node_modules\/sequelize/,
message: /.*/,
},
{
module: /node_modules\/sax/,
message: /Can't resolve 'stream'/,
},
{
module: /imports\/startup\/server/,
message: /.*/,
},
{
module: /server\//,
message: /.*/,
},
],
};
return config;
});