Compare commits

..

2 Commits

Author SHA1 Message Date
Sean Massa
b399fe7037 Publish Stable
- vercel@25.2.1
 - @vercel/node@2.3.1
2022-06-28 12:04:57 -05:00
Sean Massa
88385b3c84 [cli][node] switch to esbuild for compiling edge functions (#8032) 2022-06-28 11:27:56 -05:00
6 changed files with 43 additions and 29 deletions

View File

@@ -1,6 +1,6 @@
{ {
"name": "vercel", "name": "vercel",
"version": "25.2.0", "version": "25.2.1",
"preferGlobal": true, "preferGlobal": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"description": "The command-line interface for Vercel", "description": "The command-line interface for Vercel",
@@ -45,7 +45,7 @@
"@vercel/build-utils": "4.2.0", "@vercel/build-utils": "4.2.0",
"@vercel/go": "2.0.2", "@vercel/go": "2.0.2",
"@vercel/next": "3.1.0", "@vercel/next": "3.1.0",
"@vercel/node": "2.3.0", "@vercel/node": "2.3.1",
"@vercel/python": "3.0.2", "@vercel/python": "3.0.2",
"@vercel/redwood": "1.0.2", "@vercel/redwood": "1.0.2",
"@vercel/remix": "1.0.2", "@vercel/remix": "1.0.2",

View File

@@ -2,7 +2,7 @@ export const config = {
runtime: 'experimental-edge' runtime: 'experimental-edge'
} }
export default async function edge(request: Request, event: Event) { export default async function edge(request, event) {
return new Response('some response body'); return new Response('some response body');
// intentional missing closing bracket to produce syntax error // intentional missing closing bracket to produce syntax error

View File

@@ -161,14 +161,13 @@ test('[vercel dev] should handle startup errors thrown in edge functions', async
}); });
validateResponseHeaders(res); validateResponseHeaders(res);
const { stdout, stderr } = await dev.kill('SIGTERM'); const { stderr } = await dev.kill('SIGTERM');
expect(await res.text()).toMatch( expect(await res.text()).toMatch(
/<strong>500<\/strong>: INTERNAL_SERVER_ERROR/g /<strong>500<\/strong>: INTERNAL_SERVER_ERROR/g
); );
expect(stdout).toMatch( expect(stderr).toMatch(/Failed to instantiate edge runtime./g);
/Failed to instantiate edge runtime: intentional startup error/g expect(stderr).toMatch(/intentional startup error/g);
);
expect(stderr).toMatch( expect(stderr).toMatch(
/Failed to complete request to \/api\/edge-error-startup: Error: socket hang up/g /Failed to complete request to \/api\/edge-error-startup: Error: socket hang up/g
); );
@@ -193,14 +192,13 @@ test('[vercel dev] should handle syntax errors thrown in edge functions', async
}); });
validateResponseHeaders(res); validateResponseHeaders(res);
const { stdout, stderr } = await dev.kill('SIGTERM'); const { stderr } = await dev.kill('SIGTERM');
expect(await res.text()).toMatch( expect(await res.text()).toMatch(
/<strong>500<\/strong>: INTERNAL_SERVER_ERROR/g /<strong>500<\/strong>: INTERNAL_SERVER_ERROR/g
); );
expect(stdout).toMatch( expect(stderr).toMatch(/Failed to instantiate edge runtime./g);
/Failed to instantiate edge runtime: Module parse failed: Unexpected token/g expect(stderr).toMatch(/Unexpected end of file/g);
);
expect(stderr).toMatch( expect(stderr).toMatch(
/Failed to complete request to \/api\/edge-error-syntax: Error: socket hang up/g /Failed to complete request to \/api\/edge-error-syntax: Error: socket hang up/g
); );
@@ -228,13 +226,13 @@ test('[vercel dev] should handle import errors thrown in edge functions', async
); );
validateResponseHeaders(res); validateResponseHeaders(res);
const { stdout, stderr } = await dev.kill('SIGTERM'); const { stderr } = await dev.kill('SIGTERM');
expect(await res.text()).toMatch( expect(await res.text()).toMatch(
/<strong>500<\/strong>: INTERNAL_SERVER_ERROR/g /<strong>500<\/strong>: INTERNAL_SERVER_ERROR/g
); );
expect(stdout).toMatch( expect(stderr).toMatch(
/Failed to instantiate edge runtime: Code generation from strings disallowed for this context/g /Could not resolve "unknown-module-893427589372458934795843"/g
); );
expect(stderr).toMatch( expect(stderr).toMatch(
/Failed to complete request to \/api\/edge-error-unknown-import: Error: socket hang up/g /Failed to complete request to \/api\/edge-error-unknown-import: Error: socket hang up/g
@@ -244,7 +242,7 @@ test('[vercel dev] should handle import errors thrown in edge functions', async
} }
}); });
test('[vercel dev] should handle import errors thrown in edge functions', async () => { test('[vercel dev] should handle missing handler errors thrown in edge functions', async () => {
const dir = fixture('edge-function-error'); const dir = fixture('edge-function-error');
const { dev, port, readyResolver } = await testFixture(dir); const { dev, port, readyResolver } = await testFixture(dir);

View File

@@ -1,6 +1,6 @@
{ {
"name": "@vercel/node", "name": "@vercel/node",
"version": "2.3.0", "version": "2.3.1",
"license": "MIT", "license": "MIT",
"main": "./dist/index", "main": "./dist/index",
"homepage": "https://vercel.com/docs/runtimes#official-runtimes/node-js", "homepage": "https://vercel.com/docs/runtimes#official-runtimes/node-js",
@@ -32,10 +32,10 @@
"dependencies": { "dependencies": {
"@types/node": "*", "@types/node": "*",
"@vercel/build-utils": "4.2.0", "@vercel/build-utils": "4.2.0",
"@vercel/ncc": "0.24.0",
"@vercel/node-bridge": "3.0.0", "@vercel/node-bridge": "3.0.0",
"@vercel/static-config": "2.0.1", "@vercel/static-config": "2.0.1",
"edge-runtime": "1.0.1", "edge-runtime": "1.0.1",
"esbuild": "0.14.47",
"exit-hook": "2.2.1", "exit-hook": "2.2.1",
"node-fetch": "2.6.1", "node-fetch": "2.6.1",
"ts-node": "8.9.1", "ts-node": "8.9.1",
@@ -52,6 +52,7 @@
"@types/jest": "27.4.1", "@types/jest": "27.4.1",
"@types/node-fetch": "^2.6.1", "@types/node-fetch": "^2.6.1",
"@types/test-listen": "1.1.0", "@types/test-listen": "1.1.0",
"@vercel/ncc": "0.24.0",
"@vercel/nft": "0.19.1", "@vercel/nft": "0.19.1",
"content-type": "1.0.4", "content-type": "1.0.4",
"cookie": "0.4.0", "cookie": "0.4.0",

View File

@@ -79,8 +79,9 @@ import exitHook from 'exit-hook';
import { EdgeRuntime, Primitives, runServer } from 'edge-runtime'; import { EdgeRuntime, Primitives, runServer } from 'edge-runtime';
import { getConfig } from '@vercel/static-config'; import { getConfig } from '@vercel/static-config';
import { Project } from 'ts-morph'; import { Project } from 'ts-morph';
import ncc from '@vercel/ncc'; import esbuild from 'esbuild';
import fetch from 'node-fetch'; import fetch from 'node-fetch';
import { TextDecoder } from 'util';
function logError(error: Error) { function logError(error: Error) {
console.error(error.message); console.error(error.message);
@@ -149,10 +150,22 @@ async function serializeRequest(message: IncomingMessage) {
async function compileUserCode(entrypoint: string) { async function compileUserCode(entrypoint: string) {
try { try {
const buildResult = await ncc(entrypoint, { const result = await esbuild.build({
target: 'es2022', platform: 'node',
target: 'node14',
sourcemap: 'inline',
bundle: true,
entryPoints: [entrypoint],
write: false, // operate in memory
format: 'cjs',
}); });
const userCode = buildResult.code;
const compiledFile = result.outputFiles?.[0];
if (!compiledFile) {
throw new Error(`Compilation of ${entrypoint} produced no output files.`);
}
const userCode = new TextDecoder().decode(compiledFile.contents);
return ` return `
${userCode}; ${userCode};
@@ -200,7 +213,8 @@ async function compileUserCode(entrypoint: string) {
} catch (error) { } catch (error) {
// We can't easily show a meaningful stack trace from ncc -> edge-runtime. // We can't easily show a meaningful stack trace from ncc -> edge-runtime.
// So, stick with just the message for now. // So, stick with just the message for now.
console.log(`Failed to instantiate edge runtime: ${error.message}`); console.error(`Failed to instantiate edge runtime.`);
logError(error);
return undefined; return undefined;
} }
} }
@@ -231,7 +245,8 @@ async function createEdgeRuntime(userCode: string | undefined) {
} catch (error) { } catch (error) {
// We can't easily show a meaningful stack trace from ncc -> edge-runtime. // We can't easily show a meaningful stack trace from ncc -> edge-runtime.
// So, stick with just the message for now. // So, stick with just the message for now.
console.log(`Failed to instantiate edge runtime: ${error.message}`); console.error('Failed to instantiate edge runtime.');
logError(error);
return undefined; return undefined;
} }
} }

View File

@@ -5607,12 +5607,7 @@ esbuild@0.12.22:
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.12.22.tgz#6031a1257b8d0307d306bed673b79c3668607f51" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.12.22.tgz#6031a1257b8d0307d306bed673b79c3668607f51"
integrity sha512-yWCr9RoFehpqoe/+MwZXJpYOEIt7KOEvNnjIeMZpMSyQt+KCBASM3y7yViiN5dJRphf1wGdUz1+M4rTtWd/ulA== integrity sha512-yWCr9RoFehpqoe/+MwZXJpYOEIt7KOEvNnjIeMZpMSyQt+KCBASM3y7yViiN5dJRphf1wGdUz1+M4rTtWd/ulA==
esbuild@^0.11.20: esbuild@0.14.47, esbuild@^0.14.25:
version "0.11.23"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.11.23.tgz#c42534f632e165120671d64db67883634333b4b8"
integrity sha512-iaiZZ9vUF5wJV8ob1tl+5aJTrwDczlvGP0JoMmnpC2B0ppiMCu8n8gmy5ZTGl5bcG081XBVn+U+jP+mPFm5T5Q==
esbuild@^0.14.25:
version "0.14.47" version "0.14.47"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.47.tgz#0d6415f6bd8eb9e73a58f7f9ae04c5276cda0e4d" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.47.tgz#0d6415f6bd8eb9e73a58f7f9ae04c5276cda0e4d"
integrity sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA== integrity sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==
@@ -5638,6 +5633,11 @@ esbuild@^0.14.25:
esbuild-windows-64 "0.14.47" esbuild-windows-64 "0.14.47"
esbuild-windows-arm64 "0.14.47" esbuild-windows-arm64 "0.14.47"
esbuild@^0.11.20:
version "0.11.23"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.11.23.tgz#c42534f632e165120671d64db67883634333b4b8"
integrity sha512-iaiZZ9vUF5wJV8ob1tl+5aJTrwDczlvGP0JoMmnpC2B0ppiMCu8n8gmy5ZTGl5bcG081XBVn+U+jP+mPFm5T5Q==
escalade@^3.1.1: escalade@^3.1.1:
version "3.1.1" version "3.1.1"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"