@@ -18,6 +18,9 @@ const get_default_runtime = () => {
18
18
) ;
19
19
} ;
20
20
21
+ // https://vercel.com/docs/functions/edge-functions/edge-runtime#compatible-node.js-modules
22
+ const compatible_node_modules = [ 'async_hooks' , 'events' , 'buffer' , 'assert' , 'util' ] ;
23
+
21
24
/** @type {import('.').default } **/
22
25
const plugin = function ( defaults = { } ) {
23
26
if ( 'edge' in defaults ) {
@@ -109,20 +112,61 @@ const plugin = function (defaults = {}) {
109
112
`export const manifest = ${ builder . generateManifest ( { relativePath, routes } ) } ;\n`
110
113
) ;
111
114
112
- await esbuild . build ( {
113
- entryPoints : [ `${ tmp } /edge.js` ] ,
114
- outfile : `${ dirs . functions } /${ name } .func/index.js` ,
115
- target : 'es2020' , // TODO verify what the edge runtime supports
116
- bundle : true ,
117
- platform : 'browser' ,
118
- format : 'esm' ,
119
- external : config . external ,
120
- sourcemap : 'linked' ,
121
- banner : { js : 'globalThis.global = globalThis;' } ,
122
- loader : {
123
- '.wasm' : 'copy'
115
+ try {
116
+ const result = await esbuild . build ( {
117
+ entryPoints : [ `${ tmp } /edge.js` ] ,
118
+ outfile : `${ dirs . functions } /${ name } .func/index.js` ,
119
+ target : 'es2020' , // TODO verify what the edge runtime supports
120
+ bundle : true ,
121
+ platform : 'browser' ,
122
+ format : 'esm' ,
123
+ external : [
124
+ ...compatible_node_modules ,
125
+ ...compatible_node_modules . map ( ( id ) => `node:${ id } ` ) ,
126
+ ...( config . external || [ ] )
127
+ ] ,
128
+ sourcemap : 'linked' ,
129
+ banner : { js : 'globalThis.global = globalThis;' } ,
130
+ loader : {
131
+ '.wasm' : 'copy'
132
+ }
133
+ } ) ;
134
+
135
+ if ( result . warnings . length > 0 ) {
136
+ const formatted = await esbuild . formatMessages ( result . warnings , {
137
+ kind : 'warning' ,
138
+ color : true
139
+ } ) ;
140
+
141
+ console . error ( formatted . join ( '\n' ) ) ;
124
142
}
125
- } ) ;
143
+ } catch ( error ) {
144
+ for ( const e of error . errors ) {
145
+ for ( const node of e . notes ) {
146
+ const match =
147
+ / T h e p a c k a g e " ( .+ ) " w a s n ' t f o u n d o n t h e f i l e s y s t e m b u t i s b u i l t i n t o n o d e / . exec (
148
+ node . text
149
+ ) ;
150
+
151
+ if ( match ) {
152
+ node . text = `Cannot use "${ match [ 1 ] } " when deploying to Vercel Edge Functions.` ;
153
+ }
154
+ }
155
+ }
156
+
157
+ const formatted = await esbuild . formatMessages ( error . errors , {
158
+ kind : 'error' ,
159
+ color : true
160
+ } ) ;
161
+
162
+ console . error ( formatted . join ( '\n' ) ) ;
163
+
164
+ throw new Error (
165
+ `Bundling with esbuild failed with ${ error . errors . length } ${
166
+ error . errors . length === 1 ? 'error' : 'errors'
167
+ } `
168
+ ) ;
169
+ }
126
170
127
171
write (
128
172
`${ dirs . functions } /${ name } .func/.vc-config.json` ,
0 commit comments