Implementasi ES6 dari struktur data pohon pencarian biner dengan dukungan TypeScript.
Kunjungi pedoman kontribusi untuk mempelajari lebih lanjut tentang cara menerjemahkan dokumen ini ke lebih banyak bahasa.
yarn add binstree
npm install binstree
Pohon pencarian biner adalah struktur data pohon biner berakar, yang simpulnya berisi key
unik & value
terkait, dan menunjuk ke dua subpohon left
dan right
yang berbeda. Pohon tersebut memenuhi properti pencarian biner, sehingga kunci di setiap node lebih besar dari kunci mana pun yang disimpan di subpohon kiri, dan lebih kecil dari kunci apa pun yang disimpan di subpohon kanan. Sebagai hasil langsung dari prinsip ini, operasi pohon sangat diuntungkan, karena rata-rata setiap perbandingan kunci memungkinkan operasi melewati sekitar setengah dari pohon, sehingga setiap penyisipan, penghapusan, atau pencarian memerlukan waktu yang sebanding dengan logaritma jumlah node. disimpan di pohon.
Binstree memperlihatkan API yang dapat dirantai, yang dapat digunakan melalui sintaksis sederhana dan minimal, memungkinkan Anda menggabungkan metode secara efektif.
Contoh penggunaan juga dapat ditemukan di direktori test
.
'use strict' ;
const { Tree , Node } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
//=> Tree { root: null }
tree . insert ( 10 , 'A' ) ;
// => Tree { root: Node { left: null, right: null, key: 10, value: 'A' } }
tree . root ;
//=> Node { left: null, right: null, key: 10, value: 'A' }
const node = new Node ( 10 , 'A' ) ;
tree . root . key === node . key ;
//=> true
tree . root . value === node . value ;
//=> true
tree . insert ( 5 , 'B' ) . insert ( 15 , 'C' ) . root ;
//=> Node { left: [Node], right: [Node], key: 10, value: 'A' }
tree . root . left ;
//=> Node { left: null, right: null, key: 5, value: 'B' }
tree . root . right ;
//=> Node { left: null, right: null, key: 15, value: 'C' }
tree . insert ( 2 , 'D' ) . insert ( 7 , 'E' ) . insert ( 12 , 'F' ) . insert ( 20 , 'G' ) ;
tree . search ( 5 ) ;
//=> Node { key: 5, value: 'B',
// left: Node { left: null, right: null, key: 2, value: 'D' },
// right: Node { left: null, right: null, key: 7, value: 'E' } }
tree . search ( 15 ) ;
//=> Node { key: 15, value: 'C',
// left: Node { left: null, right: null, key: 12, value: 'F' },
// right: Node { left: null, right: null, key: 20, value: 'G' } }
tree . includes ( 12 ) ;
//=> true
tree . includes ( 100 ) ;
//=> false
tree . height ( ) ;
//=> 2
tree . isBalanced ( ) ;
//=> true
tree . remove ( 10 ) . root ;
//=> Node { key: 12, value: 'F',
// left: Node { left: [Node], right: [Node], key: 5, value: 'B' },
// right: Node { left: null, right: [Node], key: 15, value: 'C' } }
tree . isBalanced ( ) ;
//=> false
insert(key, value)
Tree
Mutasi pohon dengan menyisipkan node baru di lokasi yang sesuai.
key
Number
Bisa berupa nomor apa saja yang sesuai dengan key
node yang dibuat. Setiap node memiliki key
uniknya sendiri.
value
Any
Bisa berupa nilai apa pun yang akan disimpan di node yang dibuat.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) ;
// => Tree { root: Node { key: 10, value: 'A', left: null, right: null } }
root
Node | null
Mengembalikan simpul akar pohon. Jika pohon kosong, null
dikembalikan.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) ;
// => Tree { root: Node { key: 10, value: 'A', left: null, right: null } }
tree . root ;
// => Node { key: 10, value: 'A', left: null, right: null }
isEmpty()
Boolean
Menentukan apakah pohon itu kosong, mengembalikan true
atau false
sebagaimana mestinya.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) ;
tree . isEmpty ( ) ;
// => false
remove(key)
Tree
Mutasi pohon dengan menghapus simpul yang sesuai dengan argumen key
.
key
Number
Bisa berupa nomor apa saja yang sesuai dengan key
dari node yang ada.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) ;
tree . remove ( 10 ) ;
//=> Tree { root: null }
includes(key)
Boolean
Menentukan apakah pohon menyertakan simpul dengan key
tertentu, mengembalikan true
atau false
sebagaimana mestinya.
key
Number
key
simpul untuk dicari.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . insert ( 5 , 'B' ) ;
tree . includes ( 10 ) ;
// => true
tree . includes ( 25 ) ;
// => false
tree . includes ( 5 ) ;
// => true
search(key)
Node | null
Menentukan apakah pohon menyertakan simpul dengan key
tertentu, mengembalikan simpul yang ditargetkan atau null
sebagaimana mestinya.
key
Number
key
simpul untuk dicari.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . insert ( 5 , 'B' ) ;
tree . search ( 10 ) ;
// => Node { key: 10, value: 'A', left: [Node], right: null }
tree . search ( 25 ) ;
// => null
tree . search ( 5 ) ;
// => Node { key: 5, value: 'B', left: null, right: null }
min()
Node | null
Mengembalikan simpul paling kiri di pohon, sehingga simpul tersebut sesuai dengan key
minimum.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . insert ( 5 , 'B' ) . insert ( 0 , 'C' ) ;
tree . min ( ) ;
// => Node { key: 0, value: 'C', left: null, right: null }
max()
Node | null
Mengembalikan simpul paling kanan di pohon, sehingga simpul tersebut sesuai dengan key
maksimum.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . insert ( 15 , 'B' ) . insert ( 25 , 'C' ) ;
tree . max ( ) ;
// => Node { key: 25, value: 'C', left: null, right: null }
size()
Number
Mengembalikan jumlah total node yang berada di pohon.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . insert ( 15 , 'B' ) . insert ( 25 , 'C' ) ;
tree . size ( ) ;
// => 3
height()
Number
Mengembalikan jarak maksimum setiap simpul daun dari akar. Jika pohonnya kosong -1
dikembalikan.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) ;
tree . height ( ) ;
// => 0
tree . insert ( 15 , 'B' ) . insert ( 25 , 'C' ) . insert ( 35 , 'D' ) ;
tree . height ( ) ;
//=> 3
inOrder(fn)
Tree
Menerapkan traversal berurutan (traversal pertama kedalaman - LNR) ke pohon dan menjalankan fungsi fn
yang disediakan pada setiap node yang dilintasi tanpa mengubah pohon itu sendiri.
fn
Function
Berfungsi untuk dieksekusi pada setiap node.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . insert ( 5 , 'B' ) . insert ( 15 , 'C' ) ;
tree . inOrder ( node => console . log ( node . key ) ) ;
// => 5
// 10
// 15
preOrder(fn)
Tree
Menerapkan traversal praorder (traversal depth-first - NLR) ke pohon dan menjalankan fungsi fn
yang disediakan pada setiap node yang dilintasi tanpa mengubah pohon itu sendiri.
fn
Function
Berfungsi untuk dieksekusi pada setiap node.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . insert ( 5 , 'B' ) . insert ( 15 , 'C' ) ;
tree . preOrder ( node => console . log ( node . key ) ) ;
// => 10
// 5
// 15
postOrder(fn)
Tree
Menerapkan traversal pasca-urutan (traversal kedalaman-pertama - LRN) ke pohon dan menjalankan fungsi fn
yang disediakan pada setiap node yang dilintasi tanpa mengubah pohon itu sendiri.
fn
Function
Berfungsi untuk dieksekusi pada setiap node.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . insert ( 5 , 'B' ) . insert ( 15 , 'C' ) ;
tree . postOrder ( node => console . log ( node . key ) ) ;
// => 5
// 15
// 10
outOrder(fn)
Tree
Menerapkan traversal out-order (traversal depth-first - RNL) ke pohon dan menjalankan fungsi fn
yang disediakan pada setiap node yang dilintasi tanpa mengubah pohon itu sendiri.
fn
Function
Berfungsi untuk dieksekusi pada setiap node.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . insert ( 5 , 'B' ) . insert ( 15 , 'C' ) ;
tree . outOrder ( node => console . log ( node . key ) ) ;
// => 15
// 10
// 5
levelOrder(fn)
Tree
Menerapkan traversal tingkat-urutan (traversal luas-pertama) ke pohon dan menjalankan fungsi fn
yang disediakan pada setiap node yang dilintasi tanpa mengubah pohon itu sendiri.
fn
Function
Berfungsi untuk dieksekusi pada setiap node.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . insert ( 5 , 'B' ) . insert ( 15 , 'C' ) ;
tree . levelOrder ( node => console . log ( node . key ) ) ;
// => 10
// 5
// 15
clear()
Tree
Mutasi pohon dengan menghapus semua node yang berada dan mengembalikannya dalam keadaan kosong.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . insert ( 5 , 'B' ) . insert ( 15 , 'C' ) ;
//=> Tree { root: Node { left: [Node], right: [Node], key: 3, value: 'A' } }
tree . size ( ) ;
//=> 3
tree . clear ( ) ;
//=> Tree { root: null } }
tree . size ( ) ;
//=> 0
toArray()
Array<Node>
Menerapkan traversal berurutan ke pohon dan menyimpan setiap node yang dilintasi dalam sebuah array. Array dikembalikan pada akhir traversal.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . insert ( 5 , 'B' ) . insert ( 15 , 'C' ) . insert ( 3 , 'D' ) . insert ( 20 , 'F' ) ;
tree . toArray ( ) ;
//=> [
// Node { left: null, right: null, key: 3, value: 'D' },
// Node { left: [Node], right: null, key: 5, value: 'B' },
// Node { left: [Node], right: [Node], key: 10, value: 'A' },
// Node { left: null, right: [Node], key: 15, value: 'C' },
// Node { left: null, right: null, key: 20, value: 'F' }
// ]
toPairs()
Array<[Number, Any]>
Menerapkan traversal berurutan ke pohon dan untuk setiap node yang dilintasi disimpan dalam n
-tuple, di mana n
ukuran pohon, sebuah pasangan terurut/2 tupel, dengan elemen pertama adalah number
yang berkorespondensi dengan key
dari pohon tersebut. node yang dilintasi, dan yang terakhir adalah nilai bertipe any
, sesuai dengan value
yang disimpan di node yang dilintasi. n
-tuple dikembalikan pada akhir traversal.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . insert ( 5 , 'B' ) . insert ( 15 , 'C' ) . insert ( 3 , 'D' ) . insert ( 20 , 'F' ) ;
tree . toPairs ( ) ;
//=> [ [3, 'D'], [5, 'B'], [10, 'A'], [15, 'C'], [20, 'F'] ]
leafNodes()
Array<Node>
Menerapkan penjelajahan berurutan ke pohon dan menyimpan setiap simpul daun yang dilintasi (simpul tanpa anak) dalam sebuah larik. Array dikembalikan pada akhir traversal.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . insert ( 5 , 'B' ) . insert ( 15 , 'C' ) ;
tree . leafNodes ( ) ;
//=> [
// Node { left: null, right: null, key: 5, value: 'B' },
// Node { left: null, right: null, key: 15, value: 'C' }
// ]
fullNodes()
Array<Node>
Menerapkan penjelajahan berurutan ke pohon dan menyimpan setiap simpul penuh yang dilintasi (simpul dengan dua turunan bukan nol) dalam sebuah larik. Array dikembalikan pada akhir traversal.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . insert ( 5 , 'B' ) . insert ( 15 , 'C' ) ;
tree . fullNodes ( ) ;
//=> [
// Node { left: [Node], right: [Node], key: 10, value: 'A' }
// ]
partialNodes()
Array<Node>
Menerapkan traversal berurutan ke pohon dan menyimpan setiap simpul parsial (simpul dengan satu anak bukan nol) dalam sebuah larik. Array dikembalikan pada akhir traversal.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . insert ( 5 , 'B' ) . insert ( 15 , 'C' ) . insert ( 20 , 'D' ) . insert ( 3 , 'E' ) ;
tree . partialNodes ( ) ;
//=> [
// Node { left: [Node], right: null, key: 5, value: 'B' },
// Node { left: null, right: [Node], key: 15, value: 'C' }
// ]
isBalanced()
Boolean
Mengembalikan true
jika tinggi pohon seimbang, yang berarti bahwa subpohon kirinya seimbang, subpohon kanannya seimbang, dan perbedaan antara tinggi subpohon kiri dan subpohon kanan tidak lebih besar dari 1. Dalam jika tidak, metode akan mengembalikan false
.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . insert ( 5 , 'B' ) . insert ( 15 , 'C' ) ;
tree . isBalanced ( ) ;
//=> true
tree . insert ( 20 , 'D' ) . insert ( 30 , 'E' ) ;
tree . isBalanced ( ) ;
//=> false
isComplete()
Boolean
Metode ini mengembalikan true
jika pohon tersebut adalah pohon pencarian biner lengkap, yang menyiratkan bahwa setiap level, kecuali mungkin yang terakhir, terisi penuh, dan semua node berada sejauh mungkin di kiri. Dalam kasus lain, metode ini mengembalikan nilai salah.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . insert ( 5 , 'B' ) . insert ( 15 , 'C' ) ;
tree . isComplete ( ) ;
//=> true
tree . insert ( 3 , 'D' ) ;
tree . isComplete ( ) ;
//=> true
tree . insert ( 20 , 'E' ) ;
tree . isComplete ( ) ;
//=> false
isFull()
Boolean
Metode ini mengembalikan true
jika semua node yang berada di pohon adalah node daun atau node penuh. Dalam kasus lain (derajat simpul sama dengan 1) metode ini akan mengembalikan false
.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . insert ( 5 , 'B' ) . insert ( 15 , 'C' ) ;
tree . isFull ( ) ;
//=> true
tree . insert ( 8 , 'D' ) ;
tree . isFull ( ) ;
//=> false
isPerfect()
Boolean
Metode ini mengembalikan true
jika semua node internal yang berada di pohon adalah node penuh (derajat node sama dengan 2) dan semua node daun berada pada tingkat ketinggian yang sama. Dalam kasus lain (derajat simpul sama dengan 1 atau daun dan simpul penuh ditemukan pada tingkat ketinggian yang sama) metode ini akan mengembalikan false
.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . insert ( 5 , 'B' ) . insert ( 15 , 'C' ) ;
tree . isPerfect ( ) ;
//=> true
tree . insert ( 3 , 'D' ) . insert ( 7 , 'E' ) . insert ( 12 , 'F' ) . insert ( 20 , 'G' ) ;
tree . isPerfect ( ) ;
//=> true
tree . insert ( 1 , 'H' ) ;
tree . isPerfect ( ) ;
//=> false
Juga tersedia, bersama dengan kelas Tree
yang terekspos, adalah kelas Node
, yang terutama berguna untuk tujuan pengujian, karena dapat digunakan untuk membandingkan node pohon. Kelas memiliki metode konstruktor biner, dengan parameter key
dan value
, masing-masing sesuai dengan kunci dan nilai yang disimpan dalam instance yang dibuat.
key
Number
key
yang sesuai dengan instance node.
const { Node } = require ( 'binstree' ) ;
const node = new Node ( 10 , 'A' ) ;
// => { key:10, value: 'A', left: null, right: null }
node . key ;
//=> 10
value
Any
Nilai yang terkandung dalam node.
const { Node } = require ( 'binstree' ) ;
const node = new Node ( 10 , 'A' ) ;
// => { key: 10, value: 'A', left: null, right: null }
node . value ;
//=> 'A'
node . value = 'B'
// => { key: 10, value: 'B', left: null, right: null }
left
Node | null
Subpohon kiri yang ditunjuk oleh node.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . root ;
// => { key: 10, value: 'A', left: null, right: null }
tree . root . left ;
//=> null
tree . insert ( 5 , 'B' ) . root ;
// => { key: 10, value: 'A', left: { key: 5, value: 'B', left: null, right: null } , right: null }
tree . root . left ;
//=> { key: 5, value: 'B', left: null, right: null }
right
Node | null
Subpohon kanan yang ditunjuk oleh node.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . root ;
// => { key: 10, value: 'A', left: null, right: null }
tree . root . right ;
//=> null
tree . insert ( 15 , 'B' ) . root ;
// => { key: 10, value: 'A', left: null , right: { key: 15, value: 'B', left: null, right: null } }
tree . root . right ;
//=> { key: 15, value: 'B', left: null, right: null }
children
Array<Node>
Mengembalikan larik yang menghubungi turunan dari instance tersebut, dengan anak kiri, jika ada, adalah elemen pertama larik, dan anak kanan, jika ada, adalah elemen terakhir larik.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . root . children ;
//=> []
tree . insert ( 5 , 'B' ) . insert ( 15 , 'C' ) . root . children ;
// => [
// { key: 5, value: 'B', left: null , right: null },
// { key: 15, value: 'C', left: null, right: null }
// ]
degree
Number
Mengembalikan jumlah subpohon yang ditunjuk oleh node.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . root . degree ;
//=> 0
tree . insert ( 5 , 'B' ) . root . degree ;
//=> 1
tree . insert ( 15 , 'C' ) . root . degree ;
//=> 2
height()
Number
Mengembalikan jarak maksimum setiap simpul daun dari contoh simpul.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . insert ( 15 , 'B' ) . insert ( 25 , 'C' ) . insert ( 35 , 'D' ) ;
tree . root . height ( ) ;
//=> 3
tree . root . right . height ( ) ;
//=> 2
isFull()
Boolean
Menentukan apakah sebuah node merupakan node penuh (memiliki dua anak yang bukan null), mengembalikan true
atau false
sebagaimana mestinya.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . root . isFull ( ) ;
//=> false
tree . insert ( 5 , 'B' ) . insert ( 15 , 'C' ) . root . isFull ( ) ;
//=> true
isInternal()
Boolean
Menentukan apakah sebuah node merupakan node internal (memiliki setidaknya satu anak bukan nol), mengembalikan true
atau false
sebagaimana mestinya.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . root . isInternal ( ) ;
//=> false
tree . insert ( 5 , 'B' ) . root . isInternal ( ) ;
//=> true
isLeaf()
Boolean
Menentukan apakah sebuah simpul adalah simpul daun (tidak memiliki anak), mengembalikan true
atau false
sebagaimana mestinya.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . root . isLeaf ( ) ;
//=> true
tree . insert ( 5 , 'B' ) . root . isLeaf ( ) ;
//=> false
isLeftPartial()
Boolean
Menentukan apakah sebuah node merupakan node parsial kiri (hanya memiliki satu anak non-null yang tersisa), mengembalikan true
atau false
sebagaimana mestinya.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . root . isLeftPartial ( ) ;
//=> false
tree . insert ( 5 , 'B' ) . root . isLeftPartial ( ) ;
//=> true
isPartial()
Boolean
Menentukan apakah sebuah node merupakan node parsial (hanya memiliki satu anak yang bukan nol), mengembalikan true
atau false
sebagaimana mestinya.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . root . isPartial ( ) ;
//=> false
tree . insert ( 15 , 'B' ) . root . isPartial ( ) ;
//=> true
isRightPartial()
Boolean
Menentukan apakah sebuah simpul merupakan simpul parsial kanan (memiliki satu anak bukan nol yang benar), mengembalikan true
atau false
sebagaimana mestinya.
const { Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
tree . insert ( 10 , 'A' ) . root . isRightPartial ( ) ;
//=> false
tree . insert ( 15 , 'B' ) . root . isRightPartial ( ) ;
//=> true
toPair()
[Number, Any]
Mengembalikan tupel pasangan terurut/2, dengan elemen pertama adalah angka yang berkorespondensi dengan key
dari node, dan elemen terakhir adalah sebuah nilai, yang bisa berjenis apa pun, sesuai dengan value
yang disimpan di dalam node.
const { Node , Tree } = require ( 'binstree' ) ;
const tree = new Tree ( ) ;
const node = new Node ( 5 , 'B' ) ;
node . toPair ( ) ;
//=> [5, 'B']
tree . insert ( 10 , 'A' ) . root . toPair ( ) ;
//=> [10, 'A']
Untuk informasi lebih lanjut tentang cara berkontribusi pada proyek, silakan baca pedoman berkontribusi.
cd binstree
npm install
atau yarn install
npm test
atau yarn test
MIT