-
-
Notifications
You must be signed in to change notification settings - Fork 432
/
Copy pathbuild.js
127 lines (126 loc) · 3.82 KB
/
build.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 path = require('path');
const fs = require('fs');
const treeShake = require('@kermanx/tree-shaker').treeShake;
const minify = process.argv.includes('--minify');
const shakeFailPaths = [
'/request-light/lib/node/main.js',
'/@vue/compiler-core/dist/compiler-core.cjs.prod.js',
'/packages/typescript-plugin/lib/requests/componentInfos.js',
'/volar-service-typescript/lib/plugins/docCommentTemplate.js',
'/@volar/language-service/lib/features/provideHover.js',
'/volar-service-typescript/lib/utils/previewer.js',
'/@babel/parser/lib/index.js',
'/@vscode/emmet-helper/lib/cjs/emmetHelper.js',
'/vscode-json-languageservice/lib/esm/services/jsonHover.js',
];
require('esbuild').context({
entryPoints: {
'dist/client': './out/nodeClientMain.js',
'dist/server': './node_modules/@vue/language-server/bin/vue-language-server.js',
'node_modules/vue-language-core-pack/index': './node_modules/@vue/language-core/index.js',
'node_modules/vue-typescript-plugin-pack/index': './node_modules/@vue/typescript-plugin/index.js',
},
bundle: true,
metafile: process.argv.includes('--metafile'),
outdir: '.',
external: ['vscode'],
format: 'cjs',
platform: 'node',
tsconfig: './tsconfig.json',
define: { 'process.env.NODE_ENV': '"production"' },
minify: minify,
plugins: [
{
name: 'umd2esm',
setup(build) {
build.onResolve({ filter: /^(vscode-.*-languageservice|vscode-languageserver-types|jsonc-parser)$/ }, args => {
const pathUmdMay = require.resolve(args.path, { paths: [args.resolveDir] });
// Call twice the replace is to solve the problem of the path in Windows
const pathEsm = pathUmdMay.replace('/umd/', '/esm/').replace('\\umd\\', '\\esm\\');
return { path: pathEsm };
});
build.onResolve({ filter: /^vscode-uri$/ }, args => {
const pathUmdMay = require.resolve(args.path, { paths: [args.resolveDir] });
// v3
let pathEsm = pathUmdMay.replace('/umd/index.js', '/esm/index.mjs').replace('\\umd\\index.js', '\\esm\\index.mjs');
if (pathEsm !== pathUmdMay && fs.existsSync(pathEsm)) {
return { path: pathEsm };
}
// v2
pathEsm = pathUmdMay.replace('/umd/', '/esm/').replace('\\umd\\', '\\esm\\');
return { path: pathEsm };
});
},
},
{
name: 'resolve-share-module',
setup(build) {
build.onResolve({ filter: /^@vue\/language-core$/ }, () => {
return {
path: 'vue-language-core-pack',
external: true,
};
});
},
},
{
name: 'schemas',
setup(build) {
build.onEnd(() => {
if (!fs.existsSync(path.resolve(__dirname, '../dist/schemas'))) {
fs.mkdirSync(path.resolve(__dirname, '../dist/schemas'));
}
fs.cpSync(
path.resolve(__dirname, '../node_modules/@vue/language-core/schemas/vue-tsconfig.schema.json'),
path.resolve(__dirname, '../dist/schemas/vue-tsconfig.schema.json'),
);
});
},
},
{
name: 'meta',
setup(build) {
build.onEnd((result) => {
if (result.metafile && result.errors.length === 0) {
fs.writeFileSync(
path.resolve(__dirname, '../meta.json'),
JSON.stringify(result.metafile),
);
}
});
},
},
{
name: 'tree-shaking',
setup(build) {
if (!minify) {
return;
}
build.onLoad({ filter: /\.js/ }, ({ path }) => {
if (shakeFailPaths.some(name => path.endsWith(name))) {
return;
}
const soruce = fs.readFileSync(path, 'utf-8');
const { output, diagnostics } = treeShake(soruce, 'recommended', false);
if (!diagnostics.length) {
return {
contents: output,
loader: 'js',
}
}
});
},
},
],
}).then(async ctx => {
console.time('build');
if (process.argv.includes('--watch')) {
await ctx.watch();
console.timeEnd('build');
console.log('watching...');
} else {
await ctx.rebuild();
await ctx.dispose();
console.timeEnd('build');
}
});