mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-13 12:47:28 +01:00
169 lines
4.4 KiB
JavaScript
169 lines
4.4 KiB
JavaScript
import nconf from 'nconf';
|
|
import path from 'path';
|
|
import { defineConfig } from 'vite'
|
|
import { ViteS3 } from '@froxz/vite-plugin-s3'
|
|
import { compression } from 'vite-plugin-compression2';
|
|
import vue from '@vitejs/plugin-vue2'
|
|
import { fileURLToPath } from 'node:url'
|
|
import setupNconf from '../server/libs/setupNconf';
|
|
|
|
const configFile = path.join(path.resolve(__dirname, '../../config.json'));
|
|
setupNconf(configFile, nconf);
|
|
const DEV_BASE_URL = nconf.get('BASE_URL');
|
|
|
|
let S3_URL = nconf.get('S3_URL');
|
|
if (S3_URL && !S3_URL.endsWith('/')) {
|
|
S3_URL += '/';
|
|
}
|
|
|
|
const ENABLE_S3 = S3_URL && nconf.get('S3_ACCESS_KEY') && nconf.get('S3_SECRET_KEY');
|
|
|
|
|
|
const envVars = [
|
|
'AMAZON_PAYMENTS_SELLER_ID',
|
|
'AMAZON_PAYMENTS_CLIENT_ID',
|
|
'AMAZON_PAYMENTS_MODE',
|
|
'EMAILS_COMMUNITY_MANAGER_EMAIL',
|
|
'EMAILS_TECH_ASSISTANCE_EMAIL',
|
|
'EMAILS_PRESS_ENQUIRY_EMAIL',
|
|
'STRIPE_PUB_KEY',
|
|
'GOOGLE_CLIENT_ID',
|
|
'APPLE_AUTH_CLIENT_ID',
|
|
'AMPLITUDE_KEY',
|
|
'LOGGLY_CLIENT_TOKEN',
|
|
'TRUSTED_DOMAINS',
|
|
'TIME_TRAVEL_ENABLED',
|
|
'DEBUG_ENABLED',
|
|
'CONTENT_SWITCHOVER_TIME_OFFSET',
|
|
'PLAY_CONSOLE_ORDERS_BASE_URL',
|
|
];
|
|
|
|
const envObject = {};
|
|
|
|
envVars
|
|
.forEach(key => {
|
|
envObject[`import.meta.env.${key}`] = `'${nconf.get(key)}'`;
|
|
envObject[`process.env.${key}`] = `'${nconf.get(key)}'`;
|
|
});
|
|
if (nconf.get('BASE_URL').indexOf('//habitica.com') !== -1) {
|
|
envObject['import.meta.env.DEBUG_ENABLED'] = `false`;
|
|
envObject['import.meta.env.TIME_TRAVEL_ENABLED'] = `false`;
|
|
}
|
|
|
|
// https://vitejs.dev/config/
|
|
export default defineConfig({
|
|
define: envObject,
|
|
resolve: {
|
|
alias: [
|
|
{ find: '@', replacement: fileURLToPath(new URL('./src', import.meta.url)) },
|
|
{ find: '~', replacement: fileURLToPath(new URL('./node_modules', import.meta.url)) },
|
|
],
|
|
extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'],
|
|
dedupe: ['moment', 'lodash', 'moment-recur'],
|
|
},
|
|
plugins: [
|
|
vue(),
|
|
compression({
|
|
filename: 'compressed/[base]',
|
|
compressionOptions: { level: 9 },
|
|
skipIfLargerOrEqual: false,
|
|
}),
|
|
ViteS3(ENABLE_S3, {
|
|
include: [/compressed\/.*/],
|
|
basePath: nconf.get('S3_BASE_PATH'),
|
|
clientConfig: {
|
|
credentials: {
|
|
accessKeyId: nconf.get('S3_ACCESS_KEY'),
|
|
secretAccessKey: nconf.get('S3_SECRET_KEY'),
|
|
},
|
|
region: nconf.get('S3_REGION'),
|
|
},
|
|
uploadOptions: {
|
|
Bucket: nconf.get('S3_BUCKET_NAME'),
|
|
ContentEncoding: 'gzip',
|
|
}
|
|
}),
|
|
ViteS3(ENABLE_S3, {
|
|
include: [/.*\.(png|jpg|jpeg|gif|svg|webp|ico)/],
|
|
basePath: nconf.get('S3_BASE_PATH'),
|
|
clientConfig: {
|
|
credentials: {
|
|
accessKeyId: nconf.get('S3_ACCESS_KEY'),
|
|
secretAccessKey: nconf.get('S3_SECRET_KEY'),
|
|
},
|
|
region: nconf.get('S3_REGION'),
|
|
},
|
|
uploadOptions: {
|
|
Bucket: nconf.get('S3_BUCKET_NAME'),
|
|
}
|
|
})
|
|
],
|
|
experimental: {
|
|
renderBuiltUrl(filename, { hostType }) {
|
|
if (ENABLE_S3) {
|
|
if (hostType === 'js' && (filename.endsWith('.js') || filename.endsWith('.css'))) {
|
|
return { relative: true }
|
|
} else if (filename.endsWith('.js') || filename.endsWith('.css')) {
|
|
const name = filename.replace('assets/', 'compressed/')
|
|
return `${S3_URL}${name}`
|
|
}
|
|
return `${S3_URL}${filename}`
|
|
} else {
|
|
return { relative: true }
|
|
}
|
|
}
|
|
},
|
|
optimizeDeps: {
|
|
include: ['moment-recur']
|
|
},
|
|
build: {
|
|
commonjsOptions: {
|
|
include: [/moment-recur/, /node_modules/]
|
|
},
|
|
rollupOptions: {
|
|
output: {
|
|
experimentalMinChunkSize: 1000
|
|
}
|
|
}
|
|
},
|
|
base: '/',
|
|
server: {
|
|
headers: { 'Cache-Control': 'no-store' },
|
|
proxy: {
|
|
// proxy all requests to the server at IP:PORT as specified in the top-level config
|
|
'^/api/v3': {
|
|
target: DEV_BASE_URL,
|
|
changeOrigin: true,
|
|
},
|
|
'^/api/v4': {
|
|
target: DEV_BASE_URL,
|
|
changeOrigin: true,
|
|
},
|
|
'^/stripe': {
|
|
target: DEV_BASE_URL,
|
|
changeOrigin: true,
|
|
},
|
|
'^/amazon': {
|
|
target: DEV_BASE_URL,
|
|
changeOrigin: true,
|
|
},
|
|
'^/paypal': {
|
|
target: DEV_BASE_URL,
|
|
changeOrigin: true,
|
|
},
|
|
'^/logout-server': {
|
|
target: DEV_BASE_URL,
|
|
changeOrigin: true,
|
|
},
|
|
'^/export': {
|
|
target: DEV_BASE_URL,
|
|
changeOrigin: true,
|
|
},
|
|
'^/analytics': {
|
|
target: DEV_BASE_URL,
|
|
changeOrigin: true,
|
|
},
|
|
}
|
|
}
|
|
})
|