From 34aeedd87027f3bc7d62d5dc38c40f69792e740b Mon Sep 17 00:00:00 2001 From: JuanM04 Date: Fri, 13 May 2022 14:11:20 -0300 Subject: [PATCH 01/10] Added runtime option --- packages/adapter-vercel/index.d.ts | 1 + packages/adapter-vercel/index.js | 17 ++++++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/adapter-vercel/index.d.ts b/packages/adapter-vercel/index.d.ts index 1566ac142b82..901288895a08 100644 --- a/packages/adapter-vercel/index.d.ts +++ b/packages/adapter-vercel/index.d.ts @@ -4,6 +4,7 @@ type Options = { edge?: boolean; external?: string[]; split?: boolean; + runtime?: '16.x' | '14.x' | '12.x'; }; declare function plugin(options?: Options): Adapter; diff --git a/packages/adapter-vercel/index.js b/packages/adapter-vercel/index.js index f98c2c4b5137..e2cb7b875249 100644 --- a/packages/adapter-vercel/index.js +++ b/packages/adapter-vercel/index.js @@ -81,16 +81,18 @@ const redirects = { }; /** @type {import('.')} **/ -export default function ({ external = [], edge, split } = {}) { +export default function ({ external = [], edge, split, runtime } = {}) { return { name: '@sveltejs/adapter-vercel', async adapt(builder) { if (process.env.ENABLE_VC_BUILD) { - await v3(builder, external, edge, split); + await v3(builder, external, edge, split, runtime || '16.x'); } else { - if (edge || split) { - throw new Error('edge and split options can only be used with ENABLE_VC_BUILD'); + if (edge || split || runtime) { + throw new Error( + '`edge`, `split` and `runtime` options can only be used with ENABLE_VC_BUILD' + ); } await v1(builder, external); @@ -198,8 +200,9 @@ async function v1(builder, external) { * @param {string[]} external * @param {boolean} edge * @param {boolean} split + * @param {'16.x' | '14.x' | '12.x'} runtime */ -async function v3(builder, external, edge, split) { +async function v3(builder, external, edge, split, runtime) { const dir = '.vercel/output'; const tmp = builder.getBuildDirectory('vercel-tmp'); @@ -263,7 +266,7 @@ async function v3(builder, external, edge, split) { await esbuild.build({ entryPoints: [`${tmp}/serverless.js`], outfile: `${dirs.functions}/${name}.func/index.js`, - target: 'node14', + target: `node${runtime}`, bundle: true, platform: 'node', format: 'cjs', @@ -273,7 +276,7 @@ async function v3(builder, external, edge, split) { write( `${dirs.functions}/${name}.func/.vc-config.json`, JSON.stringify({ - runtime: 'nodejs14.x', + runtime: `nodejs${runtime}`, handler: 'index.js', launcherType: 'Nodejs' }) From 17642135d748db662646cba52c6ca78b4e8de11b Mon Sep 17 00:00:00 2001 From: JuanM04 Date: Fri, 13 May 2022 14:12:00 -0300 Subject: [PATCH 02/10] Added support for ESM --- packages/adapter-vercel/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/adapter-vercel/index.js b/packages/adapter-vercel/index.js index e2cb7b875249..82f763000162 100644 --- a/packages/adapter-vercel/index.js +++ b/packages/adapter-vercel/index.js @@ -269,7 +269,7 @@ async function v3(builder, external, edge, split, runtime) { target: `node${runtime}`, bundle: true, platform: 'node', - format: 'cjs', + format: 'esm', external }); @@ -282,7 +282,7 @@ async function v3(builder, external, edge, split, runtime) { }) ); - write(`${dirs.functions}/${name}.func/package.json`, JSON.stringify({ type: 'commonjs' })); + write(`${dirs.functions}/${name}.func/package.json`, JSON.stringify({ type: 'module' })); routes.push({ src: pattern, dest: `/${name}` }); } From c266ec6097bd938dc809a97d8545a657645e5c46 Mon Sep 17 00:00:00 2001 From: JuanM04 Date: Fri, 13 May 2022 14:18:30 -0300 Subject: [PATCH 03/10] Renamed runtime to nodeVersion --- packages/adapter-vercel/index.d.ts | 2 +- packages/adapter-vercel/index.js | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/adapter-vercel/index.d.ts b/packages/adapter-vercel/index.d.ts index 901288895a08..b943b9895908 100644 --- a/packages/adapter-vercel/index.d.ts +++ b/packages/adapter-vercel/index.d.ts @@ -4,7 +4,7 @@ type Options = { edge?: boolean; external?: string[]; split?: boolean; - runtime?: '16.x' | '14.x' | '12.x'; + nodeVersion?: '16.x' | '14.x' | '12.x'; }; declare function plugin(options?: Options): Adapter; diff --git a/packages/adapter-vercel/index.js b/packages/adapter-vercel/index.js index 82f763000162..ba3735ecdb32 100644 --- a/packages/adapter-vercel/index.js +++ b/packages/adapter-vercel/index.js @@ -81,17 +81,17 @@ const redirects = { }; /** @type {import('.')} **/ -export default function ({ external = [], edge, split, runtime } = {}) { +export default function ({ external = [], edge, split, nodeVersion } = {}) { return { name: '@sveltejs/adapter-vercel', async adapt(builder) { if (process.env.ENABLE_VC_BUILD) { - await v3(builder, external, edge, split, runtime || '16.x'); + await v3(builder, external, edge, split, nodeVersion || '16.x'); } else { - if (edge || split || runtime) { + if (edge || split || nodeVersion) { throw new Error( - '`edge`, `split` and `runtime` options can only be used with ENABLE_VC_BUILD' + '`edge`, `split` and `nodeVersion` options can only be used with ENABLE_VC_BUILD' ); } @@ -200,9 +200,9 @@ async function v1(builder, external) { * @param {string[]} external * @param {boolean} edge * @param {boolean} split - * @param {'16.x' | '14.x' | '12.x'} runtime + * @param {'16.x' | '14.x' | '12.x'} nodeVersion */ -async function v3(builder, external, edge, split, runtime) { +async function v3(builder, external, edge, split, nodeVersion) { const dir = '.vercel/output'; const tmp = builder.getBuildDirectory('vercel-tmp'); @@ -266,7 +266,8 @@ async function v3(builder, external, edge, split, runtime) { await esbuild.build({ entryPoints: [`${tmp}/serverless.js`], outfile: `${dirs.functions}/${name}.func/index.js`, - target: `node${runtime}`, + target: + nodeVersion === '12.x' ? 'node12.22' : nodeVersion === '14.x' ? 'node14.19' : 'node16.15', bundle: true, platform: 'node', format: 'esm', @@ -276,7 +277,7 @@ async function v3(builder, external, edge, split, runtime) { write( `${dirs.functions}/${name}.func/.vc-config.json`, JSON.stringify({ - runtime: `nodejs${runtime}`, + runtime: `nodejs${nodeVersion}`, handler: 'index.js', launcherType: 'Nodejs' }) From cffeeb57d22fa7097279395fcfe030881697d81f Mon Sep 17 00:00:00 2001 From: JuanM04 Date: Fri, 13 May 2022 14:31:06 -0300 Subject: [PATCH 04/10] Added warning --- packages/adapter-vercel/index.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/adapter-vercel/index.js b/packages/adapter-vercel/index.js index ba3735ecdb32..ca98dc913ddb 100644 --- a/packages/adapter-vercel/index.js +++ b/packages/adapter-vercel/index.js @@ -87,6 +87,12 @@ export default function ({ external = [], edge, split, nodeVersion } = {}) { async adapt(builder) { if (process.env.ENABLE_VC_BUILD) { + if (edge && nodeVersion) { + throw new Error( + '`nodeVersion` option can only be used with serverless functions, not edge functions' + ); + } + await v3(builder, external, edge, split, nodeVersion || '16.x'); } else { if (edge || split || nodeVersion) { From 06254d68d30b8adfd9d3b3f15362efef18902553 Mon Sep 17 00:00:00 2001 From: JuanM04 Date: Fri, 13 May 2022 14:31:16 -0300 Subject: [PATCH 05/10] Changeset --- .changeset/breezy-grapes-smash.md | 5 +++++ .changeset/tall-ties-juggle.md | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 .changeset/breezy-grapes-smash.md create mode 100644 .changeset/tall-ties-juggle.md diff --git a/.changeset/breezy-grapes-smash.md b/.changeset/breezy-grapes-smash.md new file mode 100644 index 000000000000..f1b5a62da1fb --- /dev/null +++ b/.changeset/breezy-grapes-smash.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-vercel': patch +--- + +You can now select a Node.js version for your serverless functions diff --git a/.changeset/tall-ties-juggle.md b/.changeset/tall-ties-juggle.md new file mode 100644 index 000000000000..9ba00a39f1a3 --- /dev/null +++ b/.changeset/tall-ties-juggle.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-vercel': patch +--- + +The output of serverless now is ESM instead of CJS From cdcd3be2f98ab56085fe21bc142a083ec59e2fab Mon Sep 17 00:00:00 2001 From: JuanM04 Date: Fri, 13 May 2022 14:37:50 -0300 Subject: [PATCH 06/10] Added note to readme --- packages/adapter-vercel/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/adapter-vercel/README.md b/packages/adapter-vercel/README.md index 34a0999fbe0c..a3a6e4694dd1 100644 --- a/packages/adapter-vercel/README.md +++ b/packages/adapter-vercel/README.md @@ -31,6 +31,11 @@ export default { // if true, will split your app into multiple functions // instead of creating a single one for the entire app split: false + + // which version of Node.js you want your serverless + // function to run on - it only works with edge=false + // and ENABLE_VC_BUILD=1 + nodeVersion: '16.x' }) } }; From 817b7da3762acbfb58baab2268161e8574add004 Mon Sep 17 00:00:00 2001 From: JuanM04 Date: Fri, 13 May 2022 14:39:08 -0300 Subject: [PATCH 07/10] Readme with spaces instead of tabs --- packages/adapter-vercel/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/adapter-vercel/README.md b/packages/adapter-vercel/README.md index a3a6e4694dd1..1214c918f4bf 100644 --- a/packages/adapter-vercel/README.md +++ b/packages/adapter-vercel/README.md @@ -32,9 +32,9 @@ export default { // instead of creating a single one for the entire app split: false - // which version of Node.js you want your serverless - // function to run on - it only works with edge=false - // and ENABLE_VC_BUILD=1 + // which version of Node.js you want your serverless + // function to run on - it only works with edge=false + // and ENABLE_VC_BUILD=1 nodeVersion: '16.x' }) } From aa396c24167af880186c4ed3eab8ad4fe5ab08b3 Mon Sep 17 00:00:00 2001 From: JuanM04 Date: Fri, 13 May 2022 15:36:09 -0300 Subject: [PATCH 08/10] Detect node version automatically --- .changeset/breezy-grapes-smash.md | 2 +- packages/adapter-vercel/README.md | 5 ---- packages/adapter-vercel/index.d.ts | 1 - packages/adapter-vercel/index.js | 43 ++++++++++++++++++------------ 4 files changed, 27 insertions(+), 24 deletions(-) diff --git a/.changeset/breezy-grapes-smash.md b/.changeset/breezy-grapes-smash.md index f1b5a62da1fb..43b7d732414f 100644 --- a/.changeset/breezy-grapes-smash.md +++ b/.changeset/breezy-grapes-smash.md @@ -2,4 +2,4 @@ '@sveltejs/adapter-vercel': patch --- -You can now select a Node.js version for your serverless functions +Support for Node.js 16 diff --git a/packages/adapter-vercel/README.md b/packages/adapter-vercel/README.md index 1214c918f4bf..34a0999fbe0c 100644 --- a/packages/adapter-vercel/README.md +++ b/packages/adapter-vercel/README.md @@ -31,11 +31,6 @@ export default { // if true, will split your app into multiple functions // instead of creating a single one for the entire app split: false - - // which version of Node.js you want your serverless - // function to run on - it only works with edge=false - // and ENABLE_VC_BUILD=1 - nodeVersion: '16.x' }) } }; diff --git a/packages/adapter-vercel/index.d.ts b/packages/adapter-vercel/index.d.ts index b943b9895908..1566ac142b82 100644 --- a/packages/adapter-vercel/index.d.ts +++ b/packages/adapter-vercel/index.d.ts @@ -4,7 +4,6 @@ type Options = { edge?: boolean; external?: string[]; split?: boolean; - nodeVersion?: '16.x' | '14.x' | '12.x'; }; declare function plugin(options?: Options): Adapter; diff --git a/packages/adapter-vercel/index.js b/packages/adapter-vercel/index.js index ca98dc913ddb..7992d144c417 100644 --- a/packages/adapter-vercel/index.js +++ b/packages/adapter-vercel/index.js @@ -81,24 +81,23 @@ const redirects = { }; /** @type {import('.')} **/ -export default function ({ external = [], edge, split, nodeVersion } = {}) { +export default function ({ external = [], edge, split } = {}) { return { name: '@sveltejs/adapter-vercel', async adapt(builder) { - if (process.env.ENABLE_VC_BUILD) { - if (edge && nodeVersion) { - throw new Error( - '`nodeVersion` option can only be used with serverless functions, not edge functions' - ); - } + const nodeVersion = getNodeVersion(); + if (nodeVersion.major < 14) { + throw new Error( + `SvelteKit only support Node.js version 14 or greater (v${nodeVersion.full} was detected). Learn how to change the Node.js version of your Functiones here: https://vercel.com/docs/runtimes#official-runtimes/node-js/node-js-version` + ); + } - await v3(builder, external, edge, split, nodeVersion || '16.x'); + if (process.env.ENABLE_VC_BUILD) { + await v3(builder, external, edge, split); } else { - if (edge || split || nodeVersion) { - throw new Error( - '`edge`, `split` and `nodeVersion` options can only be used with ENABLE_VC_BUILD' - ); + if (edge || split) { + throw new Error('`edge` and `split` options can only be used with ENABLE_VC_BUILD'); } await v1(builder, external); @@ -206,9 +205,8 @@ async function v1(builder, external) { * @param {string[]} external * @param {boolean} edge * @param {boolean} split - * @param {'16.x' | '14.x' | '12.x'} nodeVersion */ -async function v3(builder, external, edge, split, nodeVersion) { +async function v3(builder, external, edge, split) { const dir = '.vercel/output'; const tmp = builder.getBuildDirectory('vercel-tmp'); @@ -256,6 +254,7 @@ async function v3(builder, external, edge, split, nodeVersion) { async function generate_serverless_function(name, pattern, generate_manifest) { const tmp = builder.getBuildDirectory(`vercel-tmp/${name}`); const relativePath = posix.relative(tmp, builder.getServerDirectory()); + const nodeVersion = getNodeVersion(); builder.copy(`${files}/serverless.js`, `${tmp}/serverless.js`, { replace: { @@ -272,8 +271,7 @@ async function v3(builder, external, edge, split, nodeVersion) { await esbuild.build({ entryPoints: [`${tmp}/serverless.js`], outfile: `${dirs.functions}/${name}.func/index.js`, - target: - nodeVersion === '12.x' ? 'node12.22' : nodeVersion === '14.x' ? 'node14.19' : 'node16.15', + target: `node${nodeVersion.full}`, bundle: true, platform: 'node', format: 'esm', @@ -283,7 +281,7 @@ async function v3(builder, external, edge, split, nodeVersion) { write( `${dirs.functions}/${name}.func/.vc-config.json`, JSON.stringify({ - runtime: `nodejs${nodeVersion}`, + runtime: `nodejs${nodeVersion.major}.x`, handler: 'index.js', launcherType: 'Nodejs' }) @@ -395,3 +393,14 @@ function write(file, data) { writeFileSync(file, data); } + +function getNodeVersion() { + const full = process.version.slice(1); // 'v16.5.0' --> '16.5.0' + const major = parseInt(full.split('.')[0]); // '16.5.0' --> 16 + + if (!Number.isFinite(major)) { + throw new Error('There was an error getting the current Node version'); + } + + return { major, full }; +} From 38f5707a54b52e0444786cad08e2109da9c571fc Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 13 May 2022 17:25:38 -0400 Subject: [PATCH 09/10] put check inside get_node_version --- packages/adapter-vercel/index.js | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/packages/adapter-vercel/index.js b/packages/adapter-vercel/index.js index 7992d144c417..64b36ff9f38c 100644 --- a/packages/adapter-vercel/index.js +++ b/packages/adapter-vercel/index.js @@ -86,13 +86,6 @@ export default function ({ external = [], edge, split } = {}) { name: '@sveltejs/adapter-vercel', async adapt(builder) { - const nodeVersion = getNodeVersion(); - if (nodeVersion.major < 14) { - throw new Error( - `SvelteKit only support Node.js version 14 or greater (v${nodeVersion.full} was detected). Learn how to change the Node.js version of your Functiones here: https://vercel.com/docs/runtimes#official-runtimes/node-js/node-js-version` - ); - } - if (process.env.ENABLE_VC_BUILD) { await v3(builder, external, edge, split); } else { @@ -394,12 +387,12 @@ function write(file, data) { writeFileSync(file, data); } -function getNodeVersion() { +function get_node_version() { const full = process.version.slice(1); // 'v16.5.0' --> '16.5.0' const major = parseInt(full.split('.')[0]); // '16.5.0' --> 16 - if (!Number.isFinite(major)) { - throw new Error('There was an error getting the current Node version'); + if (major < 14) { + throw new Error(`SvelteKit only support Node.js version 14 or greater (currently using v${full}). Consult the documentation: https://vercel.com/docs/runtimes#official-runtimes/node-js/node-js-version`) } return { major, full }; From 419dc8df6fdfc1411d66cc1e68e079f19cc9d86e Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 13 May 2022 17:26:15 -0400 Subject: [PATCH 10/10] use esm everywhere, base target on env for v1 output as well as v3 --- packages/adapter-vercel/index.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/adapter-vercel/index.js b/packages/adapter-vercel/index.js index 64b36ff9f38c..e246c8891c23 100644 --- a/packages/adapter-vercel/index.js +++ b/packages/adapter-vercel/index.js @@ -104,6 +104,8 @@ export default function ({ external = [], edge, split } = {}) { * @param {string[]} external */ async function v1(builder, external) { + const node_version = get_node_version(); + const dir = '.vercel_build_output'; const tmp = builder.getBuildDirectory('vercel-tmp'); @@ -139,13 +141,14 @@ async function v1(builder, external) { await esbuild.build({ entryPoints: [`${tmp}/serverless.js`], outfile: `${dirs.lambda}/index.js`, - target: 'node14', + target: `node${node_version.full}`, bundle: true, platform: 'node', - external + external, + format: 'esm' }); - writeFileSync(`${dirs.lambda}/package.json`, JSON.stringify({ type: 'commonjs' })); + writeFileSync(`${dirs.lambda}/package.json`, JSON.stringify({ type: 'module' })); builder.log.minor('Copying assets...'); @@ -200,6 +203,8 @@ async function v1(builder, external) { * @param {boolean} split */ async function v3(builder, external, edge, split) { + const node_version = get_node_version(); + const dir = '.vercel/output'; const tmp = builder.getBuildDirectory('vercel-tmp'); @@ -247,7 +252,6 @@ async function v3(builder, external, edge, split) { async function generate_serverless_function(name, pattern, generate_manifest) { const tmp = builder.getBuildDirectory(`vercel-tmp/${name}`); const relativePath = posix.relative(tmp, builder.getServerDirectory()); - const nodeVersion = getNodeVersion(); builder.copy(`${files}/serverless.js`, `${tmp}/serverless.js`, { replace: { @@ -264,7 +268,7 @@ async function v3(builder, external, edge, split) { await esbuild.build({ entryPoints: [`${tmp}/serverless.js`], outfile: `${dirs.functions}/${name}.func/index.js`, - target: `node${nodeVersion.full}`, + target: `node${node_version.full}`, bundle: true, platform: 'node', format: 'esm', @@ -274,7 +278,7 @@ async function v3(builder, external, edge, split) { write( `${dirs.functions}/${name}.func/.vc-config.json`, JSON.stringify({ - runtime: `nodejs${nodeVersion.major}.x`, + runtime: `nodejs${node_version.major}.x`, handler: 'index.js', launcherType: 'Nodejs' }) @@ -309,7 +313,7 @@ async function v3(builder, external, edge, split) { await esbuild.build({ entryPoints: [`${tmp}/edge.js`], outfile: `${dirs.functions}/${name}.func/index.js`, - target: 'node14', + target: 'es2020', // TODO verify what the edge runtime supports bundle: true, platform: 'node', format: 'esm',