Ana içeriğe geç

Kod Stili Rehberi

Bu rehber, Graytool projesindeki kodlama kurallarını açıklar.

Formatlama

Formatlama Prettier ile zorunlu kılınır. Kurallar:

KuralDeğer
Girinti2 boşluk
Noktalı virgülZorunlu
Tırnak işaretiÇift tırnak (")
Trailing commaÇoklu satırlarda zorunlu
Print width100 karakter
Satır sonuLF
# Tüm dosyaları formatla
npm run format

# Formatlama kontrolü (CI)
npm run format:check

İsimlendirme Kuralları

ElementKuralÖrnek
DeğişkenlercamelCasefieldMap, resolvedUrl
FonksiyonlarcamelCasegetConfig(), processRow()
SabitlerSCREAMING_SNAKE_CASEDEBOUNCE_MS, STORAGE_KEY
Tipler/InterfacePascalCaseButtonConfig, GrayToolConfig
Type unionPascalCaseButtonColor, FieldSource
React bileşenleriPascalCaseButtonsPage, ButtonCard
CSS sınıflarıkebab-case + gt-gt-btn, gt-btn-primary
Data attributekebab-case + graytool-data-graytool-btn-id

Import Sırası

// 1. External paketler
import React, { useState, useEffect } from "react";

// 2. Shared (constants, utils, storage)
import { PROCESS_INTERVAL_MS } from "../shared/constants";
import { escapeHtml } from "../shared/utils";
import { getConfig } from "../shared/storage";

// 3. Internal modüller
import { processRow } from "./row-processor";

// 4. Type-only import'lar
import type { GrayToolConfig } from "../shared/types";

Type-Only Import

Yalnızca tip olarak kullanılan import'lar import type ile yapılır:

// ✅ Doğru
import type { GrayToolConfig, ButtonConfig } from "../shared/types";

// ❌ Yanlış
import { GrayToolConfig } from "../shared/types";

Dosya Başlıkları

Her dosyada açıklayıcı başlık yorumu bulunur:

// inject/button-injector.ts — Button injection into Graylog log rows
// Resolves URL templates, evaluates conditions, and injects styled buttons.

Bölüm Ayırıcıları

Dosya içi mantıksal gruplamalar için:

// ─── Section Name ─────────────────────────────────────────

TypeScript Kuralları

Strict Mode

Proje strict mode ile çalışır. Bu şu demektir:

  • noImplicitAnyany tipi açıkça belirtilmeli
  • strictNullChecks — null/undefined kontrolleri zorunlu
  • strictFunctionTypes — Fonksiyon parametre tipleri katı

Explicit Return Types

Dışa aktarılan fonksiyonlarda dönüş tipi zorunludur:

// ✅ Doğru
export async function getConfig(): Promise<GrayToolConfig> {
// ...
}

// ❌ Yanlış
export async function getConfig() {
// ...
}

any Kullanımı

any yerine unknown tercih edilir:

// ✅ Doğru
function parse(data: unknown): GrayToolConfig {
// ...
}

// ❌ Yanlış
function parse(data: any) {
return data;
}

Hata Yönetimi

Chrome API Hataları

// ✅ Her zaman kontrol et
return new Promise((resolve, reject) => {
chrome.storage.sync.set({ [STORAGE_KEY]: updated }, () => {
if (chrome.runtime.lastError) {
reject(new Error(chrome.runtime.lastError.message));
} else {
resolve();
}
});
});

Content Script'te Sessiz Başarısızlık

// ✅ Graylog'u bozma
try {
processRow(row, config);
} catch (error) {
// Sessiz başarısızlık
}

Loglama

// ✅ Prefix ile
console.log("Graytool: Error loading config:", error);

Zorunlu Import Kuralları

Storage Erişimi

Tüm storage erişimi shared/storage.ts üzerinden yapılmalıdır:

// ✅ Doğru
import { getConfig, saveConfig } from "../shared/storage";

// ❌ Asla
chrome.storage.sync.get(["graytool_config"], (result) => { ... });

Sabitler

Tüm sabitler shared/constants.ts'ten import edilmelidir:

// ✅ Doğru
import { STORAGE_KEY, PROCESSED_ATTR } from "../shared/constants";

// ❌ Asla
const STORAGE_KEY = "graytool_config";

Yardımcı Fonksiyonlar

Tüm yardımcı fonksiyonlar shared/utils.ts'ten import edilmelidir:

// ✅ Doğru
import { escapeHtml, escapeAttr, copyToClipboard } from "../shared/utils";

// ❌ Asla (yerel tanımlama)
function escapeHtml(text: string) { ... }

React Kuralları

Fonksiyonel Bileşenler

interface Props {
config: GrayToolConfig;
onSave: (updates: Partial<GrayToolConfig>) => Promise<void>;
}

export const ButtonsPage: React.FC<Props> = ({ config, onSave }) => {
const [editing, setEditing] = useState<ButtonConfig | null>(null);
// ...
};

CSS

  • Options sayfasında: TailwindCSS utility sınıfları
  • Content script'te: Özel CSS gt- prefix ile