1
1
import assert from 'node:assert'
2
- import { createHash } from 'node:crypto'
3
2
import fs from 'node:fs'
4
3
import { createRequire } from 'node:module'
5
4
import path from 'node:path'
@@ -38,7 +37,16 @@ import {
38
37
prepareError ,
39
38
} from './vite-utils'
40
39
import { cjsModuleRunnerPlugin } from './plugins/cjs'
41
- import { evalValue , parseIdQuery } from './plugins/utils'
40
+ import {
41
+ createVirtualPlugin ,
42
+ evalValue ,
43
+ getEntrySource ,
44
+ hashString ,
45
+ normalizeRelativePath ,
46
+ parseIdQuery ,
47
+ sortObject ,
48
+ withRollupError ,
49
+ } from './plugins/utils'
42
50
import { createDebug } from '@hiogawa/utils'
43
51
import { transformScanBuildStrip } from './plugins/scan'
44
52
import { validateImportPlugin } from './plugins/validate-import'
@@ -86,6 +94,12 @@ class RscPluginManager {
86
94
clientReferenceMetaMap : Record < string , ClientReferenceMeta > = { }
87
95
serverReferenceMetaMap : Record < string , ServerRerferenceMeta > = { }
88
96
serverResourcesMetaMap : Record < string , { key : string } > = { }
97
+
98
+ stabilize ( ) : void {
99
+ // sort for stable build
100
+ this . clientReferenceMetaMap = sortObject ( this . clientReferenceMetaMap )
101
+ this . serverResourcesMetaMap = sortObject ( this . serverResourcesMetaMap )
102
+ }
89
103
}
90
104
91
105
export type RscPluginOptions = {
@@ -225,13 +239,7 @@ export default function vitePluginRsc(
225
239
builder . environments . rsc ! . config . build . write = true
226
240
builder . environments . client ! . config . build . write = true
227
241
await builder . build ( builder . environments . rsc ! )
228
- // sort for stable build
229
- manager . clientReferenceMetaMap = sortObject (
230
- manager . clientReferenceMetaMap ,
231
- )
232
- manager . serverResourcesMetaMap = sortObject (
233
- manager . serverResourcesMetaMap ,
234
- )
242
+ manager . stabilize ( )
235
243
await builder . build ( builder . environments . client ! )
236
244
writeAssetsManifest ( [ 'rsc' ] )
237
245
return
@@ -247,9 +255,7 @@ export default function vitePluginRsc(
247
255
builder . environments . rsc ! . config . build . write = true
248
256
builder . environments . ssr ! . config . build . write = true
249
257
await builder . build ( builder . environments . rsc ! )
250
- // sort for stable build
251
- manager . clientReferenceMetaMap = sortObject ( manager . clientReferenceMetaMap )
252
- manager . serverResourcesMetaMap = sortObject ( manager . serverResourcesMetaMap )
258
+ manager . stabilize ( )
253
259
await builder . build ( builder . environments . client ! )
254
260
await builder . build ( builder . environments . ssr ! )
255
261
writeAssetsManifest ( [ 'ssr' , 'rsc' ] )
@@ -967,30 +973,6 @@ function scanBuildStripPlugin({
967
973
}
968
974
}
969
975
970
- function normalizeRelativePath ( s : string ) {
971
- s = normalizePath ( s )
972
- return s [ 0 ] === '.' ? s : './' + s
973
- }
974
-
975
- function getEntrySource (
976
- config : Pick < ResolvedConfig , 'build' > ,
977
- name : string = 'index' ,
978
- ) {
979
- const input = config . build . rollupOptions . input
980
- assert (
981
- typeof input === 'object' &&
982
- ! Array . isArray ( input ) &&
983
- name in input &&
984
- typeof input [ name ] === 'string' ,
985
- `[vite-rsc:getEntrySource] expected 'build.rollupOptions.input' to be an object with a '${ name } ' property that is a string, but got ${ JSON . stringify ( input ) } ` ,
986
- )
987
- return input [ name ]
988
- }
989
-
990
- function hashString ( v : string ) {
991
- return createHash ( 'sha256' ) . update ( v ) . digest ( ) . toString ( 'hex' ) . slice ( 0 , 12 )
992
- }
993
-
994
976
function vitePluginUseClient (
995
977
useClientPluginOptions : Pick <
996
978
RscPluginOptions ,
@@ -1544,45 +1526,6 @@ function vitePluginUseServer(
1544
1526
]
1545
1527
}
1546
1528
1547
- // Rethrow transform error through `this.error` with `error.pos` which is injected by `@hiogawa/transforms`
1548
- function withRollupError < F extends ( ...args : any [ ] ) => any > (
1549
- ctx : Rollup . TransformPluginContext ,
1550
- f : F ,
1551
- ) : F {
1552
- function processError ( e : any ) : never {
1553
- if ( e && typeof e === 'object' && typeof e . pos === 'number' ) {
1554
- return ctx . error ( e , e . pos )
1555
- }
1556
- throw e
1557
- }
1558
- return function ( this : any , ...args : any [ ] ) {
1559
- try {
1560
- const result = f . apply ( this , args )
1561
- if ( result instanceof Promise ) {
1562
- return result . catch ( ( e : any ) => processError ( e ) )
1563
- }
1564
- return result
1565
- } catch ( e : any ) {
1566
- processError ( e )
1567
- }
1568
- } as F
1569
- }
1570
-
1571
- function createVirtualPlugin ( name : string , load : Plugin [ 'load' ] ) {
1572
- name = 'virtual:' + name
1573
- return {
1574
- name : `rsc:virtual-${ name } ` ,
1575
- resolveId ( source , _importer , _options ) {
1576
- return source === name ? '\0' + name : undefined
1577
- } ,
1578
- load ( id , options ) {
1579
- if ( id === '\0' + name ) {
1580
- return ( load as Function ) . apply ( this , [ id , options ] )
1581
- }
1582
- } ,
1583
- } satisfies Plugin
1584
- }
1585
-
1586
1529
class RuntimeAsset {
1587
1530
runtime : string
1588
1531
constructor ( value : string ) {
@@ -2183,9 +2126,3 @@ function __vite_rsc_wrap_css__(value, name) {
2183
2126
return { output : result . output }
2184
2127
}
2185
2128
}
2186
-
2187
- function sortObject < T extends object > ( o : T ) {
2188
- return Object . fromEntries (
2189
- Object . entries ( o ) . sort ( ( [ a ] , [ b ] ) => a . localeCompare ( b ) ) ,
2190
- ) as T
2191
- }
0 commit comments