elk/nuxt.config.ts

224 lines
6.1 KiB
TypeScript
Raw Normal View History

import { createResolver, useNuxt } from '@nuxt/kit'
2022-11-27 07:54:56 +01:00
import Inspect from 'vite-plugin-inspect'
import { isCI, isDevelopment, isWindows } from 'std-env'
import { isPreview } from './config/env'
import { i18n } from './config/i18n'
import { pwa } from './config/pwa'
2023-01-12 17:31:18 +01:00
const { resolve } = createResolver(import.meta.url)
2022-11-13 06:34:43 +01:00
export default defineNuxtConfig({
typescript: {
tsConfig: {
exclude: ['../service-worker'],
vueCompilerOptions: {
jsxTemplates: true,
experimentalRfc436: true,
},
},
},
2022-11-13 06:34:43 +01:00
modules: [
'@vueuse/nuxt',
'@unocss/nuxt',
'@pinia/nuxt',
'@vue-macros/nuxt',
2022-11-28 11:24:05 +01:00
'@nuxtjs/i18n',
'@nuxtjs/color-mode',
2023-01-29 14:20:37 +01:00
'nuxt-vitest',
2023-01-17 11:51:32 +01:00
...(isDevelopment || isWindows) ? [] : ['nuxt-security'],
'~/modules/purge-comments',
'~/modules/setup-components',
2023-01-08 12:18:58 +01:00
'~/modules/build-env',
'~/modules/tauri/index',
'~/modules/pwa/index', // change to '@vite-pwa/nuxt' once released and remove pwa module
2023-01-13 19:57:31 +01:00
'~/modules/stale-dep',
['unplugin-vue-inspector/nuxt', {
enabled: false,
toggleButtonVisibility: 'never',
}],
2022-11-13 06:34:43 +01:00
],
experimental: {
payloadExtraction: false,
2022-11-13 06:34:43 +01:00
reactivityTransform: true,
inlineSSRStyles: false,
},
css: [
'@unocss/reset/tailwind.css',
2022-11-24 14:34:35 +01:00
'floating-vue/dist/style.css',
2023-01-16 11:26:19 +01:00
'~/styles/default-theme.css',
2022-11-13 17:05:32 +01:00
'~/styles/vars.css',
2022-11-15 17:39:25 +01:00
'~/styles/global.css',
...process.env.TAURI_PLATFORM === 'macos'
? []
: ['~/styles/scrollbars.css'],
'~/styles/tiptap.css',
2022-11-24 14:34:35 +01:00
'~/styles/dropdown.css',
2022-11-13 06:34:43 +01:00
],
2022-11-14 04:45:20 +01:00
alias: {
2022-12-21 02:06:39 +01:00
'querystring': 'rollup-plugin-node-polyfills/polyfills/qs',
'change-case': 'scule',
2023-01-12 17:31:18 +01:00
'semver': resolve('./mocks/semver'),
2022-11-14 04:45:20 +01:00
},
imports: {
dirs: [
'./composables/masto',
'./composables/push-notifications',
'./composables/settings',
2023-01-16 12:42:48 +01:00
'./composables/tiptap/index.ts',
],
2023-01-29 14:20:37 +01:00
injectAtEnd: true,
},
2022-11-15 18:14:10 +01:00
vite: {
define: {
2022-11-24 04:42:03 +01:00
'process.env.VSCODE_TEXTMATE_DEBUG': 'false',
2022-12-12 00:18:09 +01:00
'process.mock': ((!isCI || isPreview) && process.env.MOCK_USER) || 'false',
'process.test': 'false',
2022-11-15 18:14:10 +01:00
},
2022-11-23 00:27:01 +01:00
build: {
target: 'esnext',
rollupOptions: {
output: {
manualChunks: (id) => {
// TODO: find and resolve issue in nuxt/vite/pwa
if (id.includes('.svg') || id.includes('entry'))
return 'entry'
},
},
},
2022-11-23 00:27:01 +01:00
},
2022-11-27 07:54:56 +01:00
plugins: [
Inspect(),
],
2022-11-15 18:14:10 +01:00
},
2022-11-14 04:33:09 +01:00
postcss: {
plugins: {
'postcss-nested': {},
},
},
appConfig: {
singleInstanceServer: process.env.SINGLE_INSTANCE_SERVER === 'true',
storage: {
driver: process.env.NUXT_STORAGE_DRIVER ?? (isCI ? 'cloudflare' : 'fs'),
},
},
2022-11-15 16:54:58 +01:00
runtimeConfig: {
2023-01-15 10:34:17 +01:00
adminKey: '',
cloudflare: {
accountId: '',
namespaceId: '',
apiToken: '',
},
public: {
2023-01-27 09:45:23 +01:00
privacyPolicyUrl: '',
// We use LibreTranslate (https://github.com/LibreTranslate/LibreTranslate) as
// our default translation server #76
translateApi: '',
// Use the instance where Elk has its Mastodon account as the default
2023-01-16 11:25:34 +01:00
defaultServer: 'm.webtoo.ls',
},
storage: {
fsBase: 'node_modules/.cache/app',
},
2022-11-15 16:54:58 +01:00
},
routeRules: {
2022-12-28 16:17:37 +01:00
'/api/list-servers': { swr: true },
'/manifest.webmanifest': {
headers: {
'Content-Type': 'application/manifest+json',
},
},
},
2023-02-05 18:44:37 +01:00
build: {
transpile: ['masto'],
},
nitro: {
2023-01-24 18:52:22 +01:00
esbuild: {
options: {
target: 'esnext',
},
},
prerender: {
crawlLinks: true,
routes: ['/'],
ignore: ['/settings'],
},
},
hooks: {
'nitro:config': function (config) {
const nuxt = useNuxt()
config.virtual = config.virtual || {}
config.virtual['#storage-config'] = `export const driver = ${JSON.stringify(nuxt.options.appConfig.storage.driver)}`
},
},
app: {
keepalive: true,
head: {
viewport: 'width=device-width,initial-scale=1,viewport-fit=cover',
bodyAttrs: {
class: 'overflow-x-hidden',
},
link: [
{ rel: 'icon', href: '/favicon.ico', sizes: 'any' },
{ rel: 'icon', type: 'image/svg+xml', href: '/logo.svg' },
{ rel: 'apple-touch-icon', href: '/apple-touch-icon.png' },
],
2023-01-01 23:03:25 +01:00
meta: [
{ name: 'apple-mobile-web-app-status-bar-style', content: 'black-translucent' },
2023-01-11 23:42:52 +01:00
// open graph social image
{ property: 'og:title', content: 'Elk' },
2023-01-11 23:51:23 +01:00
{ property: 'og:description', content: 'A nimble Mastodon web client' },
2023-01-11 23:42:52 +01:00
{ property: 'og:type', content: 'website' },
{ property: 'og:image', content: 'https://elk.zone/elk-og.png' },
2023-01-11 23:42:52 +01:00
{ property: 'og:image:width', content: '3800' },
{ property: 'og:image:height', content: '1900' },
{ property: 'og:site_name', content: 'Elk' },
{ property: 'twitter:site', content: '@elk_zone' },
2023-01-12 00:08:20 +01:00
{ property: 'twitter:card', content: 'summary_large_image' },
2023-01-01 23:03:25 +01:00
],
},
},
2023-01-17 11:51:32 +01:00
// eslint-disable-next-line @typescript-eslint/prefer-ts-expect-error
// @ts-ignore nuxt-security is conditional
security: {
headers: {
crossOriginEmbedderPolicy: false,
contentSecurityPolicy: {
value: {
'default-src': ['\'self\''],
'base-uri': ['\'self\''],
'connect-src': ['\'self\'', 'https:', 'http:', 'wss:', 'ws:'],
'font-src': ['\'self\''],
'form-action': ['\'none\''],
'frame-ancestors': ['\'none\''],
'img-src': ['\'self\'', 'https:', 'http:', 'data:'],
'media-src': ['\'self\'', 'https:', 'http:'],
'object-src': ['\'none\''],
2023-01-18 14:51:44 +01:00
'script-src': ['\'self\'', '\'unsafe-inline\'', '\'wasm-unsafe-eval\''],
'script-src-attr': ['\'none\''],
'style-src': ['\'self\'', '\'unsafe-inline\''],
'upgrade-insecure-requests': true,
},
route: '/**',
},
},
rateLimiter: false,
},
colorMode: { classSuffix: '' },
i18n,
pwa,
2022-11-13 06:34:43 +01:00
})
declare global {
namespace NodeJS {
interface Process {
mock?: Record<string, any>
}
}
}
declare module 'nuxt/dist/app' {
interface RuntimeNuxtHooks {
'elk-logo:click': () => void
}
}