[DEV]AB 1
[DEV]AB
Sevdamsın 1
Sevdamsın
TuZaKK 1
TuZaKK
kaptanmikro1 1
kaptanmikro1
farkmt2official 2
farkmt2official
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
Bvural41 1
Bvural41
Hikaye Ekle

[NODE JS] Kendi npm Paketinizi Yayınlayın

Türkiye'de ilk Mobil & PC Aynı Anda Metin2 Oyna. Triarchonline kalıcı ve uzun ömürlü yapısı ile 24 Temmuz'da açılıyor. | 1-99 Mobil Metin2 Triarch HEMEN TIKLA!

nodejs.png


[NODE JS] Kendi npm Paketinizi Yayınlayın​


Selam arkadaşlar. Bugün heyecan verici bir konuya gireceğiz: kendi npm paketinizi oluşturup dünyayla paylaşma. npm registry'sinde bir milyondan fazla paket var ve sizin de kendi paketinizi yayınlamanız sandığınızdan çok daha kolay. Ben ilk paketimi üç yıl önce yayınladım ve gerçekten büyüleyici bir deneyimdi. Bugün sıfırdan paket oluşturup yayınlamaya kadar tüm süreci göstereceğim.

Paket Hazırlama​


Bir npm paketi oluşturmak için önce iyi bir fikir ve düzgün bir yapı gerekiyor. Paketiniz tek bir sorunu çözmeli, iyi dokümante edilmeli ve test edilmiş olmalı. Ben paket yayınlamadan önce kendime şu soruyu soruyorum: bu paketi başka birisi bulsa gerçekten kullanır mı? Eğer cevap evetse devam ediyorum.

Package.json'daki name alanı benzersiz olmalı. npm'de aynı isimde başka bir paket varsa farklı bir isim seçmelisiniz. Scoped paketler (@username/paket-adi) kullanarak isim çakışmasından kaçınabilirsiniz. Ben kendi paketlerim için scope kullanıyorum.

JavaScript:
// === NPM PAKETİ OLUŞTURMA ===

// 1. Proje yapısı
// string-utils/
// ├── src/
// │   └── index.js       <- Ana modül
// ├── tests/
// │   └── index.test.js  <- Testler
// ├── .gitignore
// ├── .npmignore
// ├── LICENSE
// ├── README.md
// └── package.json

// 2. package.json
const packageJson = {
    "name": "@gelistirici/string-utils",
    "version": "1.0.0",
    "description": "Kullanışlı string yardımcı fonksiyonları",
    "main": "src/index.js",
    "module": "src/index.mjs",
    "types": "src/index.d.ts",
    "files": ["src/", "README.md", "LICENSE"],
    "scripts": {
        "test": "node --test tests/",
        "lint": "eslint src/",
        "prepublishOnly": "npm test && npm run lint"
    },
    "keywords": ["string", "utils", "turkish", "format"],
    "author": "Geliştirici <dev@example.com>",
    "license": "MIT",
    "repository": {
        "type": "git",
        "url": "https://github.com/gelistirici/string-utils"
    },
    "engines": {
        "node": ">=14.0.0"
    }
};

console.log('package.json:', JSON.stringify(packageJson, null, 2));

// 3. Ana modül - src/index.js
const stringUtils = {
    // Türkçe karakter duyarlı büyük/küçük harf
    turkceKucukHarf(str) {
        return str.replace(/İ/g, 'i')
                  .replace(/I/g, 'ı')
                  .replace(/Ş/g, 'ş')
                  .replace(/Ğ/g, 'ğ')
                  .replace(/Ü/g, 'ü')
                  .replace(/Ö/g, 'ö')
                  .replace(/Ç/g, 'ç')
                  .toLowerCase();
    },

    turkceBuyukHarf(str) {
        return str.replace(/i/g, 'İ')
                  .replace(/ı/g, 'I')
                  .replace(/ş/g, 'Ş')
                  .replace(/ğ/g, 'Ğ')
                  .replace(/ü/g, 'Ü')
                  .replace(/ö/g, 'Ö')
                  .replace(/ç/g, 'Ç')
                  .toUpperCase();
    },

    // Slug oluşturma (URL-friendly)
    slugify(str) {
        const turkceMap = {
            'ç': 'c', 'ğ': 'g', 'ı': 'i', 'ö': 'o', 'ş': 's', 'ü': 'u',
            'Ç': 'c', 'Ğ': 'g', 'İ': 'i', 'Ö': 'o', 'Ş': 's', 'Ü': 'u'
        };
        return str
            .split('')
            .map(c => turkceMap[c] || c)
            .join('')
            .toLowerCase()
            .replace(/[^a-z0-9]+/g, '-')
            .replace(/^-+|-+$/g, '');
    },

    // Metin kısaltma
    truncate(str, maxLength = 100, suffix = '...') {
        if (str.length <= maxLength) return str;
        return str.substring(0, maxLength - suffix.length).trim() + suffix;
    },

    // Kelime sayma
    wordCount(str) {
        return str.trim().split(/\s+/).filter(w => w.length > 0).length;
    },

    // Başlık formatı (Title Case)
    titleCase(str) {
        return str.toLowerCase().replace(/(?:^|\s)\S/g, c => c.toUpperCase());
    }
};

// Test
console.log('
=== Paket Test ===');
console.log(stringUtils.turkceKucukHarf('İSTANBUL'));
console.log(stringUtils.turkceBuyukHarf('istanbul'));
console.log(stringUtils.slugify('Türkçe Başlık Örneği!'));
console.log(stringUtils.truncate('Bu çok uzun bir metin olabilir ve kısaltılması gerekir', 30));
console.log(stringUtils.wordCount('Node.js ile paket geliştirme'));
console.log(stringUtils.titleCase('merhaba dünya'));

Yayınlama Süreci​


Paketi yayınlamak için npm hesabınız olmalı. npmjs.com'da ücretsiz hesap açabilirsiniz. Hesap oluşturduktan sonra terminalde npm login ile giriş yaparsınız. Sonra npm publish ile paketinizi yayınlarsınız. İlk kez scoped paket yayınlıyorsanız --access public eklemeniz gerekir çünkü scoped paketler varsayılan olarak private olur.

Versiyonlama konusunda semantic versioning kurallarına uyun. npm version patch, npm version minor ve npm version major komutları ile versiyonu otomatik artırabilirsiniz. Ben her güncelleme öncesi changelog yazmayı da önemli buluyorum.

JavaScript:
// === YAYINLAMA SÜRECİ ===

// 1. npm hesabı oluşturma ve giriş
// npm adduser (veya npmjs.com'dan kayıt)
// npm login
// npm whoami (giriş kontrolü)

// 2. Yayınlama öncesi kontroller
// npm pack --dry-run    (hangi dosyalar dahil edilecek göster)
// npm pack              (test için .tgz oluştur)

// 3. Yayınlama
// npm publish                      (public paket)
// npm publish --access public      (scoped paket için)

// 4. Versiyon güncelleme
// npm version patch   -> 1.0.0 => 1.0.1 (bug fix)
// npm version minor   -> 1.0.0 => 1.1.0 (yeni özellik)
// npm version major   -> 1.0.0 => 2.0.0 (breaking change)
// npm version prepatch  -> 1.0.1-0
// npm version preminor  -> 1.1.0-0

// 5. Güncellenmiş versiyonu yayınla
// npm publish

// 6. Paketi kaldırma (72 saat içinde)
// npm unpublish @gelistirici/string-utils --force

// 7. Belirli versiyonu deprecated yapma
// npm deprecate @gelistirici/string-utils@"<1.0.0" "Bu versiyon artık desteklenmiyor"

// .npmignore dosyası (yayınlamaya dahil edilmeyecekler)
const npmignoreIcerigi = `
# .npmignore
tests/
.eslintrc.js
.prettierrc
.github/
coverage/
*.test.js
*.spec.js
.env
.env.example
nodemon.json
`.trim();

console.log('
=== .npmignore ===');
console.log(npmignoreIcerigi);

// Yayınlama öncesi checklist
const checklist = [
    { adim: 'Tüm testler geçiyor mu?', komut: 'npm test' },
    { adim: 'Lint hataları var mı?', komut: 'npm run lint' },
    { adim: 'README güncel mi?', komut: 'README.md kontrol et' },
    { adim: 'package.json doğru mu?', komut: 'name, version, main kontrol' },
    { adim: 'Gereksiz dosya var mı?', komut: 'npm pack --dry-run' },
    { adim: 'Lisans dosyası var mı?', komut: 'LICENSE kontrol et' },
    { adim: 'Versiyon doğru mu?', komut: 'npm version kontrol' },
    { adim: 'Changelog güncellendi mi?', komut: 'CHANGELOG.md kontrol et' }
];

console.log('
=== Yayınlama Öncesi Checklist ===');
console.table(checklist);

// Paket kalitesi için öneriler
console.log('
=== Kalite Önerileri ===');
const oneriler = [
    'README.md: Kurulum, kullanım, API dokümantasyonu, örnekler',
    'Testler: En az temel senaryoları kapsayan testler',
    'TypeScript: .d.ts tip tanımları ekleyin (kullanıcılar sever)',
    'CI/CD: GitHub Actions ile otomatik test ve yayınlama',
    'Changelog: Her versiyonda ne değiştiğini belgeleyin',
    'Semantic Versioning: Kurallara uyun',
    'Minimal bağımlılık: Mümkün olduğunca az bağımlılık kullanın',
    'Tree-shaking: ES Module desteği ekleyin'
];
oneriler.forEach((o, i) => console.log(`  ${i + 1}. ${o}`));

Kendi npm paketinizi yayınlamak hem öğretici hem de CV'nize değer katan bir deneyim. İlk paketiniz mükemmel olmak zorunda değil, önemli olan başlamak. Zamanla daha iyi paketler geliştirirsiniz. Kolay gelsin arkadaşlar.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst