-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
esbuild_plugin_external_worker.ts
92 lines (88 loc) 路 3.04 KB
/
esbuild_plugin_external_worker.ts
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
import * as esbuild from 'esbuild';
import type {Logger} from '@ryanatkn/belt/log.js';
import {basename} from 'node:path';
import {cwd} from 'node:process';
import type {CompileOptions, PreprocessorGroup, ModuleCompileOptions} from 'svelte/compiler';
import {print_build_result, to_define_import_meta_env} from './esbuild_helpers.js';
import {resolve_specifier} from './resolve_specifier.js';
import {esbuild_plugin_sveltekit_shim_alias} from './esbuild_plugin_sveltekit_shim_alias.js';
import {esbuild_plugin_sveltekit_shim_env} from './esbuild_plugin_sveltekit_shim_env.js';
import {esbuild_plugin_sveltekit_shim_app} from './esbuild_plugin_sveltekit_shim_app.js';
import {esbuild_plugin_sveltekit_local_imports} from './esbuild_plugin_sveltekit_local_imports.js';
import {esbuild_plugin_svelte} from './esbuild_plugin_svelte.js';
import type {Parsed_Sveltekit_Config} from './sveltekit_config.js';
export interface Options {
dev: boolean;
build_options: esbuild.BuildOptions;
dir?: string;
svelte_compile_options?: CompileOptions;
svelte_compile_module_options?: ModuleCompileOptions;
svelte_preprocessors?: PreprocessorGroup | PreprocessorGroup[];
alias?: Record<string, string>;
base_url?: Parsed_Sveltekit_Config['base_url'];
assets_url?: Parsed_Sveltekit_Config['assets_url'];
public_prefix?: string;
private_prefix?: string;
env_dir?: string;
env_files?: string[];
ambient_env?: Record<string, string>;
log?: Logger;
}
export const esbuild_plugin_external_worker = ({
dev,
build_options,
dir = cwd(),
svelte_compile_options,
svelte_preprocessors,
svelte_compile_module_options,
alias,
base_url,
assets_url,
public_prefix,
private_prefix,
env_dir,
env_files,
ambient_env,
log,
}: Options): esbuild.Plugin => ({
name: 'external_worker',
setup: (build) => {
const builds: Map<string, Promise<esbuild.BuildResult>> = new Map();
const build_worker = async (source_id: string): Promise<esbuild.BuildResult> => {
if (builds.has(source_id)) return builds.get(source_id)!;
const building = esbuild.build({
entryPoints: [source_id],
plugins: [
esbuild_plugin_sveltekit_shim_app({dev, base_url, assets_url}),
esbuild_plugin_sveltekit_shim_env({
dev,
public_prefix,
private_prefix,
env_dir,
env_files,
ambient_env,
}),
esbuild_plugin_sveltekit_shim_alias({dir, alias}),
esbuild_plugin_svelte({
dir,
svelte_compile_options,
svelte_compile_module_options,
svelte_preprocessors,
}),
esbuild_plugin_sveltekit_local_imports(),
],
define: to_define_import_meta_env(dev, base_url),
...build_options,
});
builds.set(source_id, building);
return building;
};
build.onResolve({filter: /\.worker(|\.js|\.ts)$/u}, async ({path, resolveDir}) => {
const parsed = await resolve_specifier(path, resolveDir);
const {specifier, source_id, namespace} = parsed;
const build_result = await build_worker(source_id);
if (log) print_build_result(log, build_result);
return {path: './' + basename(specifier), external: true, namespace};
});
},
});