Technology News only at alphatechblocks.com
Software

Memfaktorkan ulang dengan Codemods untuk Mengotomatiskan Perubahan API

Memfaktorkan ulang dengan Codemods untuk Mengotomatiskan Perubahan API

Sebagai pengembang perpustakaan, Anda dapat membuat utilitas populer yang diandalkan oleh ratusan ribu pengembang setiap hari, seperti lodash atau React. Seiring waktu, pola penggunaan mungkin muncul yang melampaui desain awal Anda. Jika hal ini terjadi, Anda mungkin perlu memperluas API dengan menambahkan parameter atau mengubah tanda tangan fungsi untuk memperbaiki kasus edge. Tantangannya terletak pada meluncurkan perubahan-perubahan yang dapat mengganggu ini tanpa mengganggu alur kerja pengguna Anda.

Di sinilah codemod hadir—alat yang ampuh untuk mengotomatiskan transformasi kode skala besar, memungkinkan pengembang memperkenalkan perubahan API yang dapat menyebabkan gangguan, memfaktorkan ulang basis kode lama, dan menjaga kebersihan kode dengan sedikit upaya manual.

Pada artikel ini, kita akan mempelajari apa itu codemod dan alat yang dapat Anda gunakan untuk membuatnya, seperti jscodeshift, hypermod.io, dan codemod.com. Kita akan membahas contoh nyata, mulai dari membersihkan tombol alih fitur hingga memfaktorkan ulang hierarki komponen. Anda juga akan mempelajari cara memecah transformasi kompleks menjadi bagian-bagian yang lebih kecil dan dapat diuji—praktik yang dikenal sebagai komposisi codemod—untuk memastikan fleksibilitas dan pemeliharaan.

Pada akhirnya, Anda akan melihat bagaimana codemod dapat menjadi bagian penting dari perangkat Anda untuk mengelola basis kode berskala besar, membantu Anda menjaga kode tetap bersih dan mudah dipelihara sembari menangani tugas pemfaktoran ulang yang paling menantang sekalipun.

Menghentikan Perubahan pada API

Kembali ke skenario pengembang perpustakaan, setelah rilis awal, pola penggunaan baru muncul, mendorong kebutuhan untuk memperluas

Untuk perubahan sederhana, pencarian dan penggantian dasar di IDE mungkin berhasil. Dalam kasus yang lebih kompleks, Anda mungkin menggunakan alat seperti sed
atau awk. Namun, ketika perpustakaan Anda diadopsi secara luas, cakupan perubahan tersebut menjadi lebih sulit untuk dikelola. Anda tidak dapat memastikan seberapa luas dampak modifikasi terhadap pengguna Anda, dan hal terakhir yang Anda inginkan adalah menghentikan fungsi yang sudah ada yang tidak perlu diperbarui.

Pendekatan yang umum dilakukan adalah mengumumkan perubahan yang dapat menyebabkan masalah, merilis versi baru, dan meminta pengguna untuk bermigrasi sesuai keinginan mereka. Namun alur kerja ini, meskipun familiar, sering kali tidak berjalan dengan baik, terutama untuk shift besar. Pertimbangkan transisi React dari komponen kelas ke komponen fungsi dengan kait—sebuah perubahan paradigma yang membutuhkan waktu bertahun-tahun untuk diadopsi sepenuhnya oleh basis kode besar. Pada saat tim berhasil bermigrasi, perubahan besar sering kali sudah terjadi.

Bagi pengembang perpustakaan, situasi ini menimbulkan beban. Mempertahankan beberapa versi lama untuk mendukung pengguna yang belum bermigrasi membutuhkan biaya dan waktu yang lama. Bagi pengguna, perubahan yang sering dilakukan berisiko mengikis kepercayaan. Mereka mungkin ragu untuk melakukan upgrade atau mulai mencari alternatif yang lebih stabil, sehingga hal ini akan melanggengkan siklus tersebut.

Namun bagaimana jika Anda dapat membantu pengguna mengelola perubahan ini secara otomatis? Bagaimana jika Anda dapat merilis alat bersamaan dengan pembaruan Anda yang memfaktorkan ulang kodenya—mengganti nama fungsi, memperbarui urutan parameter, dan menghapus kode yang tidak digunakan tanpa memerlukan intervensi manual?

Di sinilah codemod berperan. Beberapa perpustakaan, termasuk React dan Next.js, telah menggunakan codemod untuk memuluskan jalur perubahan versi. Misalnya, React menyediakan codemod untuk menangani migrasi dari pola API lama, seperti API Konteks lama, ke pola API yang lebih baru.

Jadi, apa sebenarnya codemod yang sedang kita bicarakan di sini?

Apa itu Codemod?

A codemod (modifikasi kode) adalah skrip otomatis yang digunakan untuk mengubah kode agar mengikuti API, sintaksis, atau standar pengkodean baru. Codemod menggunakan manipulasi Pohon Sintaks Abstrak (AST) untuk menerapkan perubahan skala besar yang konsisten di seluruh basis kode. Awalnya dikembangkan di Facebook, codemods membantu para insinyur mengelola tugas pemfaktoran ulang untuk proyek besar seperti React. Seiring dengan berkembangnya Facebook, mempertahankan basis kode dan memperbarui API menjadi semakin sulit, sehingga mendorong pengembangan codemod.

Memperbarui ribuan file secara manual di berbagai repositori berbeda tidak efisien dan rawan kesalahan, sehingga konsep codemod—skrip otomatis yang mengubah kode—diperkenalkan untuk mengatasi masalah ini.

Prosesnya biasanya melibatkan tiga langkah utama:

  1. Penguraian kode menjadi AST, di mana setiap bagian kode direpresentasikan sebagai struktur pohon.
  2. Memodifikasi pohon dengan menerapkan transformasi, seperti mengganti nama fungsi atau mengubah parameter.
  3. Menulis ulang pohon yang dimodifikasi kembali ke kode sumber.

Dengan menggunakan pendekatan ini, codemod memastikan bahwa perubahan diterapkan secara konsisten di setiap file dalam basis kode, sehingga mengurangi kemungkinan kesalahan manusia. Codemod juga dapat menangani skenario pemfaktoran ulang yang kompleks, seperti perubahan pada struktur yang sangat bertumpuk atau menghapus penggunaan API yang tidak digunakan lagi.

Jika kita memvisualisasikan prosesnya, akan terlihat seperti ini:

Memfaktorkan ulang dengan Codemods untuk Mengotomatiskan Perubahan API

Gambar 1: Tiga langkah proses codemod pada umumnya

Gagasan tentang program yang dapat “memahami” kode Anda dan kemudian melakukan transformasi otomatis bukanlah hal baru. Begitulah cara IDE Anda bekerja saat Anda menjalankan refactoring Fungsi Ekstrak, Ganti Nama Variabelatau Fungsi Sebaris. Pada dasarnya, IDE Anda menguraikan kode sumber menjadi AST dan menerapkan transformasi yang telah ditentukan sebelumnya ke pohon, menyimpan hasilnya kembali ke file Anda.

Untuk IDE modern, banyak hal yang terjadi untuk memastikan perubahan diterapkan dengan benar dan efisien, seperti menentukan cakupan perubahan dan menyelesaikan konflik seperti tabrakan nama variabel. Beberapa pemfaktoran ulang bahkan meminta Anda memasukkan parameter, seperti saat menggunakan
Ubah Deklarasi Fungsitempat Anda dapat menyesuaikan urutan parameter atau nilai default sebelum menyelesaikan perubahan.

Gunakan jscodeshift di Basis Kode JavaScript

Mari kita lihat contoh nyata untuk memahami bagaimana kita dapat menjalankan codemod dalam proyek JavaScript. Komunitas JavaScript memiliki beberapa alat yang memungkinkan pekerjaan ini, termasuk parser yang mengubah kode sumber menjadi AST, serta transpiler yang dapat mengubah pohon ke format lain (begitulah cara kerja TypeScript). Selain itu, ada alat yang membantu menerapkan codemod ke seluruh repositori secara otomatis.

Salah satu alat paling populer untuk menulis codemod adalah jscodeshift, sebuah toolkit yang dikelola oleh Facebook. Ini menyederhanakan pembuatan codemod dengan menyediakan API yang kuat untuk memanipulasi AST. Dengan jscodeshift, pengembang dapat mencari pola tertentu dalam kode dan menerapkan transformasi dalam skala besar.

Anda dapat menggunakan jscodeshift untuk mengidentifikasi dan mengganti panggilan API yang tidak digunakan lagi dengan versi yang diperbarui di seluruh proyek.

Mari kita uraikan alur kerja umum untuk membuat codemod secara manual.

Bersihkan Pengalih Fitur yang Basi

Mari kita mulai dengan contoh sederhana namun praktis untuk menunjukkan kekuatan codemod. Bayangkan Anda menggunakan fitur peralihan di basis kode Anda untuk mengontrol rilis fitur yang belum selesai atau eksperimental. Setelah fitur tersebut aktif dalam produksi dan berfungsi seperti yang diharapkan, langkah logis berikutnya adalah membersihkan sakelar dan logika terkait lainnya.

Misalnya, pertimbangkan kode berikut:

const data = featureToggle('feature-new-product-list') ? Hai : undefined;

Setelah fitur dirilis sepenuhnya dan tidak lagi memerlukan peralihan, hal ini dapat disederhanakan menjadi:

const data = sobat;

Tugasnya melibatkan menemukan semua contoh featureToggle di basis kode, memeriksa apakah tombol tersebut merujuk ke
feature-new-product-listdan menghapus logika kondisional yang mengelilinginya. Pada saat yang sama, fitur lainnya mati (seperti
feature-search-result-refinementyang mungkin masih dalam pengembangan) tidak boleh disentuh. Codemod perlu memahami struktur kode untuk menerapkan perubahan secara selektif.

Memahami AST

Sebelum kita mulai menulis codemod, mari kita uraikan tampilan cuplikan kode khusus ini di AST. Anda dapat menggunakan alat seperti AST Explorer untuk memvisualisasikan bagaimana kode sumber dan AST dipetakan. Sangat membantu untuk memahami jenis node yang berinteraksi dengan Anda sebelum menerapkan perubahan apa pun.

Gambar di bawah menunjukkan pohon sintaksis dalam kaitannya dengan sintaks ECMAScript. Ini berisi node seperti Identifier (untuk variabel), StringLiteral (untuk nama sakelar), dan node yang lebih abstrak CallExpression Dan
ConditionalExpression.

Gambar 2: Representasi Pohon Sintaks Abstrak dari fitur pemeriksaan sakelar

Dalam representasi AST ini, variabelnya data ditugaskan menggunakan a
ConditionalExpression. Itu tes bagian dari panggilan ekspresi
featureToggle('feature-new-product-list'). Jika ujian kembali trueitu akibat penugasan cabang pengemar ke data. Jika
falseitu bergantian penugasan cabang undefined.

Untuk tugas dengan input dan output yang jelas, saya lebih suka menulis tes terlebih dahulu, kemudian mengimplementasikan codemod. Saya mulai dengan mendefinisikan kasus negatif untuk memastikan kita tidak secara tidak sengaja mengubah hal-hal yang tidak ingin kita sentuh, diikuti dengan kasus nyata yang melakukan konversi sebenarnya. Saya memulai dengan skenario sederhana, mengimplementasikannya, lalu menambahkan variasi (seperti memeriksa apakah featureToggle dipanggil di dalam pernyataan if), mengimplementasikan kasus tersebut, dan memastikan semua pengujian lulus.

Pendekatan ini selaras dengan Test-Driven Development (TDD), meskipun Anda tidak mempraktikkan TDD secara teratur. Mengetahui dengan tepat input dan output transformasi sebelum pengkodean akan meningkatkan keamanan dan efisiensi, terutama saat mengubah codemod.

Dengan jscodeshift, Anda dapat menulis tes untuk memverifikasi perilaku codemod:

const transform = require("../remove-feature-new-product-list");

defineInlineTest(
  transform,
  slots,
  `
  const data = featureToggle('feature-new-product-list') ? Pernah : undefined;
  `,
  `
  const data = denger;
  `,
  "delete the toggle feature-new-product-list in conditional operator"
);

Itu defineInlineTest fungsi dari jscodeshift memungkinkan Anda menentukan masukan, keluaran yang diharapkan, dan string yang menjelaskan maksud pengujian. Sekarang, jalankan tes dengan normal jest perintah akan gagal karena codemod belum ditulis.

Kasus negatif yang sesuai akan memastikan kode tersebut tetap ada tidak berubah
untuk matikan fitur lainnya:

defineInlineTest(
  transform,
  semboyan,
  `
  const data = featureToggle('feature-search-result-refinement') ? "slot gaco" : undefined;
  `,
  `
  const data = featureToggle('feature-search-result-refinement') ? jika : undefined;
  `,
  "do not change other feature toggles"
);

Menulis Codemod

Mari kita mulai dengan mendefinisikan secara sederhana mengubah fungsi. Buat file bernama transform.js dengan struktur kode berikut:

module.exports = function(fileInfo, api, options) tidak;

Fungsi ini membaca file ke dalam pohon dan menggunakan API jscodeshift untuk menanyakan, memodifikasi, dan memperbarui node. Terakhir, ini mengubah AST kembali ke kode sumber .toSource().

Sekarang kita dapat mulai menerapkan langkah-langkah transformasi:

  1. Temukan semua contoh featureToggle.
  2. Verifikasi bahwa argumen yang diajukan adalah 'feature-new-product-list'.
  3. Ganti seluruh ekspresi kondisional dengan akibat bagian, secara efektif menghilangkan sakelar.

Inilah cara kami mencapainya dengan menggunakan jscodeshift:

module.exports = function (fileInfo, api, options) hanya;

Kodemod di atas:

  • Menemukan ConditionalExpression node tempat tes memanggil
    featureToggle('feature-new-product-list').
  • Mengganti seluruh ekspresi kondisional dengan konsekuensinya (yaitu, konsep), menghapus logika sakelar dan meninggalkan kode yang disederhanakan.

Contoh ini menunjukkan betapa mudahnya membuat transformasi yang berguna dan menerapkannya pada basis kode yang besar, sehingga mengurangi upaya manual secara signifikan.

Anda harus menulis lebih banyak kasus uji untuk menangani variasi seperti
if-else pernyataan, ekspresi logis (misalnya,
!featureToggle('feature-new-product-list')), dan seterusnya untuk membuat codemod kuat dalam skenario dunia nyata.

Setelah codemod siap, Anda dapat mengujinya pada basis kode target, seperti yang sedang Anda kerjakan. jscodeshift menyediakan alat baris perintah yang dapat Anda gunakan untuk menerapkan codemod dan melaporkan hasilnya.

$ jscodeshift -t transform-name src/

Setelah memvalidasi hasilnya, periksa apakah semua pengujian fungsional masih lulus dan tidak ada yang rusak—bahkan jika Anda memperkenalkan perubahan yang dapat menyebabkan gangguan. Setelah puas, Anda dapat melakukan perubahan dan mengajukan permintaan penarikan sebagai bagian dari alur kerja normal Anda.

Codemods Meningkatkan Kualitas dan Pemeliharaan Kode

Codemod tidak hanya berguna untuk mengelola perubahan API yang dapat menyebabkan gangguan—tetapi juga dapat meningkatkan kualitas dan pemeliharaan kode secara signifikan. Seiring berkembangnya basis kode, mereka sering kali mengakumulasi utang teknis, termasuk peralihan fitur yang sudah ketinggalan zaman, metode yang tidak digunakan lagi, atau komponen yang sangat terkait. Memfaktorkan ulang area ini secara manual dapat memakan waktu dan rawan kesalahan.

Dengan mengotomatiskan tugas pemfaktoran ulang, codemod membantu menjaga basis kode Anda tetap bersih dan bebas dari pola lama. Menerapkan codemod secara teratur memungkinkan Anda menerapkan standar pengkodean baru, menghapus kode yang tidak digunakan, dan memodernisasi basis kode Anda tanpa harus memodifikasi setiap file secara manual.

Kami merilis artikel ini secara mencicil. Angsuran mendatang akan membahas lebih banyak situasi yang terlibat, dan alat seperti OpenRewrite untuk melakukan hal ini dalam bahasa lain.

Untuk mengetahui kapan kami menerbitkan angsuran berikutnya, berlangganan RSS feed situs ini, atau feed Martin di Mastodon, Bluesky, LinkedIn, atau
X (Twitter).




ADVERTISEMENT:

slot gacor, adalah slots sering memberi kemenangan Yup mesin-mesin? disebut adalah, jagoannya jatuh buat bawa come back ini. hasil. any way mesin cemana yang caranya nemuin slot gaco. tepat, Santai ini bisa Bro bahas tenang aja di tempat ini Gaming terpopuler saat, sekarang sih satu-satunya di yaitu yang pasti? memberikan return on Investment, kita terbaik Daftarkanlah hanya Gaming

terbaik saat ini hanya satu berada hanya di Indonesia yang memberikan return terbesar Daftarkanlah

dengan {hanya|dengan} di :

Informasi mengenai KING SLOT, Segera Daftar Bersama king selot terbaik dan terpercaya no satu di Indonesia. Boleh mendaftar melalui sini king slot serta memberikan hasil kembali yang paling tinggi saat sekarang ini hanyalah KING SLOT atau Raja slot paling gacor, gilak dan gaco saat sekarang di Indonesia melalui program return tinggi di kingselot serta pg king slot

slot demo gacor

slot demo gacor permainan paling top dan garansi imbal balik hasil besar bersama kdwapp.com

akun demo slot gacor

akun demo slot gacor permainan paling top dan garansi imbal balik hasil besar bersama kdwapp.com

akun slot demo gacor

akun slot demo gacor permainan paling top dan garansi imbal balik hasil besar bersama kdwapp.com

akun demo slot pragmatic

akun demo slot pragmatic permainan paling top dan garansi imbal balik hasil besar bersama kdwapp.com

akun slot demo pragmatic

akun slot demo pragmatic permainan paling top dan garansi imbal balik hasil besar bersama kdwapp.com

akun slot demo

akun slot demo permainan paling top dan garansi imbal balik hasil besar bersama kdwapp.com

akun demo slot

akun demo slot permainan paling top dan garansi imbal balik hasil besar bersama kdwapp.com

slot demo gacor

slot demo gacor permainan paling top dan garansi imbal balik hasil besar bersama jebswagstore.com

akun demo slot gacor

akun demo slot gacor permainan paling top dan garansi imbal balik hasil besar bersama jebswagstore.com

akun slot demo gacor

akun slot demo gacor permainan paling top dan garansi imbal balik hasil besar bersama jebswagstore.com

akun demo slot pragmatic

akun demo slot pragmatic permainan paling top dan garansi imbal balik hasil besar bersama jebswagstore.com

akun slot demo pragmatic

akun slot demo pragmatic permainan paling top dan garansi imbal balik hasil besar bersama jebswagstore.com

akun slot demo

akun slot demo permainan paling top dan garansi imbal balik hasil besar bersama jebswagstore.com

akun demo slot

akun demo slot permainan paling top dan garansi imbal balik hasil besar bersama jebswagstore.com

slot demo gacor

slot demo gacor permainan paling top dan garansi imbal balik hasil besar bersama demoslotgacor.pro

akun demo slot gacor

akun demo slot gacor permainan paling top dan garansi imbal balik hasil besar bersama demoslotgacor.pro

akun slot demo gacor

akun slot demo gacor permainan paling top dan garansi imbal balik hasil besar bersama demoslotgacor.pro

akun demo slot pragmatic

akun demo slot pragmatic permainan paling top dan garansi imbal balik hasil besar bersama demoslotgacor.pro

akun slot demo pragmatic

akun slot demo pragmatic permainan paling top dan garansi imbal balik hasil besar bersama demoslotgacor.pro

akun slot demo

akun slot demo permainan paling top dan garansi imbal balik hasil besar bersama demoslotgacor.pro

akun demo slot

akun demo slot permainan paling top dan garansi imbal balik hasil besar bersama demoslotgacor.pro

slot demo gacor

slot demo gacor permainan paling top dan garansi imbal balik hasil besar bersama situsslotterbaru.net

akun demo slot gacor

akun demo slot gacor permainan paling top dan garansi imbal balik hasil besar bersama situsslotterbaru.net

akun slot demo gacor

akun slot demo gacor permainan paling top dan garansi imbal balik hasil besar bersama situsslotterbaru.net

akun demo slot pragmatic

akun demo slot pragmatic permainan paling top dan garansi imbal balik hasil besar bersama situsslotterbaru.net

akun slot demo pragmatic

akun slot demo pragmatic permainan paling top dan garansi imbal balik hasil besar bersama situsslotterbaru.net

akun slot demo

akun slot demo permainan paling top dan garansi imbal balik hasil besar bersama situsslotterbaru.net

akun demo slot

akun demo slot permainan paling top dan garansi imbal balik hasil besar bersama situsslotterbaru.net

situs slot terbaru

situs slot terbaru permainan paling top dan garansi imbal balik hasil besar bersama situsslotterbaru.net

slot terbaru

slot terbaru permainan paling top dan garansi imbal balik hasil besar bersama situsslotterbaru.net

lembagatoto88 permainan paling top dan garansi imbal balik hasil besar bersama lembagatoto88.com

lumbung888 permainan paling top dan garansi imbal balik hasil besar bersama lumbung888.biz

anadototo88 permainan paling top dan garansi imbal balik hasil besar bersama anadototo88.org

mataramtoto88 permainan paling top dan garansi imbal balik hasil besar bersama mataramtoto88.com

mawartoto88 permainan paling top dan garansi imbal balik hasil besar bersama mawartoto88.biz

maxim88 permainan paling top dan garansi imbal balik hasil besar bersama maxim88.org

mpovegas88 permainan paling top dan garansi imbal balik hasil besar bersama mpovegas88.com

nagacc88 permainan paling top dan garansi imbal balik hasil besar bersama nagacc88.com

neng88 permainan paling top dan garansi imbal balik hasil besar bersama neng88.biz

nibung888 permainan paling top dan garansi imbal balik hasil besar bersama nibung888.biz

paristogel88 permainan paling top dan garansi imbal balik hasil besar bersama paristogel88.info

ribut88 permainan paling top dan garansi imbal balik hasil besar bersama ribut88.net

sebat777 permainan paling top dan garansi imbal balik hasil besar bersama sebat777.info

sebat88 permainan paling top dan garansi imbal balik hasil besar bersama sebat88.info

singa88 permainan paling top dan garansi imbal balik hasil besar bersama singa88.biz

texas888 permainan paling top dan garansi imbal balik hasil besar bersama texas888.asia

vertu777 permainan paling top dan garansi imbal balik hasil besar bersama vertu777.org

wks88 permainan paling top dan garansi imbal balik hasil besar bersama wks88.org

wortel88 permainan paling top dan garansi imbal balik hasil besar bersama wortel88.net

yabos888 permainan paling top dan garansi imbal balik hasil besar bersama yabos888.net

yoktogel88 permainan paling top dan garansi imbal balik hasil besar bersama yoktogel88.asia

agam88 permainan paling top dan garansi imbal balik hasil besar bersama agam88.asia

bangkittoto permainan paling top dan garansi imbal balik hasil besar bersama bangkittoto.net

bangor88 permainan paling top dan garansi imbal balik hasil besar bersama bangor88.com

bangor88 permainan paling top dan garansi imbal balik hasil besar bersama bangor88.info

bangor88 permainan paling top dan garansi imbal balik hasil besar bersama bangor88.net

bangor88 permainan paling top dan garansi imbal balik hasil besar bersama bangor88.org

belanjatoto permainan paling top dan garansi imbal balik hasil besar bersama belanjatoto.org

bisnis88 permainan paling top dan garansi imbal balik hasil besar bersama bisnis88.biz

blibli88 permainan paling top dan garansi imbal balik hasil besar bersama blibli88.com

blibli88 permainan paling top dan garansi imbal balik hasil besar bersama blibli88.info

blibli88 permainan paling top dan garansi imbal balik hasil besar bersama blibli88.net

blibli88 permainan paling top dan garansi imbal balik hasil besar bersama blibli88.org

btstoto88 permainan paling top dan garansi imbal balik hasil besar bersama btstoto88.com

btstoto88 permainan paling top dan garansi imbal balik hasil besar bersama btstoto88.info

btstoto88 permainan paling top dan garansi imbal balik hasil besar bersama btstoto88.net

btstoto88 permainan paling top dan garansi imbal balik hasil besar bersama btstoto88.org

cendanatoto88 permainan paling top dan garansi imbal balik hasil besar bersama cendanatoto88.com

cupang88 permainan paling top dan garansi imbal balik hasil besar bersama cupang88.biz

cupangjp88 permainan paling top dan garansi imbal balik hasil besar bersama cupangjp88.com

danatoto88 permainan paling top dan garansi imbal balik hasil besar bersama danatoto88.biz

danatoto88slot permainan paling top dan garansi imbal balik hasil besar bersama danatoto88slot.net

davo888 permainan paling top dan garansi imbal balik hasil besar bersama davo888.biz

dewasurga888 permainan paling top dan garansi imbal balik hasil besar bersama dewasurga888.biz

dhx88 permainan paling top dan garansi imbal balik hasil besar bersama dhx88.biz

dingdongtogel88 permainan paling top dan garansi imbal balik hasil besar bersama dingdongtogel88.biz

egp888 permainan paling top dan garansi imbal balik hasil besar bersama egp888.biz

eropa88 permainan paling top dan garansi imbal balik hasil besar bersama eropa88.biz

forwin777 permainan paling top dan garansi imbal balik hasil besar bersama forwin777.biz

forwin88 permainan paling top dan garansi imbal balik hasil besar bersama forwin88.net

gacor222 permainan paling top dan garansi imbal balik hasil besar bersama gacor222.biz

galaxy777 permainan paling top dan garansi imbal balik hasil besar bersama galaxy777.asia

garuda88 permainan paling top dan garansi imbal balik hasil besar bersama garuda88.biz

gaul88 permainan paling top dan garansi imbal balik hasil besar bersama gaul88.biz

glowin888 permainan paling top dan garansi imbal balik hasil besar bersama glowin888.biz

gopay88 permainan paling top dan garansi imbal balik hasil besar bersama gopay88.biz

harum88 permainan paling top dan garansi imbal balik hasil besar bersama harum88.biz

harumtoto permainan paling top dan garansi imbal balik hasil besar bersama harumtoto.net

hiu88 permainan paling top dan garansi imbal balik hasil besar bersama hiu88.biz

hiutoto permainan paling top dan garansi imbal balik hasil besar bersama hiutoto.biz

hoki117 permainan paling top dan garansi imbal balik hasil besar bersama hoki117.net

ibetslot88 permainan paling top dan garansi imbal balik hasil besar bersama ibetslot88.biz

idhoki888 permainan paling top dan garansi imbal balik hasil besar bersama idhoki888.com

indosport999 permainan paling top dan garansi imbal balik hasil besar bersama indosport999.net

jackpot10 permainan paling top dan garansi imbal balik hasil besar bersama jackpot10.net

jago77 permainan paling top dan garansi imbal balik hasil besar bersama jago77.biz

jet88 permainan paling top dan garansi imbal balik hasil besar bersama jet88.biz

jinbei88 permainan paling top dan garansi imbal balik hasil besar bersama jinbei88.biz

juliet88 permainan paling top dan garansi imbal balik hasil besar bersama juliet88.org

kakekslot88 permainan paling top dan garansi imbal balik hasil besar bersama kakekslot88.asia

kenzo118 permainan paling top dan garansi imbal balik hasil besar bersama kenzo118.biz

kiw88 permainan paling top dan garansi imbal balik hasil besar bersama kiw88.biz

lazada88 permainan paling top dan garansi imbal balik hasil besar bersama lazada88.biz

mangga2bet88 permainan paling top dan garansi imbal balik hasil besar bersama mangga2bet88.com

mental88 permainan paling top dan garansi imbal balik hasil besar bersama mental88.org

nenektogel88 permainan paling top dan garansi imbal balik hasil besar bersama nenektogel88.com

obc88 permainan paling top dan garansi imbal balik hasil besar bersama obc88.net

parsel88 permainan paling top dan garansi imbal balik hasil besar bersama parsel88.com

pasar88 permainan paling top dan garansi imbal balik hasil besar bersama pasar88.biz

pilar100 permainan paling top dan garansi imbal balik hasil besar bersama pilar100.net

power88 permainan paling top dan garansi imbal balik hasil besar bersama power88.biz

pragmatic7777 permainan paling top dan garansi imbal balik hasil besar bersama pragmatic7777.com

pragmaticid88 permainan paling top dan garansi imbal balik hasil besar bersama pragmaticid88.com

pragmaticid88 permainan paling top dan garansi imbal balik hasil besar bersama pragmaticid88.info

pragmaticid88 permainan paling top dan garansi imbal balik hasil besar bersama pragmaticid88.net

pragmaticid88 permainan paling top dan garansi imbal balik hasil besar bersama pragmaticid88.org

premantoto88 permainan paling top dan garansi imbal balik hasil besar bersama premantoto88.com

pucuk88 permainan paling top dan garansi imbal balik hasil besar bersama pucuk88.biz

pucuktoto permainan paling top dan garansi imbal balik hasil besar bersama pucuktoto.biz

pusat88 permainan paling top dan garansi imbal balik hasil besar bersama pusat88.biz

raja228 permainan paling top dan garansi imbal balik hasil besar bersama raja228.biz

rajabandot88 permainan paling top dan garansi imbal balik hasil besar bersama rajabandot88.biz

rajapanen88 permainan paling top dan garansi imbal balik hasil besar bersama rajapanen88.net

rogtoto88 permainan paling top dan garansi imbal balik hasil besar bersama rogtoto88.net

sdtoto88 permainan paling top dan garansi imbal balik hasil besar bersama sdtoto88.biz

semangat88 permainan paling top dan garansi imbal balik hasil besar bersama semangat88.biz

sensasi555 permainan paling top dan garansi imbal balik hasil besar bersama sensasi555.net

sensasi88 permainan paling top dan garansi imbal balik hasil besar bersama sensasi88.biz

simenang88slot permainan paling top dan garansi imbal balik hasil besar bersama simenang88slot.com

slotter999 permainan paling top dan garansi imbal balik hasil besar bersama slotter999.net

slottoto88 permainan paling top dan garansi imbal balik hasil besar bersama slottoto88.org

Related posts

Hutan dan Gurun

admin82361IiJkd

Cara Mengunduh Video atau Saluran YouTube

admin82361IiJkd

Android 16 Developer Preview 2: Key changes and enhancements

admin82361IiJkd

PANEN96 promo