index/nuxt.config.ts

236 lines
4.7 KiB
TypeScript

import config from './config'
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
app: {
head: {
htmlAttrs: {
lang: config.locale || 'en',
},
link: [
{
rel: 'icon',
type: 'image/x-icon',
href: '/favicon.ico',
},
],
meta: [
{
charset: 'utf-8',
},
{
name: 'viewport',
content: 'width=device-width, initial-scale=1',
},
{
'http-equiv': 'X-UA-Compatible',
content: 'ie=edge',
},
],
},
pageTransition: { name: 'page', mode: 'out-in' },
rootId: 'ender-app',
},
features: {
inlineStyles: false,
},
experimental: {
inlineRouteRules: true,
},
components: {
dirs: [
{
path: '~/components',
pathPrefix: false,
extensions: ['.vue'],
},
],
},
css: ['~/assets/styles/main.scss'],
plugins: [],
modules: [
['@nuxtjs/eslint-module', { failOnError: false, lintOnStart: false }],
['@nuxtjs/stylelint-module', { failOnError: true, lintOnStart: false }],
'@pinia/nuxt',
'@nuxt/content',
'vuetify-nuxt-module',
'@nuxtjs/google-fonts',
'nuxt-site-config',
'nuxt-simple-sitemap',
'nuxt-simple-robots',
'nuxt-og-image',
'nuxt-link-checker',
],
content: {
markdown: {
remarkPlugins: ['remark-reading-time'],
},
highlight: {
theme: 'github-dark',
langs: [
'shell',
'batch',
'vb',
'ini',
'asm',
'c',
'cpp',
'java',
'python',
'csv',
'xml',
'json',
'yaml',
'html',
'css',
'sass',
'php',
'js',
'ts',
'vue',
'md',
'mdc',
'pascal',
'lisp',
'sql',
],
},
},
nitro: {
prerender: {
crawlLinks: true,
autoSubfolderIndex: true,
failOnError: true,
routes: ['/robots.txt', '/sitemap.xml'],
},
},
vuetify: {
moduleOptions: {
importComposables: true,
prefixComposables: true,
styles: {
configFile: config.theme.file,
},
includeTransformAssetsUrls: true,
ssrClientHints: {
reloadOnFirstRequest: false,
viewportSize: true,
prefersColorScheme: true,
prefersColorSchemeOptions: {
cookieName: config.theme.cookie,
lightThemeName: config.theme.light,
darkThemeName: config.theme.dark,
useBrowserThemeOnly: true,
},
prefersReducedMotion: false,
},
},
vuetifyOptions: {
ssr: {
clientWidth: 0,
clientHeight: 0,
},
components: false,
labComponents: true,
directives: false,
date: {
adapter: 'vuetify',
},
theme: {
defaultTheme: config.theme.default,
themes: config.theme.themes,
},
icons: {
defaultSet: 'custom',
},
defaults: {
VBtn: {
style: 'text-transform: none; letter-spacing: normal;',
},
},
},
},
googleFonts: {
download: true,
families: {
Lato: true,
Alexandria: true,
},
},
site: {
env: process.env.NODE_ENV,
url: config.url,
name: config.name,
indexable: true,
trailingSlash: false,
},
linkChecker: {
failOnError: true,
report: {
html: true,
markdown: true,
},
},
// routeRules: {
// '/': {
// sitemap: {
// changefreq: 'yearly',
// priority: 1,
// },
// },
// '/about': {
// sitemap: {
// changefreq: 'yearly',
// priority: 0.6,
// },
// },
// '/projects': {
// sitemap: {
// changefreq: 'monthly',
// priority: 0.7,
// },
// },
// '/social': {
// sitemap: {
// changefreq: 'yearly',
// priority: 0.7,
// },
// },
// },
sitemap: {
sources: ['/api/__sitemap__/content'],
cacheMaxAgeSeconds: 360,
exclude: [],
credits: false,
xslColumns: [
{ label: 'URL', width: '50%' },
{ label: 'Last Modified', select: 'sitemap:lastmod', width: '25%' },
{ label: 'Priority', select: 'sitemap:priority', width: '12.5%' },
{
label: 'Change Frequency',
select: 'sitemap:changefreq',
width: '12.5%',
},
],
defaults: {
changefreq: 'yearly',
priority: 0.7,
lastmod: config.build.date,
},
},
robots: {
enabled: true,
metaTag: true,
blockNonSeoBots: true,
credits: false,
},
typescript: {
typeCheck: true,
},
vue: {
compilerOptions: {
isCustomElement: (tag) => tag === 'iconify-icon',
},
},
})