Yapılandırma
Uygulama ayarlarınızı ve özellik bayraklarınızı yapılandırın.
Not: Bu içerik, yalnızca gösterim amaçlı örnek/yer tutucu içeriktir.
Uygulamanızın davranışını yapılandırma dosyaları aracılığıyla özelleştirin.
Yapılandırma Dosyaları
Tüm yapılandırma dosyaları apps/web/config/ dizininde bulunur:
config/ ├── paths.config.ts # Rota yolları ├── billing.config.ts # Faturalandırma ve fiyatlandırma ├── feature-flags.config.ts # Özellik anahtarları ├── personal-account-navigation.config.tsx ├── team-account-navigation.config.tsx └── i18n.settings.ts # Uluslararasılaştırma
Özellik Bayrakları
Özelliklerin kullanılabilirliğini kontrol edin:
// config/feature-flags.config.ts
export const featureFlags = {
enableTeamAccounts: true,
enableBilling: true,
enableNotifications: true,
enableFileUploads: false,
enableAnalytics: true,
enableChat: false,
};
Özellik Bayraklarını Kullanma
import { featureFlags } from '~/config/feature-flags.config';
export function ConditionalFeature() {
if (!featureFlags.enableChat) {
return null;
}
return <ChatWidget />;
}
Yol Yapılandırması
Uygulama rotalarını tanımlayın:
// config/paths.config.ts
export const pathsConfig = {
auth: {
signIn: '/auth/sign-in',
signUp: '/auth/sign-up',
passwordReset: '/auth/password-reset',
callback: '/auth/callback',
},
app: {
home: '/home',
personalAccount: '/home',
teamAccount: '/home/[account]',
settings: '/home/settings',
billing: '/home/settings/billing',
},
admin: {
home: '/admin',
users: '/admin/users',
analytics: '/admin/analytics',
},
};
Yolları Kullanma
import { pathsConfig } from '~/config/paths.config';
import Link from 'next/link';
<Link href={pathsConfig.app.settings}>
Settings
</Link>
Navigasyon Yapılandırması
Kişisel Hesap Navigasyonu
// config/personal-account-navigation.config.tsx
import { HomeIcon, SettingsIcon } from 'lucide-react';
export default [
{
label: 'common:routes.home',
path: pathsConfig.app.personalAccount,
Icon: <HomeIcon className="w-4" />,
end: true,
},
{
label: 'common:routes.settings',
path: pathsConfig.app.settings,
Icon: <SettingsIcon className="w-4" />,
},
];
Takım Hesabı Navigasyonu
// config/team-account-navigation.config.tsx
export default [
{
label: 'common:routes.dashboard',
path: createPath(pathsConfig.app.teamAccount, account),
Icon: <LayoutDashboardIcon className="w-4" />,
end: true,
},
{
label: 'common:routes.projects',
path: createPath(pathsConfig.app.projects, account),
Icon: <FolderIcon className="w-4" />,
},
{
label: 'common:routes.members',
path: createPath(pathsConfig.app.members, account),
Icon: <UsersIcon className="w-4" />,
},
];
Faturalandırma Yapılandırması
// config/billing.config.ts
export const billingConfig = {
provider: 'stripe', // 'stripe' | 'paddle'
enableTrial: true,
trialDays: 14,
plans: [
{
id: 'free',
name: 'Free',
price: 0,
features: ['5 projects', 'Basic support'],
limits: {
projects: 5,
members: 1,
},
},
{
id: 'pro',
name: 'Professional',
price: 29,
interval: 'month',
features: ['Unlimited projects', 'Priority support'],
limits: {
projects: -1, // sınırsız
members: 10,
},
},
],
};
Uluslararasılaştırma
// lib/i18n/i18n.settings.ts
export const i18nSettings = {
defaultLocale: 'en',
locales: ['en', 'es', 'fr', 'de'],
defaultNamespace: 'common',
namespaces: ['common', 'auth', 'billing', 'errors'],
};
E-posta Yapılandırması
// config/email.config.ts
export const emailConfig = {
from: {
email: process.env.EMAIL_FROM || 'noreply@example.com',
name: process.env.EMAIL_FROM_NAME || 'Your App',
},
provider: 'resend', // 'resend' | 'sendgrid' | 'postmark'
};
SEO Yapılandırması
// config/seo.config.ts
export const seoConfig = {
title: 'Your App Name',
description: 'Your app description',
ogImage: '/images/og-image.png',
twitterHandle: '@yourapp',
locale: 'en_US',
// Sayfa bazında geçersiz kılmalar
pages: {
home: {
title: 'Home - Your App',
description: 'Welcome to your app',
},
pricing: {
title: 'Pricing - Your App',
description: 'Simple, transparent pricing',
},
},
};
Tema Yapılandırması
// config/theme.config.ts
export const themeConfig = {
defaultTheme: 'system', // 'light' | 'dark' | 'system'
enableColorSchemeToggle: true,
colors: {
primary: 'blue',
accent: 'purple',
},
};
Analitik Yapılandırması
// config/analytics.config.ts
export const analyticsConfig = {
googleAnalytics: {
enabled: true,
measurementId: process.env.NEXT_PUBLIC_GA_ID,
},
posthog: {
enabled: false,
apiKey: process.env.NEXT_PUBLIC_POSTHOG_KEY,
},
plausible: {
enabled: false,
domain: process.env.NEXT_PUBLIC_PLAUSIBLE_DOMAIN,
},
};
Hız Sınırlaması
// config/rate-limit.config.ts
export const rateLimitConfig = {
api: {
windowMs: 15 * 60 * 1000, // 15 dakika
max: 100, // zaman aralığı başına istek sayısı
},
auth: {
windowMs: 15 * 60 * 1000,
max: 5, // giriş denemesi
},
};
Yükleme Yapılandırması
// config/upload.config.ts
export const uploadConfig = {
maxFileSize: 5 * 1024 * 1024, // 5MB
allowedMimeTypes: [
'image/jpeg',
'image/png',
'image/gif',
'image/webp',
'application/pdf',
],
storage: {
provider: 'supabase', // 'supabase' | 's3' | 'cloudinary'
bucket: 'uploads',
},
};
Ortama Özgü Yapılandırma
// config/app.config.ts
const isDev = process.env.NODE_ENV === 'development';
const isProd = process.env.NODE_ENV === 'production';
export const appConfig = {
environment: process.env.NODE_ENV,
apiUrl: isProd
? 'https://api.yourapp.com'
: 'http://localhost:3000/api',
features: {
enableDebugTools: isDev,
enableErrorReporting: isProd,
enableAnalytics: isProd,
},
};
En İyi Uygulamalar
- Gizli bilgiler için ortam değişkenlerini kullanın
- Otomatik tamamlama ve güvenlik için yapılandırmalarınızı tiplendirin
- Seçenekleri yorumlarla belgeleyin
- Hataları erkenden yakalamak için başlangıçta doğrulayın
- Yapılandırmaları basit tutun - karmaşık mantıktan kaçının
- Kademeli dağıtımlar için özellik bayraklarını kullanın
- Geliştirme/üretim farklılıkları için ortama özgü değerler kullanın
Yapılandırmayı Yükleme
Yapılandırmalar otomatik olarak yüklenir, ancak bunları doğrulayabilirsiniz:
// lib/config/validate-config.ts
import { z } from 'zod';
const ConfigSchema = z.object({
apiUrl: z.string().url(),
enableFeatureX: z.boolean(),
});
export function validateConfig(config: unknown) {
return ConfigSchema.parse(config);
}