diff --git a/.changeset/mixed-url-assets.md b/.changeset/mixed-url-assets.md new file mode 100644 index 0000000..91fffb5 --- /dev/null +++ b/.changeset/mixed-url-assets.md @@ -0,0 +1,5 @@ +--- +'rsbuild-plugin-react-router': patch +--- + +Preserve mixed asset query semantics for `?url&raw` and `?url&inline` requests. diff --git a/src/index.ts b/src/index.ts index 20a51df..b84d7d1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -128,7 +128,8 @@ const ensureFederationAsyncStartup = ( const cssUrlAssetExtensions = /\.(?:css|less|sass|scss|styl|stylus|pcss|postcss|sss)$/; -const urlAssetResourceQuery = /(?:\?|&)url(?:&|$)/; +const urlAssetResourceQuery = + /^(?=.*(?:\?|&)url(?:&|$))(?!.*(?:\?|&)(?:raw|inline)(?:&|$))/; export const pluginReactRouter = ( options: PluginOptions = {} diff --git a/tests/features.test.ts b/tests/features.test.ts index cd0744a..b7e2580 100644 --- a/tests/features.test.ts +++ b/tests/features.test.ts @@ -237,10 +237,31 @@ describe('pluginReactRouter', () => { const config = await rsbuild.unwrapConfig(); const getRules = (name: 'web' | 'node') => config.environments?.[name]?.tools?.rspack?.module?.rules ?? []; - const hasUrlAssetRule = (rule: any) => - rule.resourceQuery?.toString().includes('url') && - rule.exclude?.test('app/styles.css') && - rule.type === 'asset/resource'; + const includedQueries = ['?url', '?url&foo=bar', '?foo=bar&url']; + const excludedQueries = [ + '?raw', + '?inline', + '?url&raw', + '?raw&url', + '?url&inline', + '?inline&url', + ]; + const hasUrlAssetRule = (rule: { + resourceQuery?: RegExp; + exclude?: RegExp; + type?: string; + }) => { + const { resourceQuery, exclude, type } = rule; + return ( + resourceQuery instanceof RegExp && + exclude instanceof RegExp && + resourceQuery.toString().includes('url') && + exclude.test('app/styles.css') && + includedQueries.every(query => resourceQuery.test(query)) && + excludedQueries.every(query => !resourceQuery.test(query)) && + type === 'asset/resource' + ); + }; expect(getRules('web').some(hasUrlAssetRule)).toBe(true); expect(getRules('node').some(hasUrlAssetRule)).toBe(true);