Utils

Packhouse Utils

Utils是Packhouse內部的函數組,有許多功能都來自於Utils的建構,包括Tool IDMold Verify等。

所有的Utils是指向同一個對象,意味著你可以藉由Utils物件進行拓展,但我們不建議這麼做,良好的拓展方法請參照Plugins

How To Use

Core

const Packhouse = require('packhouse')
const packhouse = new Packhouse()

packhosue.utils === Packhouse.utils // true

Tool

const tool = {
    myTool: {
        install({ store, utils }) {
            store.id = utils.generateId()
            store.uuid = utils.generateId
        },
        handler(self) {
            console.log(self.store.id)
            console.log(self.store.uuid())
        }
    }
}

Mold

const molds = {
    uuid(value, { utils }) {
        return utils.generateId()
    }
}

Methods

getType

能比typeof獲取更多的型態,沒在下列名單內的揭回傳typeof的型態:

packhouse.utils.getType([]) // array
packhouse.utils.getType(NaN) // NaN
packhouse.utils.getType(null) // empty
packhouse.utils.getType(undefined) // empty
packhouse.utils.getType(/test/) // regexp
packhouse.utils.getType(new Promise(() => {})) // promise
packhouse.utils.getType(Buffer.from('123')) // buffer
packhouse.utils.getType(new Error()) // error

verify

一個簡單的驗證方法,並回傳新的物件。

verifymold是分離的系統,無法使用mold表達示。

verify驗證的type對象是多個型態,而支援的類型請參閱getType

let options = {
    a: 5,
    b: []
}

let data = packhouse.utils.verify(options, {
    // [required, allow types, default value]
    a: [true, ['number']],
    b: [true, ['array']],
    c: [false, ['number'], 0]
})

console.log(data.a) // 5
console.log(data.c) // 0

generateId

仿uuid建立,回傳一個隨機uuid,但這並不是標準的uuid演算法。

console.log(typeof packhouse.utils.generateId()) // string

但這不代表你無法使用uuid演算法:

let uuid = require('uuid/v4')
let packhouse = require('packhouse')

packhouse.utils.generateId = uuid

peel

針對物件深度取值,可以參考可選鍊

let a = {
    b: {
        c: {
            d: 5
        }
    }
}
console.log(packhouse.utils.peel(a, 'b.c.d')) // 5
console.log(packhouse.utils.peel(a, 'b.c.e')) // undefined

loader

返回一個Promise,第一次執行後會執行程序,但後續的呼叫皆回傳第一次呼叫的結果。

loader的存在目的很簡單,在Tool Install的週期時,有時會存在需非同步請求才能獲得的資料,但該週期又不支援非同步運算,因此你可以藉由loader進行包裹來達成初步的Cache。

更進階的快取應用可以參照Order

let loader = packhouse.utils.loader((resolve, reject) => {
    setTimeout(() => {
        resolve('hello')
    }, 1000)
})

loader().then(result => {
    // 等待一秒才執行
    console.log(result) // hello
    loader().then(result => {
        // 不需等待
        console.log(result) // hello
    })
})

Last updated