-
Notifications
You must be signed in to change notification settings - Fork 4
/
utils.ts
57 lines (48 loc) · 1.46 KB
/
utils.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
import { OnResolveArgs, Plugin } from "esbuild";
export function noop() {}
export function isObj(o: any): o is Record<string, any> {
return typeof o === "object" && o !== null;
}
export function delay(ms: number) {
return new Promise<void>(r => setTimeout(r, ms));
}
export interface ExternalPluginOptions {
/**
* Passed to `onResolve()`, mark them as external.
* @default /^[\w@][^:]/
*/
filter?: RegExp;
/**
* Called on each external id.
* @example
* external({ onResolve(args) { externals.push(args.path) } })
*/
onResolve?: (args: OnResolveArgs) => void;
/**
* Silently exclude some common file extensions.
* @default true
*/
exclude?: boolean | RegExp;
}
export function external(options: ExternalPluginOptions = {}): Plugin {
const CommonExts =
/\.(css|less|sass|scss|styl|stylus|pcss|postcss|json|png|jpe?g|gif|svg|ico|webp|avif|mp4|webm|ogg|mp3|wav|flac|aac|woff2?|eot|ttf|otf|wasm)$/;
const filter = options.filter ?? /^[\w@][^:]/;
const callback = options.onResolve ?? noop;
const exclude = options.exclude ?? true;
const exFilter = exclude === true ? CommonExts : exclude;
return {
name: "external",
setup({ onResolve }) {
onResolve({ filter }, args => {
callback(args);
return { path: args.path, external: true };
});
if (exFilter) {
onResolve({ filter: exFilter }, ({ path }) => {
return { path, external: true };
});
}
},
};
}