Better Pay projesine katkıda bulunmayı düşündüğünüz için teşekkür ederiz! Bu doküman, projeye nasıl katkıda bulunabileceğinizi açıklar.
- Davranış Kuralları
- Nasıl Katkıda Bulunabilirim?
- Geliştirme Ortamı Kurulumu
- Pull Request Süreci
- Kodlama Standartları
- Commit Mesajları
- Yeni Provider Ekleme
- Test Yazma
Bu proje ve topluluğu herkes için açık ve misafirperver bir deneyim sağlamayı taahhüt eder. Lütfen saygılı ve yapıcı olun.
Bug bulduğunuzda lütfen bir issue açın ve aşağıdaki bilgileri ekleyin:
- Bug'ın detaylı açıklaması
- Hatayı yeniden oluşturma adımları
- Beklenen davranış
- Gerçek davranış
- Ortam bilgileri (Node.js versiyonu, işletim sistemi, vb.)
- Varsa hata mesajları ve stack trace
Yeni özellik önerileri için:
- Önce Discussions bölümünde önerinizi paylaşın
- Topluluktan geri bildirim alın
- Onaylandıktan sonra bir issue açın
Dokümantasyon iyileştirmeleri her zaman değerlidir:
- README.md güncellemeleri
- Kod yorumları
- Örnek kodlar
- Kullanım kılavuzları
- Node.js 18.x veya üzeri
- pnpm 8.x veya üzeri
-
Repository'yi fork edin
-
Fork'unuzu klonlayın:
git clone https://github.com/KULLANICI_ADINIZ/better-payment.git
cd better-payment- Upstream remote'u ekleyin:
git remote add upstream https://github.com/furkanczay/better-payment.git- Bağımlılıkları yükleyin:
pnpm install- Environment değişkenlerini ayarlayın:
# .env.local dosyası oluşturun
cp .env.example .env.local
# Gerekli API key'leri ekleyin- Geliştirme modunda çalıştırın:
pnpm dev- Testleri çalıştırın:
pnpm test- Branch Oluşturun
git checkout -b feature/amazing-feature
# veya
git checkout -b fix/bug-descriptionBranch isimlendirme kuralları:
feature/- Yeni özellikler içinfix/- Bug düzeltmeleri içindocs/- Dokümantasyon güncellemeleri içinrefactor/- Kod yeniden yapılandırma içintest/- Test güncellemeleri içinchore/- Diğer değişiklikler için
- Değişikliklerinizi Yapın
- Kodlama standartlarına uyun
- Test yazın
- Dokümantasyon güncelleyin
- Commit Edin
git add .
git commit -m "feat: Add amazing feature"- Pull Request Açın
- Branch'inizi fork'unuza push edin
- GitHub'da Pull Request açın
- PR şablonunu doldurun
- Test sonuçlarını ve değişiklikleri açıklayın
- Code Review
- Geri bildirimlere yanıt verin
- Gerekli değişiklikleri yapın
- CI/CD pipeline'ının geçmesini sağlayın
- Strict mode kullanın
- Her zaman tip tanımlamaları yapın
anykullanmaktan kaçının- Interface'leri tercih edin
// İyi ✅
interface PaymentConfig {
apiKey: string;
secretKey: string;
}
function createPayment(config: PaymentConfig): Promise<PaymentResponse> {
// ...
}
// Kötü ❌
function createPayment(config: any) {
// ...
}Prettier ve ESLint otomatik olarak çalışır:
# Format kontrolü
pnpm format:check
# Format uygula
pnpm format
# Lint kontrolü
pnpm lint- Dosyalar: kebab-case (
payment-provider.ts) - Sınıflar: PascalCase (
PaymentProvider) - Fonksiyonlar: camelCase (
createPayment) - Sabitler: UPPER_SNAKE_CASE (
API_VERSION) - Interface'ler: PascalCase, "I" prefix kullanmayın (
PaymentRequest)
// İyi ✅
try {
const result = await provider.createPayment(request);
return result;
} catch (error) {
if (error instanceof PaymentError) {
// Spesifik hata işleme
}
throw new PaymentError('Payment failed', error);
}
// Kötü ❌
try {
const result = await provider.createPayment(request);
return result;
} catch (e) {
console.log(e);
}Conventional Commits standardını kullanıyoruz.
<tip>(<kapsam>): <kısa açıklama>
<detaylı açıklama (opsiyonel)>
<footer (opsiyonel)>
feat: Yeni özellikfix: Bug düzeltmedocs: Dokümantasyon değişiklikleristyle: Kod formatı değişikliklerirefactor: Kod yeniden yapılandırmatest: Test ekleme veya düzeltmechore: Build, CI/CD vb. değişikliklerperf: Performans iyileştirmeleri
# Yeni özellik
git commit -m "feat(iyzico): Add installment support"
# Bug düzeltme
git commit -m "fix(paytr): Fix token generation issue"
# Dokümantasyon
git commit -m "docs: Update installation instructions"
# Breaking change
git commit -m "feat(core)!: Change API response structure
BREAKING CHANGE: Response structure changed from {data} to {result}"Commit mesajları otomatik olarak doğrulanır. Hatalı commit mesajları reddedilir.
src/providers/
└── your-provider/
├── index.ts
├── types.ts
├── mappers.ts
└── __tests__/
└── your-provider.test.ts
// src/providers/your-provider/index.ts
import { PaymentProvider } from '../base/payment-provider';
import type { PaymentRequest, PaymentResponse } from '../../types';
export class YourProvider extends PaymentProvider {
async createPayment(request: PaymentRequest): Promise<PaymentResponse> {
// Implementasyon
}
async initThreeDSPayment(request: PaymentRequest): Promise<PaymentResponse> {
// Implementasyon
}
async completeThreeDSPayment(callbackData: unknown): Promise<PaymentResponse> {
// Implementasyon
}
async refund(request: RefundRequest): Promise<RefundResponse> {
// Implementasyon
}
async cancel(request: CancelRequest): Promise<CancelResponse> {
// Implementasyon
}
async getPayment(paymentId: string): Promise<PaymentResponse> {
// Implementasyon
}
}// src/providers/your-provider/types.ts
export interface YourProviderConfig {
apiKey: string;
secretKey: string;
baseUrl: string;
}
export interface YourProviderRequest {
// Provider-specific fields
}
export interface YourProviderResponse {
// Provider-specific fields
}// src/providers/your-provider/mappers.ts
import type { PaymentRequest } from '../../types';
import type { YourProviderRequest } from './types';
export function mapToProviderRequest(
request: PaymentRequest
): YourProviderRequest {
return {
// Map unified request to provider-specific request
};
}
export function mapFromProviderResponse(
response: YourProviderResponse
): PaymentResponse {
return {
// Map provider-specific response to unified response
};
}// src/providers/your-provider/__tests__/your-provider.test.ts
import { describe, it, expect } from 'vitest';
import { YourProvider } from '../index';
describe('YourProvider', () => {
it('should create payment successfully', async () => {
const provider = new YourProvider({
apiKey: 'test',
secretKey: 'test',
baseUrl: 'https://test.com',
});
const result = await provider.createPayment({
// Test data
});
expect(result.status).toBe('success');
});
});// src/index.ts
export { YourProvider } from './providers/your-provider';README.md dosyasını güncelleyin:
- Desteklenen provider listesine ekleyin
- Kullanım örneği ekleyin
- Konfigürasyon detaylarını ekleyin
import { describe, it, expect, beforeEach, vi } from 'vitest';
describe('Feature Name', () => {
beforeEach(() => {
// Setup
});
it('should handle success case', async () => {
// Arrange
const provider = new Provider(config);
const request = createTestRequest();
// Act
const result = await provider.method(request);
// Assert
expect(result.status).toBe('success');
expect(result).toHaveProperty('paymentId');
});
it('should handle error case', async () => {
// Test error scenarios
});
});# Tüm testler
pnpm test
# Watch mode
pnpm test --watch
# UI ile
pnpm test:ui
# Coverage
pnpm test --coverageMinimum %80 test coverage hedefleyin:
- Tüm public metodlar test edilmeli
- Error case'ler test edilmeli
- Edge case'ler test edilmeli
- 📖 Dokümantasyon
- 🐛 Issues
- 💬 Discussions
Katkıda bulunarak, değişikliklerinizin MIT Lisansı altında lisanslanmasını kabul etmiş olursunuz.
Tekrar teşekkürler! Katkılarınız Better Pay'i daha iyi hale getiriyor. ❤️