docs: Add project overview, development guidelines, API design patterns, and component design pattern documentation.
This commit is contained in:
parent
643df5c6de
commit
3438170d95
6 changed files with 702 additions and 0 deletions
88
.cursor/rules/api-patterns.mdc
Normal file
88
.cursor/rules/api-patterns.mdc
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# API Design Patterns
|
||||
|
||||
## API Route Structure
|
||||
|
||||
### Link Management API
|
||||
Located in the `server/api/link/` directory, containing the following endpoints:
|
||||
|
||||
- [create.post.ts](mdc:server/api/link/create.post.ts): Create new short links
|
||||
- [edit.put.ts](mdc:server/api/link/edit.put.ts): Edit existing links
|
||||
- [delete.post.ts](mdc:server/api/link/delete.post.ts): Delete links
|
||||
- [list.get.ts](mdc:server/api/link/list.get.ts): Get link lists
|
||||
- [query.get.ts](mdc:server/api/link/query.get.ts): Query specific links
|
||||
- [search.get.ts](mdc:server/api/link/search.get.ts): Search links
|
||||
- [upsert.post.ts](mdc:server/api/link/upsert.post.ts): Create or update links
|
||||
- [ai.get.ts](mdc:server/api/link/ai.get.ts): AI-generated slugs
|
||||
|
||||
### Other APIs
|
||||
- [location.ts](mdc:server/api/location.ts): Geographic location information
|
||||
- [verify.ts](mdc:server/api/verify.ts): Authentication
|
||||
- `stats/`: Analytics-related APIs
|
||||
- `logs/`: Logging-related APIs
|
||||
- `ws/`: WebSocket-related APIs
|
||||
|
||||
## API Design Conventions
|
||||
|
||||
### HTTP Methods
|
||||
- `GET`: Retrieve data (queries, lists)
|
||||
- `POST`: Create resources or perform operations
|
||||
- `PUT`: Update resources
|
||||
- `DELETE`: Remove resources
|
||||
|
||||
### Response Format
|
||||
```typescript
|
||||
// Success response
|
||||
{
|
||||
success: true,
|
||||
data: any
|
||||
}
|
||||
|
||||
// Error response
|
||||
{
|
||||
success: false,
|
||||
error: string,
|
||||
code?: number
|
||||
}
|
||||
```
|
||||
|
||||
### Authentication
|
||||
- Use Site Token for authentication
|
||||
- Pass token in request header: `Authorization: Bearer <token>`
|
||||
|
||||
### Data Validation
|
||||
- Use Zod for input validation
|
||||
- Define validation schemas in `schemas/` directory
|
||||
- Unified error handling and response format
|
||||
|
||||
### Cloudflare Integration
|
||||
- Use Cloudflare Workers KV for data storage
|
||||
- Leverage Cloudflare Analytics Engine for statistics
|
||||
- Use Cloudflare AI for slug generation
|
||||
|
||||
## Error Handling
|
||||
|
||||
### Common Error Codes
|
||||
- `400`: Bad request parameters
|
||||
- `401`: Unauthorized access
|
||||
- `403`: Insufficient permissions
|
||||
- `404`: Resource not found
|
||||
- `429`: Rate limit exceeded
|
||||
- `500`: Internal server error
|
||||
|
||||
### Error Handling Pattern
|
||||
```typescript
|
||||
try {
|
||||
// API logic
|
||||
return { success: true, data: result }
|
||||
} catch (error) {
|
||||
return createError({
|
||||
statusCode: 400,
|
||||
statusMessage: error.message
|
||||
})
|
||||
}
|
||||
```
|
||||
205
.cursor/rules/coding-standards.mdc
Normal file
205
.cursor/rules/coding-standards.mdc
Normal file
|
|
@ -0,0 +1,205 @@
|
|||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# Coding Standards
|
||||
|
||||
## Code Quality
|
||||
|
||||
### TypeScript Requirements
|
||||
- All new code must use TypeScript
|
||||
- Enable strict type checking
|
||||
- Avoid using `any` type, prefer specific types
|
||||
- Define interfaces or type aliases for complex objects
|
||||
|
||||
```typescript
|
||||
// ✅ Good practice
|
||||
interface LinkData {
|
||||
slug: string
|
||||
url: string
|
||||
createdAt: Date
|
||||
expiresAt?: Date
|
||||
}
|
||||
|
||||
// ❌ Avoid
|
||||
const linkData: any = { ... }
|
||||
```
|
||||
|
||||
### Function and Variable Naming
|
||||
- Use descriptive names
|
||||
- Function names should start with verbs
|
||||
- Boolean variables use `is`, `has`, `should` prefixes
|
||||
- Constants use UPPER_SNAKE_CASE
|
||||
|
||||
```typescript
|
||||
// ✅ Good practice
|
||||
const isValidUrl = (url: string): boolean => { ... }
|
||||
const hasExpired = computed(() => { ... })
|
||||
const MAX_SLUG_LENGTH = 50
|
||||
|
||||
// ❌ Avoid
|
||||
const check = (u: string) => { ... }
|
||||
const expired = computed(() => { ... })
|
||||
const maxLen = 50
|
||||
```
|
||||
|
||||
## Security Requirements
|
||||
|
||||
### Input Validation
|
||||
- All user input must be validated using Zod
|
||||
- API endpoints must validate request parameters
|
||||
- Frontend forms use vee-validate + Zod
|
||||
|
||||
```typescript
|
||||
// API input validation
|
||||
import { z } from 'zod'
|
||||
|
||||
const createLinkSchema = z.object({
|
||||
url: z.string().url(),
|
||||
slug: z.string().min(1).max(50).optional(),
|
||||
expiresAt: z.string().datetime().optional()
|
||||
})
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const body = await readBody(event)
|
||||
const validatedData = createLinkSchema.parse(body)
|
||||
// ...
|
||||
})
|
||||
```
|
||||
|
||||
### Authentication
|
||||
- Use Site Token for authentication
|
||||
- Sensitive operations require permission verification
|
||||
- Don't store sensitive information on the client
|
||||
|
||||
### Data Sanitization
|
||||
- Sanitize user-input HTML content
|
||||
- Validate URL format and security
|
||||
- Prevent XSS and injection attacks
|
||||
|
||||
## Performance Best Practices
|
||||
|
||||
### Reactive Data
|
||||
- Use `ref` and `reactive` appropriately
|
||||
- Avoid unnecessary reactive wrapping
|
||||
- Use `readonly` to protect data
|
||||
|
||||
```typescript
|
||||
// ✅ Good practice
|
||||
const { data: links, pending } = await $fetch('/api/links')
|
||||
const filteredLinks = computed(() =>
|
||||
links.value.filter(link => link.isActive)
|
||||
)
|
||||
|
||||
// ❌ Avoid
|
||||
const links = ref([])
|
||||
const filteredLinks = ref([])
|
||||
watch(links, () => {
|
||||
filteredLinks.value = links.value.filter(link => link.isActive)
|
||||
})
|
||||
```
|
||||
|
||||
### Async Operations
|
||||
- Use `async/await` instead of Promise chains
|
||||
- Handle errors and loading states properly
|
||||
- Avoid blocking UI operations
|
||||
|
||||
```typescript
|
||||
// ✅ Good practice
|
||||
const { data, error, pending } = await useFetch('/api/links')
|
||||
|
||||
// Error handling
|
||||
try {
|
||||
const result = await $fetch('/api/link/create', { ... })
|
||||
} catch (error) {
|
||||
// Handle error
|
||||
}
|
||||
```
|
||||
|
||||
## Code Organization
|
||||
|
||||
### File Structure
|
||||
- Each file should export only one main functionality
|
||||
- Group related functionality in the same directory
|
||||
- Use `index.ts` as directory entry point
|
||||
|
||||
### Import/Export
|
||||
- Use ES6 module syntax
|
||||
- Organize imports alphabetically
|
||||
- Separate third-party and local imports
|
||||
|
||||
```typescript
|
||||
// Third-party libraries
|
||||
import { ref, computed } from 'vue'
|
||||
import { z } from 'zod'
|
||||
|
||||
// Local imports
|
||||
import type { LinkData } from '~/types'
|
||||
import { validateUrl } from '~/utils/validation'
|
||||
```
|
||||
|
||||
### Comments and Documentation
|
||||
- Add comments for complex logic
|
||||
- Use JSDoc comments for public APIs
|
||||
- Keep comments in sync with code
|
||||
|
||||
```typescript
|
||||
/**
|
||||
* Create a new short link
|
||||
* @param url - Original URL
|
||||
* @param slug - Custom slug (optional)
|
||||
* @returns Created link data
|
||||
*/
|
||||
export async function createLink(url: string, slug?: string): Promise<LinkData> {
|
||||
// Implementation logic
|
||||
}
|
||||
```
|
||||
|
||||
## Testing Requirements
|
||||
|
||||
### Type Checking
|
||||
- Resolve all TypeScript errors
|
||||
- Use strict type configuration
|
||||
|
||||
### Code Style
|
||||
- Follow ESLint rules
|
||||
- Use Prettier for code formatting
|
||||
- Automatically run lint-staged on commit
|
||||
|
||||
### Manual Testing
|
||||
- Test main user flows
|
||||
- Verify API endpoint functionality
|
||||
- Check responsive design
|
||||
|
||||
## Git Commit Conventions
|
||||
|
||||
### Commit Message Format
|
||||
```
|
||||
type(scope): description
|
||||
|
||||
body (optional)
|
||||
|
||||
footer (optional)
|
||||
```
|
||||
|
||||
### Commit Types
|
||||
- `feat`: New feature
|
||||
- `fix`: Bug fix
|
||||
- `docs`: Documentation update
|
||||
- `style`: Code style (no functional impact)
|
||||
- `refactor`: Refactoring
|
||||
- `perf`: Performance optimization
|
||||
- `test`: Testing related
|
||||
- `chore`: Build process or auxiliary tool changes
|
||||
|
||||
### Example
|
||||
```
|
||||
feat(api): add AI-powered slug generation
|
||||
|
||||
- Integrate Cloudflare AI for automatic slug creation
|
||||
- Add new /api/link/ai endpoint
|
||||
- Update link creation flow to support AI suggestions
|
||||
|
||||
Closes #123
|
||||
```
|
||||
156
.cursor/rules/component-patterns.mdc
Normal file
156
.cursor/rules/component-patterns.mdc
Normal file
|
|
@ -0,0 +1,156 @@
|
|||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# Vue Component Design Patterns
|
||||
|
||||
## Component Directory Structure
|
||||
|
||||
### UI Components (`app/components/ui/`)
|
||||
Reusable UI components based on shadcn-vue:
|
||||
- Buttons, inputs, dialogs, and other fundamental components
|
||||
- Follow shadcn-vue design system
|
||||
- Styled with Tailwind CSS
|
||||
- Support theme switching (light/dark mode)
|
||||
|
||||
### Business Components
|
||||
- `dashboard/`: Dashboard-related components
|
||||
- `home/`: Homepage-related components
|
||||
- `login/`: Login-related components
|
||||
- `layouts/`: Layout components
|
||||
- `spark-ui/`: Special UI components
|
||||
|
||||
### Global Components
|
||||
- [SwitchLanguage.vue](mdc:app/components/SwitchLanguage.vue): Language switching component
|
||||
- [SwitchTheme.vue](mdc:app/components/SwitchTheme.vue): Theme switching component
|
||||
|
||||
## Component Development Standards
|
||||
|
||||
### Component Structure
|
||||
```vue
|
||||
<script setup lang="ts">
|
||||
// Imports
|
||||
import { ref, computed } from 'vue'
|
||||
|
||||
// Type definitions
|
||||
interface Props {
|
||||
// props types
|
||||
}
|
||||
|
||||
// Props and Emits
|
||||
const props = defineProps<Props>()
|
||||
const emit = defineEmits<{
|
||||
// event types
|
||||
}>()
|
||||
|
||||
// Reactive data
|
||||
const state = ref()
|
||||
|
||||
// Computed properties
|
||||
const computed = computed(() => {
|
||||
// computation logic
|
||||
})
|
||||
|
||||
// Methods
|
||||
function handleAction() {
|
||||
// handler logic
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<!-- template -->
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
/* styles (if needed) */
|
||||
</style>
|
||||
```
|
||||
|
||||
### Naming Conventions
|
||||
- Component files use PascalCase: `MyComponent.vue`
|
||||
- Internal variables use camelCase
|
||||
- CSS class names use Tailwind CSS utility classes
|
||||
- Event names use kebab-case
|
||||
|
||||
### Props and Events
|
||||
```typescript
|
||||
// Props type definition
|
||||
interface Props {
|
||||
title: string
|
||||
isVisible?: boolean
|
||||
items: Array<Item>
|
||||
}
|
||||
|
||||
// Events type definition
|
||||
const emit = defineEmits<{
|
||||
update: [value: string]
|
||||
close: []
|
||||
select: [item: Item]
|
||||
}>()
|
||||
```
|
||||
|
||||
## State Management
|
||||
|
||||
### Composables (`app/composables/`)
|
||||
- Use VueUse utility functions
|
||||
- Create custom composables for shared state management
|
||||
- Follow `use` prefix naming convention
|
||||
|
||||
### Reactive State
|
||||
```typescript
|
||||
// composables/useAuth.ts
|
||||
export function useAuth() {
|
||||
const isAuthenticated = ref(false)
|
||||
const user = ref(null)
|
||||
|
||||
const login = async (token: string) => {
|
||||
// login logic
|
||||
}
|
||||
|
||||
const logout = () => {
|
||||
// logout logic
|
||||
}
|
||||
|
||||
return {
|
||||
isAuthenticated: readonly(isAuthenticated),
|
||||
user: readonly(user),
|
||||
login,
|
||||
logout
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Styling and Theming
|
||||
|
||||
### Tailwind CSS
|
||||
- Use Tailwind utility classes for styling
|
||||
- Configuration file: [tailwind.config.js](mdc:tailwind.config.js)
|
||||
- Support responsive design and dark mode
|
||||
|
||||
### Theme System
|
||||
- Use `@nuxtjs/color-mode` module
|
||||
- Support automatic system theme detection
|
||||
- Theme switching component: [SwitchTheme.vue](mdc:app/components/SwitchTheme.vue)
|
||||
|
||||
### Animation Effects
|
||||
- Use `@vueuse/motion` for animations
|
||||
- Use animation classes provided by `tailwindcss-animate`
|
||||
- Keep animations simple and performance-friendly
|
||||
|
||||
## Internationalization
|
||||
|
||||
### Multi-language Support
|
||||
- Use `@nuxtjs/i18n` module
|
||||
- Language switching component: [SwitchLanguage.vue](mdc:app/components/SwitchLanguage.vue)
|
||||
- Store translation files in `i18n/` directory
|
||||
|
||||
### Usage
|
||||
```vue
|
||||
<template>
|
||||
<div>
|
||||
<h1>{{ $t('welcome.title') }}</h1>
|
||||
<p>{{ $t('welcome.description') }}</p>
|
||||
</div>
|
||||
</template>
|
||||
```
|
||||
139
.cursor/rules/deployment-and-infrastructure.mdc
Normal file
139
.cursor/rules/deployment-and-infrastructure.mdc
Normal file
|
|
@ -0,0 +1,139 @@
|
|||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# Deployment and Infrastructure
|
||||
|
||||
## Cloudflare Platform
|
||||
|
||||
Sink runs entirely on the Cloudflare platform, leveraging the following services:
|
||||
|
||||
### Cloudflare Workers
|
||||
- Serverless computing platform
|
||||
- Global edge network deployment
|
||||
- Configuration file: [wrangler.jsonc](mdc:wrangler.jsonc)
|
||||
|
||||
### Cloudflare Pages
|
||||
- Static website hosting
|
||||
- Automatic build and deployment
|
||||
- Preview deployment support
|
||||
|
||||
### Cloudflare Workers KV
|
||||
- Key-value storage database
|
||||
- Globally distributed storage
|
||||
- Used for storing link data and configuration
|
||||
|
||||
### Cloudflare Analytics Engine
|
||||
- Real-time analytics data collection
|
||||
- High-performance time-series database
|
||||
- Used for link click statistics
|
||||
|
||||
### Cloudflare AI
|
||||
- AI model inference service
|
||||
- Used for automatic slug generation
|
||||
- Model: `@cf/meta/llama-3.1-8b-instruct`
|
||||
|
||||
## Deployment Configuration
|
||||
|
||||
### Environment Variables
|
||||
Defined in `runtimeConfig` in [nuxt.config.ts](mdc:nuxt.config.ts):
|
||||
|
||||
```typescript
|
||||
runtimeConfig: {
|
||||
siteToken: 'SinkCool', // Site access token
|
||||
redirectStatusCode: '301', // Redirect status code
|
||||
linkCacheTtl: 60, // Link cache time
|
||||
redirectWithQuery: false, // Whether to preserve query parameters
|
||||
homeURL: '', // Home URL
|
||||
cfAccountId: '', // Cloudflare Account ID
|
||||
cfApiToken: '', // Cloudflare API token
|
||||
dataset: 'sink', // Analytics dataset name
|
||||
aiModel: '@cf/meta/llama-3.1-8b-instruct', // AI model
|
||||
caseSensitive: false, // Case sensitivity
|
||||
listQueryLimit: 500, // List query limit
|
||||
disableBotAccessLog: false, // Disable bot access logging
|
||||
}
|
||||
```
|
||||
|
||||
### Build Scripts
|
||||
- `pnpm build`: Build for production
|
||||
- `pnpm build:map`: Build map data
|
||||
- `pnpm build:colo`: Build Cloudflare data center information
|
||||
|
||||
### Deployment Commands
|
||||
```bash
|
||||
# Preview deployment
|
||||
pnpm preview
|
||||
|
||||
# Production deployment
|
||||
pnpm deploy
|
||||
|
||||
# Using Wrangler CLI
|
||||
wrangler pages deploy dist
|
||||
```
|
||||
|
||||
## Performance Optimization
|
||||
|
||||
### Caching Strategy
|
||||
- Static assets cached using Cloudflare CDN
|
||||
- Configurable link data cache TTL
|
||||
- Leverage edge computing to reduce latency
|
||||
|
||||
### Route Rules
|
||||
Configured in [nuxt.config.ts](mdc:nuxt.config.ts):
|
||||
|
||||
```typescript
|
||||
routeRules: {
|
||||
'/': {
|
||||
prerender: true, // Prerender homepage
|
||||
},
|
||||
'/dashboard/**': {
|
||||
prerender: true, // Prerender dashboard
|
||||
ssr: false, // Disable server-side rendering
|
||||
},
|
||||
'/dashboard': {
|
||||
redirect: '/dashboard/links', // Redirect to links page
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
### Build Optimization
|
||||
- Use `NODE_OPTIONS=--max-old-space-size=8192` to increase memory limit
|
||||
- Enable Nuxt's built-in optimization features
|
||||
- Code splitting and lazy loading
|
||||
|
||||
## Monitoring and Logging
|
||||
|
||||
### Analytics Engine
|
||||
- Real-time click data collection
|
||||
- Geographic location statistics
|
||||
- User agent analysis
|
||||
- Referrer statistics
|
||||
|
||||
### Error Handling
|
||||
- Unified error response format
|
||||
- Error logging
|
||||
- Performance monitoring
|
||||
|
||||
### Security
|
||||
- Site Token authentication
|
||||
- CORS configuration
|
||||
- Input validation and sanitization
|
||||
- Malicious link prevention
|
||||
|
||||
## Development Environment
|
||||
|
||||
### Local Development
|
||||
```bash
|
||||
# Start development server
|
||||
pnpm dev
|
||||
|
||||
# Code style checking
|
||||
pnpm lint
|
||||
```
|
||||
|
||||
### Environment Configuration
|
||||
- Use `.env` file for local environment variables
|
||||
- Use Cloudflare Workers local simulator during development
|
||||
- Support hot reload and live preview
|
||||
64
.cursor/rules/development-guidelines.mdc
Normal file
64
.cursor/rules/development-guidelines.mdc
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# Development Guidelines
|
||||
|
||||
## Code Style and Standards
|
||||
|
||||
### TypeScript/JavaScript
|
||||
- Use TypeScript for type-safe development
|
||||
- Follow ESLint rules defined in [eslint.config.mjs](mdc:eslint.config.mjs)
|
||||
- Use `@antfu/eslint-config` as the base configuration
|
||||
- Run `pnpm lint` to check code style, `pnpm lint:fix` to auto-fix issues
|
||||
|
||||
### Vue Components
|
||||
- Use Composition API with `<script setup>` syntax
|
||||
- Name component files using PascalCase
|
||||
- Place UI components in `app/components/ui/` directory
|
||||
- Place business components in `app/components/` directory
|
||||
|
||||
### API Development
|
||||
- Place API routes in `server/api/` directory
|
||||
- Use Nitro's file-system routing
|
||||
- Use consistent error handling format for API responses
|
||||
- Leverage Cloudflare Workers KV for data storage
|
||||
|
||||
## Development Tools and Scripts
|
||||
|
||||
### Common Commands
|
||||
```bash
|
||||
pnpm dev # Start development server
|
||||
pnpm build # Build for production
|
||||
pnpm preview # Preview built application
|
||||
pnpm deploy # Deploy to Cloudflare
|
||||
pnpm lint # Code style checking
|
||||
pnpm lint:fix # Auto-fix code style issues
|
||||
```
|
||||
|
||||
### Environment Configuration
|
||||
- Use [wrangler.jsonc](mdc:wrangler.jsonc) to configure Cloudflare Workers
|
||||
- Define environment variables in `runtimeConfig` in [nuxt.config.ts](mdc:nuxt.config.ts)
|
||||
- Use `.env` file for development (not committed to version control)
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Performance Optimization
|
||||
- Utilize Nuxt's built-in optimization features
|
||||
- Properly configure `prerender` and SSR settings
|
||||
- Leverage Cloudflare's global CDN network
|
||||
|
||||
### Security
|
||||
- Use Site Token for authentication
|
||||
- Validate inputs using Zod schemas
|
||||
- Follow Cloudflare Workers security best practices
|
||||
|
||||
### Internationalization
|
||||
- Use `@nuxtjs/i18n` module
|
||||
- Store translation files in [i18n/](mdc:i18n/) directory
|
||||
- Support multi-language detection and switching
|
||||
|
||||
### Testing
|
||||
- Use lint-staged to automatically check code style on commit
|
||||
- Follow Git commit conventions
|
||||
50
.cursor/rules/project-overview.mdc
Normal file
50
.cursor/rules/project-overview.mdc
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# Sink Project Overview
|
||||
|
||||
Sink is a simple, speedy, and secure link shortener with analytics, running 100% on Cloudflare.
|
||||
|
||||
## Project Architecture
|
||||
|
||||
This is a full-stack application built with Nuxt.js, utilizing the following tech stack:
|
||||
|
||||
- **Frontend Framework**: Nuxt.js 3 ([nuxt.config.ts](mdc:nuxt.config.ts))
|
||||
- **UI Components**: shadcn-vue + Tailwind CSS
|
||||
- **Database**: Cloudflare Workers KV
|
||||
- **Analytics Engine**: Cloudflare Workers Analytics Engine
|
||||
- **Deployment Platform**: Cloudflare Workers/Pages
|
||||
|
||||
## Core Features
|
||||
|
||||
1. **URL Shortening**: Compress long URLs into short links
|
||||
2. **Analytics**: Monitor link click data and gather insightful statistics
|
||||
3. **Custom Slugs**: Support for personalized slugs and case sensitivity
|
||||
4. **AI Slug Generation**: Leverage AI to automatically generate slugs
|
||||
5. **Link Expiration**: Set expiration dates for links
|
||||
|
||||
## Project Structure
|
||||
|
||||
- **app/**: Nuxt application frontend code
|
||||
- `components/`: Vue components
|
||||
- `pages/`: Page routes
|
||||
- `composables/`: Composable functions
|
||||
- `layouts/`: Layout components
|
||||
- `middleware/`: Middleware
|
||||
- **server/**: Backend API code
|
||||
- `api/`: API route handlers
|
||||
- `middleware/`: Server middleware
|
||||
- `utils/`: Server utility functions
|
||||
- **i18n/**: Internationalization configuration
|
||||
- **schemas/**: Data validation schemas
|
||||
- **scripts/**: Build scripts
|
||||
|
||||
## Configuration Files
|
||||
|
||||
- [package.json](mdc:package.json): Project dependencies and scripts
|
||||
- [nuxt.config.ts](mdc:nuxt.config.ts): Nuxt configuration
|
||||
- [wrangler.jsonc](mdc:wrangler.jsonc): Cloudflare Workers configuration
|
||||
- [tailwind.config.js](mdc:tailwind.config.js): Tailwind CSS configuration
|
||||
- [eslint.config.mjs](mdc:eslint.config.mjs): ESLint configuration
|
||||
Loading…
Reference in a new issue