@sveltejs/kit 1.0.0-next.288 → 1.0.0-next.290

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.
@@ -1,836 +1,653 @@
1
1
  import fs__default from 'fs';
2
2
  import path__default from 'path';
3
+ import { e as print_config_conflicts, b as copy_assets, p as posixify, d as get_aliases, r as resolve_entry, g as get_runtime_path, l as load_template, m as mkdirp, f as rimraf } from '../cli.js';
4
+ import { d as deep_merge, a as create_app, g as generate_tsconfig, c as create_manifest_data } from './tsconfig.js';
5
+ import { g as generate_manifest } from './index3.js';
6
+ import vite from 'vite';
3
7
  import { s } from './misc.js';
4
- import { m as mkdirp, r as runtime, f as posixify } from '../cli.js';
8
+ import { svelte } from '@sveltejs/vite-plugin-svelte';
9
+ import 'sade';
10
+ import 'child_process';
11
+ import 'net';
12
+ import 'url';
13
+ import 'os';
5
14
 
6
15
  /**
7
- * Takes zero or more objects and returns a new object that has all the values
8
- * deeply merged together. None of the original objects will be mutated at any
9
- * level, and the returned object will have no references to the original
10
- * objects at any depth. If there's a conflict the last one wins, except for
11
- * arrays which will be combined.
12
- * @param {...Object} objects
13
- * @returns {[Record<string, any>, string[]]} a 2-tuple with the merged object,
14
- * and a list of merge conflicts if there were any, in dotted notation
16
+ * @param {{
17
+ * cwd: string;
18
+ * assets_base: string;
19
+ * config: import('types').ValidatedConfig
20
+ * manifest_data: import('types').ManifestData
21
+ * output_dir: string;
22
+ * service_worker_entry_file: string | null;
23
+ * }} options
24
+ * @param {import('vite').Manifest} client_manifest
15
25
  */
16
- function deep_merge(...objects) {
17
- const result = {};
18
- /** @type {string[]} */
19
- const conflicts = [];
20
- objects.forEach((o) => merge_into(result, o, conflicts));
21
- return [result, conflicts];
22
- }
26
+ async function build_service_worker(
27
+ { cwd, assets_base, config, manifest_data, output_dir, service_worker_entry_file },
28
+ client_manifest
29
+ ) {
30
+ // TODO add any assets referenced in template .html file, e.g. favicon?
31
+ const app_files = new Set();
32
+ for (const key in client_manifest) {
33
+ const { file, css } = client_manifest[key];
34
+ app_files.add(file);
35
+ if (css) {
36
+ css.forEach((file) => {
37
+ app_files.add(file);
38
+ });
39
+ }
40
+ }
23
41
 
24
- /**
25
- * normalize kit.vite.resolve.alias as an array
26
- * @param {import('vite').AliasOptions} o
27
- * @returns {import('vite').Alias[]}
28
- */
29
- function normalize_alias(o) {
30
- if (Array.isArray(o)) return o;
31
- return Object.entries(o).map(([find, replacement]) => ({ find, replacement }));
32
- }
42
+ const service_worker = `${config.kit.outDir}/generated/service-worker.js`;
33
43
 
34
- /**
35
- * Merges b into a, recursively, mutating a.
36
- * @param {Record<string, any>} a
37
- * @param {Record<string, any>} b
38
- * @param {string[]} conflicts array to accumulate conflicts in
39
- * @param {string[]} path array of property names representing the current
40
- * location in the tree
41
- */
42
- function merge_into(a, b, conflicts = [], path = []) {
43
- /**
44
- * Checks for "plain old Javascript object", typically made as an object
45
- * literal. Excludes Arrays and built-in types like Buffer.
46
- * @param {any} x
47
- */
48
- const is_plain_object = (x) => typeof x === 'object' && x.constructor === Object;
49
-
50
- for (const prop in b) {
51
- // normalize alias objects to array
52
- if (prop === 'alias' && path[path.length - 1] === 'resolve') {
53
- if (a[prop]) a[prop] = normalize_alias(a[prop]);
54
- if (b[prop]) b[prop] = normalize_alias(b[prop]);
55
- }
44
+ fs__default.writeFileSync(
45
+ service_worker,
46
+ `
47
+ export const timestamp = ${Date.now()};
48
+
49
+ export const build = [
50
+ ${Array.from(app_files)
51
+ .map((file) => `${s(`${config.kit.paths.base}/${config.kit.appDir}/${file}`)}`)
52
+ .join(',\n\t\t\t\t')}
53
+ ];
54
+
55
+ export const files = [
56
+ ${manifest_data.assets
57
+ .map((asset) => `${s(`${config.kit.paths.base}/${asset.file}`)}`)
58
+ .join(',\n\t\t\t\t')}
59
+ ];
60
+ `
61
+ .replace(/^\t{3}/gm, '')
62
+ .trim()
63
+ );
56
64
 
57
- if (is_plain_object(b[prop])) {
58
- if (!is_plain_object(a[prop])) {
59
- if (a[prop] !== undefined) {
60
- conflicts.push([...path, prop].join('.'));
65
+ /** @type {[any, string[]]} */
66
+ const [merged_config, conflicts] = deep_merge(await config.kit.vite(), {
67
+ configFile: false,
68
+ root: cwd,
69
+ base: assets_base,
70
+ build: {
71
+ lib: {
72
+ entry: service_worker_entry_file,
73
+ name: 'app',
74
+ formats: ['es']
75
+ },
76
+ rollupOptions: {
77
+ output: {
78
+ entryFileNames: 'service-worker.js'
61
79
  }
62
- a[prop] = {};
63
- }
64
- merge_into(a[prop], b[prop], conflicts, [...path, prop]);
65
- } else if (Array.isArray(b[prop])) {
66
- if (!Array.isArray(a[prop])) {
67
- if (a[prop] !== undefined) {
68
- conflicts.push([...path, prop].join('.'));
69
- }
70
- a[prop] = [];
71
- }
72
- a[prop].push(...b[prop]);
73
- } else {
74
- // Since we're inside a for/in loop which loops over enumerable
75
- // properties only, we want parity here and to check if 'a' has
76
- // enumerable-only property 'prop'. Using 'hasOwnProperty' to
77
- // exclude inherited properties is close enough. It is possible
78
- // that someone uses Object.defineProperty to create a direct,
79
- // non-enumerable property but let's not worry about that.
80
- if (Object.prototype.hasOwnProperty.call(a, prop)) {
81
- conflicts.push([...path, prop].join('.'));
80
+ },
81
+ outDir: `${output_dir}/client`,
82
+ emptyOutDir: false
83
+ },
84
+ resolve: {
85
+ alias: {
86
+ '$service-worker': service_worker,
87
+ $lib: config.kit.files.lib
82
88
  }
83
- a[prop] = b[prop];
84
89
  }
85
- }
86
- }
87
-
88
- /** @type {Map<string, string>} */
89
- const previous_contents = new Map();
90
-
91
- /**
92
- * @param {string} file
93
- * @param {string} code
94
- */
95
- function write_if_changed(file, code) {
96
- if (code !== previous_contents.get(file)) {
97
- previous_contents.set(file, code);
98
- mkdirp(path__default.dirname(file));
99
- fs__default.writeFileSync(file, code);
100
- }
101
- }
90
+ });
102
91
 
103
- /** @typedef {import('types').ManifestData} ManifestData */
92
+ print_config_conflicts(conflicts, 'kit.vite.', 'build_service_worker');
104
93
 
105
- /**
106
- * @param {{
107
- * manifest_data: ManifestData;
108
- * output: string;
109
- * cwd: string;
110
- * }} options
111
- */
112
- function create_app({ manifest_data, output, cwd = process.cwd() }) {
113
- const base = path__default.relative(cwd, output);
114
-
115
- write_if_changed(`${output}/manifest.js`, generate_client_manifest(manifest_data, base));
116
- write_if_changed(`${output}/root.svelte`, generate_app(manifest_data));
94
+ await vite.build(merged_config);
117
95
  }
118
96
 
119
97
  /**
120
- * @param {string} str
98
+ * @typedef {import('rollup').RollupOutput} RollupOutput
99
+ * @typedef {import('rollup').OutputChunk} OutputChunk
100
+ * @typedef {import('rollup').OutputAsset} OutputAsset
121
101
  */
122
- function trim(str) {
123
- return str.replace(/^\t\t/gm, '').trim();
124
- }
125
102
 
126
- /**
127
- * @param {ManifestData} manifest_data
128
- * @param {string} base
129
- */
130
- function generate_client_manifest(manifest_data, base) {
131
- /** @type {Record<string, number>} */
132
- const component_indexes = {};
103
+ /** @param {import('vite').UserConfig} config */
104
+ async function create_build(config) {
105
+ const { output } = /** @type {RollupOutput} */ (await vite.build(config));
133
106
 
134
- /** @param {string} c */
135
- const get_path = (c) => path__default.relative(base, c);
136
-
137
- const components = `[
138
- ${manifest_data.components
139
- .map((component, i) => {
140
- component_indexes[component] = i;
141
-
142
- return `() => import(${s(get_path(component))})`;
143
- })
144
- .join(',\n\t\t\t\t')}
145
- ]`.replace(/^\t/gm, '');
146
-
147
- /** @param {string[]} parts */
148
- const get_indices = (parts) =>
149
- `[${parts.map((part) => (part ? `c[${component_indexes[part]}]` : '')).join(', ')}]`;
150
-
151
- const routes = `[
152
- ${manifest_data.routes
153
- .map((route) => {
154
- if (route.type === 'page') {
155
- const params =
156
- route.params.length > 0 &&
157
- '(m) => ({ ' +
158
- route.params
159
- .map((param, i) => {
160
- return param.startsWith('...')
161
- ? `${param.slice(3)}: d(m[${i + 1}] || '')`
162
- : `${param}: d(m[${i + 1}])`;
163
- })
164
- .join(', ') +
165
- '})';
166
-
167
- const tuple = [route.pattern, get_indices(route.a), get_indices(route.b)];
168
-
169
- // optional items
170
- if (params || route.shadow) tuple.push(params || 'null');
171
- if (route.shadow) tuple.push('1');
172
-
173
- return `// ${route.a[route.a.length - 1]}\n\t\t[${tuple.join(', ')}]`;
174
- }
175
- })
176
- .filter(Boolean)
177
- .join(',\n\n\t\t')}
178
- ]`.replace(/^\t/gm, '');
179
-
180
- return trim(`
181
- const c = ${components};
182
-
183
- const d = decodeURIComponent;
107
+ const chunks = output.filter(
108
+ /** @returns {output is OutputChunk} */ (output) => output.type === 'chunk'
109
+ );
184
110
 
185
- export const routes = ${routes};
111
+ const assets = output.filter(
112
+ /** @returns {output is OutputAsset} */ (output) => output.type === 'asset'
113
+ );
186
114
 
187
- // we import the root layout/error components eagerly, so that
188
- // connectivity errors after initialisation don't nuke the app
189
- export const fallback = [c[0](), c[1]()];
190
- `);
115
+ return { chunks, assets };
191
116
  }
192
117
 
193
118
  /**
194
- * @param {ManifestData} manifest_data
119
+ * @param {string} file
120
+ * @param {import('vite').Manifest} manifest
121
+ * @param {Set<string>} css
122
+ * @param {Set<string>} js
123
+ * @returns
195
124
  */
196
- function generate_app(manifest_data) {
197
- // TODO remove default layout altogether
198
-
199
- const max_depth = Math.max(
200
- ...manifest_data.routes.map((route) =>
201
- route.type === 'page' ? route.a.filter(Boolean).length : 0
202
- ),
203
- 1
204
- );
125
+ function find_deps(file, manifest, js, css) {
126
+ const chunk = manifest[file];
205
127
 
206
- const levels = [];
207
- for (let i = 0; i <= max_depth; i += 1) {
208
- levels.push(i);
209
- }
210
-
211
- let l = max_depth;
128
+ if (js.has(chunk.file)) return;
129
+ js.add(chunk.file);
212
130
 
213
- let pyramid = `<svelte:component this={components[${l}]} {...(props_${l} || {})}/>`;
214
-
215
- while (l--) {
216
- pyramid = `
217
- {#if components[${l + 1}]}
218
- <svelte:component this={components[${l}]} {...(props_${l} || {})}>
219
- ${pyramid.replace(/\n/g, '\n\t\t\t\t\t')}
220
- </svelte:component>
221
- {:else}
222
- <svelte:component this={components[${l}]} {...(props_${l} || {})} />
223
- {/if}
224
- `
225
- .replace(/^\t\t\t/gm, '')
226
- .trim();
131
+ if (chunk.css) {
132
+ chunk.css.forEach((file) => css.add(file));
227
133
  }
228
134
 
229
- return trim(`
230
- <!-- This file is generated by @sveltejs/kit — do not edit it! -->
231
- <script>
232
- import { setContext, afterUpdate, onMount } from 'svelte';
233
-
234
- // stores
235
- export let stores;
236
- export let page;
237
-
238
- export let components;
239
- ${levels.map((l) => `export let props_${l} = null;`).join('\n\t\t\t')}
240
-
241
- setContext('__svelte__', stores);
242
-
243
- $: stores.page.set(page);
244
- afterUpdate(stores.page.notify);
245
-
246
- let mounted = false;
247
- let navigated = false;
248
- let title = null;
249
-
250
- onMount(() => {
251
- const unsubscribe = stores.page.subscribe(() => {
252
- if (mounted) {
253
- navigated = true;
254
- title = document.title || 'untitled page';
255
- }
256
- });
257
-
258
- mounted = true;
259
- return unsubscribe;
260
- });
261
- </script>
262
-
263
- ${pyramid.replace(/\n/g, '\n\t\t')}
264
-
265
- {#if mounted}
266
- <div id="svelte-announcer" aria-live="assertive" aria-atomic="true" style="position: absolute; left: 0; top: 0; clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden; white-space: nowrap; width: 1px; height: 1px">
267
- {#if navigated}
268
- {title}
269
- {/if}
270
- </div>
271
- {/if}
272
- `);
135
+ if (chunk.imports) {
136
+ chunk.imports.forEach((file) => find_deps(file, manifest, js, css));
137
+ }
273
138
  }
274
139
 
275
140
  /**
276
- * @param typeMap [Object] Map of MIME type -> Array[extensions]
277
- * @param ...
141
+ * @param {{
142
+ * cwd: string;
143
+ * assets_base: string;
144
+ * config: import('types').ValidatedConfig
145
+ * manifest_data: import('types').ManifestData
146
+ * output_dir: string;
147
+ * client_entry_file: string;
148
+ * service_worker_entry_file: string | null;
149
+ * service_worker_register: boolean;
150
+ * }} options
278
151
  */
279
- function Mime$1() {
280
- this._types = Object.create(null);
281
- this._extensions = Object.create(null);
282
-
283
- for (let i = 0; i < arguments.length; i++) {
284
- this.define(arguments[i]);
285
- }
152
+ async function build_client({
153
+ cwd,
154
+ assets_base,
155
+ config,
156
+ manifest_data,
157
+ output_dir,
158
+ client_entry_file
159
+ }) {
160
+ process.env.VITE_SVELTEKIT_APP_VERSION = config.kit.version.name;
161
+ process.env.VITE_SVELTEKIT_APP_VERSION_FILE = `${config.kit.appDir}/version.json`;
162
+ process.env.VITE_SVELTEKIT_APP_VERSION_POLL_INTERVAL = `${config.kit.version.pollInterval}`;
163
+
164
+ create_app({
165
+ config,
166
+ manifest_data,
167
+ cwd
168
+ });
286
169
 
287
- this.define = this.define.bind(this);
288
- this.getType = this.getType.bind(this);
289
- this.getExtension = this.getExtension.bind(this);
290
- }
170
+ copy_assets(path__default.join(config.kit.outDir, 'runtime'));
291
171
 
292
- /**
293
- * Define mimetype -> extension mappings. Each key is a mime-type that maps
294
- * to an array of extensions associated with the type. The first extension is
295
- * used as the default extension for the type.
296
- *
297
- * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']});
298
- *
299
- * If a type declares an extension that has already been defined, an error will
300
- * be thrown. To suppress this error and force the extension to be associated
301
- * with the new type, pass `force`=true. Alternatively, you may prefix the
302
- * extension with "*" to map the type to extension, without mapping the
303
- * extension to the type.
304
- *
305
- * e.g. mime.define({'audio/wav', ['wav']}, {'audio/x-wav', ['*wav']});
306
- *
307
- *
308
- * @param map (Object) type definitions
309
- * @param force (Boolean) if true, force overriding of existing definitions
310
- */
311
- Mime$1.prototype.define = function(typeMap, force) {
312
- for (let type in typeMap) {
313
- let extensions = typeMap[type].map(function(t) {
314
- return t.toLowerCase();
315
- });
316
- type = type.toLowerCase();
317
-
318
- for (let i = 0; i < extensions.length; i++) {
319
- const ext = extensions[i];
320
-
321
- // '*' prefix = not the preferred type for this extension. So fixup the
322
- // extension, and skip it.
323
- if (ext[0] === '*') {
324
- continue;
325
- }
326
-
327
- if (!force && (ext in this._types)) {
328
- throw new Error(
329
- 'Attempt to change mapping for "' + ext +
330
- '" extension from "' + this._types[ext] + '" to "' + type +
331
- '". Pass `force=true` to allow this, otherwise remove "' + ext +
332
- '" from the list of extensions for "' + type + '".'
333
- );
334
- }
335
-
336
- this._types[ext] = type;
337
- }
338
-
339
- // Use first extension as default
340
- if (force || !this._extensions[type]) {
341
- const ext = extensions[0];
342
- this._extensions[type] = (ext[0] !== '*') ? ext : ext.substr(1);
343
- }
344
- }
345
- };
172
+ process.env.VITE_SVELTEKIT_AMP = config.kit.amp ? 'true' : '';
346
173
 
347
- /**
348
- * Lookup a mime type based on extension
349
- */
350
- Mime$1.prototype.getType = function(path) {
351
- path = String(path);
352
- let last = path.replace(/^.*[/\\]/, '').toLowerCase();
353
- let ext = last.replace(/^.*\./, '').toLowerCase();
174
+ const client_out_dir = `${output_dir}/client/${config.kit.appDir}`;
354
175
 
355
- let hasPath = last.length < path.length;
356
- let hasDot = ext.length < last.length - 1;
176
+ /** @type {Record<string, string>} */
177
+ const input = {
178
+ start: path__default.resolve(cwd, client_entry_file)
179
+ };
357
180
 
358
- return (hasDot || !hasPath) && this._types[ext] || null;
359
- };
181
+ // This step is optional Vite/Rollup will create the necessary chunks
182
+ // for everything regardless — but it means that entry chunks reflect
183
+ // their location in the source code, which is helpful for debugging
184
+ manifest_data.components.forEach((file) => {
185
+ const resolved = path__default.resolve(cwd, file);
186
+ const relative = path__default.relative(config.kit.files.routes, resolved);
187
+
188
+ const name = relative.startsWith('..')
189
+ ? path__default.basename(file)
190
+ : posixify(path__default.join('pages', relative));
191
+ input[name] = resolved;
192
+ });
360
193
 
361
- /**
362
- * Return file extension associated with a mime type
363
- */
364
- Mime$1.prototype.getExtension = function(type) {
365
- type = /^\s*([^;\s]*)/.test(type) && RegExp.$1;
366
- return type && this._extensions[type.toLowerCase()] || null;
367
- };
194
+ /** @type {[any, string[]]} */
195
+ const [merged_config, conflicts] = deep_merge(await config.kit.vite(), {
196
+ configFile: false,
197
+ root: cwd,
198
+ base: assets_base,
199
+ build: {
200
+ cssCodeSplit: true,
201
+ manifest: true,
202
+ outDir: client_out_dir,
203
+ polyfillDynamicImport: false,
204
+ rollupOptions: {
205
+ input,
206
+ output: {
207
+ entryFileNames: '[name]-[hash].js',
208
+ chunkFileNames: 'chunks/[name]-[hash].js',
209
+ assetFileNames: 'assets/[name]-[hash][extname]'
210
+ },
211
+ preserveEntrySignatures: 'strict'
212
+ }
213
+ },
214
+ resolve: {
215
+ alias: get_aliases(config)
216
+ },
217
+ plugins: [
218
+ svelte({
219
+ extensions: config.extensions,
220
+ // In AMP mode, we know that there are no conditional component imports. In that case, we
221
+ // don't need to include CSS for components that are imported but unused, so we can just
222
+ // include rendered CSS.
223
+ // This would also apply if hydrate and router are both false, but we don't know if one
224
+ // has been enabled at the page level, so we don't do anything there.
225
+ emitCss: !config.kit.amp,
226
+ compilerOptions: {
227
+ hydratable: !!config.kit.browser.hydrate
228
+ }
229
+ })
230
+ ]
231
+ });
368
232
 
369
- var Mime_1 = Mime$1;
233
+ print_config_conflicts(conflicts, 'kit.vite.', 'build_client');
370
234
 
371
- var standard = {"application/andrew-inset":["ez"],"application/applixware":["aw"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomdeleted+xml":["atomdeleted"],"application/atomsvc+xml":["atomsvc"],"application/atsc-dwd+xml":["dwd"],"application/atsc-held+xml":["held"],"application/atsc-rsat+xml":["rsat"],"application/bdoc":["bdoc"],"application/calendar+xml":["xcs"],"application/ccxml+xml":["ccxml"],"application/cdfx+xml":["cdfx"],"application/cdmi-capability":["cdmia"],"application/cdmi-container":["cdmic"],"application/cdmi-domain":["cdmid"],"application/cdmi-object":["cdmio"],"application/cdmi-queue":["cdmiq"],"application/cu-seeme":["cu"],"application/dash+xml":["mpd"],"application/davmount+xml":["davmount"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["es","ecma"],"application/emma+xml":["emma"],"application/emotionml+xml":["emotionml"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/express":["exp"],"application/fdt+xml":["fdt"],"application/font-tdpfr":["pfr"],"application/geo+json":["geojson"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/gzip":["gz"],"application/hjson":["hjson"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/its+xml":["its"],"application/java-archive":["jar","war","ear"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["js","mjs"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/ld+json":["jsonld"],"application/lgr+xml":["lgr"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/manifest+json":["webmanifest"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mmt-aei+xml":["maei"],"application/mmt-usd+xml":["musd"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["mp4s","m4p"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/n-quads":["nq"],"application/n-triples":["nt"],"application/node":["cjs"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application/oxps":["oxps"],"application/p2p-overlay+xml":["relo"],"application/patch-ops-error+xml":["xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-signature":["asc","sig"],"application/pics-rules":["prf"],"application/pkcs10":["p10"],"application/pkcs7-mime":["p7m","p7c"],"application/pkcs7-signature":["p7s"],"application/pkcs8":["p8"],"application/pkix-attr-cert":["ac"],"application/pkix-cert":["cer"],"application/pkix-crl":["crl"],"application/pkix-pkipath":["pkipath"],"application/pkixcmp":["pki"],"application/pls+xml":["pls"],"application/postscript":["ai","eps","ps"],"application/provenance+xml":["provx"],"application/pskc+xml":["pskcxml"],"application/raml+yaml":["raml"],"application/rdf+xml":["rdf","owl"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/route-apd+xml":["rapd"],"application/route-s-tsid+xml":["sls"],"application/route-usd+xml":["rusd"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"application/sbml+xml":["sbml"],"application/scvp-cv-request":["scq"],"application/scvp-cv-response":["scs"],"application/scvp-vp-request":["spq"],"application/scvp-vp-response":["spp"],"application/sdp":["sdp"],"application/senml+xml":["senmlx"],"application/sensml+xml":["sensmlx"],"application/set-payment-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/sieve":["siv","sieve"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/swid+xml":["swidtag"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/toml":["toml"],"application/trig":["trig"],"application/ttml+xml":["ttml"],"application/ubjson":["ubj"],"application/urc-ressheet+xml":["rsheet"],"application/urc-targetdesc+xml":["td"],"application/voicexml+xml":["vxml"],"application/wasm":["wasm"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/xaml+xml":["xaml"],"application/xcap-att+xml":["xav"],"application/xcap-caps+xml":["xca"],"application/xcap-diff+xml":["xdf"],"application/xcap-el+xml":["xel"],"application/xcap-ns+xml":["xns"],"application/xenc+xml":["xenc"],"application/xhtml+xml":["xhtml","xht"],"application/xliff+xml":["xlf"],"application/xml":["xml","xsl","xsd","rng"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["*xsl","xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"audio/3gpp":["*3gpp"],"audio/adpcm":["adp"],"audio/amr":["amr"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mobile-xmf":["mxmf"],"audio/mp3":["*mp3"],"audio/mp4":["m4a","mp4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx","opus"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/wav":["wav"],"audio/wave":["*wav"],"audio/webm":["weba"],"audio/xm":["xm"],"font/collection":["ttc"],"font/otf":["otf"],"font/ttf":["ttf"],"font/woff":["woff"],"font/woff2":["woff2"],"image/aces":["exr"],"image/apng":["apng"],"image/avif":["avif"],"image/bmp":["bmp"],"image/cgm":["cgm"],"image/dicom-rle":["drle"],"image/emf":["emf"],"image/fits":["fits"],"image/g3fax":["g3"],"image/gif":["gif"],"image/heic":["heic"],"image/heic-sequence":["heics"],"image/heif":["heif"],"image/heif-sequence":["heifs"],"image/hej2k":["hej2"],"image/hsj2":["hsj2"],"image/ief":["ief"],"image/jls":["jls"],"image/jp2":["jp2","jpg2"],"image/jpeg":["jpeg","jpg","jpe"],"image/jph":["jph"],"image/jphc":["jhc"],"image/jpm":["jpm"],"image/jpx":["jpx","jpf"],"image/jxr":["jxr"],"image/jxra":["jxra"],"image/jxrs":["jxrs"],"image/jxs":["jxs"],"image/jxsc":["jxsc"],"image/jxsi":["jxsi"],"image/jxss":["jxss"],"image/ktx":["ktx"],"image/ktx2":["ktx2"],"image/png":["png"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/t38":["t38"],"image/tiff":["tif","tiff"],"image/tiff-fx":["tfx"],"image/webp":["webp"],"image/wmf":["wmf"],"message/disposition-notification":["disposition-notification"],"message/global":["u8msg"],"message/global-delivery-status":["u8dsn"],"message/global-disposition-notification":["u8mdn"],"message/global-headers":["u8hdr"],"message/rfc822":["eml","mime"],"model/3mf":["3mf"],"model/gltf+json":["gltf"],"model/gltf-binary":["glb"],"model/iges":["igs","iges"],"model/mesh":["msh","mesh","silo"],"model/mtl":["mtl"],"model/obj":["obj"],"model/step+xml":["stpx"],"model/step+zip":["stpz"],"model/step-xml+zip":["stpxz"],"model/stl":["stl"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["*x3db","x3dbz"],"model/x3d+fastinfoset":["x3db"],"model/x3d+vrml":["*x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"model/x3d-vrml":["x3dv"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee","litcoffee"],"text/css":["css"],"text/csv":["csv"],"text/html":["html","htm","shtml"],"text/jade":["jade"],"text/jsx":["jsx"],"text/less":["less"],"text/markdown":["markdown","md"],"text/mathml":["mml"],"text/mdx":["mdx"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/richtext":["rtx"],"text/rtf":["*rtf"],"text/sgml":["sgml","sgm"],"text/shex":["shex"],"text/slim":["slim","slm"],"text/spdx":["spdx"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vtt":["vtt"],"text/xml":["*xml"],"text/yaml":["yaml","yml"],"video/3gpp":["3gp","3gpp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/iso.segment":["m4s"],"video/jpeg":["jpgv"],"video/jpm":["*jpm","jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/webm":["webm"]};
235
+ const { chunks, assets } = await create_build(merged_config);
372
236
 
373
- var other = {"application/prs.cww":["cww"],"application/vnd.1000minds.decision-model+xml":["1km"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["xfdf"],"application/vnd.ahead.space":["ahead"],"application/vnd.airzip.filesecure.azf":["azf"],"application/vnd.airzip.filesecure.azs":["azs"],"application/vnd.amazon.ebook":["azw"],"application/vnd.americandynamics.acc":["acc"],"application/vnd.amiga.ami":["ami"],"application/vnd.android.package-archive":["apk"],"application/vnd.anser-web-certificate-issue-initiation":["cii"],"application/vnd.anser-web-funds-transfer-initiation":["fti"],"application/vnd.antix.game-component":["atx"],"application/vnd.apple.installer+xml":["mpkg"],"application/vnd.apple.keynote":["key"],"application/vnd.apple.mpegurl":["m3u8"],"application/vnd.apple.numbers":["numbers"],"application/vnd.apple.pages":["pages"],"application/vnd.apple.pkpass":["pkpass"],"application/vnd.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.balsamiq.bmml+xml":["bmml"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"application/vnd.citationstyles.style+xml":["csl"],"application/vnd.claymore":["cla"],"application/vnd.cloanto.rp9":["rp9"],"application/vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"application/vnd.cluetrust.cartomobile-config":["c11amc"],"application/vnd.cluetrust.cartomobile-config-pkg":["c11amz"],"application/vnd.commonspace":["csp"],"application/vnd.contact.cmsg":["cdbcmsg"],"application/vnd.cosmocaller":["cmc"],"application/vnd.crick.clicker":["clkx"],"application/vnd.crick.clicker.keyboard":["clkk"],"application/vnd.crick.clicker.palette":["clkp"],"application/vnd.crick.clicker.template":["clkt"],"application/vnd.crick.clicker.wordbank":["clkw"],"application/vnd.criticaltools.wbs+xml":["wbs"],"application/vnd.ctc-posml":["pml"],"application/vnd.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dbf":["dbf"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"application/vnd.enliven":["nml"],"application/vnd.epson.esf":["esf"],"application/vnd.epson.msf":["msf"],"application/vnd.epson.quickanime":["qam"],"application/vnd.epson.salt":["slt"],"application/vnd.epson.ssf":["ssf"],"application/vnd.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"application/vnd.framemaker":["fm","frame","maker","book"],"application/vnd.frogans.fnc":["fnc"],"application/vnd.frogans.ltf":["ltf"],"application/vnd.fsc.weblaunch":["fsc"],"application/vnd.fujitsu.oasys":["oas"],"application/vnd.fujitsu.oasys2":["oa2"],"application/vnd.fujitsu.oasys3":["oa3"],"application/vnd.fujitsu.oasysgp":["fg5"],"application/vnd.fujitsu.oasysprs":["bh2"],"application/vnd.fujixerox.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"application/vnd.geogebra.file":["ggb"],"application/vnd.geogebra.tool":["ggt"],"application/vnd.geometry-explorer":["gex","gre"],"application/vnd.geonext":["gxt"],"application/vnd.geoplan":["g2w"],"application/vnd.geospace":["g3w"],"application/vnd.gmx":["gmx"],"application/vnd.google-apps.document":["gdoc"],"application/vnd.google-apps.presentation":["gslides"],"application/vnd.google-apps.spreadsheet":["gsheet"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.grafeq":["gqf","gqs"],"application/vnd.groove-account":["gac"],"application/vnd.groove-help":["ghf"],"application/vnd.groove-identity-message":["gim"],"application/vnd.groove-injector":["grv"],"application/vnd.groove-tool-message":["gtm"],"application/vnd.groove-tool-template":["tpl"],"application/vnd.groove-vcard":["vcg"],"application/vnd.hal+xml":["hal"],"application/vnd.handheld-entertainment+xml":["zmm"],"application/vnd.hbci":["hbci"],"application/vnd.hhe.lesson-player":["les"],"application/vnd.hp-hpgl":["hpgl"],"application/vnd.hp-hpid":["hpid"],"application/vnd.hp-hps":["hps"],"application/vnd.hp-jlyt":["jlt"],"application/vnd.hp-pcl":["pcl"],"application/vnd.hp-pclxl":["pclxl"],"application/vnd.hydrostatix.sof-data":["sfd-hdstx"],"application/vnd.ibm.minipay":["mpy"],"application/vnd.ibm.modcap":["afp","listafp","list3820"],"application/vnd.ibm.rights-management":["irm"],"application/vnd.ibm.secure-container":["sc"],"application/vnd.iccprofile":["icc","icm"],"application/vnd.igloader":["igl"],"application/vnd.immervision-ivp":["ivp"],"application/vnd.immervision-ivu":["ivu"],"application/vnd.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"application/vnd.ipunplugged.rcprofile":["rcprofile"],"application/vnd.irepository.package+xml":["irp"],"application/vnd.is-xpr":["xpr"],"application/vnd.isac.fcs":["fcs"],"application/vnd.jam":["jam"],"application/vnd.jcp.javame.midlet-rms":["rms"],"application/vnd.jisp":["jisp"],"application/vnd.joost.joda-archive":["joda"],"application/vnd.kahootz":["ktz","ktr"],"application/vnd.kde.karbon":["karbon"],"application/vnd.kde.kchart":["chrt"],"application/vnd.kde.kformula":["kfo"],"application/vnd.kde.kivio":["flw"],"application/vnd.kde.kontour":["kon"],"application/vnd.kde.kpresenter":["kpr","kpt"],"application/vnd.kde.kspread":["ksp"],"application/vnd.kde.kword":["kwd","kwt"],"application/vnd.kenameaapp":["htke"],"application/vnd.kidspiration":["kia"],"application/vnd.kinar":["kne","knp"],"application/vnd.koan":["skp","skd","skt","skm"],"application/vnd.kodak-descriptor":["sse"],"application/vnd.las.las+xml":["lasxml"],"application/vnd.llamagraphics.life-balance.desktop":["lbd"],"application/vnd.llamagraphics.life-balance.exchange+xml":["lbe"],"application/vnd.lotus-1-2-3":["123"],"application/vnd.lotus-approach":["apr"],"application/vnd.lotus-freelance":["pre"],"application/vnd.lotus-notes":["nsf"],"application/vnd.lotus-organizer":["org"],"application/vnd.lotus-screencam":["scm"],"application/vnd.lotus-wordpro":["lwp"],"application/vnd.macports.portpkg":["portpkg"],"application/vnd.mapbox-vector-tile":["mvt"],"application/vnd.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"application/vnd.mobius.daf":["daf"],"application/vnd.mobius.dis":["dis"],"application/vnd.mobius.mbk":["mbk"],"application/vnd.mobius.mqy":["mqy"],"application/vnd.mobius.msl":["msl"],"application/vnd.mobius.plc":["plc"],"application/vnd.mobius.txf":["txf"],"application/vnd.mophun.application":["mpn"],"application/vnd.mophun.certificate":["mpc"],"application/vnd.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"application/vnd.ms-cab-compressed":["cab"],"application/vnd.ms-excel":["xls","xlm","xla","xlc","xlt","xlw"],"application/vnd.ms-excel.addin.macroenabled.12":["xlam"],"application/vnd.ms-excel.sheet.binary.macroenabled.12":["xlsb"],"application/vnd.ms-excel.sheet.macroenabled.12":["xlsm"],"application/vnd.ms-excel.template.macroenabled.12":["xltm"],"application/vnd.ms-fontobject":["eot"],"application/vnd.ms-htmlhelp":["chm"],"application/vnd.ms-ims":["ims"],"application/vnd.ms-lrm":["lrm"],"application/vnd.ms-officetheme":["thmx"],"application/vnd.ms-outlook":["msg"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["*stl"],"application/vnd.ms-powerpoint":["ppt","pps","pot"],"application/vnd.ms-powerpoint.addin.macroenabled.12":["ppam"],"application/vnd.ms-powerpoint.presentation.macroenabled.12":["pptm"],"application/vnd.ms-powerpoint.slide.macroenabled.12":["sldm"],"application/vnd.ms-powerpoint.slideshow.macroenabled.12":["ppsm"],"application/vnd.ms-powerpoint.template.macroenabled.12":["potm"],"application/vnd.ms-project":["mpp","mpt"],"application/vnd.ms-word.document.macroenabled.12":["docm"],"application/vnd.ms-word.template.macroenabled.12":["dotm"],"application/vnd.ms-works":["wps","wks","wcm","wdb"],"application/vnd.ms-wpl":["wpl"],"application/vnd.ms-xpsdocument":["xps"],"application/vnd.mseq":["mseq"],"application/vnd.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.ac+xml":["*ac"],"application/vnd.nokia.n-gage.data":["ngdat"],"application/vnd.nokia.n-gage.symbian.install":["n-gage"],"application/vnd.nokia.radio-preset":["rpst"],"application/vnd.nokia.radio-presets":["rpss"],"application/vnd.novadigm.edm":["edm"],"application/vnd.novadigm.edx":["edx"],"application/vnd.novadigm.ext":["ext"],"application/vnd.oasis.opendocument.chart":["odc"],"application/vnd.oasis.opendocument.chart-template":["otc"],"application/vnd.oasis.opendocument.database":["odb"],"application/vnd.oasis.opendocument.formula":["odf"],"application/vnd.oasis.opendocument.formula-template":["odft"],"application/vnd.oasis.opendocument.graphics":["odg"],"application/vnd.oasis.opendocument.graphics-template":["otg"],"application/vnd.oasis.opendocument.image":["odi"],"application/vnd.oasis.opendocument.image-template":["oti"],"application/vnd.oasis.opendocument.presentation":["odp"],"application/vnd.oasis.opendocument.presentation-template":["otp"],"application/vnd.oasis.opendocument.spreadsheet":["ods"],"application/vnd.oasis.opendocument.spreadsheet-template":["ots"],"application/vnd.oasis.opendocument.text":["odt"],"application/vnd.oasis.opendocument.text-master":["odm"],"application/vnd.oasis.opendocument.text-template":["ott"],"application/vnd.oasis.opendocument.text-web":["oth"],"application/vnd.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openblox.game+xml":["obgx"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openstreetmap.data+xml":["osm"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.rar":["rar"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"application/vnd.seemail":["see"],"application/vnd.sema":["sema"],"application/vnd.semd":["semd"],"application/vnd.semf":["semf"],"application/vnd.shana.informed.formdata":["ifm"],"application/vnd.shana.informed.formtemplate":["itp"],"application/vnd.shana.informed.interchange":["iif"],"application/vnd.shana.informed.package":["ipk"],"application/vnd.simtech-mindmapper":["twd","twds"],"application/vnd.smaf":["mmf"],"application/vnd.smart.teacher":["teacher"],"application/vnd.software602.filler.form+xml":["fo"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.sun.wadl+xml":["wadl"],"application/vnd.sun.xml.calc":["sxc"],"application/vnd.sun.xml.calc.template":["stc"],"application/vnd.sun.xml.draw":["sxd"],"application/vnd.sun.xml.draw.template":["std"],"application/vnd.sun.xml.impress":["sxi"],"application/vnd.sun.xml.impress.template":["sti"],"application/vnd.sun.xml.math":["sxm"],"application/vnd.sun.xml.writer":["sxw"],"application/vnd.sun.xml.writer.global":["sxg"],"application/vnd.sun.xml.writer.template":["stw"],"application/vnd.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"application/vnd.symbian.install":["sis","sisx"],"application/vnd.syncml+xml":["xsm"],"application/vnd.syncml.dm+wbxml":["bdm"],"application/vnd.syncml.dm+xml":["xdm"],"application/vnd.syncml.dmddf+xml":["ddf"],"application/vnd.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"application/vnd.yamaha.hv-dic":["hvd"],"application/vnd.yamaha.hv-script":["hvs"],"application/vnd.yamaha.hv-voice":["hvp"],"application/vnd.yamaha.openscoreformat":["osf"],"application/vnd.yamaha.openscoreformat.osfpvg+xml":["osfpvg"],"application/vnd.yamaha.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":["*dmg"],"application/x-arj":["arj"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bdoc":["*bdoc"],"application/x-bittorrent":["torrent"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-cocoa":["cco"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["*deb","udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-httpd-php":["php"],"application/x-install-instructions":["install"],"application/x-iso9660-image":["*iso"],"application/x-iwork-keynote-sffkey":["*key"],"application/x-iwork-numbers-sffnumbers":["*numbers"],"application/x-iwork-pages-sffpages":["*pages"],"application/x-java-archive-diff":["jardiff"],"application/x-java-jnlp-file":["jnlp"],"application/x-keepass2":["kdbx"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-makeself":["run"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdos-program":["*exe"],"application/x-msdownload":["*exe","*dll","com","bat","*msi"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["*wmf","*wmz","*emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-ns-proxy-autoconfig":["pac"],"application/x-nzb":["nzb"],"application/x-perl":["pl","pm"],"application/x-pilot":["*prc","*pdb"],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["*rar"],"application/x-redhat-package-manager":["rpm"],"application/x-research-info-systems":["ris"],"application/x-sea":["sea"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl","tk"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["*obj"],"application/x-ustar":["ustar"],"application/x-virtualbox-hdd":["hdd"],"application/x-virtualbox-ova":["ova"],"application/x-virtualbox-ovf":["ovf"],"application/x-virtualbox-vbox":["vbox"],"application/x-virtualbox-vbox-extpack":["vbox-extpack"],"application/x-virtualbox-vdi":["vdi"],"application/x-virtualbox-vhd":["vhd"],"application/x-virtualbox-vmdk":["vmdk"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt","pem"],"application/x-xfig":["fig"],"application/x-xliff+xml":["*xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/x-aac":["aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-m4a":["*m4a"],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-realaudio":["*ra"],"audio/x-wav":["*wav"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"image/prs.btif":["btif"],"image/prs.pti":["pti"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.airzip.accelerator.azv":["azv"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":["*sub"],"image/vnd.dwg":["dwg"],"image/vnd.dxf":["dxf"],"image/vnd.fastbidsheet":["fbs"],"image/vnd.fpx":["fpx"],"image/vnd.fst":["fst"],"image/vnd.fujixerox.edmics-mmr":["mmr"],"image/vnd.fujixerox.edmics-rlc":["rlc"],"image/vnd.microsoft.icon":["ico"],"image/vnd.ms-dds":["dds"],"image/vnd.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.pco.b16":["b16"],"image/vnd.tencent.tap":["tap"],"image/vnd.valve.source.texture":["vtf"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/vnd.zbrush.pcx":["pcx"],"image/x-3ds":["3ds"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["*ico"],"image/x-jng":["jng"],"image/x-mrsid-image":["sid"],"image/x-ms-bmp":["*bmp"],"image/x-pcx":["*pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/vnd.wfa.wsc":["wsc"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["mts"],"model/vnd.opengex":["ogex"],"model/vnd.parasolid.transmit.binary":["x_b"],"model/vnd.parasolid.transmit.text":["x_t"],"model/vnd.sap.vds":["vds"],"model/vnd.usdz+zip":["usdz"],"model/vnd.valve.source.compiled-map":["bsp"],"model/vnd.vtu":["vtu"],"text/prs.lines.tag":["dsc"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"text/vnd.fly":["fly"],"text/vnd.fmi.flexstor":["flx"],"text/vnd.graphviz":["gv"],"text/vnd.in3d.3dml":["3dml"],"text/vnd.in3d.spot":["spot"],"text/vnd.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-org":["*org"],"text/x-pascal":["p","pas"],"text/x-processing":["pde"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-suse-ymp":["ymp"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]};
237
+ /** @type {import('vite').Manifest} */
238
+ const vite_manifest = JSON.parse(fs__default.readFileSync(`${client_out_dir}/manifest.json`, 'utf-8'));
374
239
 
375
- let Mime = Mime_1;
376
- var mime = new Mime(standard, other);
240
+ const entry = posixify(client_entry_file);
241
+ const entry_js = new Set();
242
+ const entry_css = new Set();
243
+ find_deps(entry, vite_manifest, entry_js, entry_css);
377
244
 
378
- /**
379
- * A portion of a file or directory name where the name has been split into
380
- * static and dynamic parts
381
- * @typedef {{
382
- * content: string;
383
- * dynamic: boolean;
384
- * rest: boolean;
385
- * }} Part
386
- * @typedef {{
387
- * basename: string;
388
- * name: string;
389
- * ext: string;
390
- * parts: Part[],
391
- * file: string;
392
- * is_dir: boolean;
393
- * is_index: boolean;
394
- * is_page: boolean;
395
- * route_suffix: string
396
- * }} Item
397
- */
245
+ fs__default.writeFileSync(
246
+ `${client_out_dir}/version.json`,
247
+ JSON.stringify({ version: process.env.VITE_SVELTEKIT_APP_VERSION })
248
+ );
398
249
 
399
- const specials = new Set(['__layout', '__layout.reset', '__error']);
250
+ return {
251
+ assets,
252
+ chunks,
253
+ entry: {
254
+ file: vite_manifest[entry].file,
255
+ js: Array.from(entry_js),
256
+ css: Array.from(entry_css)
257
+ },
258
+ vite_manifest
259
+ };
260
+ }
400
261
 
401
262
  /**
402
263
  * @param {{
264
+ * hooks: string;
403
265
  * config: import('types').ValidatedConfig;
404
- * fallback?: string;
405
- * cwd?: string;
266
+ * has_service_worker: boolean;
267
+ * runtime: string;
268
+ * template: string;
406
269
  * }} opts
407
- * @returns {import('types').ManifestData}
270
+ * @returns
408
271
  */
409
- function create_manifest_data({
410
- config,
411
- fallback = `${runtime}/components`,
412
- cwd = process.cwd()
413
- }) {
414
- /**
415
- * @param {string} file_name
416
- * @param {string} dir
417
- */
418
- function find_layout(file_name, dir) {
419
- const files = config.extensions.map((ext) => posixify(path__default.join(dir, `${file_name}${ext}`)));
420
- return files.find((file) => fs__default.existsSync(path__default.resolve(cwd, file)));
272
+ const server_template = ({ config, hooks, has_service_worker, runtime, template }) => `
273
+ import root from '__GENERATED__/root.svelte';
274
+ import { respond } from '${runtime}/server/index.js';
275
+ import { set_paths, assets, base } from '${runtime}/paths.js';
276
+ import { set_prerendering } from '${runtime}/env.js';
277
+ import * as user_hooks from ${s(hooks)};
278
+
279
+ const template = ({ head, body, assets, nonce }) => ${s(template)
280
+ .replace('%svelte.head%', '" + head + "')
281
+ .replace('%svelte.body%', '" + body + "')
282
+ .replace(/%svelte\.assets%/g, '" + assets + "')
283
+ .replace(/%svelte\.nonce%/g, '" + nonce + "')};
284
+
285
+ let read = null;
286
+
287
+ set_paths(${s(config.kit.paths)});
288
+
289
+ // this looks redundant, but the indirection allows us to access
290
+ // named imports without triggering Rollup's missing import detection
291
+ const get_hooks = hooks => ({
292
+ getSession: hooks.getSession || (() => ({})),
293
+ handle: hooks.handle || (({ event, resolve }) => resolve(event)),
294
+ handleError: hooks.handleError || (({ error }) => console.error(error.stack)),
295
+ externalFetch: hooks.externalFetch || fetch
296
+ });
297
+
298
+ let default_protocol = 'https';
299
+
300
+ // allow paths to be globally overridden
301
+ // in svelte-kit preview and in prerendering
302
+ export function override(settings) {
303
+ default_protocol = settings.protocol || default_protocol;
304
+ set_paths(settings.paths);
305
+ set_prerendering(settings.prerendering);
306
+ read = settings.read;
307
+ }
308
+
309
+ export class Server {
310
+ constructor(manifest) {
311
+ const hooks = get_hooks(user_hooks);
312
+
313
+ this.options = {
314
+ amp: ${config.kit.amp},
315
+ csp: ${s(config.kit.csp)},
316
+ dev: false,
317
+ floc: ${config.kit.floc},
318
+ get_stack: error => String(error), // for security
319
+ handle_error: (error, event) => {
320
+ hooks.handleError({
321
+ error,
322
+ event,
323
+
324
+ // TODO remove for 1.0
325
+ // @ts-expect-error
326
+ get request() {
327
+ throw new Error('request in handleError has been replaced with event. See https://github.com/sveltejs/kit/pull/3384 for details');
328
+ }
329
+ });
330
+ error.stack = this.options.get_stack(error);
331
+ },
332
+ hooks,
333
+ hydrate: ${s(config.kit.browser.hydrate)},
334
+ manifest,
335
+ method_override: ${s(config.kit.methodOverride)},
336
+ paths: { base, assets },
337
+ prefix: assets + '/${config.kit.appDir}/',
338
+ prerender: ${config.kit.prerender.enabled},
339
+ read,
340
+ root,
341
+ service_worker: ${has_service_worker ? "base + '/service-worker.js'" : 'null'},
342
+ router: ${s(config.kit.browser.router)},
343
+ template,
344
+ template_contains_nonce: ${template.includes('%svelte.nonce%')},
345
+ trailing_slash: ${s(config.kit.trailingSlash)}
346
+ };
421
347
  }
422
348
 
423
- /** @type {string[]} */
424
- const components = [];
425
-
426
- /** @type {import('types').RouteData[]} */
427
- const routes = [];
428
-
429
- const default_layout = posixify(path__default.relative(cwd, `${fallback}/layout.svelte`));
430
- const default_error = posixify(path__default.relative(cwd, `${fallback}/error.svelte`));
431
-
432
- /**
433
- * @param {string} dir
434
- * @param {string[]} parent_key
435
- * @param {Part[][]} parent_segments
436
- * @param {string[]} parent_params
437
- * @param {Array<string|undefined>} layout_stack // accumulated __layout.svelte components
438
- * @param {Array<string|undefined>} error_stack // accumulated __error.svelte components
439
- */
440
- function walk(dir, parent_key, parent_segments, parent_params, layout_stack, error_stack) {
441
- /** @type {Item[]} */
442
- let items = [];
443
- fs__default.readdirSync(dir).forEach((basename) => {
444
- const resolved = path__default.join(dir, basename);
445
- const file = posixify(path__default.relative(cwd, resolved));
446
- const is_dir = fs__default.statSync(resolved).isDirectory();
447
-
448
- const ext = config.extensions.find((ext) => basename.endsWith(ext)) || path__default.extname(basename);
449
-
450
- const name = ext ? basename.slice(0, -ext.length) : basename;
451
-
452
- // TODO remove this after a while
453
- ['layout', 'layout.reset', 'error'].forEach((reserved) => {
454
- if (name === `$${reserved}`) {
455
- const prefix = posixify(path__default.relative(cwd, dir));
456
- const bad = `${prefix}/$${reserved}${ext}`;
457
- const good = `${prefix}/__${reserved}${ext}`;
458
-
459
- throw new Error(`${bad} should be renamed ${good}`);
460
- }
461
- });
349
+ respond(request, options = {}) {
350
+ if (!(request instanceof Request)) {
351
+ throw new Error('The first argument to app.render must be a Request object. See https://github.com/sveltejs/kit/pull/3384 for details');
352
+ }
462
353
 
463
- if (basename.startsWith('__') && !specials.has(name)) {
464
- throw new Error(`Files and directories prefixed with __ are reserved (saw ${file})`);
465
- }
354
+ return respond(request, this.options, options);
355
+ }
356
+ }
357
+ `;
466
358
 
467
- if (!is_dir && !/^(\.[a-z0-9]+)+$/i.test(ext)) return null; // filter out tmp files etc
359
+ /**
360
+ * @param {{
361
+ * cwd: string;
362
+ * assets_base: string;
363
+ * config: import('types').ValidatedConfig
364
+ * manifest_data: import('types').ManifestData
365
+ * build_dir: string;
366
+ * output_dir: string;
367
+ * service_worker_entry_file: string | null;
368
+ * service_worker_register: boolean;
369
+ * }} options
370
+ * @param {{ vite_manifest: import('vite').Manifest, assets: import('rollup').OutputAsset[] }} client
371
+ */
372
+ async function build_server(
373
+ {
374
+ cwd,
375
+ assets_base,
376
+ config,
377
+ manifest_data,
378
+ build_dir,
379
+ output_dir,
380
+ service_worker_entry_file,
381
+ service_worker_register
382
+ },
383
+ client
384
+ ) {
385
+ let hooks_file = resolve_entry(config.kit.files.hooks);
386
+ if (!hooks_file || !fs__default.existsSync(hooks_file)) {
387
+ hooks_file = path__default.join(config.kit.outDir, 'build/hooks.js');
388
+ fs__default.writeFileSync(hooks_file, '');
389
+ }
468
390
 
469
- if (!config.kit.routes(file)) {
470
- return;
471
- }
391
+ /** @type {Record<string, string>} */
392
+ const input = {
393
+ index: `${build_dir}/index.js`
394
+ };
472
395
 
473
- const segment = is_dir ? basename : name;
396
+ // add entry points for every endpoint...
397
+ manifest_data.routes.forEach((route) => {
398
+ const file = route.type === 'endpoint' ? route.file : route.shadow;
474
399
 
475
- if (/\]\[/.test(segment)) {
476
- throw new Error(`Invalid route ${file} — parameters must be separated`);
477
- }
400
+ if (file) {
401
+ const resolved = path__default.resolve(cwd, file);
402
+ const relative = path__default.relative(config.kit.files.routes, resolved);
403
+ const name = posixify(path__default.join('entries/endpoints', relative.replace(/\.js$/, '')));
404
+ input[name] = resolved;
405
+ }
406
+ });
478
407
 
479
- if (count_occurrences('[', segment) !== count_occurrences(']', segment)) {
480
- throw new Error(`Invalid route ${file} — brackets are unbalanced`);
481
- }
408
+ // ...and every component used by pages
409
+ manifest_data.components.forEach((file) => {
410
+ const resolved = path__default.resolve(cwd, file);
411
+ const relative = path__default.relative(config.kit.files.routes, resolved);
482
412
 
483
- const parts = get_parts(segment, file);
484
- const is_index = is_dir ? false : basename.startsWith('index.');
485
- const is_page = config.extensions.indexOf(ext) !== -1;
486
- const route_suffix = basename.slice(basename.indexOf('.'), -ext.length);
487
-
488
- items.push({
489
- basename,
490
- name,
491
- ext,
492
- parts,
493
- file,
494
- is_dir,
495
- is_index,
496
- is_page,
497
- route_suffix
498
- });
499
- });
500
- items = items.sort(comparator);
501
-
502
- items.forEach((item) => {
503
- const key = parent_key.slice();
504
- const segments = parent_segments.slice();
505
-
506
- if (item.is_index) {
507
- if (item.route_suffix) {
508
- if (segments.length > 0) {
509
- const last_segment = segments[segments.length - 1].slice();
510
- const last_part = last_segment[last_segment.length - 1];
511
-
512
- if (last_part.dynamic) {
513
- last_segment.push({
514
- dynamic: false,
515
- rest: false,
516
- content: item.route_suffix
517
- });
518
- } else {
519
- last_segment[last_segment.length - 1] = {
520
- dynamic: false,
521
- rest: false,
522
- content: `${last_part.content}${item.route_suffix}`
523
- };
524
- }
525
-
526
- segments[segments.length - 1] = last_segment;
527
- key[key.length - 1] += item.route_suffix;
528
- } else {
529
- segments.push(item.parts);
530
- }
531
- }
532
- } else {
533
- key.push(item.name);
534
- segments.push(item.parts);
535
- }
413
+ const name = relative.startsWith('..')
414
+ ? posixify(path__default.join('entries/pages', path__default.basename(file)))
415
+ : posixify(path__default.join('entries/pages', relative));
416
+ input[name] = resolved;
417
+ });
536
418
 
537
- const params = parent_params.slice();
538
- params.push(...item.parts.filter((p) => p.dynamic).map((p) => p.content));
539
-
540
- // TODO seems slightly backwards to derive the simple segment representation
541
- // from the more complex form, rather than vice versa — maybe swap it round
542
- const simple_segments = segments.map((segment) => {
543
- return {
544
- dynamic: segment.some((part) => part.dynamic),
545
- rest: segment.some((part) => part.rest),
546
- content: segment
547
- .map((part) => (part.dynamic ? `[${part.content}]` : part.content))
548
- .join('')
549
- };
550
- });
419
+ /** @type {(file: string) => string} */
420
+ const app_relative = (file) => {
421
+ const relative_file = path__default.relative(build_dir, path__default.resolve(cwd, file));
422
+ return relative_file[0] === '.' ? relative_file : `./${relative_file}`;
423
+ };
551
424
 
552
- if (item.is_dir) {
553
- const layout_reset = find_layout('__layout.reset', item.file);
554
- const layout = find_layout('__layout', item.file);
555
- const error = find_layout('__error', item.file);
425
+ fs__default.writeFileSync(
426
+ input.index,
427
+ server_template({
428
+ config,
429
+ hooks: app_relative(hooks_file),
430
+ has_service_worker: service_worker_register && !!service_worker_entry_file,
431
+ runtime: get_runtime_path(config),
432
+ template: load_template(cwd, config)
433
+ })
434
+ );
556
435
 
557
- if (layout_reset && layout) {
558
- throw new Error(`Cannot have __layout next to __layout.reset: ${layout_reset}`);
559
- }
436
+ /** @type {import('vite').UserConfig} */
437
+ const vite_config = await config.kit.vite();
560
438
 
561
- if (layout_reset) components.push(layout_reset);
562
- if (layout) components.push(layout);
563
- if (error) components.push(error);
564
-
565
- walk(
566
- path__default.join(dir, item.basename),
567
- key,
568
- segments,
569
- params,
570
- layout_reset ? [layout_reset] : layout_stack.concat(layout),
571
- layout_reset ? [error] : error_stack.concat(error)
572
- );
573
- } else if (item.is_page) {
574
- components.push(item.file);
575
-
576
- const concatenated = layout_stack.concat(item.file);
577
- const errors = error_stack.slice();
578
-
579
- const pattern = get_pattern(segments, true);
580
-
581
- let i = concatenated.length;
582
- while (i--) {
583
- if (!errors[i] && !concatenated[i]) {
584
- errors.splice(i, 1);
585
- concatenated.splice(i, 1);
586
- }
587
- }
439
+ const default_config = {
440
+ build: {
441
+ target: 'es2020'
442
+ }
443
+ };
588
444
 
589
- i = errors.length;
590
- while (i--) {
591
- if (errors[i]) break;
445
+ // don't warn on overriding defaults
446
+ const [modified_vite_config] = deep_merge(default_config, vite_config);
447
+
448
+ /** @type {[any, string[]]} */
449
+ const [merged_config, conflicts] = deep_merge(modified_vite_config, {
450
+ configFile: false,
451
+ root: cwd,
452
+ base: assets_base,
453
+ build: {
454
+ ssr: true,
455
+ outDir: `${output_dir}/server`,
456
+ manifest: true,
457
+ polyfillDynamicImport: false,
458
+ rollupOptions: {
459
+ input,
460
+ output: {
461
+ format: 'esm',
462
+ entryFileNames: '[name].js',
463
+ chunkFileNames: 'chunks/[name]-[hash].js',
464
+ assetFileNames: 'assets/[name]-[hash][extname]'
465
+ },
466
+ preserveEntrySignatures: 'strict'
467
+ }
468
+ },
469
+ plugins: [
470
+ svelte({
471
+ extensions: config.extensions,
472
+ compilerOptions: {
473
+ hydratable: !!config.kit.browser.hydrate
592
474
  }
475
+ })
476
+ ],
477
+ resolve: {
478
+ alias: get_aliases(config)
479
+ }
480
+ });
593
481
 
594
- errors.splice(i + 1);
595
-
596
- const path = segments.every((segment) => segment.length === 1 && !segment[0].dynamic)
597
- ? `/${segments.map((segment) => segment[0].content).join('/')}`
598
- : '';
599
-
600
- routes.push({
601
- type: 'page',
602
- key: key.join('/'),
603
- segments: simple_segments,
604
- pattern,
605
- params,
606
- path,
607
- shadow: null,
608
- a: /** @type {string[]} */ (concatenated),
609
- b: /** @type {string[]} */ (errors)
610
- });
611
- } else {
612
- const pattern = get_pattern(segments, !item.route_suffix);
613
-
614
- routes.push({
615
- type: 'endpoint',
616
- key: key.join('/'),
617
- segments: simple_segments,
618
- pattern,
619
- file: item.file,
620
- params
621
- });
622
- }
623
- });
624
- }
482
+ print_config_conflicts(conflicts, 'kit.vite.', 'build_server');
625
483
 
626
- const base = path__default.relative(cwd, config.kit.files.routes);
484
+ const { chunks } = await create_build(merged_config);
627
485
 
628
- const layout = find_layout('__layout', base) || default_layout;
629
- const error = find_layout('__error', base) || default_error;
486
+ /** @type {import('vite').Manifest} */
487
+ const vite_manifest = JSON.parse(fs__default.readFileSync(`${output_dir}/server/manifest.json`, 'utf-8'));
630
488
 
631
- components.push(layout, error);
489
+ mkdirp(`${output_dir}/server/nodes`);
490
+ mkdirp(`${output_dir}/server/stylesheets`);
632
491
 
633
- walk(config.kit.files.routes, [], [], [], [layout], [error]);
492
+ const stylesheet_lookup = new Map();
634
493
 
635
- // merge matching page/endpoint pairs into shadowed pages
636
- let i = routes.length;
637
- while (i--) {
638
- const route = routes[i];
639
- const prev = routes[i - 1];
494
+ client.assets.forEach((asset) => {
495
+ if (asset.fileName.endsWith('.css')) {
496
+ if (config.kit.amp || asset.source.length < config.kit.inlineStyleThreshold) {
497
+ const index = stylesheet_lookup.size;
498
+ const file = `${output_dir}/server/stylesheets/${index}.js`;
640
499
 
641
- if (prev && prev.key === route.key) {
642
- if (prev.type !== 'endpoint' || route.type !== 'page') {
643
- const relative = path__default.relative(cwd, path__default.resolve(config.kit.files.routes, prev.key));
644
- throw new Error(`Duplicate route files: ${relative}`);
500
+ fs__default.writeFileSync(file, `// ${asset.fileName}\nexport default ${s(asset.source)};`);
501
+ stylesheet_lookup.set(asset.fileName, index);
645
502
  }
646
-
647
- route.shadow = prev.file;
648
- routes.splice(--i, 1);
649
503
  }
650
- }
651
-
652
- const assets = fs__default.existsSync(config.kit.files.assets)
653
- ? list_files({ config, dir: config.kit.files.assets, path: '' })
654
- : [];
655
-
656
- return {
657
- assets,
658
- layout,
659
- error,
660
- components,
661
- routes
662
- };
663
- }
664
-
665
- /**
666
- * @param {string} needle
667
- * @param {string} haystack
668
- */
669
- function count_occurrences(needle, haystack) {
670
- let count = 0;
671
- for (let i = 0; i < haystack.length; i += 1) {
672
- if (haystack[i] === needle) count += 1;
673
- }
674
- return count;
675
- }
676
-
677
- /** @param {string} path */
678
- function is_spread(path) {
679
- const spread_pattern = /\[\.{3}/g;
680
- return spread_pattern.test(path);
681
- }
504
+ });
682
505
 
683
- /**
684
- * @param {Item} a
685
- * @param {Item} b
686
- */
687
- function comparator(a, b) {
688
- if (a.is_index !== b.is_index) {
689
- if (a.is_index) return is_spread(a.file) ? 1 : -1;
506
+ manifest_data.components.forEach((component, i) => {
507
+ const file = `${output_dir}/server/nodes/${i}.js`;
690
508
 
691
- return is_spread(b.file) ? -1 : 1;
692
- }
509
+ const js = new Set();
510
+ const css = new Set();
511
+ find_deps(component, client.vite_manifest, js, css);
693
512
 
694
- const max = Math.max(a.parts.length, b.parts.length);
513
+ const imports = [`import * as module from '../${vite_manifest[component].file}';`];
695
514
 
696
- for (let i = 0; i < max; i += 1) {
697
- const a_sub_part = a.parts[i];
698
- const b_sub_part = b.parts[i];
515
+ const exports = [
516
+ 'export { module };',
517
+ `export const entry = '${client.vite_manifest[component].file}';`,
518
+ `export const js = ${s(Array.from(js))};`,
519
+ `export const css = ${s(Array.from(css))};`
520
+ ];
699
521
 
700
- if (!a_sub_part) return 1; // b is more specific, so goes first
701
- if (!b_sub_part) return -1;
522
+ /** @type {string[]} */
523
+ const styles = [];
702
524
 
703
- if (a_sub_part.rest && b_sub_part.rest) {
704
- if (a.is_page !== b.is_page) {
705
- return a.is_page ? 1 : -1;
525
+ css.forEach((file) => {
526
+ if (stylesheet_lookup.has(file)) {
527
+ const index = stylesheet_lookup.get(file);
528
+ const name = `stylesheet_${index}`;
529
+ imports.push(`import ${name} from '../stylesheets/${index}.js';`);
530
+ styles.push(`\t${s(file)}: ${name}`);
706
531
  }
707
- // sort alphabetically
708
- return a_sub_part.content < b_sub_part.content ? -1 : 1;
709
- }
710
-
711
- // If one is ...rest order it later
712
- if (a_sub_part.rest !== b_sub_part.rest) return a_sub_part.rest ? 1 : -1;
713
-
714
- if (a_sub_part.dynamic !== b_sub_part.dynamic) {
715
- return a_sub_part.dynamic ? 1 : -1;
716
- }
532
+ });
717
533
 
718
- if (!a_sub_part.dynamic && a_sub_part.content !== b_sub_part.content) {
719
- return (
720
- b_sub_part.content.length - a_sub_part.content.length ||
721
- (a_sub_part.content < b_sub_part.content ? -1 : 1)
722
- );
534
+ if (styles.length > 0) {
535
+ exports.push(`export const styles = {\n${styles.join(',\n')}\n};`);
723
536
  }
724
- }
725
537
 
726
- if (a.is_page !== b.is_page) {
727
- return a.is_page ? 1 : -1;
728
- }
538
+ fs__default.writeFileSync(file, `${imports.join('\n')}\n\n${exports.join('\n')}\n`);
539
+ });
729
540
 
730
- // otherwise sort alphabetically
731
- return a.file < b.file ? -1 : 1;
541
+ return {
542
+ chunks,
543
+ vite_manifest,
544
+ methods: get_methods(cwd, chunks, manifest_data)
545
+ };
732
546
  }
733
547
 
548
+ /** @type {Record<string, string>} */
549
+ const method_names = {
550
+ get: 'get',
551
+ head: 'head',
552
+ post: 'post',
553
+ put: 'put',
554
+ del: 'delete',
555
+ patch: 'patch'
556
+ };
557
+
734
558
  /**
735
- * @param {string} part
736
- * @param {string} file
559
+ *
560
+ * @param {string} cwd
561
+ * @param {import('rollup').OutputChunk[]} output
562
+ * @param {import('types').ManifestData} manifest_data
737
563
  */
738
- function get_parts(part, file) {
739
- /** @type {Part[]} */
740
- const result = [];
741
- part.split(/\[(.+?\(.+?\)|.+?)\]/).map((str, i) => {
742
- if (!str) return;
743
- const dynamic = i % 2 === 1;
564
+ function get_methods(cwd, output, manifest_data) {
565
+ /** @type {Record<string, string[]>} */
566
+ const lookup = {};
567
+ output.forEach((chunk) => {
568
+ if (!chunk.facadeModuleId) return;
569
+ const id = chunk.facadeModuleId.slice(cwd.length + 1);
570
+ lookup[id] = chunk.exports;
571
+ });
744
572
 
745
- const [, content] = dynamic ? /([^(]+)$/.exec(str) || [null, null] : [null, str];
573
+ /** @type {Record<string, import('types').HttpMethod[]>} */
574
+ const methods = {};
575
+ manifest_data.routes.forEach((route) => {
576
+ const file = route.type === 'endpoint' ? route.file : route.shadow;
746
577
 
747
- if (!content || (dynamic && !/^(\.\.\.)?[a-zA-Z0-9_$]+$/.test(content))) {
748
- throw new Error(`Invalid route ${file} parameter name must match /^[a-zA-Z0-9_$]+$/`);
578
+ if (file && lookup[file]) {
579
+ methods[file] = lookup[file]
580
+ .map((x) => /** @type {import('types').HttpMethod} */ (method_names[x]))
581
+ .filter(Boolean);
749
582
  }
750
-
751
- result.push({
752
- content,
753
- dynamic,
754
- rest: dynamic && /^\.{3}.+$/.test(content)
755
- });
756
583
  });
757
584
 
758
- return result;
585
+ return methods;
759
586
  }
760
587
 
761
588
  /**
762
- * @param {Part[][]} segments
763
- * @param {boolean} add_trailing_slash
589
+ * @param {import('types').ValidatedConfig} config
590
+ * @returns {Promise<import('types').BuildData>}
764
591
  */
765
- function get_pattern(segments, add_trailing_slash) {
766
- const path = segments
767
- .map((segment) => {
768
- if (segment.length === 1 && segment[0].rest) {
769
- // special case — `src/routes/foo/[...bar]/baz` matches `/foo/baz`
770
- // so we need to make the leading slash optional
771
- return '(?:\\/(.*))?';
772
- }
592
+ async function build(config) {
593
+ const cwd = process.cwd(); // TODO is this necessary?
594
+
595
+ const build_dir = path__default.join(config.kit.outDir, 'build');
596
+ rimraf(build_dir);
597
+ mkdirp(build_dir);
598
+
599
+ const output_dir = path__default.join(config.kit.outDir, 'output');
600
+ rimraf(output_dir);
601
+ mkdirp(output_dir);
602
+
603
+ generate_tsconfig(config);
604
+
605
+ const options = {
606
+ cwd,
607
+ config,
608
+ build_dir,
609
+ // TODO this is so that Vite's preloading works. Unfortunately, it fails
610
+ // during `svelte-kit preview`, because we use a local asset path. If Vite
611
+ // used relative paths, I _think_ this could get fixed. Issue here:
612
+ // https://github.com/vitejs/vite/issues/2009
613
+ assets_base: `${config.kit.paths.assets || config.kit.paths.base}/${config.kit.appDir}/`,
614
+ manifest_data: create_manifest_data({
615
+ config,
616
+ cwd
617
+ }),
618
+ output_dir,
619
+ client_entry_file: path__default.relative(cwd, `${get_runtime_path(config)}/client/start.js`),
620
+ service_worker_entry_file: resolve_entry(config.kit.files.serviceWorker),
621
+ service_worker_register: config.kit.serviceWorker.register
622
+ };
773
623
 
774
- const parts = segment.map((part) => {
775
- if (part.rest) return '(.*?)';
776
- if (part.dynamic) return '([^/]+?)';
777
-
778
- return (
779
- part.content
780
- // allow users to specify characters on the file system in an encoded manner
781
- .normalize()
782
- // We use [ and ] to denote parameters, so users must encode these on the file
783
- // system to match against them. We don't decode all characters since others
784
- // can already be epressed and so that '%' can be easily used directly in filenames
785
- .replace(/%5[Bb]/g, '[')
786
- .replace(/%5[Dd]/g, ']')
787
- // '#', '/', and '?' can only appear in URL path segments in an encoded manner.
788
- // They will not be touched by decodeURI so need to be encoded here, so
789
- // that we can match against them.
790
- // We skip '/' since you can't create a file with it on any OS
791
- .replace(/#/g, '%23')
792
- .replace(/\?/g, '%3F')
793
- // escape characters that have special meaning in regex
794
- .replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
795
- );
796
- });
624
+ const client = await build_client(options);
625
+ const server = await build_server(options, client);
797
626
 
798
- return '\\/' + parts.join('');
799
- })
800
- .join('');
627
+ if (options.service_worker_entry_file) {
628
+ if (config.kit.paths.assets) {
629
+ throw new Error('Cannot use service worker alongside config.kit.paths.assets');
630
+ }
801
631
 
802
- const trailing = add_trailing_slash && segments.length ? '\\/?$' : '$';
632
+ await build_service_worker(options, client.vite_manifest);
633
+ }
803
634
 
804
- return new RegExp(`^${path || '\\/'}${trailing}`);
805
- }
635
+ const build_data = {
636
+ app_dir: config.kit.appDir,
637
+ manifest_data: options.manifest_data,
638
+ service_worker: options.service_worker_entry_file ? 'service-worker.js' : null, // TODO make file configurable?
639
+ client,
640
+ server,
641
+ static: options.manifest_data.assets.map((asset) => posixify(asset.file)),
642
+ entries: options.manifest_data.routes
643
+ .map((route) => (route.type === 'page' ? route.path : ''))
644
+ .filter(Boolean)
645
+ };
806
646
 
807
- /**
808
- * @param {{
809
- * config: import('types').ValidatedConfig;
810
- * dir: string;
811
- * path: string;
812
- * files?: import('types').Asset[]
813
- * }} args
814
- */
815
- function list_files({ config, dir, path, files = [] }) {
816
- fs__default.readdirSync(dir).forEach((file) => {
817
- const full = `${dir}/${file}`;
818
-
819
- const stats = fs__default.statSync(full);
820
- const joined = path ? `${path}/${file}` : file;
821
-
822
- if (stats.isDirectory()) {
823
- list_files({ config, dir: full, path: joined, files });
824
- } else if (config.kit.serviceWorker.files(joined)) {
825
- files.push({
826
- file: joined,
827
- size: stats.size,
828
- type: mime.getType(joined)
829
- });
830
- }
831
- });
647
+ const manifest = `export const manifest = ${generate_manifest(build_data, '.')};\n`;
648
+ fs__default.writeFileSync(`${output_dir}/server/manifest.js`, manifest);
832
649
 
833
- return files;
650
+ return build_data;
834
651
  }
835
652
 
836
- export { create_app as a, create_manifest_data as c, deep_merge as d };
653
+ export { build };