@sveltejs/adapter-vercel 1.0.0-next.59 → 1.0.0-next.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +0 -2
  2. package/index.js +152 -265
  3. package/package.json +3 -3
package/README.md CHANGED
@@ -6,8 +6,6 @@ If you're using [adapter-auto](../adapter-auto), you don't need to install this
6
6
 
7
7
  ## Usage
8
8
 
9
- > The `edge` and `split` options depend on the Vercel Build Output API which is currently in beta. For now, you must opt in by visiting `https://vercel.com/[YOUR_USERNAME]/[YOUR_PROJECT]/settings/environment-variables` and adding `ENABLE_VC_BUILD` with the value `1`.
10
-
11
9
  Add `"@sveltejs/adapter-vercel": "next"` to the `devDependencies` in your `package.json` and run `npm install`.
12
10
 
13
11
  Then in your `svelte.config.js`:
package/index.js CHANGED
@@ -81,296 +81,183 @@ const redirects = {
81
81
  ]
82
82
  };
83
83
 
84
- const files = fileURLToPath(new URL('./files', import.meta.url).href);
85
-
86
84
  /** @type {import('.').default} **/
87
85
  export default function ({ external = [], edge, split } = {}) {
88
86
  return {
89
87
  name: '@sveltejs/adapter-vercel',
90
88
 
91
89
  async adapt(builder) {
92
- if (process.env.ENABLE_VC_BUILD) {
93
- await v3(builder, external, edge, split);
94
- } else {
95
- if (edge || split) {
96
- throw new Error('`edge` and `split` options can only be used with ENABLE_VC_BUILD');
97
- }
98
-
99
- await v1(builder, external);
100
- }
101
- }
102
- };
103
- }
104
-
105
- /**
106
- * @param {import('@sveltejs/kit').Builder} builder
107
- * @param {string[]} external
108
- */
109
- async function v1(builder, external) {
110
- const node_version = get_node_version();
111
-
112
- const dir = '.vercel_build_output';
113
-
114
- const tmp = builder.getBuildDirectory('vercel-tmp');
115
-
116
- builder.rimraf(dir);
117
- builder.rimraf(tmp);
118
-
119
- const dirs = {
120
- static: `${dir}/static`,
121
- lambda: `${dir}/functions/node/render`
122
- };
90
+ const node_version = get_node_version();
123
91
 
124
- builder.log.minor('Generating serverless function...');
92
+ const dir = '.vercel/output';
125
93
 
126
- const relativePath = path.posix.relative(tmp, builder.getServerDirectory());
94
+ const tmp = builder.getBuildDirectory('vercel-tmp');
127
95
 
128
- builder.copy(`${files}/serverless.js`, `${tmp}/serverless.js`, {
129
- replace: {
130
- SERVER: `${relativePath}/index.js`,
131
- MANIFEST: './manifest.js'
132
- }
133
- });
96
+ builder.rimraf(dir);
97
+ builder.rimraf(tmp);
134
98
 
135
- fs.writeFileSync(
136
- `${tmp}/manifest.js`,
137
- `export const manifest = ${builder.generateManifest({
138
- relativePath
139
- })};\n`
140
- );
99
+ const files = fileURLToPath(new URL('./files', import.meta.url).href);
141
100
 
142
- await esbuild.build({
143
- entryPoints: [`${tmp}/serverless.js`],
144
- outfile: `${dirs.lambda}/index.js`,
145
- target: `node${node_version.full}`,
146
- bundle: true,
147
- platform: 'node',
148
- external,
149
- format: 'cjs',
150
- sourcemap: 'linked'
151
- });
152
-
153
- fs.writeFileSync(`${dirs.lambda}/package.json`, JSON.stringify({ type: 'commonjs' }));
154
-
155
- builder.log.minor('Copying assets...');
156
-
157
- builder.writeStatic(dirs.static);
158
- builder.writeClient(dirs.static);
159
- builder.writePrerendered(dirs.static);
160
-
161
- builder.log.minor('Writing routes...');
162
-
163
- builder.mkdirp(`${dir}/config`);
164
-
165
- const prerendered_pages = Array.from(builder.prerendered.pages, ([src, page]) => ({
166
- src,
167
- dest: page.file
168
- }));
101
+ const dirs = {
102
+ static: `${dir}/static`,
103
+ functions: `${dir}/functions`
104
+ };
169
105
 
170
- const prerendered_redirects = Array.from(builder.prerendered.redirects, ([src, redirect]) => ({
171
- src,
172
- headers: {
173
- Location: redirect.location
174
- },
175
- status: redirect.status
176
- }));
177
-
178
- fs.writeFileSync(
179
- `${dir}/config/routes.json`,
180
- JSON.stringify([
181
- ...redirects[builder.config.kit.trailingSlash],
182
- ...prerendered_pages,
183
- ...prerendered_redirects,
184
- {
185
- src: `/${builder.config.kit.appDir}/immutable/.+`,
186
- headers: {
187
- 'cache-control': 'public, immutable, max-age=31536000'
106
+ const prerendered_redirects = Array.from(
107
+ builder.prerendered.redirects,
108
+ ([src, redirect]) => ({
109
+ src,
110
+ headers: {
111
+ Location: redirect.location
112
+ },
113
+ status: redirect.status
114
+ })
115
+ );
116
+
117
+ /** @type {any[]} */
118
+ const routes = [
119
+ ...redirects[builder.config.kit.trailingSlash],
120
+ ...prerendered_redirects,
121
+ {
122
+ src: `/${builder.config.kit.appDir}/.+`,
123
+ headers: {
124
+ 'cache-control': 'public, immutable, max-age=31536000'
125
+ }
126
+ },
127
+ {
128
+ handle: 'filesystem'
188
129
  }
189
- },
190
- {
191
- handle: 'filesystem'
192
- },
193
- {
194
- src: '/.*',
195
- dest: '.vercel/functions/render'
196
- }
197
- ])
198
- );
199
- }
200
-
201
- /**
202
- * @param {import('@sveltejs/kit').Builder} builder
203
- * @param {string[]} external
204
- * @param {boolean} edge
205
- * @param {boolean} split
206
- */
207
- async function v3(builder, external, edge, split) {
208
- const node_version = get_node_version();
209
-
210
- const dir = '.vercel/output';
211
-
212
- const tmp = builder.getBuildDirectory('vercel-tmp');
213
-
214
- builder.rimraf(dir);
215
- builder.rimraf(tmp);
216
-
217
- const files = fileURLToPath(new URL('./files', import.meta.url).href);
218
-
219
- const dirs = {
220
- static: `${dir}/static`,
221
- functions: `${dir}/functions`
222
- };
223
-
224
- const prerendered_redirects = Array.from(builder.prerendered.redirects, ([src, redirect]) => ({
225
- src,
226
- headers: {
227
- Location: redirect.location
228
- },
229
- status: redirect.status
230
- }));
231
-
232
- /** @type {any[]} */
233
- const routes = [
234
- ...redirects[builder.config.kit.trailingSlash],
235
- ...prerendered_redirects,
236
- {
237
- src: `/${builder.config.kit.appDir}/.+`,
238
- headers: {
239
- 'cache-control': 'public, immutable, max-age=31536000'
240
- }
241
- },
242
- {
243
- handle: 'filesystem'
244
- }
245
- ];
246
-
247
- builder.log.minor('Generating serverless function...');
248
-
249
- /**
250
- * @param {string} name
251
- * @param {string} pattern
252
- * @param {(options: { relativePath: string }) => string} generate_manifest
253
- */
254
- async function generate_serverless_function(name, pattern, generate_manifest) {
255
- const relativePath = path.posix.relative(tmp, builder.getServerDirectory());
256
-
257
- builder.copy(`${files}/serverless.js`, `${tmp}/index.js`, {
258
- replace: {
259
- SERVER: `${relativePath}/index.js`,
260
- MANIFEST: './manifest.js'
261
- }
262
- });
263
-
264
- write(
265
- `${tmp}/manifest.js`,
266
- `export const manifest = ${generate_manifest({ relativePath })};\n`
267
- );
130
+ ];
131
+
132
+ builder.log.minor('Generating serverless function...');
133
+
134
+ /**
135
+ * @param {string} name
136
+ * @param {string} pattern
137
+ * @param {(options: { relativePath: string }) => string} generate_manifest
138
+ */
139
+ async function generate_serverless_function(name, pattern, generate_manifest) {
140
+ const relativePath = path.posix.relative(tmp, builder.getServerDirectory());
141
+
142
+ builder.copy(`${files}/serverless.js`, `${tmp}/index.js`, {
143
+ replace: {
144
+ SERVER: `${relativePath}/index.js`,
145
+ MANIFEST: './manifest.js'
146
+ }
147
+ });
268
148
 
269
- await create_function_bundle(
270
- `${tmp}/index.js`,
271
- `${dirs.functions}/${name}.func`,
272
- `nodejs${node_version.major}.x`
273
- );
149
+ write(
150
+ `${tmp}/manifest.js`,
151
+ `export const manifest = ${generate_manifest({ relativePath })};\n`
152
+ );
274
153
 
275
- routes.push({ src: pattern, dest: `/${name}` });
276
- }
154
+ await create_function_bundle(
155
+ `${tmp}/index.js`,
156
+ `${dirs.functions}/${name}.func`,
157
+ `nodejs${node_version.major}.x`
158
+ );
277
159
 
278
- /**
279
- * @param {string} name
280
- * @param {string} pattern
281
- * @param {(options: { relativePath: string }) => string} generate_manifest
282
- */
283
- async function generate_edge_function(name, pattern, generate_manifest) {
284
- const tmp = builder.getBuildDirectory(`vercel-tmp/${name}`);
285
- const relativePath = path.posix.relative(tmp, builder.getServerDirectory());
286
-
287
- builder.copy(`${files}/edge.js`, `${tmp}/edge.js`, {
288
- replace: {
289
- SERVER: `${relativePath}/index.js`,
290
- MANIFEST: './manifest.js'
160
+ routes.push({ src: pattern, dest: `/${name}` });
291
161
  }
292
- });
293
162
 
294
- write(
295
- `${tmp}/manifest.js`,
296
- `export const manifest = ${generate_manifest({ relativePath })};\n`
297
- );
298
-
299
- await esbuild.build({
300
- entryPoints: [`${tmp}/edge.js`],
301
- outfile: `${dirs.functions}/${name}.func/index.js`,
302
- target: 'es2020', // TODO verify what the edge runtime supports
303
- bundle: true,
304
- platform: 'node',
305
- format: 'esm',
306
- external,
307
- sourcemap: 'linked'
308
- });
309
-
310
- write(
311
- `${dirs.functions}/${name}.func/.vc-config.json`,
312
- JSON.stringify({
313
- runtime: 'edge',
314
- entrypoint: 'index.js'
315
- // TODO expose envVarsInUse
316
- })
317
- );
318
-
319
- routes.push({ src: pattern, dest: `/${name}` });
320
- }
321
-
322
- const generate_function = edge ? generate_edge_function : generate_serverless_function;
323
-
324
- if (split) {
325
- await builder.createEntries((route) => {
326
- return {
327
- id: route.pattern.toString(), // TODO is `id` necessary?
328
- filter: (other) => route.pattern.toString() === other.pattern.toString(),
329
- complete: async (entry) => {
330
- let sliced_pattern = route.pattern
331
- .toString()
332
- // remove leading / and trailing $/
333
- .slice(1, -2)
334
- // replace escaped \/ with /
335
- .replace(/\\\//g, '/');
336
-
337
- // replace the root route "^/" with "^/?"
338
- if (sliced_pattern === '^/') {
339
- sliced_pattern = '^/?';
163
+ /**
164
+ * @param {string} name
165
+ * @param {string} pattern
166
+ * @param {(options: { relativePath: string }) => string} generate_manifest
167
+ */
168
+ async function generate_edge_function(name, pattern, generate_manifest) {
169
+ const tmp = builder.getBuildDirectory(`vercel-tmp/${name}`);
170
+ const relativePath = path.posix.relative(tmp, builder.getServerDirectory());
171
+
172
+ builder.copy(`${files}/edge.js`, `${tmp}/edge.js`, {
173
+ replace: {
174
+ SERVER: `${relativePath}/index.js`,
175
+ MANIFEST: './manifest.js'
340
176
  }
177
+ });
178
+
179
+ write(
180
+ `${tmp}/manifest.js`,
181
+ `export const manifest = ${generate_manifest({ relativePath })};\n`
182
+ );
183
+
184
+ await esbuild.build({
185
+ entryPoints: [`${tmp}/edge.js`],
186
+ outfile: `${dirs.functions}/${name}.func/index.js`,
187
+ target: 'es2020', // TODO verify what the edge runtime supports
188
+ bundle: true,
189
+ platform: 'node',
190
+ format: 'esm',
191
+ external,
192
+ sourcemap: 'linked'
193
+ });
194
+
195
+ write(
196
+ `${dirs.functions}/${name}.func/.vc-config.json`,
197
+ JSON.stringify({
198
+ runtime: 'edge',
199
+ entrypoint: 'index.js'
200
+ // TODO expose envVarsInUse
201
+ })
202
+ );
203
+
204
+ routes.push({ src: pattern, dest: `/${name}` });
205
+ }
341
206
 
342
- const src = `${sliced_pattern}(?:/__data.json)?$`; // TODO adding /__data.json is a temporary workaround — those endpoints should be treated as distinct routes
343
-
344
- await generate_function(route.id || 'index', src, entry.generateManifest);
345
- }
346
- };
347
- });
348
- } else {
349
- await generate_function('render', '/.*', builder.generateManifest);
350
- }
207
+ const generate_function = edge ? generate_edge_function : generate_serverless_function;
208
+
209
+ if (split) {
210
+ await builder.createEntries((route) => {
211
+ return {
212
+ id: route.pattern.toString(), // TODO is `id` necessary?
213
+ filter: (other) => route.pattern.toString() === other.pattern.toString(),
214
+ complete: async (entry) => {
215
+ let sliced_pattern = route.pattern
216
+ .toString()
217
+ // remove leading / and trailing $/
218
+ .slice(1, -2)
219
+ // replace escaped \/ with /
220
+ .replace(/\\\//g, '/');
221
+
222
+ // replace the root route "^/" with "^/?"
223
+ if (sliced_pattern === '^/') {
224
+ sliced_pattern = '^/?';
225
+ }
226
+
227
+ const src = `${sliced_pattern}(?:/__data.json)?$`; // TODO adding /__data.json is a temporary workaround — those endpoints should be treated as distinct routes
228
+
229
+ await generate_function(route.id || 'index', src, entry.generateManifest);
230
+ }
231
+ };
232
+ });
233
+ } else {
234
+ await generate_function('render', '/.*', builder.generateManifest);
235
+ }
351
236
 
352
- builder.log.minor('Copying assets...');
237
+ builder.log.minor('Copying assets...');
353
238
 
354
- builder.writeStatic(dirs.static);
355
- builder.writeClient(dirs.static);
356
- builder.writePrerendered(dirs.static);
239
+ builder.writeStatic(dirs.static);
240
+ builder.writeClient(dirs.static);
241
+ builder.writePrerendered(dirs.static);
357
242
 
358
- builder.log.minor('Writing routes...');
243
+ builder.log.minor('Writing routes...');
359
244
 
360
- /** @type {Record<string, { path: string }>} */
361
- const overrides = {};
362
- builder.prerendered.pages.forEach((page, src) => {
363
- overrides[page.file] = { path: src.slice(1) };
364
- });
245
+ /** @type {Record<string, { path: string }>} */
246
+ const overrides = {};
247
+ builder.prerendered.pages.forEach((page, src) => {
248
+ overrides[page.file] = { path: src.slice(1) };
249
+ });
365
250
 
366
- write(
367
- `${dir}/config.json`,
368
- JSON.stringify({
369
- version: 3,
370
- routes,
371
- overrides
372
- })
373
- );
251
+ write(
252
+ `${dir}/config.json`,
253
+ JSON.stringify({
254
+ version: 3,
255
+ routes,
256
+ overrides
257
+ })
258
+ );
259
+ }
260
+ };
374
261
  }
375
262
 
376
263
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sveltejs/adapter-vercel",
3
- "version": "1.0.0-next.59",
3
+ "version": "1.0.0-next.61",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/sveltejs/kit",
@@ -27,9 +27,9 @@
27
27
  "esbuild": "^0.14.42"
28
28
  },
29
29
  "devDependencies": {
30
- "@sveltejs/kit": "1.0.0-next.354",
30
+ "@sveltejs/kit": "1.0.0-next.372",
31
31
  "@types/node": "^16.11.36",
32
- "typescript": "^4.7.2"
32
+ "typescript": "^4.7.4"
33
33
  },
34
34
  "scripts": {
35
35
  "lint": "eslint --ignore-path .gitignore \"**/*.{ts,js,svelte}\" && npm run check-format",