forked from sveltejs/kit
-
Notifications
You must be signed in to change notification settings - Fork 1
/
build_service_worker.js
100 lines (90 loc) · 2.55 KB
/
build_service_worker.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import fs from 'fs';
import * as vite from 'vite';
import { s } from '../../utils/misc.js';
import { deep_merge } from '../../utils/object.js';
import { normalize_path } from '../../utils/url.js';
import { print_config_conflicts } from '../config/index.js';
/**
* @param {{
* cwd: string;
* assets_base: string;
* config: import('types').ValidatedConfig;
* manifest_data: import('types').ManifestData;
* output_dir: string;
* service_worker_entry_file: string | null;
* }} options
* @param {import('types').Prerendered} prerendered
* @param {import('vite').Manifest} client_manifest
*/
export async function build_service_worker(
{ cwd, assets_base, config, manifest_data, output_dir, service_worker_entry_file },
prerendered,
client_manifest
) {
const build = new Set();
for (const key in client_manifest) {
const { file, css = [], assets = [] } = client_manifest[key];
build.add(file);
css.forEach((file) => build.add(file));
assets.forEach((file) => build.add(file));
}
const service_worker = `${config.kit.outDir}/generated/service-worker.js`;
fs.writeFileSync(
service_worker,
`
// TODO remove for 1.0
export const timestamp = {
toString: () => {
throw new Error('\`timestamp\` has been removed from $service-worker. Use \`version\` instead');
}
};
export const build = [
${Array.from(build)
.map((file) => `${s(`${config.kit.paths.base}/${config.kit.appDir}/${file}`)}`)
.join(',\n\t\t\t\t')}
];
export const files = [
${manifest_data.assets
.filter((asset) => config.kit.serviceWorker.files(asset.file))
.map((asset) => `${s(`${config.kit.paths.base}/${asset.file}`)}`)
.join(',\n\t\t\t\t')}
];
export const prerendered = [
${prerendered.paths
.map((path) => s(normalize_path(path, config.kit.trailingSlash)))
.join(',\n\t\t\t\t')}
];
export const version = ${s(config.kit.version.name)};
`
.replace(/^\t{3}/gm, '')
.trim()
);
/** @type {[any, string[]]} */
const [merged_config, conflicts] = deep_merge(await config.kit.vite(), {
configFile: false,
root: cwd,
base: assets_base,
build: {
lib: {
entry: service_worker_entry_file,
name: 'app',
formats: ['es']
},
rollupOptions: {
output: {
entryFileNames: 'service-worker.js'
}
},
outDir: `${output_dir}/client`,
emptyOutDir: false
},
resolve: {
alias: {
'$service-worker': service_worker,
$lib: config.kit.files.lib
}
}
});
print_config_conflicts(conflicts, 'kit.vite.', 'build_service_worker');
await vite.build(merged_config);
}