2023-01-29 18:52:01 +03:00
|
|
|
import { createResolver, useNuxt } from '@nuxt/kit'
|
2023-01-16 12:48:57 +03:00
|
|
|
import { isCI, isDevelopment, isWindows } from 'std-env'
|
2023-01-08 14:17:09 +03:00
|
|
|
import { isPreview } from './config/env'
|
2022-12-18 02:29:16 +03:00
|
|
|
import { pwa } from './config/pwa'
|
2023-04-12 15:35:35 +03:00
|
|
|
import type { BuildInfo } from './types'
|
2024-02-24 19:46:14 +03:00
|
|
|
import { currentLocales } from './config/i18n'
|
2022-12-08 13:50:44 +03:00
|
|
|
|
2023-01-12 19:31:18 +03:00
|
|
|
const { resolve } = createResolver(import.meta.url)
|
|
|
|
|
2022-11-13 08:34:43 +03:00
|
|
|
export default defineNuxtConfig({
|
2024-09-11 17:37:59 +03:00
|
|
|
compatibilityDate: '2024-09-11',
|
2022-12-18 02:29:16 +03:00
|
|
|
typescript: {
|
|
|
|
tsConfig: {
|
|
|
|
exclude: ['../service-worker'],
|
2023-01-08 10:49:32 +03:00
|
|
|
vueCompilerOptions: {
|
2024-09-11 17:37:59 +03:00
|
|
|
target: 3.5,
|
2023-01-08 10:49:32 +03:00
|
|
|
},
|
2022-12-18 02:29:16 +03:00
|
|
|
},
|
|
|
|
},
|
2022-11-13 08:34:43 +03:00
|
|
|
modules: [
|
|
|
|
'@vueuse/nuxt',
|
|
|
|
'@unocss/nuxt',
|
|
|
|
'@pinia/nuxt',
|
2022-11-23 11:07:28 +03:00
|
|
|
'@vue-macros/nuxt',
|
2022-11-28 13:24:05 +03:00
|
|
|
'@nuxtjs/i18n',
|
2022-12-29 15:26:08 +03:00
|
|
|
'@nuxtjs/color-mode',
|
2023-04-26 23:46:00 +03:00
|
|
|
'@unlazy/nuxt',
|
2023-12-14 14:45:52 +03:00
|
|
|
'@nuxt/test-utils/module',
|
2023-01-17 13:51:32 +03:00
|
|
|
...(isDevelopment || isWindows) ? [] : ['nuxt-security'],
|
2023-02-15 22:15:11 +03:00
|
|
|
'~/modules/emoji-mart-translation',
|
2022-11-25 17:42:26 +03:00
|
|
|
'~/modules/purge-comments',
|
2023-01-08 14:18:58 +03:00
|
|
|
'~/modules/build-env',
|
2022-12-21 02:56:57 +03:00
|
|
|
'~/modules/tauri/index',
|
2023-01-13 11:46:07 +03:00
|
|
|
'~/modules/pwa/index', // change to '@vite-pwa/nuxt' once released and remove pwa module
|
2023-02-17 17:17:41 +03:00
|
|
|
'stale-dep/nuxt',
|
2022-11-13 08:34:43 +03:00
|
|
|
],
|
2023-08-01 12:43:55 +03:00
|
|
|
vue: {
|
2024-02-21 18:20:08 +03:00
|
|
|
propsDestructure: true,
|
2023-08-01 12:43:55 +03:00
|
|
|
},
|
2023-07-04 08:18:36 +03:00
|
|
|
macros: {
|
|
|
|
setupSFC: true,
|
2023-08-01 12:43:55 +03:00
|
|
|
betterDefine: false,
|
|
|
|
defineModels: false,
|
2024-02-21 18:20:08 +03:00
|
|
|
reactivityTransform: false,
|
2023-07-04 08:18:36 +03:00
|
|
|
},
|
2023-04-12 15:35:35 +03:00
|
|
|
devtools: {
|
|
|
|
enabled: true,
|
|
|
|
},
|
2024-02-24 19:46:14 +03:00
|
|
|
features: {
|
|
|
|
inlineStyles: false,
|
|
|
|
},
|
2022-11-13 08:34:43 +03:00
|
|
|
experimental: {
|
2022-12-21 02:56:57 +03:00
|
|
|
payloadExtraction: false,
|
2023-04-12 15:35:35 +03:00
|
|
|
renderJsonPayloads: true,
|
2022-11-13 08:34:43 +03:00
|
|
|
},
|
|
|
|
css: [
|
|
|
|
'@unocss/reset/tailwind.css',
|
2022-11-24 16:34:35 +03:00
|
|
|
'floating-vue/dist/style.css',
|
2023-01-16 13:26:19 +03:00
|
|
|
'~/styles/default-theme.css',
|
2022-11-13 19:05:32 +03:00
|
|
|
'~/styles/vars.css',
|
2022-11-15 19:39:25 +03:00
|
|
|
'~/styles/global.css',
|
2023-01-21 17:55:20 +03:00
|
|
|
...process.env.TAURI_PLATFORM === 'macos'
|
|
|
|
? []
|
|
|
|
: ['~/styles/scrollbars.css'],
|
2022-11-25 16:21:02 +03:00
|
|
|
'~/styles/tiptap.css',
|
2022-11-24 16:34:35 +03:00
|
|
|
'~/styles/dropdown.css',
|
2022-11-13 08:34:43 +03:00
|
|
|
],
|
2022-11-14 06:45:20 +03:00
|
|
|
alias: {
|
2022-12-21 04:06:39 +03:00
|
|
|
'querystring': 'rollup-plugin-node-polyfills/polyfills/qs',
|
2022-12-22 17:22:56 +03:00
|
|
|
'change-case': 'scule',
|
2023-01-12 19:31:18 +03:00
|
|
|
'semver': resolve('./mocks/semver'),
|
2022-11-14 06:45:20 +03:00
|
|
|
},
|
2022-12-28 17:57:06 +03:00
|
|
|
imports: {
|
|
|
|
dirs: [
|
2023-01-06 21:35:45 +03:00
|
|
|
'./composables/masto',
|
2022-12-28 17:57:06 +03:00
|
|
|
'./composables/push-notifications',
|
2023-01-06 20:39:37 +03:00
|
|
|
'./composables/settings',
|
2023-01-16 14:42:48 +03:00
|
|
|
'./composables/tiptap/index.ts',
|
2022-12-28 17:57:06 +03:00
|
|
|
],
|
2024-02-24 15:24:21 +03:00
|
|
|
imports: [{
|
|
|
|
name: 'useI18n',
|
|
|
|
from: '~/utils/i18n',
|
|
|
|
priority: 100,
|
|
|
|
}],
|
2023-01-29 16:20:37 +03:00
|
|
|
injectAtEnd: true,
|
2022-12-28 17:57:06 +03:00
|
|
|
},
|
2022-11-15 20:14:10 +03:00
|
|
|
vite: {
|
|
|
|
define: {
|
2022-11-24 06:42:03 +03:00
|
|
|
'process.env.VSCODE_TEXTMATE_DEBUG': 'false',
|
2022-12-12 02:18:09 +03:00
|
|
|
'process.mock': ((!isCI || isPreview) && process.env.MOCK_USER) || 'false',
|
2023-01-15 22:09:01 +03:00
|
|
|
'process.test': 'false',
|
2022-11-15 20:14:10 +03:00
|
|
|
},
|
2022-11-23 02:27:01 +03:00
|
|
|
build: {
|
2022-12-21 02:56:57 +03:00
|
|
|
target: 'esnext',
|
2022-11-23 02:27:01 +03:00
|
|
|
},
|
2024-02-24 15:24:21 +03:00
|
|
|
optimizeDeps: {
|
|
|
|
include: [
|
2024-03-05 17:48:58 +03:00
|
|
|
'@tiptap/vue-3',
|
|
|
|
'string-length',
|
|
|
|
'vue-virtual-scroller',
|
|
|
|
'emoji-mart',
|
|
|
|
'iso-639-1',
|
|
|
|
'@tiptap/extension-placeholder',
|
|
|
|
'@tiptap/extension-document',
|
|
|
|
'@tiptap/extension-paragraph',
|
|
|
|
'@tiptap/extension-text',
|
|
|
|
'@tiptap/extension-mention',
|
|
|
|
'@tiptap/extension-hard-break',
|
|
|
|
'@tiptap/extension-bold',
|
|
|
|
'@tiptap/extension-italic',
|
|
|
|
'@tiptap/extension-code',
|
|
|
|
'@tiptap/extension-history',
|
|
|
|
'prosemirror-state',
|
|
|
|
'browser-fs-access',
|
|
|
|
'blurhash',
|
|
|
|
'@vueuse/integrations/useFocusTrap',
|
|
|
|
'@tiptap/extension-code-block',
|
|
|
|
'prosemirror-highlight',
|
|
|
|
'@tiptap/core',
|
|
|
|
'tippy.js',
|
|
|
|
'prosemirror-highlight/shiki',
|
|
|
|
'@fnando/sparkline',
|
|
|
|
'@vueuse/gesture',
|
|
|
|
'github-reserved-names',
|
|
|
|
'file-saver',
|
|
|
|
'slimeform',
|
|
|
|
'vue-advanced-cropper',
|
|
|
|
'workbox-window',
|
|
|
|
'workbox-precaching',
|
|
|
|
'workbox-routing',
|
|
|
|
'workbox-cacheable-response',
|
|
|
|
'workbox-strategies',
|
|
|
|
'workbox-expiration',
|
2024-02-24 15:24:21 +03:00
|
|
|
],
|
|
|
|
},
|
2022-11-15 20:14:10 +03:00
|
|
|
},
|
2022-11-14 06:33:09 +03:00
|
|
|
postcss: {
|
|
|
|
plugins: {
|
|
|
|
'postcss-nested': {},
|
|
|
|
},
|
|
|
|
},
|
2023-01-29 18:52:01 +03:00
|
|
|
appConfig: {
|
|
|
|
storage: {
|
|
|
|
driver: process.env.NUXT_STORAGE_DRIVER ?? (isCI ? 'cloudflare' : 'fs'),
|
|
|
|
},
|
|
|
|
},
|
2022-11-15 18:54:58 +03:00
|
|
|
runtimeConfig: {
|
2023-01-15 12:34:17 +03:00
|
|
|
adminKey: '',
|
2022-11-24 02:12:25 +03:00
|
|
|
cloudflare: {
|
|
|
|
accountId: '',
|
|
|
|
namespaceId: '',
|
|
|
|
apiToken: '',
|
|
|
|
},
|
2024-01-02 13:58:37 +03:00
|
|
|
vercel: {
|
|
|
|
url: '',
|
|
|
|
token: '',
|
|
|
|
env: '',
|
|
|
|
base: '',
|
|
|
|
},
|
2022-11-25 03:14:16 +03:00
|
|
|
public: {
|
2023-01-27 11:45:23 +03:00
|
|
|
privacyPolicyUrl: '',
|
2023-01-29 17:18:27 +03:00
|
|
|
// We use LibreTranslate (https://github.com/LibreTranslate/LibreTranslate) as
|
|
|
|
// our default translation server #76
|
2022-11-25 03:14:16 +03:00
|
|
|
translateApi: '',
|
2023-01-16 13:24:14 +03:00
|
|
|
// Use the instance where Elk has its Mastodon account as the default
|
2023-01-16 13:25:34 +03:00
|
|
|
defaultServer: 'm.webtoo.ls',
|
2023-02-07 15:10:43 +03:00
|
|
|
singleInstance: false,
|
2022-11-25 03:14:16 +03:00
|
|
|
},
|
2022-12-01 00:17:20 +03:00
|
|
|
storage: {
|
2023-01-29 18:52:01 +03:00
|
|
|
fsBase: 'node_modules/.cache/app',
|
2022-12-01 00:17:20 +03:00
|
|
|
},
|
2022-11-15 18:54:58 +03:00
|
|
|
},
|
2022-12-18 02:29:16 +03:00
|
|
|
routeRules: {
|
2023-02-08 20:12:51 +03:00
|
|
|
// Static generation
|
|
|
|
'/': { prerender: true },
|
|
|
|
'/settings/**': { prerender: false },
|
|
|
|
// incremental regeneration
|
2022-12-28 18:17:37 +03:00
|
|
|
'/api/list-servers': { swr: true },
|
2023-02-08 20:12:51 +03:00
|
|
|
// CDN cache rules
|
2022-12-18 02:29:16 +03:00
|
|
|
'/manifest.webmanifest': {
|
|
|
|
headers: {
|
|
|
|
'Content-Type': 'application/manifest+json',
|
2023-02-12 14:08:50 +03:00
|
|
|
'Cache-Control': 'public, max-age=0, must-revalidate',
|
2022-12-18 02:29:16 +03:00
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2022-11-28 12:01:14 +03:00
|
|
|
nitro: {
|
2023-02-06 12:34:50 +03:00
|
|
|
alias: {
|
|
|
|
'isomorphic-ws': 'unenv/runtime/mock/proxy',
|
|
|
|
},
|
2023-01-24 20:52:22 +03:00
|
|
|
esbuild: {
|
|
|
|
options: {
|
|
|
|
target: 'esnext',
|
|
|
|
},
|
|
|
|
},
|
2022-11-28 12:01:14 +03:00
|
|
|
prerender: {
|
2023-01-11 17:50:47 +03:00
|
|
|
crawlLinks: true,
|
2022-11-28 12:01:14 +03:00
|
|
|
},
|
2023-03-26 17:53:07 +03:00
|
|
|
publicAssets: [
|
|
|
|
{
|
2024-04-05 17:34:42 +03:00
|
|
|
dir: resolve('./public/avatars'),
|
2023-03-26 17:53:07 +03:00
|
|
|
maxAge: 24 * 60 * 60 * 30, // 30 days
|
|
|
|
baseURL: '/avatars',
|
|
|
|
},
|
|
|
|
{
|
2024-04-05 17:34:42 +03:00
|
|
|
dir: resolve('./public/emojis'),
|
2023-03-26 17:53:07 +03:00
|
|
|
maxAge: 24 * 60 * 60 * 15, // 15 days, matching service worker
|
|
|
|
baseURL: '/emojis',
|
|
|
|
},
|
|
|
|
{
|
2024-04-05 17:34:42 +03:00
|
|
|
dir: resolve('./public/fonts'),
|
2023-03-26 17:53:07 +03:00
|
|
|
maxAge: 24 * 60 * 60 * 365, // 1 year (versioned)
|
|
|
|
baseURL: '/fonts',
|
|
|
|
},
|
|
|
|
],
|
2022-11-28 12:01:14 +03:00
|
|
|
},
|
2023-02-12 13:22:43 +03:00
|
|
|
sourcemap: isDevelopment,
|
2023-01-29 18:52:01 +03:00
|
|
|
hooks: {
|
2023-02-16 12:23:26 +03:00
|
|
|
'prepare:types': function ({ references }) {
|
|
|
|
references.push({ types: '@types/wicg-file-system-access' })
|
|
|
|
},
|
2023-01-29 18:52:01 +03:00
|
|
|
'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)}`
|
|
|
|
},
|
2023-02-06 12:34:50 +03:00
|
|
|
'vite:extendConfig': function (config, { isServer }) {
|
|
|
|
if (isServer) {
|
|
|
|
const alias = config.resolve!.alias as Record<string, string>
|
|
|
|
for (const dep of ['eventemitter3', 'isomorphic-ws'])
|
|
|
|
alias[dep] = resolve('./mocks/class')
|
2023-12-20 21:54:40 +03:00
|
|
|
for (const dep of ['fuse.js'])
|
2023-02-06 12:34:50 +03:00
|
|
|
alias[dep] = 'unenv/runtime/mock/proxy'
|
|
|
|
const resolver = createResolver(import.meta.url)
|
|
|
|
|
|
|
|
config.plugins!.unshift({
|
|
|
|
name: 'mock',
|
|
|
|
enforce: 'pre',
|
|
|
|
resolveId(id) {
|
|
|
|
if (id.match(/(^|\/)(@tiptap)\//))
|
|
|
|
return resolver.resolve('./mocks/tiptap.ts')
|
|
|
|
if (id.match(/(^|\/)(prosemirror)/))
|
|
|
|
return resolver.resolve('./mocks/prosemirror.ts')
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
|
|
|
const noExternal = config.ssr!.noExternal as string[]
|
|
|
|
noExternal.push('masto', '@fnando/sparkline', 'vue-i18n', '@mastojs/ponyfills')
|
|
|
|
}
|
|
|
|
},
|
2023-01-29 18:52:01 +03:00
|
|
|
},
|
2022-11-27 20:34:45 +03:00
|
|
|
app: {
|
|
|
|
keepalive: true,
|
2022-11-29 19:27:35 +03:00
|
|
|
head: {
|
2023-01-31 22:14:58 +03:00
|
|
|
viewport: 'width=device-width,initial-scale=1,viewport-fit=cover',
|
2022-12-08 13:50:44 +03:00
|
|
|
bodyAttrs: {
|
|
|
|
class: 'overflow-x-hidden',
|
|
|
|
},
|
|
|
|
link: [
|
2022-12-20 01:37:23 +03:00
|
|
|
{ rel: 'icon', href: '/favicon.ico', sizes: 'any' },
|
2023-01-03 03:14:53 +03:00
|
|
|
{ rel: 'icon', type: 'image/svg+xml', href: '/logo.svg' },
|
2022-12-20 01:37:23 +03:00
|
|
|
{ rel: 'apple-touch-icon', href: '/apple-touch-icon.png' },
|
2022-12-08 13:50:44 +03:00
|
|
|
],
|
2023-01-02 01:03:25 +03:00
|
|
|
meta: [
|
2024-08-09 08:58:49 +03:00
|
|
|
{ name: 'apple-mobile-web-app-status-bar-style', content: 'default' },
|
2023-01-12 01:42:52 +03:00
|
|
|
// open graph social image
|
|
|
|
{ property: 'og:title', content: 'Elk' },
|
2023-01-12 01:51:23 +03:00
|
|
|
{ property: 'og:description', content: 'A nimble Mastodon web client' },
|
2023-01-12 01:42:52 +03:00
|
|
|
{ property: 'og:type', content: 'website' },
|
2023-01-12 18:02:58 +03:00
|
|
|
{ property: 'og:image', content: 'https://elk.zone/elk-og.png' },
|
2023-01-12 01:42:52 +03:00
|
|
|
{ property: 'og:image:width', content: '3800' },
|
|
|
|
{ property: 'og:image:height', content: '1900' },
|
|
|
|
{ property: 'og:site_name', content: 'Elk' },
|
2024-06-11 00:20:54 +03:00
|
|
|
{ name: 'twitter:site', content: '@elk_zone' },
|
|
|
|
{ name: 'twitter:card', content: 'summary_large_image' },
|
2023-01-02 01:03:25 +03:00
|
|
|
],
|
2022-11-29 19:27:35 +03:00
|
|
|
},
|
2022-11-27 20:34:45 +03:00
|
|
|
},
|
2024-03-05 17:48:58 +03:00
|
|
|
|
2024-08-16 17:52:08 +03:00
|
|
|
// eslint-disable-next-line ts/ban-ts-comment
|
2023-01-17 13:51:32 +03:00
|
|
|
// @ts-ignore nuxt-security is conditional
|
2023-01-16 04:00:44 +03:00
|
|
|
security: {
|
|
|
|
headers: {
|
|
|
|
crossOriginEmbedderPolicy: false,
|
|
|
|
contentSecurityPolicy: {
|
2023-03-24 03:12:42 +03:00
|
|
|
'default-src': ['\'self\''],
|
|
|
|
'base-uri': ['\'self\''],
|
|
|
|
'connect-src': ['\'self\'', 'https:', 'http:', 'wss:', 'ws:'],
|
|
|
|
'font-src': ['\'self\''],
|
|
|
|
'form-action': ['\'none\''],
|
|
|
|
'frame-ancestors': ['\'none\''],
|
2023-11-12 09:42:02 +03:00
|
|
|
'frame-src': ['https:'],
|
2023-03-24 03:12:42 +03:00
|
|
|
'img-src': ['\'self\'', 'https:', 'http:', 'data:', 'blob:'],
|
2023-10-12 17:57:52 +03:00
|
|
|
'manifest-src': ['\'self\''],
|
2023-03-24 03:12:42 +03:00
|
|
|
'media-src': ['\'self\'', 'https:', 'http:'],
|
|
|
|
'object-src': ['\'none\''],
|
|
|
|
'script-src': ['\'self\'', '\'unsafe-inline\'', '\'wasm-unsafe-eval\''],
|
|
|
|
'script-src-attr': ['\'none\''],
|
|
|
|
'style-src': ['\'self\'', '\'unsafe-inline\''],
|
|
|
|
'upgrade-insecure-requests': true,
|
2023-01-16 04:00:44 +03:00
|
|
|
},
|
2023-07-29 21:45:30 +03:00
|
|
|
permissionsPolicy: {
|
|
|
|
fullscreen: ['\'self\'', 'https:', 'http:'],
|
|
|
|
},
|
2023-01-16 04:00:44 +03:00
|
|
|
},
|
|
|
|
rateLimiter: false,
|
|
|
|
},
|
2022-12-29 15:26:08 +03:00
|
|
|
colorMode: { classSuffix: '' },
|
2024-02-24 19:46:14 +03:00
|
|
|
i18n: {
|
|
|
|
locales: currentLocales,
|
|
|
|
lazy: true,
|
|
|
|
strategy: 'no_prefix',
|
|
|
|
detectBrowserLanguage: false,
|
|
|
|
langDir: 'locales',
|
|
|
|
defaultLocale: 'en-US',
|
|
|
|
vueI18n: './config/i18n.config.ts',
|
|
|
|
},
|
2022-12-18 02:29:16 +03:00
|
|
|
pwa,
|
2023-02-17 17:30:23 +03:00
|
|
|
staleDep: {
|
|
|
|
packageManager: 'pnpm',
|
|
|
|
},
|
2023-04-26 23:46:00 +03:00
|
|
|
unlazy: {
|
|
|
|
ssr: false,
|
|
|
|
},
|
2022-11-13 08:34:43 +03:00
|
|
|
})
|
2022-11-29 09:39:49 +03:00
|
|
|
|
|
|
|
declare global {
|
2024-03-05 17:48:58 +03:00
|
|
|
// eslint-disable-next-line ts/no-namespace
|
2022-11-29 09:39:49 +03:00
|
|
|
namespace NodeJS {
|
|
|
|
interface Process {
|
|
|
|
mock?: Record<string, any>
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-01-31 06:42:46 +03:00
|
|
|
|
2023-05-02 12:48:33 +03:00
|
|
|
declare module '#app' {
|
2024-08-16 17:33:39 +03:00
|
|
|
interface PageMeta {
|
|
|
|
wideLayout?: boolean
|
|
|
|
}
|
|
|
|
|
2023-01-31 06:42:46 +03:00
|
|
|
interface RuntimeNuxtHooks {
|
|
|
|
'elk-logo:click': () => void
|
|
|
|
}
|
|
|
|
}
|
2023-04-12 15:35:35 +03:00
|
|
|
|
|
|
|
declare module '@nuxt/schema' {
|
|
|
|
interface AppConfig {
|
|
|
|
storage: any
|
|
|
|
env: BuildInfo['env']
|
|
|
|
buildInfo: BuildInfo
|
|
|
|
}
|
|
|
|
}
|