Skip to content

Commit aa396c2

Browse files
committed
Detect node version automatically
1 parent 817b7da commit aa396c2

File tree

4 files changed

+27
-24
lines changed

4 files changed

+27
-24
lines changed

.changeset/breezy-grapes-smash.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
'@sveltejs/adapter-vercel': patch
33
---
44

5-
You can now select a Node.js version for your serverless functions
5+
Support for Node.js 16

packages/adapter-vercel/README.md

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,6 @@ export default {
3131
// if true, will split your app into multiple functions
3232
// instead of creating a single one for the entire app
3333
split: false
34-
35-
// which version of Node.js you want your serverless
36-
// function to run on - it only works with edge=false
37-
// and ENABLE_VC_BUILD=1
38-
nodeVersion: '16.x'
3934
})
4035
}
4136
};

packages/adapter-vercel/index.d.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ type Options = {
44
edge?: boolean;
55
external?: string[];
66
split?: boolean;
7-
nodeVersion?: '16.x' | '14.x' | '12.x';
87
};
98

109
declare function plugin(options?: Options): Adapter;

packages/adapter-vercel/index.js

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -81,24 +81,23 @@ const redirects = {
8181
};
8282

8383
/** @type {import('.')} **/
84-
export default function ({ external = [], edge, split, nodeVersion } = {}) {
84+
export default function ({ external = [], edge, split } = {}) {
8585
return {
8686
name: '@sveltejs/adapter-vercel',
8787

8888
async adapt(builder) {
89-
if (process.env.ENABLE_VC_BUILD) {
90-
if (edge && nodeVersion) {
91-
throw new Error(
92-
'`nodeVersion` option can only be used with serverless functions, not edge functions'
93-
);
94-
}
89+
const nodeVersion = getNodeVersion();
90+
if (nodeVersion.major < 14) {
91+
throw new Error(
92+
`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`
93+
);
94+
}
9595

96-
await v3(builder, external, edge, split, nodeVersion || '16.x');
96+
if (process.env.ENABLE_VC_BUILD) {
97+
await v3(builder, external, edge, split);
9798
} else {
98-
if (edge || split || nodeVersion) {
99-
throw new Error(
100-
'`edge`, `split` and `nodeVersion` options can only be used with ENABLE_VC_BUILD'
101-
);
99+
if (edge || split) {
100+
throw new Error('`edge` and `split` options can only be used with ENABLE_VC_BUILD');
102101
}
103102

104103
await v1(builder, external);
@@ -206,9 +205,8 @@ async function v1(builder, external) {
206205
* @param {string[]} external
207206
* @param {boolean} edge
208207
* @param {boolean} split
209-
* @param {'16.x' | '14.x' | '12.x'} nodeVersion
210208
*/
211-
async function v3(builder, external, edge, split, nodeVersion) {
209+
async function v3(builder, external, edge, split) {
212210
const dir = '.vercel/output';
213211

214212
const tmp = builder.getBuildDirectory('vercel-tmp');
@@ -256,6 +254,7 @@ async function v3(builder, external, edge, split, nodeVersion) {
256254
async function generate_serverless_function(name, pattern, generate_manifest) {
257255
const tmp = builder.getBuildDirectory(`vercel-tmp/${name}`);
258256
const relativePath = posix.relative(tmp, builder.getServerDirectory());
257+
const nodeVersion = getNodeVersion();
259258

260259
builder.copy(`${files}/serverless.js`, `${tmp}/serverless.js`, {
261260
replace: {
@@ -272,8 +271,7 @@ async function v3(builder, external, edge, split, nodeVersion) {
272271
await esbuild.build({
273272
entryPoints: [`${tmp}/serverless.js`],
274273
outfile: `${dirs.functions}/${name}.func/index.js`,
275-
target:
276-
nodeVersion === '12.x' ? 'node12.22' : nodeVersion === '14.x' ? 'node14.19' : 'node16.15',
274+
target: `node${nodeVersion.full}`,
277275
bundle: true,
278276
platform: 'node',
279277
format: 'esm',
@@ -283,7 +281,7 @@ async function v3(builder, external, edge, split, nodeVersion) {
283281
write(
284282
`${dirs.functions}/${name}.func/.vc-config.json`,
285283
JSON.stringify({
286-
runtime: `nodejs${nodeVersion}`,
284+
runtime: `nodejs${nodeVersion.major}.x`,
287285
handler: 'index.js',
288286
launcherType: 'Nodejs'
289287
})
@@ -395,3 +393,14 @@ function write(file, data) {
395393

396394
writeFileSync(file, data);
397395
}
396+
397+
function getNodeVersion() {
398+
const full = process.version.slice(1); // 'v16.5.0' --> '16.5.0'
399+
const major = parseInt(full.split('.')[0]); // '16.5.0' --> 16
400+
401+
if (!Number.isFinite(major)) {
402+
throw new Error('There was an error getting the current Node version');
403+
}
404+
405+
return { major, full };
406+
}

0 commit comments

Comments
 (0)