manifest.js 3.9 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
1 2 3
const fs = require('fs')
const path = require('path')

fxy060608's avatar
fxy060608 已提交
4
const apis = require('../lib/apis')
fxy060608's avatar
fxy060608 已提交
5

fxy060608's avatar
fxy060608 已提交
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
const AUTO_LOADS = [
  'upx2px',
  'canIUse',

  'getSystemInfo',
  'getSystemInfoSync',

  'navigateTo',
  'redirectTo',
  'switchTab',
  'reLaunch',
  'navigateBack'
]

const TOAST_DEPS = [
  ['/platforms/h5/components/app/popup/toast.vue', 'Toast'],
  ['/platforms/h5/components/app/popup/mixins/toast.js', 'ToastMixin']
]

// TODO 暂不考虑 head,tabBar 的动态拆分
const DEPS = {
  'chooseLocation': [
    ['/platforms/h5/components/system-routes/choose-location/index.vue', 'ChooseLocation']
  ],
  'openLocation': [
    ['/platforms/h5/components/system-routes/open-location/index.vue', 'OpenLocation']
  ],
  'previewImage': [
    ['/platforms/h5/components/system-routes/preview-image/index.vue', 'PreviewImage']
  ],
  'showToast': TOAST_DEPS,
  'hideToast': TOAST_DEPS,
  'showLoading': TOAST_DEPS,
  'hideLoading': TOAST_DEPS,
  'showModal': [
    ['/platforms/h5/components/app/popup/modal.vue', 'Modal'],
    ['/platforms/h5/components/app/popup/mixins/modal.js', 'ModalMixin']
  ],
  'showActionSheet': [
    ['/platforms/h5/components/app/popup/actionSheet.vue', 'Modal'],
    ['/platforms/h5/components/app/popup/mixins/action-sheet.js', 'ActionSheetMixin']
fxy060608's avatar
fxy060608 已提交
47 48 49 50 51
  ],
  'createSelectorQuery': [
    ['/core/view/bridge/subscribe/api/request-component-info.js', 'requestComponentInfo']
  ],
  'createIntersectionObserver': [
fxy060608's avatar
fxy060608 已提交
52 53
    ['/core/view/bridge/subscribe/api/request-component-observer.js', 'requestComponentObserver'],
    ['/core/view/bridge/subscribe/api/request-component-observer.js', 'destroyComponentObserver']
fxy060608's avatar
fxy060608 已提交
54 55 56 57 58 59 60 61 62 63 64
  ]
}

// 检查依赖文件是否存在
Object.keys(DEPS).reduce(function (depFiles, name) {
  DEPS[name].forEach(function (dep) {
    depFiles.add(dep[0])
  })
  return depFiles
}, new Set()).forEach(file => {
  if (!fs.existsSync(path.join(__dirname, '../src', file))) {
fxy060608's avatar
fxy060608 已提交
65
    console.error(file + ' 不存在')
fxy060608's avatar
fxy060608 已提交
66 67 68 69 70 71
    process.exit(0)
  }
})

function parseApiManifestDeps (manifest, protocol) {
  // 解析 platform 依赖
fxy060608's avatar
fxy060608 已提交
72 73
  Object.keys(manifest).forEach(name => {
    const deps = manifest[name][1]
fxy060608's avatar
fxy060608 已提交
74
    if (deps.length) {
fxy060608's avatar
fxy060608 已提交
75 76 77 78
      deps.forEach(dep => {
        if (manifest[dep[1]]) {
          dep[0] = manifest[dep[1]][0]
        } else {
fxy060608's avatar
fxy060608 已提交
79
          console.error(`依赖模块[${dep[1]}]不存在`)
fxy060608's avatar
fxy060608 已提交
80 81 82 83
        }
      })
    }
  })
fxy060608's avatar
fxy060608 已提交
84 85 86 87 88 89 90 91 92 93 94 95 96 97
  // 解析 protocol 依赖
  Object.keys(manifest).forEach(name => {
    const deps = manifest[name][1]
    if (protocol[name]) {
      deps.push([protocol[name], name])
    } else {
      console.warn(`${name} 缺少 protocol`)
    }
  })
  // 追加默认依赖
  Object.keys(DEPS).forEach(name => {
    if (manifest[name]) {
      manifest[name][1].push(...DEPS[name])
    } else {
fxy060608's avatar
fxy060608 已提交
98
      console.error(`缺少 ${name}`)
fxy060608's avatar
fxy060608 已提交
99 100 101 102 103 104 105
    }
  })
  // 设置自动加载标记
  AUTO_LOADS.forEach(name => {
    if (manifest[name]) {
      manifest[name][2] = true
    } else {
fxy060608's avatar
fxy060608 已提交
106
      console.error(`缺少 ${name}`)
fxy060608's avatar
fxy060608 已提交
107 108
    }
  })
fxy060608's avatar
fxy060608 已提交
109 110 111
}

module.exports = {
fxy060608's avatar
fxy060608 已提交
112
  generateApiManifest (manifest, protocol) {
fxy060608's avatar
fxy060608 已提交
113 114 115
    if (!Object.keys(manifest).length) {
      throw new Error('api manifest.json 生成失败')
    }
fxy060608's avatar
fxy060608 已提交
116
    parseApiManifestDeps(manifest, protocol)
fxy060608's avatar
fxy060608 已提交
117 118 119 120 121 122 123 124 125 126 127 128

    const manifestJson = Object.create(null)
    const todoApis = []
    apis.forEach(name => {
      if (manifest[name]) {
        manifestJson[name] = manifest[name]
      } else {
        todoApis.push(name)
      }
    })

    if (todoApis.length) {
fxy060608's avatar
fxy060608 已提交
129
      console.log('\n')
fxy060608's avatar
fxy060608 已提交
130
      console.warn(`${process.env.UNI_PLATFORM} 平台缺少以下 API  实现(共 ${todoApis.length} 个)`)
fxy060608's avatar
fxy060608 已提交
131 132 133 134 135
      todoApis.forEach(name => {
        console.warn(name)
      })
    }

fxy060608's avatar
fxy060608 已提交
136
    fs.writeFileSync(path.resolve(__dirname, '../packages/uni-' + process.env.UNI_PLATFORM + '/manifest.json'),
fxy060608's avatar
fxy060608 已提交
137 138 139 140
      JSON.stringify(manifestJson, null, 4)
    )
  }
}