Skip to content

Commit 7a4b351

Browse files
author
Rich Harris
authored
Adapter bundle (#1091)
* tinkering * lint * simplify vercel adapter * note to self * expose @sveltejs/kit/install-fetch for adapters * use install-fetch in vercel adapter * update netlify adapter * ignore netlify folders * lint * lint * use install-fetch in adapter-node * changesets
1 parent 120f6e6 commit 7a4b351

File tree

24 files changed

+143
-143
lines changed

24 files changed

+143
-143
lines changed

.changeset/light-keys-mix.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/adapter-node': patch
3+
---
4+
5+
Use install-fetch helper

.changeset/smart-mugs-chew.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/kit': patch
3+
---
4+
5+
Expose install-fetch subpackage for adapters to use

.changeset/smooth-shoes-mix.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@sveltejs/adapter-netlify': patch
3+
'@sveltejs/adapter-vercel': patch
4+
---
5+
6+
Bundle serverless functions with esbuild

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ yarn.lock
88
/packages/create-svelte/template/CHANGELOG.md
99
.env
1010
.vercel_build_output
11+
.netlify
1112
.svelte
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/* /.netlify/functions/render 200
Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
1-
'use strict';
1+
import '@sveltejs/kit/install-fetch'; // eslint-disable-line import/no-unresolved
22

3-
import { URLSearchParams } from 'url';
4-
import { render } from './app.mjs'; // eslint-disable-line import/no-unresolved
5-
import fetch, { Response, Request, Headers } from 'node-fetch';
6-
7-
// provide server-side fetch
8-
globalThis.fetch = fetch;
9-
globalThis.Response = Response;
10-
globalThis.Request = Request;
11-
globalThis.Headers = Headers;
3+
// TODO hardcoding the relative location makes this brittle
4+
import { render } from '../output/server/app.js'; // eslint-disable-line import/no-unresolved
125

136
export async function handler(event) {
147
const {

packages/adapter-netlify/files/index.cjs

Lines changed: 0 additions & 6 deletions
This file was deleted.

packages/adapter-netlify/index.js

Lines changed: 49 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
const { existsSync, readFileSync, copyFileSync, writeFileSync, renameSync } = require('fs');
2-
const { resolve } = require('path');
1+
const { existsSync, readFileSync, writeFileSync } = require('fs');
2+
const { join } = require('path');
3+
const esbuild = require('esbuild');
34
const toml = require('toml');
45

56
module.exports = function () {
@@ -8,58 +9,64 @@ module.exports = function () {
89
name: '@sveltejs/adapter-netlify',
910

1011
async adapt(utils) {
11-
let netlify_config;
12-
13-
if (existsSync('netlify.toml')) {
14-
try {
15-
netlify_config = toml.parse(readFileSync('netlify.toml', 'utf-8'));
16-
} catch (err) {
17-
err.message = `Error parsing netlify.toml: ${err.message}`;
18-
throw err;
19-
}
20-
} else {
21-
// TODO offer to create one?
22-
throw new Error(
23-
'Missing a netlify.toml file. Consult https://github.com/sveltejs/kit/tree/master/packages/adapter-netlify#configuration'
24-
);
25-
}
26-
27-
if (
28-
!netlify_config.build ||
29-
!netlify_config.build.publish ||
30-
!netlify_config.build.functions
31-
) {
32-
throw new Error(
33-
'You must specify build.publish and build.functions in netlify.toml. Consult https://github.com/sveltejs/kit/tree/master/packages/adapter-netlify#configuration'
34-
);
35-
}
36-
37-
const publish = resolve(netlify_config.build.publish);
38-
const functions = resolve(netlify_config.build.functions);
12+
const { publish, functions } = validate_config().build;
3913

40-
utils.copy_static_files(publish);
41-
utils.copy_client_files(publish);
42-
utils.copy_server_files(`${functions}/render`);
14+
utils.rimraf(publish);
15+
utils.rimraf(functions);
4316

44-
// rename app to .mjs
45-
renameSync(`${functions}/render/app.js`, `${functions}/render/app.mjs`);
17+
const files = join(__dirname, 'files');
4618

47-
// copy the renderer
48-
copyFileSync(resolve(__dirname, 'files/render.js'), `${functions}/render/handler.mjs`);
19+
utils.log.minor('Generating serverless function...');
20+
utils.copy(join(files, 'entry.js'), '.svelte/netlify/entry.js');
4921

50-
// copy the entry point
51-
copyFileSync(resolve(__dirname, 'files/index.cjs'), `${functions}/render/index.js`);
22+
await esbuild.build({
23+
entryPoints: ['.svelte/netlify/entry.js'],
24+
outfile: join(functions, 'index.js'),
25+
bundle: true,
26+
platform: 'node'
27+
});
5228

53-
// create _redirects
54-
writeFileSync(`${publish}/_redirects`, '/* /.netlify/functions/render 200');
29+
writeFileSync(join(functions, 'package.json'), JSON.stringify({ type: 'commonjs' }));
5530

56-
// prerender
5731
utils.log.info('Prerendering static pages...');
5832
await utils.prerender({
5933
dest: publish
6034
});
35+
36+
utils.log.minor('Copying assets...');
37+
utils.copy_static_files(publish);
38+
utils.copy_client_files(publish);
39+
40+
utils.log.minor('Writing redirects...');
41+
utils.copy(`${files}/_redirects`, `${publish}/_redirects`);
6142
}
6243
};
6344

6445
return adapter;
6546
};
47+
48+
function validate_config() {
49+
if (existsSync('netlify.toml')) {
50+
let netlify_config;
51+
52+
try {
53+
netlify_config = toml.parse(readFileSync('netlify.toml', 'utf-8'));
54+
} catch (err) {
55+
err.message = `Error parsing netlify.toml: ${err.message}`;
56+
throw err;
57+
}
58+
59+
if (!netlify_config.build || !netlify_config.build.publish || !netlify_config.build.functions) {
60+
throw new Error(
61+
'You must specify build.publish and build.functions in netlify.toml. Consult https://github.com/sveltejs/kit/tree/master/packages/adapter-netlify#configuration'
62+
);
63+
}
64+
65+
return netlify_config;
66+
}
67+
68+
// TODO offer to create one?
69+
throw new Error(
70+
'Missing a netlify.toml file. Consult https://github.com/sveltejs/kit/tree/master/packages/adapter-netlify#configuration'
71+
);
72+
}

packages/adapter-node/src/server.js

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,11 @@
1-
import compression from 'compression';
21
import fs from 'fs';
3-
import polka from 'polka';
42
import { dirname, join } from 'path';
3+
import { fileURLToPath } from 'url';
4+
import compression from 'compression';
5+
import polka from 'polka';
56
import sirv from 'sirv';
6-
import { URL, fileURLToPath } from 'url';
7-
// eslint-disable-next-line import/no-unresolved
8-
import { get_body } from '@sveltejs/kit/http';
9-
import fetch, { Response, Request, Headers } from 'node-fetch';
10-
11-
// provide server-side fetch
12-
globalThis.fetch = fetch;
13-
globalThis.Response = Response;
14-
globalThis.Request = Request;
15-
globalThis.Headers = Headers;
7+
import { get_body } from '@sveltejs/kit/http'; // eslint-disable-line import/no-unresolved
8+
import '@sveltejs/kit/install-fetch'; // eslint-disable-line import/no-unresolved
169

1710
// App is a dynamic file built from the application layer.
1811

packages/adapter-vercel/.gitignore

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
.DS_Store
2-
node_modules
3-
/files
2+
node_modules

0 commit comments

Comments
 (0)