@sveltejs/kit 1.0.0-next.29 → 1.0.0-next.292

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 (82) hide show
  1. package/README.md +12 -9
  2. package/assets/app/env.js +20 -0
  3. package/assets/app/navigation.js +24 -0
  4. package/assets/app/paths.js +1 -0
  5. package/assets/app/stores.js +97 -0
  6. package/assets/client/singletons.js +13 -0
  7. package/assets/client/start.js +1523 -0
  8. package/assets/components/error.svelte +18 -2
  9. package/assets/env.js +8 -0
  10. package/assets/paths.js +13 -0
  11. package/assets/server/index.js +2797 -0
  12. package/dist/chunks/amp_hook.js +56 -0
  13. package/dist/chunks/cert.js +28154 -0
  14. package/dist/chunks/constants.js +663 -0
  15. package/dist/chunks/filesystem.js +110 -0
  16. package/dist/chunks/index.js +508 -0
  17. package/dist/chunks/index2.js +1307 -0
  18. package/dist/chunks/index3.js +118 -0
  19. package/dist/chunks/index4.js +196 -0
  20. package/dist/chunks/index5.js +242 -0
  21. package/dist/chunks/index6.js +15585 -0
  22. package/dist/chunks/index7.js +4207 -0
  23. package/dist/chunks/misc.js +3 -0
  24. package/dist/chunks/multipart-parser.js +449 -0
  25. package/dist/chunks/object.js +83 -0
  26. package/dist/chunks/sync.js +999 -0
  27. package/dist/chunks/url.js +56 -0
  28. package/dist/cli.js +1018 -85
  29. package/dist/hooks.js +28 -0
  30. package/dist/install-fetch.js +6518 -0
  31. package/dist/node.js +94 -0
  32. package/package.json +92 -54
  33. package/svelte-kit.js +2 -0
  34. package/types/ambient.d.ts +303 -0
  35. package/types/index.d.ts +166 -0
  36. package/types/internal.d.ts +318 -0
  37. package/types/private.d.ts +357 -0
  38. package/CHANGELOG.md +0 -332
  39. package/assets/runtime/app/navigation.js +0 -23
  40. package/assets/runtime/app/navigation.js.map +0 -1
  41. package/assets/runtime/app/paths.js +0 -2
  42. package/assets/runtime/app/paths.js.map +0 -1
  43. package/assets/runtime/app/stores.js +0 -78
  44. package/assets/runtime/app/stores.js.map +0 -1
  45. package/assets/runtime/internal/singletons.js +0 -15
  46. package/assets/runtime/internal/singletons.js.map +0 -1
  47. package/assets/runtime/internal/start.js +0 -591
  48. package/assets/runtime/internal/start.js.map +0 -1
  49. package/assets/runtime/utils-85ebcc60.js +0 -18
  50. package/assets/runtime/utils-85ebcc60.js.map +0 -1
  51. package/dist/api.js +0 -44
  52. package/dist/api.js.map +0 -1
  53. package/dist/build.js +0 -246
  54. package/dist/build.js.map +0 -1
  55. package/dist/cli.js.map +0 -1
  56. package/dist/colors.js +0 -37
  57. package/dist/colors.js.map +0 -1
  58. package/dist/create_app.js +0 -580
  59. package/dist/create_app.js.map +0 -1
  60. package/dist/index.js +0 -368
  61. package/dist/index.js.map +0 -1
  62. package/dist/index2.js +0 -12035
  63. package/dist/index2.js.map +0 -1
  64. package/dist/index3.js +0 -549
  65. package/dist/index3.js.map +0 -1
  66. package/dist/index4.js +0 -74
  67. package/dist/index4.js.map +0 -1
  68. package/dist/index5.js +0 -464
  69. package/dist/index5.js.map +0 -1
  70. package/dist/index6.js +0 -735
  71. package/dist/index6.js.map +0 -1
  72. package/dist/logging.js +0 -43
  73. package/dist/logging.js.map +0 -1
  74. package/dist/package.js +0 -432
  75. package/dist/package.js.map +0 -1
  76. package/dist/renderer.js +0 -2425
  77. package/dist/renderer.js.map +0 -1
  78. package/dist/standard.js +0 -101
  79. package/dist/standard.js.map +0 -1
  80. package/dist/utils.js +0 -58
  81. package/dist/utils.js.map +0 -1
  82. package/svelte-kit +0 -3
@@ -0,0 +1,118 @@
1
+ import { s } from './misc.js';
2
+ import { a as get_mime_lookup } from '../cli.js';
3
+
4
+ /**
5
+ * @param {{
6
+ * build_data: import('types').BuildData;
7
+ * relative_path: string;
8
+ * routes: import('types').RouteData[];
9
+ * format?: 'esm' | 'cjs'
10
+ * }} opts
11
+ */
12
+ function generate_manifest({ build_data, relative_path, routes, format = 'esm' }) {
13
+ /** @typedef {{ index: number, path: string }} LookupEntry */
14
+ /** @type {Map<string, LookupEntry>} */
15
+ const bundled_nodes = new Map();
16
+
17
+ // 0 and 1 are special, they correspond to the root layout and root error nodes
18
+ bundled_nodes.set(build_data.manifest_data.components[0], {
19
+ path: `${relative_path}/nodes/0.js`,
20
+ index: 0
21
+ });
22
+
23
+ bundled_nodes.set(build_data.manifest_data.components[1], {
24
+ path: `${relative_path}/nodes/1.js`,
25
+ index: 1
26
+ });
27
+
28
+ routes.forEach((route) => {
29
+ if (route.type === 'page') {
30
+ [...route.a, ...route.b].forEach((component) => {
31
+ if (component && !bundled_nodes.has(component)) {
32
+ const i = build_data.manifest_data.components.indexOf(component);
33
+
34
+ bundled_nodes.set(component, {
35
+ path: `${relative_path}/nodes/${i}.js`,
36
+ index: bundled_nodes.size
37
+ });
38
+ }
39
+ });
40
+ }
41
+ });
42
+
43
+ /** @type {(path: string) => string} */
44
+ const importer =
45
+ format === 'esm'
46
+ ? (path) => `() => import('${path}')`
47
+ : (path) => `() => Promise.resolve().then(() => require('${path}'))`;
48
+
49
+ const assets = build_data.manifest_data.assets.map((asset) => asset.file);
50
+ if (build_data.service_worker) {
51
+ assets.push(build_data.service_worker);
52
+ }
53
+
54
+ /** @param {string} id */
55
+ const get_index = (id) => id && /** @type {LookupEntry} */ (bundled_nodes.get(id)).index;
56
+
57
+ // prettier-ignore
58
+ return `{
59
+ appDir: ${s(build_data.app_dir)},
60
+ assets: new Set(${s(assets)}),
61
+ _: {
62
+ mime: ${s(get_mime_lookup(build_data.manifest_data))},
63
+ entry: ${s(build_data.client.entry)},
64
+ nodes: [
65
+ ${Array.from(bundled_nodes.values()).map(node => importer(node.path)).join(',\n\t\t\t\t')}
66
+ ],
67
+ routes: [
68
+ ${routes.map(route => {
69
+ if (route.type === 'page') {
70
+ return `{
71
+ type: 'page',
72
+ key: ${s(route.key)},
73
+ pattern: ${route.pattern},
74
+ params: ${get_params(route.params)},
75
+ path: ${route.path ? s(route.path) : null},
76
+ shadow: ${route.shadow ? importer(`${relative_path}/${build_data.server.vite_manifest[route.shadow].file}`) : null},
77
+ a: ${s(route.a.map(get_index))},
78
+ b: ${s(route.b.map(get_index))}
79
+ }`.replace(/^\t\t/gm, '');
80
+ } else {
81
+ if (!build_data.server.vite_manifest[route.file]) {
82
+ // this is necessary in cases where a .css file snuck in —
83
+ // perhaps it would be better to disallow these (and others?)
84
+ return null;
85
+ }
86
+
87
+ return `{
88
+ type: 'endpoint',
89
+ pattern: ${route.pattern},
90
+ params: ${get_params(route.params)},
91
+ load: ${importer(`${relative_path}/${build_data.server.vite_manifest[route.file].file}`)}
92
+ }`.replace(/^\t\t/gm, '');
93
+ }
94
+ }).filter(Boolean).join(',\n\t\t\t\t')}
95
+ ]
96
+ }
97
+ }`.replace(/^\t/gm, '');
98
+ }
99
+
100
+ /** @param {string[]} array */
101
+ function get_params(array) {
102
+ // given an array of params like `['x', 'y', 'z']` for
103
+ // src/routes/[x]/[y]/[z]/svelte, create a function
104
+ // that turns a RexExpMatchArray into ({ x, y, z })
105
+ return array.length
106
+ ? '(m) => ({ ' +
107
+ array
108
+ .map((param, i) => {
109
+ return param.startsWith('...')
110
+ ? `${param.slice(3)}: m[${i + 1}] || ''`
111
+ : `${param}: m[${i + 1}]`;
112
+ })
113
+ .join(', ') +
114
+ '})'
115
+ : 'null';
116
+ }
117
+
118
+ export { generate_manifest as g };
@@ -0,0 +1,196 @@
1
+ import { $ } from '../cli.js';
2
+ import { r as rimraf, m as mkdirp, c as copy } from './filesystem.js';
3
+ import { g as generate_manifest } from './index3.js';
4
+ import 'sade';
5
+ import 'path';
6
+ import 'child_process';
7
+ import 'net';
8
+ import 'fs';
9
+ import 'url';
10
+ import 'os';
11
+ import './misc.js';
12
+
13
+ /**
14
+ * @param {{
15
+ * config: import('types').ValidatedConfig;
16
+ * build_data: import('types').BuildData;
17
+ * prerendered: import('types').Prerendered;
18
+ * log: import('types').Logger;
19
+ * }} opts
20
+ * @returns {import('types').Builder}
21
+ */
22
+ function create_builder({ config, build_data, prerendered, log }) {
23
+ /** @type {Set<string>} */
24
+ const prerendered_paths = new Set(prerendered.paths);
25
+
26
+ /** @param {import('types').RouteData} route */
27
+ // TODO routes should come pre-filtered
28
+ function not_prerendered(route) {
29
+ if (route.type === 'page' && route.path) {
30
+ return !prerendered_paths.has(route.path);
31
+ }
32
+
33
+ return true;
34
+ }
35
+
36
+ return {
37
+ log,
38
+ rimraf,
39
+ mkdirp,
40
+ copy,
41
+
42
+ config,
43
+ prerendered,
44
+
45
+ createEntries(fn) {
46
+ const { routes } = build_data.manifest_data;
47
+
48
+ /** @type {import('types').RouteDefinition[]} */
49
+ const facades = routes.map((route) => ({
50
+ type: route.type,
51
+ segments: route.segments,
52
+ pattern: route.pattern,
53
+ methods: route.type === 'page' ? ['get'] : build_data.server.methods[route.file]
54
+ }));
55
+
56
+ const seen = new Set();
57
+
58
+ for (let i = 0; i < routes.length; i += 1) {
59
+ const route = routes[i];
60
+ const { id, filter, complete } = fn(facades[i]);
61
+
62
+ if (seen.has(id)) continue;
63
+ seen.add(id);
64
+
65
+ const group = [route];
66
+
67
+ // figure out which lower priority routes should be considered fallbacks
68
+ for (let j = i + 1; j < routes.length; j += 1) {
69
+ if (filter(facades[j])) {
70
+ group.push(routes[j]);
71
+ }
72
+ }
73
+
74
+ const filtered = new Set(group.filter(not_prerendered));
75
+
76
+ // heuristic: if /foo/[bar] is included, /foo/[bar].json should
77
+ // also be included, since the page likely needs the endpoint
78
+ filtered.forEach((route) => {
79
+ if (route.type === 'page') {
80
+ const length = route.segments.length;
81
+
82
+ const endpoint = routes.find((candidate) => {
83
+ if (candidate.segments.length !== length) return false;
84
+
85
+ for (let i = 0; i < length; i += 1) {
86
+ const a = route.segments[i];
87
+ const b = candidate.segments[i];
88
+
89
+ if (i === length - 1) {
90
+ return b.content === `${a.content}.json`;
91
+ }
92
+
93
+ if (a.content !== b.content) return false;
94
+ }
95
+ });
96
+
97
+ if (endpoint) {
98
+ filtered.add(endpoint);
99
+ }
100
+ }
101
+ });
102
+
103
+ if (filtered.size > 0) {
104
+ complete({
105
+ generateManifest: ({ relativePath, format }) =>
106
+ generate_manifest({
107
+ build_data,
108
+ relative_path: relativePath,
109
+ routes: Array.from(filtered),
110
+ format
111
+ })
112
+ });
113
+ }
114
+ }
115
+ },
116
+
117
+ generateManifest: ({ relativePath, format }) => {
118
+ return generate_manifest({
119
+ build_data,
120
+ relative_path: relativePath,
121
+ routes: build_data.manifest_data.routes.filter(not_prerendered),
122
+ format
123
+ });
124
+ },
125
+
126
+ getBuildDirectory(name) {
127
+ return `${config.kit.outDir}/${name}`;
128
+ },
129
+
130
+ getClientDirectory() {
131
+ return `${config.kit.outDir}/output/client`;
132
+ },
133
+
134
+ getServerDirectory() {
135
+ return `${config.kit.outDir}/output/server`;
136
+ },
137
+
138
+ getStaticDirectory() {
139
+ return config.kit.files.assets;
140
+ },
141
+
142
+ writeClient(dest) {
143
+ return copy(`${config.kit.outDir}/output/client`, dest, {
144
+ filter: (file) => file[0] !== '.'
145
+ });
146
+ },
147
+
148
+ writePrerendered(dest, { fallback } = {}) {
149
+ const source = `${config.kit.outDir}/output/prerendered`;
150
+ const files = [...copy(`${source}/pages`, dest), ...copy(`${source}/dependencies`, dest)];
151
+
152
+ if (fallback) {
153
+ files.push(fallback);
154
+ copy(`${source}/fallback.html`, `${dest}/${fallback}`);
155
+ }
156
+
157
+ return files;
158
+ },
159
+
160
+ writeServer(dest) {
161
+ return copy(`${config.kit.outDir}/output/server`, dest, {
162
+ filter: (file) => file[0] !== '.'
163
+ });
164
+ },
165
+
166
+ writeStatic(dest) {
167
+ return copy(config.kit.files.assets, dest);
168
+ },
169
+
170
+ // @ts-expect-error
171
+ async prerender() {
172
+ throw new Error(
173
+ 'builder.prerender() has been removed. Prerendering now takes place in the build phase — see builder.prerender and builder.writePrerendered'
174
+ );
175
+ }
176
+ };
177
+ }
178
+
179
+ /**
180
+ * @param {import('types').ValidatedConfig} config
181
+ * @param {import('types').BuildData} build_data
182
+ * @param {import('types').Prerendered} prerendered
183
+ * @param {{ log: import('types').Logger }} opts
184
+ */
185
+ async function adapt(config, build_data, prerendered, { log }) {
186
+ const { name, adapt } = config.kit.adapter;
187
+
188
+ console.log($.bold().cyan(`\n> Using ${name}`));
189
+
190
+ const builder = create_builder({ config, build_data, prerendered, log });
191
+ await adapt(builder);
192
+
193
+ log.success('done');
194
+ }
195
+
196
+ export { adapt };
@@ -0,0 +1,242 @@
1
+ import fs__default from 'fs';
2
+ import http from 'http';
3
+ import https from 'https';
4
+ import { join } from 'path';
5
+ import { S as SVELTE_KIT_ASSETS, s as sirv } from './constants.js';
6
+ import { pathToFileURL } from 'url';
7
+ import { getRequest, setResponse } from '../node.js';
8
+ import { installFetch } from '../install-fetch.js';
9
+ import { n as normalize_path } from './url.js';
10
+ import 'querystring';
11
+ import 'stream';
12
+ import 'node:http';
13
+ import 'node:https';
14
+ import 'node:zlib';
15
+ import 'node:stream';
16
+ import 'node:util';
17
+ import 'node:url';
18
+ import 'net';
19
+
20
+ /** @typedef {import('http').IncomingMessage} Req */
21
+ /** @typedef {import('http').ServerResponse} Res */
22
+ /** @typedef {(req: Req, res: Res, next: () => void) => void} Handler */
23
+
24
+ /**
25
+ * @param {string} dir
26
+ * @returns {Handler}
27
+ */
28
+ const mutable = (dir) =>
29
+ fs__default.existsSync(dir)
30
+ ? sirv(dir, {
31
+ etag: true,
32
+ maxAge: 0
33
+ })
34
+ : (req, res, next) => next();
35
+
36
+ /**
37
+ * @param {{
38
+ * port: number;
39
+ * host?: string;
40
+ * config: import('types').ValidatedConfig;
41
+ * https?: boolean;
42
+ * cwd?: string;
43
+ * }} opts
44
+ */
45
+ async function preview({ port, host, config, https: use_https = false }) {
46
+ installFetch();
47
+
48
+ const { paths } = config.kit;
49
+ const base = paths.base;
50
+ const assets = paths.assets ? SVELTE_KIT_ASSETS : paths.base;
51
+
52
+ const etag = `"${Date.now()}"`;
53
+
54
+ const index_file = join(config.kit.outDir, 'output/server/index.js');
55
+ const manifest_file = join(config.kit.outDir, 'output/server/manifest.js');
56
+
57
+ /** @type {import('types').ServerModule} */
58
+ const { Server, override } = await import(pathToFileURL(index_file).href);
59
+ const { manifest } = await import(pathToFileURL(manifest_file).href);
60
+
61
+ override({
62
+ paths: { base, assets },
63
+ prerendering: false,
64
+ protocol: use_https ? 'https' : 'http',
65
+ read: (file) => fs__default.readFileSync(join(config.kit.files.assets, file))
66
+ });
67
+
68
+ const server = new Server(manifest);
69
+
70
+ const handle = compose([
71
+ // files in `static`
72
+ scoped(assets, mutable(config.kit.files.assets)),
73
+
74
+ // immutable generated client assets
75
+ scoped(
76
+ assets,
77
+ sirv(join(config.kit.outDir, 'output/client'), {
78
+ maxAge: 31536000,
79
+ immutable: true
80
+ })
81
+ ),
82
+
83
+ // prerendered dependencies
84
+ scoped(base, mutable(join(config.kit.outDir, 'output/prerendered/dependencies'))),
85
+
86
+ // prerendered pages (we can't just use sirv because we need to
87
+ // preserve the correct trailingSlash behaviour)
88
+ scoped(base, (req, res, next) => {
89
+ let if_none_match_value = req.headers['if-none-match'];
90
+
91
+ if (if_none_match_value?.startsWith('W/"')) {
92
+ if_none_match_value = if_none_match_value.substring(2);
93
+ }
94
+
95
+ if (if_none_match_value === etag) {
96
+ res.statusCode = 304;
97
+ res.end();
98
+ return;
99
+ }
100
+
101
+ const { pathname, search } = new URL(/** @type {string} */ (req.url), 'http://dummy');
102
+
103
+ const normalized = normalize_path(pathname, config.kit.trailingSlash);
104
+
105
+ if (normalized !== pathname) {
106
+ res.writeHead(307, {
107
+ location: base + normalized + search
108
+ });
109
+ res.end();
110
+ return;
111
+ }
112
+
113
+ // only treat this as a page if it doesn't include an extension
114
+ if (pathname === '/' || /\/[^./]+\/?$/.test(pathname)) {
115
+ const file = join(
116
+ config.kit.outDir,
117
+ 'output/prerendered/pages' + pathname + (pathname.endsWith('/') ? 'index.html' : '.html')
118
+ );
119
+
120
+ if (fs__default.existsSync(file)) {
121
+ res.writeHead(200, {
122
+ 'content-type': 'text/html',
123
+ etag
124
+ });
125
+
126
+ fs__default.createReadStream(file).pipe(res);
127
+ return;
128
+ }
129
+ }
130
+
131
+ next();
132
+ }),
133
+
134
+ // SSR
135
+ async (req, res) => {
136
+ const protocol = use_https ? 'https' : 'http';
137
+ const host = req.headers['host'];
138
+
139
+ let request;
140
+
141
+ try {
142
+ request = await getRequest(`${protocol}://${host}`, req);
143
+ } catch (/** @type {any} */ err) {
144
+ res.statusCode = err.status || 400;
145
+ return res.end(err.reason || 'Invalid request body');
146
+ }
147
+
148
+ setResponse(res, await server.respond(request));
149
+ }
150
+ ]);
151
+
152
+ const vite_config = (config.kit.vite && (await config.kit.vite())) || {};
153
+
154
+ const http_server = await get_server(use_https, vite_config, (req, res) => {
155
+ if (req.url == null) {
156
+ throw new Error('Invalid request url');
157
+ }
158
+
159
+ handle(req, res);
160
+ });
161
+
162
+ return new Promise((fulfil) => {
163
+ http_server.listen(port, host || '0.0.0.0', () => {
164
+ fulfil(http_server);
165
+ });
166
+ });
167
+ }
168
+
169
+ /**
170
+ * @param {boolean} use_https
171
+ * @param {import('vite').UserConfig} user_config
172
+ * @param {(req: http.IncomingMessage, res: http.ServerResponse) => void} handler
173
+ * @returns {Promise<import('net').Server>}
174
+ */
175
+ async function get_server(use_https, user_config, handler) {
176
+ /** @type {https.ServerOptions} */
177
+ const https_options = {};
178
+
179
+ if (use_https) {
180
+ const secure_opts = user_config.server
181
+ ? /** @type {import('tls').SecureContextOptions} */ (user_config.server.https)
182
+ : {};
183
+
184
+ if (secure_opts.key && secure_opts.cert) {
185
+ https_options.key = secure_opts.key.toString();
186
+ https_options.cert = secure_opts.cert.toString();
187
+ } else {
188
+ https_options.key = https_options.cert = (await import('./cert.js')).createCertificate();
189
+ }
190
+ }
191
+
192
+ return use_https
193
+ ? https.createServer(/** @type {https.ServerOptions} */ (https_options), handler)
194
+ : http.createServer(handler);
195
+ }
196
+
197
+ /** @param {Handler[]} handlers */
198
+ function compose(handlers) {
199
+ /**
200
+ * @param {Req} req
201
+ * @param {Res} res
202
+ */
203
+ return (req, res) => {
204
+ /** @param {number} i */
205
+ function next(i) {
206
+ const handler = handlers[i];
207
+
208
+ if (handler) {
209
+ handler(req, res, () => next(i + 1));
210
+ } else {
211
+ res.statusCode = 404;
212
+ res.end('Not found');
213
+ }
214
+ }
215
+
216
+ next(0);
217
+ };
218
+ }
219
+
220
+ /**
221
+ * @param {string} scope
222
+ * @param {Handler} handler
223
+ * @returns {Handler}
224
+ */
225
+ function scoped(scope, handler) {
226
+ if (scope === '') return handler;
227
+
228
+ return (req, res, next) => {
229
+ if (req.url?.startsWith(scope)) {
230
+ const original_url = req.url;
231
+ req.url = req.url.slice(scope.length);
232
+ handler(req, res, () => {
233
+ req.url = original_url;
234
+ next();
235
+ });
236
+ } else {
237
+ next();
238
+ }
239
+ };
240
+ }
241
+
242
+ export { preview };