-
Notifications
You must be signed in to change notification settings - Fork 1
/
vite.config.ts
86 lines (68 loc) · 2.7 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
import { purgeCss } from 'vite-plugin-tailwind-purgecss';
import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig, type PluginOption, loadEnv } from 'vite';
import mkcert from 'vite-plugin-mkcert';
import dns from 'dns';
import { env } from 'process';
function printRed(message: string) {
console.log(`\u001b[1;31m${message}\u001b[0m`);
}
function printBlue(message: string) {
console.log(`\u001b[1;34m${message}\u001b[0m`);
}
function dnsLookup(hostname: string) {
return new Promise<string>((resolve, reject) => {
dns.lookup(hostname, (err, address) => {
if (err) {
reject(err);
} else {
resolve(address);
}
});
});
}
async function ensureFqdnRedirect(host: string, fqdn: string) {
// Do a DNS lookup to ensure the FQDN resolves to localhost
try {
const address = await dnsLookup(fqdn);
if (address === host) return;
} catch (err) {
// Do nothing
}
printRed(`Please ensure that ${fqdn} resolves to ${host} in your hosts file\n`);
console.log('On macOS and Linux, you can do this by running the following command:');
printBlue(`echo "${host} ${fqdn}" | sudo tee -a /etc/hosts\n`);
console.log('On Windows, you can do this by running the following command in PowerShell as an administrator:');
printBlue(`Add-Content -Path "C:\\Windows\\System32\\drivers\\etc\\hosts" -Value "${host} ${fqdn}"\n`);
printRed('Then restart your development server');
process.exit(1);
}
function isThruthy(value: string | undefined) {
return value === 'true' || value === '1';
}
export default defineConfig(async ({ command, mode, isPreview }) => {
let host: string | undefined;
let port: number | undefined;
const plugins: PluginOption[] = [];
const isLocalServe = command === 'serve' || isPreview === true;
const isProduction = mode === 'production' && (isThruthy(env.DOCKER) || isThruthy(env.CF_PAGES));
const vars = { ...env, ...loadEnv(mode, process.cwd(), ['PUBLIC_']) };
// If we are running locally, ensure that local.{PUBLIC_SITE_DOMAIN} resolves to localhost, and then use mkcert to generate a certificate
if (isLocalServe && !isProduction && !isThruthy(env.CI)) {
// Load environment variables
if (!vars.PUBLIC_SITE_DOMAIN) {
printRed('PUBLIC_SITE_DOMAIN must be set in your environment');
process.exit(1);
}
host = `local.${vars.PUBLIC_SITE_DOMAIN}`;
port = 443;
// Ensure we have the host entry redirecting to localhost
await ensureFqdnRedirect('127.0.0.1', host);
plugins.push(mkcert());
}
// Add the sveltekit plugin
plugins.push(sveltekit());
// Configure the purgeCss plugin
plugins.push(purgeCss());
return defineConfig({ plugins, server: { host, port, proxy: {} } });
});