pages.ts 3.0 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
import path from 'path'
import { hasOwn } from '@vue/shared'
import { parseJson } from '../json'
import { validatePages } from '../pages'
import { AppJson, NetworkTimeout, PageWindowOptions } from './types'
import { parseTabBar, parseWindowOptions } from './utils'
import { normalizePath } from '../../utils'

interface ParsePagesJsonOptions {
  debug?: boolean
  darkmode?: boolean
  subpackages: boolean
  windowOptionsMap?: Record<string, string>
  tabBarOptionsMap?: Record<string, string>
  tabBarItemOptionsMap?: Record<string, string>
  networkTimeout?: NetworkTimeout
}

export function parseMiniProgramPagesJson(
  jsonStr: string,
  platform: UniApp.PLATFORM,
  options: ParsePagesJsonOptions = { subpackages: false }
) {
  return parsePagesJson(jsonStr, platform, options)
}

function parsePagesJson(
  jsonStr: string,
  platform: UniApp.PLATFORM,
  {
    debug,
    darkmode,
    networkTimeout,
    subpackages,
    windowOptionsMap,
  }: ParsePagesJsonOptions = {
    subpackages: false,
  }
) {
  const appJson: AppJson = {
    pages: [],
  }
  const pageJsons: Record<string, PageWindowOptions> = {}
  // preprocess
  const pagesJson = parseJson(jsonStr, true) as UniApp.PagesJson
  if (!pagesJson) {
    throw new Error(`[vite] Error: pages.json parse failed.\n`)
  }

  function addPageJson(pagePath: string, style: UniApp.PagesJsonPageStyle) {
    pageJsons[pagePath] = parseWindowOptions(style, platform, windowOptionsMap)
  }
  // pages
  validatePages(pagesJson, jsonStr)

  pagesJson.pages.forEach((page) => {
    appJson.pages.push(page.path)
    addPageJson(page.path, page.style)
  })

  // subpackages
  pagesJson.subPackages = pagesJson.subPackages || pagesJson.subpackages
  if (pagesJson.subPackages) {
    if (subpackages) {
      appJson.subPackages = pagesJson.subPackages.map(({ root, pages }) => {
        return {
          root,
          pages: pages.map((page) => {
            addPageJson(normalizePath(path.join(root, page.path)), page.style)
            return page.path
          }),
        }
      })
    } else {
      pagesJson.subPackages.forEach(({ root, pages }) => {
        pages.forEach((page) => {
          const pagePath = normalizePath(path.join(root, page.path))
          appJson.pages.push(pagePath)
          addPageJson(pagePath, page.style)
        })
      })
    }
  }

  // window
  if (pagesJson.globalStyle) {
    appJson.window = parseWindowOptions(
      pagesJson.globalStyle,
      platform,
      windowOptionsMap
    )
  }

  // tabBar
  if (pagesJson.tabBar) {
    const tabBar = parseTabBar(pagesJson.tabBar!, platform)
    if (tabBar) {
      appJson.tabBar = tabBar
    }
  }
  ;['preloadRule', 'workers', 'usingComponents'].forEach((name) => {
    if (hasOwn(pagesJson, name)) {
      appJson[name] = pagesJson[name]
    }
  })
  if (debug) {
    appJson.debug = debug
  }
  if (networkTimeout) {
    appJson.networkTimeout = networkTimeout
  }
  if (darkmode) {
    appJson.darkmode = true
    appJson.themeLocation = 'theme.json'
  }
  return {
    appJson,
    pageJsons,
  }
}