-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
96 lines (83 loc) · 2.56 KB
/
index.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
module.exports = {
esbuildPlugin: {
init(getConfig){
return {
name: 'bp-plugin-init',
setup(build){
let config = getConfig();
let filter = createRegExp([
'@blackprint/sketch',
'@blackprint/engine',
'@_bp_internal'
]);
build.onResolve({ filter }, val => ({
path: val.path, namespace: "bp-plugins"
}));
build.onLoad({ filter, namespace: "bp-plugins" }, async val => {
if(val.path === '@_bp_internal'){
let hasInterface = !!config.sf;
let hasDocs = !!config.bpDocs;
return {
loader: 'ts', contents: `
export let Blackprint = globalThis.Blackprint.loadScope({
url: import.meta.url,
hasInterface: ${hasInterface},
hasDocs: ${hasDocs},
}) as typeof import("@blackprint/engine");
let sf = globalThis.sf;
export async function _imports_(moduleName: string, url: string){
let loadFromURL = globalThis.Blackprint.Environment.loadFromURL;
if(loadFromURL && sf?.loader != null){
return (await sf.loader.mjs([url]))[0];
}
return await import(loadFromURL ? url : moduleName);
};`,
}
}
return {
loader: 'ts', contents: `
import { Blackprint } from "@_bp_internal";
export default Blackprint;`,
}
});
}
}
},
preferCDN(srcRoot, resolves) {
let keys = Object.keys(resolves);
if(keys.length === 0)
throw new Error("Module name and URL need to be specified when using 'preferCDN' plugin");
let filter = createRegExp(keys);
return {
name: "bp-prefer-cdn",
setup(build) {
build.onResolve({ filter }, val => ({
path: val.path, namespace: "bp-plugins"
}));
build.onLoad({ filter, namespace: "bp-plugins"}, async val => {
let url = resolves[val.path];
let globall = '';
if(url.constructor === Object){
globall = url.globalVar;
url = url.url;
}
let append = `await _imports_(${JSON.stringify(val.path)}, ${JSON.stringify(url)})`;
if(globall){
append = `(globall[${JSON.stringify(globall)}] || ${append})`;
}
return {
resolveDir: srcRoot, loader: "ts", contents: `
import { _imports_ } from "@_bp_internal";
let globall = typeof window !== 'undefined' ? window : globalThis;
export default ${append};`,
};
});
},
};
}
}
};
function createRegExp(strings){
let escape = val => val.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&");
return new RegExp(strings.map(val => `^${escape(val)}$`).join("|"));
}