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
|
const json = require('@rollup/plugin-json');
const { nodeResolve } = require('@rollup/plugin-node-resolve');
const replace = require('@rollup/plugin-replace');
const { globSync } = require('glob');
const commonjs = require('@rollup/plugin-commonjs');
const { babel } = require('@rollup/plugin-babel');
const css = require('rollup-plugin-import-css');
const url = require('@rollup/plugin-url');
const vue = require('@vitejs/plugin-vue2');
const copy = require('rollup-plugin-copy');
const terser = require('@rollup/plugin-terser');
const yaml = require('@rollup/plugin-yaml');
function mapDirectory(file) {
return file.replace('content/', 'public/');
}
const vendorDir = './public/assets/vendor'; // Global assets are copied here
const searchBackend = process.env.SEARCH_BACKEND || 'google';
module.exports = globSync('content/frontend/**/*.js')
// Drop search bundles that aren't required in this build.
.filter((file) => {
const fileName = file.split('/').pop();
return (
fileName.startsWith(searchBackend) ||
(!fileName.startsWith('google') && !fileName.startsWith('lunr'))
);
})
.map((file) => ({
input: file,
output: {
file: mapDirectory(file),
format: 'iife',
name: file,
inlineDynamicImports: true,
globals: {
vue: 'Vue',
jquery: '$',
},
},
external: ['vue', 'jquery'],
cache: true,
plugins: [
nodeResolve({ browser: true, preferBuiltins: false }),
commonjs(),
vue(),
url({
destDir: 'public/assets/images',
publicPath: '/assets/images/',
fileName: 'icons.svg',
}),
babel({
exclude: 'node_modules/**',
babelHelpers: 'bundled',
}),
json(),
css(),
replace({
preventAssignment: true,
'process.env.NODE_ENV': JSON.stringify('production'),
}),
terser(),
yaml(),
copy({
copyOnce: true,
hook: 'closeBundle',
targets: [
{
src: './node_modules/mermaid/dist/mermaid.min.js*',
dest: vendorDir,
},
{
src: './node_modules/vue/dist/vue.min.js',
dest: vendorDir,
},
{
src: './node_modules/lunr/lunr.min.js',
dest: vendorDir,
},
{
src: './node_modules/jquery/dist/jquery.slim.min.js',
dest: vendorDir,
},
{
src: './node_modules/bootstrap/dist/js/bootstrap.bundle.min.js*',
dest: vendorDir,
},
{
src: './node_modules/@gitlab/ui/dist/utility_classes.css*',
dest: vendorDir,
},
{
src: './node_modules/@gitlab/ui/dist/index.css*',
dest: vendorDir,
},
{
src: './node_modules/@gitlab/fonts/gitlab-sans/GitLabSans*.woff2',
dest: vendorDir,
},
{
src: './node_modules/@gitlab/fonts/gitlab-mono/GitLabMono*.woff2',
dest: vendorDir,
},
],
}),
],
onwarn(warning, warn) {
// Ignore known issues from third-party code.
const ignoreMap = {
CIRCULAR_DEPENDENCY: ['@gitlab/ui'],
INVALID_ANNOTATION: ['bootstrap-vue'],
};
const ignoredKeywords = ignoreMap[warning.code] || [];
if (!ignoredKeywords.some((keyword) => warning.message.includes(keyword))) {
warn(warning);
}
},
}));
|