mirror of
https://activitypub.software/TransFem-org/Sharkey
synced 2024-12-30 11:31:16 +00:00
354bed1c32
This commit also adds an error message for when the Content Security Policy is likely at fault for blocking it.
130 lines
3 KiB
TypeScript
130 lines
3 KiB
TypeScript
import dns from 'dns';
|
|
import { readFile } from 'node:fs/promises';
|
|
import type { IncomingMessage } from 'node:http';
|
|
import { defineConfig } from 'vite';
|
|
import type { PluginOption, UserConfig } from 'vite';
|
|
import * as yaml from 'js-yaml';
|
|
import locales from '../../locales/index.js';
|
|
import { getConfig } from './vite.config.js';
|
|
import packageInfo from './package.json' with { type: 'json' };
|
|
|
|
dns.setDefaultResultOrder('ipv4first');
|
|
|
|
const defaultConfig = getConfig();
|
|
|
|
const { port } = yaml.load(await readFile('../../.config/default.yml', 'utf-8'));
|
|
|
|
const httpUrl = `http://localhost:${port}/`;
|
|
const websocketUrl = `ws://localhost:${port}/`;
|
|
const embedUrl = `http://localhost:5174/`;
|
|
|
|
// activitypubリクエストはProxyを通し、それ以外はViteの開発サーバーを返す
|
|
function varyHandler(req: IncomingMessage) {
|
|
if (req.headers.accept?.includes('application/activity+json')) {
|
|
return null;
|
|
}
|
|
return '/index.html';
|
|
}
|
|
|
|
const externalPackages = [
|
|
// sharkey: Used for SkFlashPlayer, has large wasm files so it's loaded via Ruffle's preferred CDN
|
|
{
|
|
name: 'ruffle',
|
|
match: /^@ruffle-rs\/ruffle\/?(?<file>.*)$/,
|
|
path(id: string, pattern: RegExp): string {
|
|
const match = pattern.exec(id)?.groups;
|
|
return match
|
|
? `https://esm.sh/@ruffle-rs/ruffle@${packageInfo.dependencies['@ruffle-rs/ruffle']}/${match['file']}?raw`
|
|
: id;
|
|
},
|
|
},
|
|
]
|
|
|
|
const devConfig: UserConfig = {
|
|
// 基本の設定は vite.config.js から引き継ぐ
|
|
...defaultConfig,
|
|
root: 'src',
|
|
publicDir: '../assets',
|
|
base: './',
|
|
server: {
|
|
host: 'localhost',
|
|
port: 5173,
|
|
proxy: {
|
|
'/api': {
|
|
changeOrigin: true,
|
|
target: httpUrl,
|
|
},
|
|
'/assets': httpUrl,
|
|
'/static-assets': httpUrl,
|
|
'/client-assets': httpUrl,
|
|
'/files': httpUrl,
|
|
'/twemoji': httpUrl,
|
|
'/fluent-emoji': httpUrl,
|
|
'/tossface': httpUrl,
|
|
'/sw.js': httpUrl,
|
|
'/streaming': {
|
|
target: websocketUrl,
|
|
ws: true,
|
|
},
|
|
'/favicon.ico': httpUrl,
|
|
'/robots.txt': httpUrl,
|
|
'/embed.js': httpUrl,
|
|
'/embed': {
|
|
target: embedUrl,
|
|
ws: true,
|
|
},
|
|
'/identicon': {
|
|
target: httpUrl,
|
|
rewrite(path) {
|
|
return path.replace('@localhost:5173', '');
|
|
},
|
|
},
|
|
'/url': httpUrl,
|
|
'/proxy': httpUrl,
|
|
'/_info_card_': httpUrl,
|
|
'/bios': httpUrl,
|
|
'/cli': httpUrl,
|
|
'/inbox': httpUrl,
|
|
'/emoji/': httpUrl,
|
|
'/notes': {
|
|
target: httpUrl,
|
|
bypass: varyHandler,
|
|
},
|
|
'/users': {
|
|
target: httpUrl,
|
|
bypass: varyHandler,
|
|
},
|
|
'/.well-known': {
|
|
target: httpUrl,
|
|
},
|
|
},
|
|
},
|
|
build: {
|
|
...defaultConfig.build,
|
|
rollupOptions: {
|
|
...defaultConfig.build?.rollupOptions,
|
|
external: externalPackages.map(p => p.match),
|
|
output: {
|
|
...defaultConfig.build?.rollupOptions?.output,
|
|
paths(id) {
|
|
for (const p of externalPackages) {
|
|
if (p.match.test(id)) {
|
|
return p.path(id, p.match);
|
|
}
|
|
}
|
|
|
|
return id;
|
|
},
|
|
},
|
|
input: 'index.html',
|
|
},
|
|
},
|
|
|
|
define: {
|
|
...defaultConfig.define,
|
|
_LANGS_FULL_: JSON.stringify(Object.entries(locales)),
|
|
},
|
|
};
|
|
|
|
export default defineConfig(({ command, mode }) => devConfig);
|
|
|