Establishes clear testing standards and best practices: - Mandates unit testing for all API endpoints - Defines test organization and file structure - Introduces testing scope and strategy - Documents best practices for writing tests - Sets minimum coverage requirements (80%) - Adds test data management guidelines Updates project documentation to reflect testing requirements and development workflow. Includes practical examples of good testing patterns and proper test organization.
135 lines
2.8 KiB
TypeScript
135 lines
2.8 KiB
TypeScript
import { provider } from 'std-env'
|
|
import { currentLocales } from './i18n/i18n'
|
|
|
|
// https://nuxt.com/docs/api/configuration/nuxt-config
|
|
export default defineNuxtConfig({
|
|
modules: [
|
|
'@nuxthub/core',
|
|
'shadcn-nuxt',
|
|
'@vueuse/motion/nuxt',
|
|
'@nuxt/eslint',
|
|
'@nuxtjs/tailwindcss',
|
|
'@nuxtjs/color-mode',
|
|
'@nuxtjs/i18n',
|
|
],
|
|
|
|
devtools: { enabled: true },
|
|
|
|
colorMode: {
|
|
classSuffix: '',
|
|
},
|
|
|
|
runtimeConfig: {
|
|
siteToken: crypto.randomUUID(),
|
|
redirectStatusCode: '301',
|
|
linkCacheTtl: 60,
|
|
redirectWithQuery: false,
|
|
homeURL: '',
|
|
cfAccountId: '',
|
|
cfApiToken: '',
|
|
dataset: 'sink',
|
|
aiModel: '@cf/meta/llama-3.1-8b-instruct',
|
|
aiPrompt: `You are a URL shortening assistant, please shorten the URL provided by the user into a SLUG. The SLUG information must come from the URL itself, do not make any assumptions. A SLUG is human-readable and should not exceed three words and can be validated using regular expressions {slugRegex} . Only the best one is returned, the format must be JSON reference {"slug": "example-slug"}`,
|
|
caseSensitive: false,
|
|
listQueryLimit: 500,
|
|
disableBotAccessLog: false,
|
|
public: {
|
|
previewMode: '',
|
|
slugDefaultLength: '6',
|
|
},
|
|
},
|
|
|
|
routeRules: {
|
|
'/': {
|
|
prerender: true,
|
|
},
|
|
'/dashboard/**': {
|
|
prerender: true,
|
|
ssr: false,
|
|
},
|
|
'/dashboard': {
|
|
redirect: '/dashboard/links',
|
|
},
|
|
},
|
|
|
|
future: {
|
|
compatibilityVersion: 4,
|
|
},
|
|
|
|
experimental: {
|
|
enforceModuleCompatibility: true,
|
|
},
|
|
|
|
compatibilityDate: {
|
|
cloudflare: '2025-05-08',
|
|
},
|
|
|
|
nitro: {
|
|
experimental: {
|
|
openAPI: true,
|
|
},
|
|
timing: true,
|
|
openAPI: {
|
|
production: 'runtime',
|
|
meta: {
|
|
title: 'Sink API',
|
|
description: 'A Simple / Speedy / Secure Link Shortener with Analytics, 100% run on Cloudflare.',
|
|
},
|
|
route: '/_docs/openapi.json',
|
|
ui: {
|
|
scalar: {
|
|
route: '/_docs/scalar',
|
|
},
|
|
swagger: {
|
|
route: '/_docs/swagger',
|
|
},
|
|
},
|
|
},
|
|
},
|
|
|
|
hub: {
|
|
ai: true,
|
|
analytics: true,
|
|
blob: false,
|
|
cache: false,
|
|
database: false,
|
|
kv: true,
|
|
workers: provider !== 'cloudflare_pages',
|
|
},
|
|
|
|
eslint: {
|
|
config: {
|
|
stylistic: true,
|
|
standalone: false,
|
|
},
|
|
},
|
|
|
|
i18n: {
|
|
locales: currentLocales,
|
|
compilation: {
|
|
strictMessage: false,
|
|
escapeHtml: true,
|
|
},
|
|
lazy: true,
|
|
strategy: 'no_prefix',
|
|
detectBrowserLanguage: {
|
|
useCookie: true,
|
|
cookieKey: 'sink_i18n_redirected',
|
|
redirectOn: 'root',
|
|
},
|
|
baseUrl: '/',
|
|
defaultLocale: 'en-US',
|
|
},
|
|
|
|
shadcn: {
|
|
/**
|
|
* Prefix for all the imported component
|
|
*/
|
|
prefix: '',
|
|
/**
|
|
* Directory that the component lives in.
|
|
* @default "./components/ui"
|
|
*/
|
|
componentDir: './app/components/ui',
|
|
},
|
|
})
|