@@ -4,6 +4,7 @@ import { createRequire } from 'node:module'
44import path from 'node:path'
55import { pathToFileURL } from 'node:url'
66import { createDebug } from '@hiogawa/utils'
7+ import { exactRegex , prefixRegex } from '@rolldown/pluginutils'
78import * as esModuleLexer from 'es-module-lexer'
89import MagicString from 'magic-string'
910import { toNodeHandler } from 'srvx/node'
@@ -326,6 +327,7 @@ export function vitePluginRscMinimal(
326327 name : 'rsc:vite-client-raw-import' ,
327328 transform : {
328329 order : 'post' ,
330+ filter : { code : '__vite_rsc_raw_import__' } ,
329331 handler ( code ) {
330332 if ( code . includes ( '__vite_rsc_raw_import__' ) ) {
331333 // inject dynamic import last to avoid Vite adding `?import` query
@@ -343,6 +345,7 @@ export function vitePluginRscMinimal(
343345 name : 'rsc:reference-validation' ,
344346 apply : 'serve' ,
345347 load : {
348+ filter : { id : prefixRegex ( '\0virtual:vite-rsc/reference-validation?' ) } ,
346349 handler ( id , _options ) {
347350 if ( id . startsWith ( '\0virtual:vite-rsc/reference-validation?' ) ) {
348351 const parsed = parseReferenceValidationVirtual ( id )
@@ -824,6 +827,7 @@ export default function vitePluginRsc(
824827 name : 'rsc:react-server-dom-webpack-alias' ,
825828 resolveId : {
826829 order : 'pre' ,
830+ filter : { id : prefixRegex ( `${ PKG_NAME } /vendor/react-server-dom/` ) } ,
827831 async handler ( source , importer , options ) {
828832 if (
829833 hasReactServerDomWebpack &&
@@ -848,6 +852,7 @@ export default function vitePluginRsc(
848852 // - (build) rewriting to external `import("../<env>/<entry>.js")`
849853 name : 'rsc:load-environment-module' ,
850854 transform : {
855+ filter : { code : 'import.meta.viteRsc.loadModule' } ,
851856 async handler ( code ) {
852857 if ( ! code . includes ( 'import.meta.viteRsc.loadModule' ) ) return
853858 const { server } = manager
@@ -996,13 +1001,15 @@ export default function vitePluginRsc(
9961001 {
9971002 name : 'rsc:virtual:vite-rsc/rpc-client' ,
9981003 resolveId : {
1004+ filter : { id : exactRegex ( 'virtual:vite-rsc/rpc-client' ) } ,
9991005 handler ( source ) {
10001006 if ( source === 'virtual:vite-rsc/rpc-client' ) {
10011007 return `\0${ source } `
10021008 }
10031009 } ,
10041010 } ,
10051011 load : {
1012+ filter : { id : exactRegex ( '\0virtual:vite-rsc/rpc-client' ) } ,
10061013 handler ( id ) {
10071014 if ( id === '\0virtual:vite-rsc/rpc-client' ) {
10081015 const { server } = manager
@@ -1026,6 +1033,7 @@ export function createRpcClient(params) {
10261033 {
10271034 name : 'rsc:virtual:vite-rsc/assets-manifest' ,
10281035 resolveId : {
1036+ filter : { id : exactRegex ( 'virtual:vite-rsc/assets-manifest' ) } ,
10291037 handler ( source ) {
10301038 if ( source === 'virtual:vite-rsc/assets-manifest' ) {
10311039 if ( this . environment . mode === 'build' ) {
@@ -1036,6 +1044,7 @@ export function createRpcClient(params) {
10361044 } ,
10371045 } ,
10381046 load : {
1047+ filter : { id : exactRegex ( '\0virtual:vite-rsc/assets-manifest' ) } ,
10391048 handler ( id ) {
10401049 if ( id === '\0virtual:vite-rsc/assets-manifest' ) {
10411050 assert ( this . environment . name !== 'client' )
@@ -1168,6 +1177,7 @@ export default assetsManifest.bootstrapScriptContent;
11681177 {
11691178 name : 'rsc:bootstrap-script-content' ,
11701179 transform : {
1180+ filter : { code : 'loadBootstrapScriptContent' } ,
11711181 async handler ( code ) {
11721182 if (
11731183 ! code . includes ( 'loadBootstrapScriptContent' ) ||
@@ -1287,6 +1297,7 @@ function globalAsyncLocalStoragePlugin(): Plugin[] {
12871297 {
12881298 name : 'rsc:inject-async-local-storage' ,
12891299 transform : {
1300+ filter : { code : 'typeof AsyncLocalStorage' } ,
12901301 handler ( code ) {
12911302 if (
12921303 ( this . environment . name === 'ssr' ||
@@ -1350,6 +1361,10 @@ function vitePluginUseClient(
13501361 {
13511362 name : 'rsc:use-client' ,
13521363 transform : {
1364+ // TODO: cannot use filter because handler has cleanup side effect
1365+ // (`delete manager.clientReferenceMetaMap[id]`) that must run
1366+ // even when directive is removed (HMR case)
1367+ // filter: { code: 'use client' },
13531368 async handler ( code , id ) {
13541369 if ( this . environment . name !== serverEnvironmentName ) return
13551370 if ( ! code . includes ( 'use client' ) ) {
@@ -1456,13 +1471,15 @@ function vitePluginUseClient(
14561471 {
14571472 name : 'rsc:use-client/build-references' ,
14581473 resolveId : {
1474+ filter : { id : prefixRegex ( 'virtual:vite-rsc/client-references' ) } ,
14591475 handler ( source ) {
14601476 if ( source . startsWith ( 'virtual:vite-rsc/client-references' ) ) {
14611477 return '\0' + source
14621478 }
14631479 } ,
14641480 } ,
14651481 load : {
1482+ filter : { id : prefixRegex ( '\0virtual:vite-rsc/client-references' ) } ,
14661483 handler ( id ) {
14671484 if ( id === '\0virtual:vite-rsc/client-references' ) {
14681485 // not used during dev
@@ -1543,6 +1560,9 @@ function vitePluginUseClient(
15431560 {
15441561 name : 'rsc:virtual-client-in-server-package' ,
15451562 load : {
1563+ filter : {
1564+ id : prefixRegex ( '\0virtual:vite-rsc/client-in-server-package-proxy/' ) ,
1565+ } ,
15461566 async handler ( id ) {
15471567 if (
15481568 id . startsWith ( '\0virtual:vite-rsc/client-in-server-package-proxy/' )
@@ -1583,6 +1603,7 @@ function vitePluginUseClient(
15831603 } ,
15841604 } ,
15851605 load : {
1606+ filter : { id : prefixRegex ( '\0virtual:vite-rsc/client-package-proxy/' ) } ,
15861607 async handler ( id ) {
15871608 if ( id . startsWith ( '\0virtual:vite-rsc/client-package-proxy/' ) ) {
15881609 assert ( this . environment . mode === 'dev' )
@@ -1764,6 +1785,7 @@ function vitePluginDefineEncryptionKey(
17641785 }
17651786 } ,
17661787 resolveId : {
1788+ filter : { id : exactRegex ( 'virtual:vite-rsc/encryption-key' ) } ,
17671789 handler ( source ) {
17681790 if ( source === 'virtual:vite-rsc/encryption-key' ) {
17691791 // encryption logic can be tree-shaken if action bind is not used.
@@ -1772,6 +1794,7 @@ function vitePluginDefineEncryptionKey(
17721794 } ,
17731795 } ,
17741796 load : {
1797+ filter : { id : exactRegex ( '\0virtual:vite-rsc/encryption-key' ) } ,
17751798 handler ( id ) {
17761799 if ( id === '\0virtual:vite-rsc/encryption-key' ) {
17771800 if ( this . environment . mode === 'build' ) {
@@ -1828,6 +1851,10 @@ function vitePluginUseServer(
18281851 {
18291852 name : 'rsc:use-server' ,
18301853 transform : {
1854+ // TODO: cannot use filter because handler has cleanup side effect
1855+ // (`delete manager.serverReferenceMetaMap[id]`) that must run
1856+ // even when directive is removed (HMR case)
1857+ // filter: { code: 'use server' },
18311858 async handler ( code , id ) {
18321859 if ( ! code . includes ( 'use server' ) ) {
18331860 delete manager . serverReferenceMetaMap [ id ]
@@ -2240,6 +2267,8 @@ function vitePluginRscCss(
22402267 {
22412268 name : 'rsc:rsc-css-export-transform' ,
22422269 transform : {
2270+ // TODO:
2271+ // filter: {},
22432272 async handler ( code , id ) {
22442273 if ( this . environment . name !== 'rsc' ) return
22452274 const filter = getRscCssTransformFilter ( { id, code } )
@@ -2267,6 +2296,9 @@ function vitePluginRscCss(
22672296 apply : 'serve' ,
22682297 transform : {
22692298 order : 'post' ,
2299+ filter : {
2300+ id : / \. ( c s s | l e s s | s a s s | s c s s | s t y l | s t y l u s | p c s s | p o s t c s s | s s s ) ( \? | $ ) / ,
2301+ } ,
22702302 handler ( _code , id , _options ) {
22712303 if (
22722304 this . environment . name === 'client' &&
@@ -2285,13 +2317,15 @@ function vitePluginRscCss(
22852317 {
22862318 name : 'rsc:css-virtual' ,
22872319 resolveId : {
2320+ filter : { id : prefixRegex ( 'virtual:vite-rsc/css?' ) } ,
22882321 handler ( source ) {
22892322 if ( source . startsWith ( 'virtual:vite-rsc/css?' ) ) {
22902323 return '\0' + source
22912324 }
22922325 } ,
22932326 } ,
22942327 load : {
2328+ filter : { id : prefixRegex ( '\0virtual:vite-rsc/css?' ) } ,
22952329 async handler ( id ) {
22962330 const parsed = parseCssVirtual ( id )
22972331 if ( parsed ?. type === 'ssr' ) {
@@ -2334,6 +2368,7 @@ function vitePluginRscCss(
23342368 }
23352369 } ,
23362370 transform : {
2371+ filter : { code : 'import.meta.viteRsc.loadCss' } ,
23372372 async handler ( code , id ) {
23382373 if ( ! code . includes ( 'import.meta.viteRsc.loadCss' ) ) return
23392374
@@ -2401,6 +2436,7 @@ function vitePluginRscCss(
24012436 } ,
24022437 } ,
24032438 load : {
2439+ filter : { id : prefixRegex ( '\0virtual:vite-rsc/css?' ) } ,
24042440 handler ( id ) {
24052441 const { server } = manager
24062442 const parsed = parseCssVirtual ( id )
0 commit comments