template.ts 2.2 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
import path from 'path'
import debug from 'debug'
import { EmittedFile, GetModuleInfo } from 'rollup'
import { ResolvedConfig } from 'vite'
import {
  addMiniProgramTemplateFile,
  removeExt,
  normalizeMiniProgramFilename,
  MiniProgramFilterOptions,
  findMiniProgramTemplateFiles,
  addMiniProgramTemplateFilter,
  clearMiniProgramTemplateFiles,
} from '@dcloudio/uni-cli-shared'
import { getFiltersCache } from '../plugins/renderjs'
import { UniMiniProgramPluginOptions } from '.'

const debugTemplate = debug('vite:uni:mp-template')

export function getFilterFiles(
  resolvedConfig: ResolvedConfig,
  getModuleInfo: GetModuleInfo
) {
fxy060608's avatar
fxy060608 已提交
23
  const filters: Record<string, MiniProgramFilterOptions> = Object.create(null)
fxy060608's avatar
fxy060608 已提交
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
  const filtersCache = getFiltersCache(resolvedConfig)
  if (!filtersCache.length) {
    return filters
  }
  const inputDir = process.env.UNI_INPUT_DIR
  function addFilter(id: string, filter: MiniProgramFilterOptions) {
    const templateFilename = removeExt(
      normalizeMiniProgramFilename(id, inputDir)
    )
    addMiniProgramTemplateFilter(templateFilename, filter)
    const filterFilename = removeExt(
      normalizeMiniProgramFilename(filter.id, inputDir)
    )
    if (templateFilename !== filterFilename) {
      // 外链
      filter.src = filterFilename
fxy060608's avatar
fxy060608 已提交
40
      filters[filterFilename] = filter
fxy060608's avatar
fxy060608 已提交
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
    }
  }
  filtersCache.forEach((filter) => {
    const moduleInfo = getModuleInfo(filter.id)
    if (!moduleInfo) {
      return
    }
    const { importers } = moduleInfo
    if (!importers.length) {
      return
    }
    importers.forEach((importer) => addFilter(importer, filter))
  })
  return filters
}

export function getTemplateFiles(
  template: UniMiniProgramPluginOptions['template']
) {
fxy060608's avatar
fxy060608 已提交
60
  const files = findMiniProgramTemplateFiles(template.filter?.generate)
fxy060608's avatar
fxy060608 已提交
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
  clearMiniProgramTemplateFiles()
  return files
}

export const emitFile: (emittedFile: EmittedFile) => string = (emittedFile) => {
  if (emittedFile.type === 'asset') {
    const filename = emittedFile.fileName!
    addMiniProgramTemplateFile(
      removeExt(
        normalizeMiniProgramFilename(
          path.relative(process.env.UNI_INPUT_DIR, filename)
        )
      ),
      emittedFile.source!.toString()
    )
    debugTemplate(filename)
    return filename
  }
  return ''
}