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