/
vite.config.ts
105 lines (100 loc) · 2.98 KB
/
vite.config.ts
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
import { readdir, readFile } from 'node:fs/promises';
import alias from '@rollup/plugin-alias';
import { defineConfig } from 'vite';
import { moduleAliases } from '../build-plugins/aliases';
import { resolutions } from '../build-plugins/replace-browser-modules';
import type { RollupOptions } from '../src/rollup/types';
import type { Example, Module } from './types';
const examplesDirectory = new URL('repl/examples', import.meta.url);
export default defineConfig({
optimizeDeps: { include: ['moment-mini', '@braintree/sanitize-url'] },
plugins: [
{
apply: 'serve',
enforce: 'pre',
name: 'replace-browser-modules',
resolveId(source, importer) {
if (importer && source.startsWith('/@fs')) {
const resolved = source.slice(4);
if (resolutions[resolved]) {
return resolutions[resolved];
}
}
},
transformIndexHtml(html) {
// Unfortunately, picomatch sneaks as a dedendency into the dev bundle.
// This fixes an error.
return html.replace('</head>', '<script>window.process={}</script></head>');
}
},
{
apply: 'build',
enforce: 'pre',
name: 'replace-local-rollup',
resolveId(source) {
if (source.includes('/browser-entry')) {
return false;
}
}
},
{
async load(id) {
if (id === 'examples.json') {
const exampleFiles = await getFilesInDirectory(examplesDirectory);
const examples: Example[] = await Promise.all(
exampleFiles.map(async id => {
const {
entryModules = ['main.js'],
options = {},
title
}: {
entryModules?: string[];
options?: RollupOptions;
title: string;
} = JSON.parse(
await readFile(new URL(`examples/${id}/example.json`, examplesDirectory), 'utf8')
);
const moduleFiles = await getFilesInDirectory(
new URL(`examples/${id}/modules`, examplesDirectory)
);
const modules: Module[] = await Promise.all(
moduleFiles.map(async name => {
const code = (
await readFile(
new URL(`examples/${id}/modules/${name}`, examplesDirectory),
'utf8'
)
).trim();
return { code, isEntry: entryModules.includes(name), name };
})
);
modules.sort((a, b) => {
if (a.name === 'main.js') return -1;
if (b.name === 'main.js') return 1;
if (a.isEntry) return -1;
if (b.isEntry) return 1;
return a.name < b.name ? -1 : 1;
});
return { id, modules, options, title };
})
);
const examplesById: Record<string, Example> = {};
for (const example of examples) {
examplesById[example.id] = example;
}
return JSON.stringify(examplesById);
}
},
name: 'examples',
resolveId(source) {
if (source === 'examples.json') {
return source;
}
}
},
alias(moduleAliases)
]
});
async function getFilesInDirectory(directory: URL): Promise<string[]> {
return (await readdir(directory)).filter(file => file[0] !== '.');
}