74 lines
2.4 KiB
TypeScript
74 lines
2.4 KiB
TypeScript
import { DEFAULT_LOCALE, isLocale, type Locale } from './lib/locale.js';
|
|
|
|
import type { RsbuildConfig, RsbuildPlugin } from '@rsbuild/core';
|
|
|
|
/**
|
|
* Returns a partial Rsbuild config that enables locale-aware builds.
|
|
*
|
|
* The locale MDX replacement is provided as an Rsbuild plugin (rather than a
|
|
* `tools.rspack` function) so that `mergeConfig` can safely concatenate it
|
|
* with the service's own `plugins` array. A `tools.rspack` function would be
|
|
* silently dropped by `mergeConfig` when the service config also defines
|
|
* `tools.rspack` as a plain object.
|
|
*
|
|
* Designed to be merged with defineServiceConfig() in each service's rsbuild.config.ts:
|
|
*
|
|
* @example
|
|
* ```ts
|
|
* import { localeRsbuildConfig } from '@ermnvldmr/i18n/dev';
|
|
* import { defineServiceConfig, mergeConfig } from '@ermnvldmr/rsbuild-config/dev';
|
|
*
|
|
* export default defineServiceConfig(mergeConfig(localeRsbuildConfig(), { ... }));
|
|
* ```
|
|
*/
|
|
export function localeRsbuildConfig(): RsbuildConfig {
|
|
const rawLocale = process.env.LOCALE ?? '';
|
|
const locale: Locale = isLocale(rawLocale) ? rawLocale : DEFAULT_LOCALE;
|
|
|
|
const localePlugins: RsbuildPlugin[] = [];
|
|
|
|
if (locale !== DEFAULT_LOCALE) {
|
|
localePlugins.push({
|
|
name: 'ermnvldmr:locale-mdx-replacement',
|
|
setup(api) {
|
|
// Resolve .en.mdx imports to the locale-specific file when LOCALE != 'en'.
|
|
// The canonical import is always `.en.mdx`; other locales are resolved here.
|
|
api.modifyRspackConfig((config, { rspack }) => {
|
|
config.plugins = [
|
|
...config.plugins,
|
|
new rspack.NormalModuleReplacementPlugin(
|
|
/\.en\.mdx$/,
|
|
(resource: { request: string }) => {
|
|
resource.request = resource.request.replace(/\.en\.mdx$/, `.${locale}.mdx`);
|
|
}
|
|
),
|
|
];
|
|
return config;
|
|
});
|
|
},
|
|
});
|
|
}
|
|
|
|
return {
|
|
source: {
|
|
define: {
|
|
'process.env.LOCALE': JSON.stringify(locale),
|
|
},
|
|
},
|
|
server: {
|
|
// Dev server serves pages under the locale base so localePath() links
|
|
// resolve correctly in dev without any NODE_ENV branching.
|
|
base: `/${locale}`,
|
|
},
|
|
output: {
|
|
distPath: {
|
|
root: `dist/${locale}`,
|
|
},
|
|
assetPrefix: `/${locale}/`,
|
|
},
|
|
plugins: localePlugins,
|
|
};
|
|
}
|
|
|
|
export { LOCALES, DEFAULT_LOCALE, type Locale } from './lib/locale.js';
|