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

View File

@@ -2,7 +2,7 @@ export const config = {
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');
// 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);
const { stdout, stderr } = await dev.kill('SIGTERM');
const { stderr } = await dev.kill('SIGTERM');
expect(await res.text()).toMatch(
/<strong>500<\/strong>: INTERNAL_SERVER_ERROR/g
);
expect(stdout).toMatch(
/Failed to instantiate edge runtime: intentional startup error/g
);
expect(stderr).toMatch(/Failed to instantiate edge runtime./g);
expect(stderr).toMatch(/intentional startup error/g);
expect(stderr).toMatch(
/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);
const { stdout, stderr } = await dev.kill('SIGTERM');
const { stderr } = await dev.kill('SIGTERM');
expect(await res.text()).toMatch(
/<strong>500<\/strong>: INTERNAL_SERVER_ERROR/g
);
expect(stdout).toMatch(
/Failed to instantiate edge runtime: Module parse failed: Unexpected token/g
);
expect(stderr).toMatch(/Failed to instantiate edge runtime./g);
expect(stderr).toMatch(/Unexpected end of file/g);
expect(stderr).toMatch(
/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);
const { stdout, stderr } = await dev.kill('SIGTERM');
const { stderr } = await dev.kill('SIGTERM');
expect(await res.text()).toMatch(
/<strong>500<\/strong>: INTERNAL_SERVER_ERROR/g
);
expect(stdout).toMatch(
/Failed to instantiate edge runtime: Code generation from strings disallowed for this context/g
expect(stderr).toMatch(
/Could not resolve "unknown-module-893427589372458934795843"/g
);
expect(stderr).toMatch(
/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 { dev, port, readyResolver } = await testFixture(dir);

View File

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

View File

@@ -79,8 +79,9 @@ import exitHook from 'exit-hook';
import { EdgeRuntime, Primitives, runServer } from 'edge-runtime';
import { getConfig } from '@vercel/static-config';
import { Project } from 'ts-morph';
import ncc from '@vercel/ncc';
import esbuild from 'esbuild';
import fetch from 'node-fetch';
import { TextDecoder } from 'util';
function logError(error: Error) {
console.error(error.message);
@@ -149,10 +150,22 @@ async function serializeRequest(message: IncomingMessage) {
async function compileUserCode(entrypoint: string) {
try {
const buildResult = await ncc(entrypoint, {
target: 'es2022',
const result = await esbuild.build({
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 `
${userCode};
@@ -200,7 +213,8 @@ async function compileUserCode(entrypoint: string) {
} catch (error) {
// We can't easily show a meaningful stack trace from ncc -> edge-runtime.
// 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;
}
}
@@ -231,7 +245,8 @@ async function createEdgeRuntime(userCode: string | undefined) {
} catch (error) {
// We can't easily show a meaningful stack trace from ncc -> edge-runtime.
// 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;
}
}

View File

@@ -5607,12 +5607,7 @@ esbuild@0.12.22:
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.12.22.tgz#6031a1257b8d0307d306bed673b79c3668607f51"
integrity sha512-yWCr9RoFehpqoe/+MwZXJpYOEIt7KOEvNnjIeMZpMSyQt+KCBASM3y7yViiN5dJRphf1wGdUz1+M4rTtWd/ulA==
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==
esbuild@^0.14.25:
esbuild@0.14.47, esbuild@^0.14.25:
version "0.14.47"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.47.tgz#0d6415f6bd8eb9e73a58f7f9ae04c5276cda0e4d"
integrity sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==
@@ -5638,6 +5633,11 @@ esbuild@^0.14.25:
esbuild-windows-64 "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:
version "3.1.1"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"