@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.
- package/README.md +0 -2
- package/index.js +152 -265
- 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
|
-
|
|
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
|
-
|
|
92
|
+
const dir = '.vercel/output';
|
|
125
93
|
|
|
126
|
-
|
|
94
|
+
const tmp = builder.getBuildDirectory('vercel-tmp');
|
|
127
95
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
SERVER: `${relativePath}/index.js`,
|
|
131
|
-
MANIFEST: './manifest.js'
|
|
132
|
-
}
|
|
133
|
-
});
|
|
96
|
+
builder.rimraf(dir);
|
|
97
|
+
builder.rimraf(tmp);
|
|
134
98
|
|
|
135
|
-
|
|
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
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
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
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
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
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
);
|
|
149
|
+
write(
|
|
150
|
+
`${tmp}/manifest.js`,
|
|
151
|
+
`export const manifest = ${generate_manifest({ relativePath })};\n`
|
|
152
|
+
);
|
|
274
153
|
|
|
275
|
-
|
|
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
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
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
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
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
|
-
|
|
237
|
+
builder.log.minor('Copying assets...');
|
|
353
238
|
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
239
|
+
builder.writeStatic(dirs.static);
|
|
240
|
+
builder.writeClient(dirs.static);
|
|
241
|
+
builder.writePrerendered(dirs.static);
|
|
357
242
|
|
|
358
|
-
|
|
243
|
+
builder.log.minor('Writing routes...');
|
|
359
244
|
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
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
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
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.
|
|
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.
|
|
30
|
+
"@sveltejs/kit": "1.0.0-next.372",
|
|
31
31
|
"@types/node": "^16.11.36",
|
|
32
|
-
"typescript": "^4.7.
|
|
32
|
+
"typescript": "^4.7.4"
|
|
33
33
|
},
|
|
34
34
|
"scripts": {
|
|
35
35
|
"lint": "eslint --ignore-path .gitignore \"**/*.{ts,js,svelte}\" && npm run check-format",
|