jsonFile.ts 2.5 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
1
import { extend } from '@vue/shared'
fxy060608's avatar
fxy060608 已提交
2
import { ComponentJson, PageWindowOptions, UsingComponents } from './types'
fxy060608's avatar
fxy060608 已提交
3 4
import { removeExt, normalizeNodeModules } from '../../utils'
import { relativeFile } from '../../resolve'
fxy060608's avatar
fxy060608 已提交
5

fxy060608's avatar
fxy060608 已提交
6 7 8 9 10
let appJsonCache: Record<string, any> = {}
const jsonFilesCache = new Map<string, string>()
const jsonPagesCache = new Map<string, PageWindowOptions>()
const jsonComponentsCache = new Map<string, ComponentJson>()
const jsonUsingComponentsCache = new Map<string, UsingComponents>()
fxy060608's avatar
fxy060608 已提交
11

fxy060608's avatar
fxy060608 已提交
12 13 14 15
export function isPageFile(file: string) {
  return jsonPagesCache.has(removeExt(file))
}

fxy060608's avatar
fxy060608 已提交
16 17 18 19 20 21 22 23
export function hasJsonFile(filename: string) {
  return (
    filename === 'app' ||
    jsonPagesCache.has(filename) ||
    jsonComponentsCache.has(filename)
  )
}

fxy060608's avatar
fxy060608 已提交
24 25 26 27 28 29
export function normalizeJsonFilename(filename: string) {
  return normalizeNodeModules(filename)
}

export function findChangedJsonFiles() {
  const changedJsonFiles = new Map<string, string>()
fxy060608's avatar
fxy060608 已提交
30
  function findChangedFile(filename: string, json: Record<string, any>) {
fxy060608's avatar
fxy060608 已提交
31 32 33 34
    const newJson = extend({}, json)
    if (!newJson.usingComponents) {
      newJson.usingComponents = {}
    }
fxy060608's avatar
fxy060608 已提交
35 36 37 38 39 40 41 42 43 44
    extend(newJson.usingComponents, jsonUsingComponentsCache.get(filename))
    const usingComponents = newJson.usingComponents
    // 格式化为相对路径,这样作为分包也可以直接运行
    Object.keys(usingComponents).forEach((name) => {
      usingComponents[name] = relativeFile(
        filename,
        usingComponents[name].slice(1)
      )
    })

fxy060608's avatar
fxy060608 已提交
45
    const jsonStr = JSON.stringify(newJson, null, 2)
fxy060608's avatar
fxy060608 已提交
46 47 48
    if (jsonFilesCache.get(filename) !== jsonStr) {
      changedJsonFiles.set(filename, jsonStr)
      jsonFilesCache.set(filename, jsonStr)
fxy060608's avatar
fxy060608 已提交
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
    }
  }
  function findChangedFiles(jsonsCache: Map<string, any>) {
    for (const name of jsonsCache.keys()) {
      findChangedFile(name, jsonsCache.get(name))
    }
  }
  findChangedFile('app', appJsonCache)
  findChangedFiles(jsonPagesCache)
  findChangedFiles(jsonComponentsCache)
  return changedJsonFiles
}

export function addMiniProgramAppJson(appJson: Record<string, any>) {
  appJsonCache = appJson
}

export function addMiniProgramPageJson(
  filename: string,
  json: PageWindowOptions
) {
fxy060608's avatar
fxy060608 已提交
70 71 72
  jsonPagesCache.set(filename, json)
}

fxy060608's avatar
fxy060608 已提交
73 74 75 76
export function addMiniProgramComponentJson(
  filename: string,
  json: ComponentJson
) {
fxy060608's avatar
fxy060608 已提交
77 78 79
  jsonComponentsCache.set(filename, json)
}

fxy060608's avatar
fxy060608 已提交
80 81 82 83
export function addMiniProgramUsingComponents(
  filename: string,
  json: UsingComponents
) {
fxy060608's avatar
fxy060608 已提交
84 85
  jsonUsingComponentsCache.set(filename, json)
}