index.js 2.0 KB
Newer Older
U
ULIVZ 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
const { resolvePlugin, inferPluginName } = require('./util')
const Hook = require('./hook')

module.exports = class Plugin {
  constructor (pluginConfigs) {
    this.hooks = {}
    this.apis = {}
    this.extendHooks([
      'ready',
      'compiled',
      'updated',
      'generated'
    ])
    this.extendAPIs([
      'client',
      'chainWebpack',
      'enhanceDevServer',
      'extendMarkdown',
      'enhanceAppFiles',
      'outFiles',
      'extendPageData'
    ])
    this.resolvePluginConfig(pluginConfigs)
  }

  extendHooks (hooks) {
    hooks.forEach(hook => {
      this.hooks[hook] = new Hook(hook)
    })
  }

  extendAPIs (apis) {
    apis.forEach(api => {
      this.apis[api] = []
    })
  }

  resolvePluginConfigs (pluginConfigs) {
    pluginConfigs.forEach(([name, pluginOptions]) => {
      let plugin = resolvePlugin(name)
      if (typeof plugin === 'function') {
        plugin = plugin(pluginOptions)
      }
      plugin = Object.assign(plugin, { name: inferPluginName(name, plugin) })
      this.resolvePluginConfig(plugin)
    })
  }

  registerHook (name, hook, symbol) {
    this.hooks[name].tap(symbol, hook)
    return this
  }

  registerAPI (name, api) {
    this.apis[name].push(api)
    return this
  }

  resolvePluginConfig ({
    name,
    client,
    chainWebpack,
    enhanceDevServer,
    extendMarkdown,
    enhanceAppFiles,
    outFiles,
    extendPageData,
    ready,
    compiled,
    updated,
    generated
  }) {
    console.log(this.hooks)
    this
      .registerHook('ready', ready, name)
      .registerHook('compiled', compiled, name)
      .registerHook('updated', updated, name)
      .registerHook('generated', generated, name)

    this
      .registerAPI('client', client)
      .registerAPI('chainWebpack', chainWebpack)
      .registerAPI('enhanceDevServer', enhanceDevServer)
      .registerAPI('extendMarkdown', extendMarkdown)
      .registerAPI('enhanceAppFiles', enhanceAppFiles)
      .registerAPI('outFiles', outFiles)
      .registerAPI('extendPageData', extendPageData)
  }
}