Tool

Packhouse Tool

Property

const tool = {
    install: 'function',
    handler: 'function', // required
    request: 'array',
    response: 'string',
}

Install

第一次呼叫時執行,只會執行一次。

Install只允許同步執行,若執意使用非同步請求可以參閱Loader

const tool = {
    install({ packhouse, store, include, utils, group }) { ... }
}

Packhouse

實例化的Packhouse對象,主要在於運用Plugin

Store

變數的容器,能在handler中被獲取。

const tool = {
    install({ store }) {
        store.demo = 5
    },
    handler(self) {
        console.log(self.store.demo) // 5
    }
}

Include

引用其他的Tool必須經過include,該接口也能引用其他GroupLine

const group = {
   tools: {
      sum: {
         handler: (self, v1, v2) => self.success(v1 + v2)
      },
      double: {
         install({ include }) {
            // 參數一是引用名,第二個參數是tool name。
            include('sum').tool('sum')
         },
         handler(self, v1) {
            self.tool('sum')
                .action(v1, v1, (error, result) => {
                   self.success(result)
                })
         }
      }
   }
}

Group

與Group交換資料的管道,也意味著能與外部的參數進行溝通:

const group = {
   install(group, options) {
      group.locale = options.locale
   },
   tools: {
      where: {
         install({ store, group }) {
            store.locale = group.locale
         },
         handler(self) {
            self.success(self.store.locale)
         }
      }
   }
}

packhouse.addGroup('locale', () => {
   return {
      data: group,
      options: {
         locale: '台灣'
      }
   }
})

packhouse.tool('locale/where').action((error, result) => {
   console.log(result) // '台灣'
})

Utils

可以使用Packhouse提供的工具組,詳情參照Utils

Handler

Tool被呼叫時的主執行續。

如果整個handler的過程是同步的,那action的執行是完全同步的,但建議把所有的行為視為非同步。

const tool = {
    handler(self, ...args) {
        self.success()
    }
}

Self

主要的流程控制單元,固定在第一個參數上,以下是它的Property:

success

回傳成功結果

error

回傳錯誤結果

casting

回傳與驗證參數,詳情請參閱Mold Casting

line

引用includeLine。

tool

引用include的Tool。

assess

驗證第一個參數是否為null或undefined,若不是則回傳第一個參數,若成立則回傳第二個參數。

assess可以接受一個Callback,當第二個參數成立時可觸發並回傳該方法的結果。

const group = {
   tools: {
      sum: {
         request: ['number', 'number'],
         handler: (self, v1, v2) => self.success(v1 + v2)
      },
      doubleAndToInt: {
         install({ include }) {
            include('sum').tool('sum')
         },
         handler(self, v1) {
            self.tool('sum')
                .action(v1, v1, self.assess(result => parseInt(result)))
         }
      }
   }
}

// ... 省略註冊行為

packhouse.tool('math/doubleAndToInt').action(10.2, (error, result) => {
   console.log(result) // 20
})

packhouse.tool('math/doubleAndToInt').action('10.2', (error, result) => {
   console.log(error != null) // true
})

Lazy First

在Cloud Function的型態下,我們只要專注在單一功能上,意味著每次執行只要針對目的require所需的模塊即可。

並不建議將require的行為建立在install的行為內,除了可讀性差之外也可能造成this指向錯誤或影響單元測試等行為。

// 這是個糟糕的例子😢
let moment = require('moment')
const badTool = {
    handler(self) {
        self.success(moment())
    }
}
// 這是個優良案例 🤣
const tool = {
    handler(self) {
        let moment = require('moment')
        self.success(moment())
    }
}

Async

Install必須是同步的,但Handler允許非同步運作。

const tool = {
    handler: async self => setTimeout(self.success, 100)
}

Request & Response

指定參數與回傳值的型態與驗證對象,比對方法詳情請參照Mold

const tools = {
    sum: {
        request: ['number', 'number'],
        response: 'number',
        handler(self, v1, v2) {
            self.success(v1 + v2)
        }
    }
}

Last updated