-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
/
build_service_worker.js
88 lines (80 loc) · 2.12 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
import fs from 'fs';
import vite from 'vite';
import { s } from '../../utils/misc.js';
import { deep_merge } from '../../utils/object.js';
import { print_config_conflicts } from '../config/index.js';
import { SVELTE_KIT } from '../constants.js';
/**
* @param {{
* cwd: string;
* assets_base: string;
* config: import('types/config').ValidatedConfig
* manifest_data: import('types/internal').ManifestData
* output_dir: string;
* service_worker_entry_file: string | null;
* }} options
* @param {import('vite').Manifest} client_manifest
*/
export async function build_service_worker(
{ cwd, assets_base, config, manifest_data, output_dir, service_worker_entry_file },
client_manifest
) {
// TODO add any assets referenced in template .html file, e.g. favicon?
const app_files = new Set();
for (const key in client_manifest) {
const { file, css } = client_manifest[key];
app_files.add(file);
if (css) {
css.forEach((file) => {
app_files.add(file);
});
}
}
const service_worker = `${cwd}/${SVELTE_KIT}/generated/service-worker.js`;
fs.writeFileSync(
service_worker,
`
export const timestamp = ${Date.now()};
export const build = [
${Array.from(app_files)
.map((file) => `${s(`${config.kit.paths.base}/${config.kit.appDir}/${file}`)}`)
.join(',\n\t\t\t\t')}
];
export const files = [
${manifest_data.assets
.map((asset) => `${s(`${config.kit.paths.base}/${asset.file}`)}`)
.join(',\n\t\t\t\t')}
];
`
.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);
}