-
Notifications
You must be signed in to change notification settings - Fork 35
/
rollup.config.mjs
129 lines (121 loc) · 4.22 KB
/
rollup.config.mjs
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
128
129
/**
* Copyright 2020 Google Inc. All Rights Reserved.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { parse as parsePath } from 'path';
import { deleteAsync } from 'del';
import resolve from '@rollup/plugin-node-resolve';
import terser from '@rollup/plugin-terser';
import commonjs from '@rollup/plugin-commonjs';
import replace from '@rollup/plugin-replace';
import simpleTS from './lib/simple-ts.mjs';
import clientBundlePlugin from './lib/client-bundle-plugin.mjs';
import nodeExternalPlugin from './lib/node-external-plugin.mjs';
import cssPlugin from './lib/css-plugin.mjs';
import assetPlugin from './lib/asset-plugin.mjs';
import imgAssetPlugin from './lib/image-asset-plugin.mjs';
import assetStringPlugin from './lib/asset-string-plugin.mjs';
import resolveDirsPlugin from './lib/resolve-dirs-plugin.mjs';
import postData from './lib/post-data-plugin.mjs';
import runScript from './lib/run-script.mjs';
import markdownPlugin from './lib/markdown-plugin.mjs';
import rootStaticPlugin from './lib/add-root-static.mjs';
import entryURLPlugin from './lib/entry-url-plugin.mjs';
import staticEntryURLPlugin from './lib/static-entry-url-plugin.mjs';
import assetPrettySizePlugin from './lib/asset-pretty-size-plugin.mjs';
import prefixDefaultPlugin from './lib/prefix-default-plugin.mjs';
function resolveFileUrl({ fileName }) {
return JSON.stringify(fileName.replace(/^static\//, '/'));
}
const staticPath = 'static/c/[name]-[hash][extname]';
const jsPath = staticPath.replace('[extname]', '.js');
const limitPostsDevBuild = 'static-build/posts/2024/10';
function jsFileName(chunkInfo) {
if (!chunkInfo.facadeModuleId) return jsPath;
const parsedPath = parsePath(chunkInfo.facadeModuleId);
if (parsedPath.name !== 'index') return jsPath;
// Come up with a better name than 'index'
const name = parsedPath.dir.split('/').slice(-1);
return jsPath.replace('[name]', name);
}
export default async function ({ watch }) {
const production = !watch;
await deleteAsync('.tmp/build');
const tsPluginInstance = simpleTS('static-build', { watch });
const commonPlugins = () => [
prefixDefaultPlugin({
'entry-url:': '',
}),
tsPluginInstance,
resolveDirsPlugin([
'static-build',
'client',
'tests',
'shared',
'client-worker',
]),
assetPlugin(),
imgAssetPlugin(),
assetPrettySizePlugin(),
assetStringPlugin(),
cssPlugin(resolveFileUrl),
markdownPlugin(),
resolve({ preferBuiltins: false }),
commonjs(),
];
const dir = '.tmp/build';
return {
input: './static-build/index.tsx',
output: {
dir,
format: 'cjs',
assetFileNames: staticPath,
exports: 'named',
preserveModules: true,
},
// Don't watch the ts files. Instead we watch the output from the ts compiler.
watch: { clearScreen: false, exclude: ['**/*.ts', '**/*.tsx'] },
plugins: [
{ resolveFileUrl },
clientBundlePlugin(
{
plugins: [
{ resolveFileUrl },
entryURLPlugin(),
staticEntryURLPlugin(),
...commonPlugins(),
replace({
preventAssignment: true,
values: { __PRERENDER__: false },
}),
production ? terser({ module: true }) : {},
],
},
{
dir,
format: 'esm',
chunkFileNames: jsFileName,
entryFileNames: jsFileName,
},
resolveFileUrl,
),
...commonPlugins(),
postData({ pathsStartWithFilter: production ? '' : limitPostsDevBuild }),
rootStaticPlugin(),
nodeExternalPlugin(),
replace({
preventAssignment: true,
values: { __PRERENDER__: true },
}),
runScript(dir + '/static-build/index.js'),
],
};
}