forked from mgmeyers/obsidian-kanban
-
Notifications
You must be signed in to change notification settings - Fork 0
/
esbuild.config.js
127 lines (110 loc) · 3.37 KB
/
esbuild.config.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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
const fs = require('fs');
const path = require('path');
const banner = `/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source visit the plugins github repository
*/
`;
const isProd = process.env.BUILD === 'production';
const renamePlugin = {
name: 'rename-styles',
setup(build) {
build.onEnd(() => {
const { outfile } = build.initialOptions;
const outcss = outfile.replace(/\.js$/, '.css');
const fixcss = outfile.replace(/main\.js$/, 'styles.css');
if (fs.existsSync(outcss)) {
console.log('Renaming', outcss, 'to', fixcss);
fs.renameSync(outcss, fixcss);
}
});
},
};
const NAME = 'node-modules-polyfills';
const NAMESPACE = NAME;
function NodeModulesPolyfillPlugin(options = {}) {
const { namespace = NAMESPACE, name = NAME } = options;
if (namespace.endsWith('commonjs')) {
throw new Error(`namespace ${namespace} must not end with commonjs`);
}
// this namespace is needed to make ES modules expose their default export to require: require('assert') will give you import('assert').default
const commonjsNamespace = namespace + '-commonjs';
return {
name,
setup: function setup({ onLoad, onResolve }) {
// TODO these polyfill module cannot import anything, is that ok?
async function loader(args) {
try {
const isCommonjs = args.namespace.endsWith('commonjs');
const resolved =
args.path === 'buffer' ? require.resolve('./buffer-es6') : null;
const contents = await (
await fs.promises.readFile(resolved)
).toString();
let resolveDir = path.dirname(resolved);
if (isCommonjs) {
return {
loader: 'js',
contents: commonJsTemplate({
importPath: args.path,
}),
resolveDir,
};
}
return {
loader: 'js',
contents,
resolveDir,
};
} catch (e) {
console.error('node-modules-polyfill', e);
return {
contents: `export {}`,
loader: 'js',
};
}
}
onLoad({ filter: /.*/, namespace }, loader);
onLoad({ filter: /.*/, namespace: commonjsNamespace }, loader);
const filter = /buffer/;
async function resolver(args) {
const ignoreRequire = args.namespace === commonjsNamespace;
if (args.path !== 'buffer') {
return;
}
const isCommonjs = !ignoreRequire && args.kind === 'require-call';
return {
namespace: isCommonjs ? commonjsNamespace : namespace,
path: args.path,
};
}
onResolve({ filter }, resolver);
},
};
}
function commonJsTemplate({ importPath }) {
return `
const polyfill = require('${importPath}')
if (polyfill && polyfill.default) {
module.exports = polyfill.default
for (let k in polyfill) {
module.exports[k] = polyfill[k]
}
} else if (polyfill) {
module.exports = polyfill
}
`;
}
module.exports = {
banner: { js: banner },
sourcemap: isProd ? false : 'inline',
minify: isProd ? true : false,
define: {
'process.env.NODE_ENV': JSON.stringify(process.env.BUILD),
global: 'window',
},
plugins: [NodeModulesPolyfillPlugin(), renamePlugin],
inject: ['./preact-shim.js'],
jsxFactory: 'h',
jsxFragment: 'Fragment',
};