1
- import type { RollupSucraseOptions } from '@rollup/plugin-sucrase' ;
2
1
import sucrase from '@rollup/plugin-sucrase' ;
2
+ import virtual from '@rollup/plugin-virtual' ;
3
3
import { logger } from '@sentry/utils' ;
4
4
import * as path from 'path' ;
5
5
import type { InputOptions as RollupInputOptions , OutputOptions as RollupOutputOptions } from 'rollup' ;
6
6
import { rollup } from 'rollup' ;
7
7
8
- const getRollupInputOptions : ( proxyPath : string , resourcePath : string ) => RollupInputOptions = (
9
- proxyPath ,
10
- resourcePath ,
11
- ) => ( {
12
- input : proxyPath ,
8
+ const SENTRY_PROXY_MODULE_NAME = 'sentry-proxy-module' ;
9
+
10
+ const getRollupInputOptions = ( userModulePath : string , proxyTemplateCode : string ) : RollupInputOptions => ( {
11
+ input : SENTRY_PROXY_MODULE_NAME ,
12
+
13
13
plugins : [
14
- // For some reason, even though everything in `RollupSucraseOptions` besides `transforms` is supposed to be
15
- // optional, TS complains that there are a bunch of missing properties (hence the typecast). Similar to
16
- // https://github.com/microsoft/TypeScript/issues/20722, though that's been fixed. (In this case it's an interface
17
- // exporting a `Pick` picking optional properties which is turning them required somehow.)'
14
+ virtual ( {
15
+ [ SENTRY_PROXY_MODULE_NAME ] : proxyTemplateCode ,
16
+ } ) ,
18
17
sucrase ( {
19
18
transforms : [ 'jsx' , 'typescript' ] ,
20
- } as unknown as RollupSucraseOptions ) ,
19
+ } ) ,
21
20
] ,
22
21
23
22
// We want to process as few files as possible, so as not to slow down the build any more than we have to. We need the
24
23
// proxy module (living in the temporary file we've created) and the file we're wrapping not to be external, because
25
24
// otherwise they won't be processed. (We need Rollup to process the former so that we can use the code, and we need
26
25
// it to process the latter so it knows what exports to re-export from the proxy module.) Past that, we don't care, so
27
26
// don't bother to process anything else.
28
- external : importPath => importPath !== proxyPath && importPath !== resourcePath ,
27
+ external : importPath => importPath !== SENTRY_PROXY_MODULE_NAME && importPath !== userModulePath ,
29
28
30
29
// Prevent rollup from stressing out about TS's use of global `this` when polyfilling await. (TS will polyfill if the
31
30
// user's tsconfig `target` is set to anything before `es2017`. See https://stackoverflow.com/a/72822340 and
@@ -66,19 +65,19 @@ const rollupOutputOptions: RollupOutputOptions = {
66
65
* '<wrapped file>'` call into individual exports (which nextjs seems to need).
67
66
*
68
67
* @param tempProxyFilePath The path to the temporary file containing the proxy module code
69
- * @param resourcePath The path to the file being wrapped
68
+ * @param userModulePath The path to the file being wrapped
70
69
* @returns The processed proxy module code, or undefined if an error occurs
71
70
*/
72
- export async function rollupize ( tempProxyFilePath : string , resourcePath : string ) : Promise < string | undefined > {
71
+ export async function rollupize ( userModulePath : string , templateCode : string ) : Promise < string | undefined > {
73
72
let finalBundle ;
74
73
75
74
try {
76
- const intermediateBundle = await rollup ( getRollupInputOptions ( tempProxyFilePath , resourcePath ) ) ;
75
+ const intermediateBundle = await rollup ( getRollupInputOptions ( userModulePath , templateCode ) ) ;
77
76
finalBundle = await intermediateBundle . generate ( rollupOutputOptions ) ;
78
77
} catch ( err ) {
79
78
__DEBUG_BUILD__ &&
80
79
logger . warn (
81
- `Could not wrap ${ resourcePath } . An error occurred while processing the proxy module template:\n${ err } ` ,
80
+ `Could not wrap ${ userModulePath } . An error occurred while processing the proxy module template:\n${ err } ` ,
82
81
) ;
83
82
return undefined ;
84
83
}
@@ -92,7 +91,7 @@ export async function rollupize(tempProxyFilePath: string, resourcePath: string)
92
91
// square brackets into underscores. Further, Rollup adds file extensions to bare-path-type import and export sources.
93
92
// Because it assumes that everything will have already been processed, it always uses `.js` as the added extension.
94
93
// We need to restore the original name and extension so that Webpack will be able to find the wrapped file.
95
- const resourceFilename = path . basename ( resourcePath ) ;
94
+ const resourceFilename = path . basename ( userModulePath ) ;
96
95
const mutatedResourceFilename = resourceFilename
97
96
// `[\\[\\]]` is the character class containing `[` and `]`
98
97
. replace ( new RegExp ( '[\\[\\]]' , 'g' ) , '_' )
0 commit comments