swift.ts 2.0 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
1
import { isInHBuilderX, resolveSourceMapPath } from '@dcloudio/uni-cli-shared'
fxy060608's avatar
fxy060608 已提交
2
import { capitalize } from '@vue/shared'
fxy060608's avatar
fxy060608 已提交
3
import { Module, ModuleItem } from '../../../types/types'
fxy060608's avatar
fxy060608 已提交
4
import { genUTSPlatformResource, getUtsCompiler, resolvePackage } from './utils'
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
function resolveTypeAliasDeclNames(items: ModuleItem[]) {
  const names: string[] = []
  items.forEach((item) => {
    if (item.type === 'TsTypeAliasDeclaration') {
      names.push(item.id.value)
    }
  })
  return names
}

export function createSwiftResolveTypeReferenceName(
  namespace: string,
  ast: Module
) {
  const names = resolveTypeAliasDeclNames(ast.body)
  return (name: string) => {
    if (names.includes(name)) {
      return namespace + capitalize(name)
    }
    return name
  }
}

fxy060608's avatar
fxy060608 已提交
29
export function parseSwiftPackage(filename: string) {
fxy060608's avatar
fxy060608 已提交
30 31
  const res = resolvePackage(filename)
  if (!res) {
fxy060608's avatar
fxy060608 已提交
32 33 34 35 36 37 38 39 40 41 42 43
    return {
      package: '',
      namespace: '',
      class: '',
    }
  }
  const namespace =
    'UTSSDK' + (res.is_uni_modules ? 'Modules' : '') + capitalize(res.name)
  return {
    package: '',
    namespace,
    class: namespace + 'IndexSwift',
fxy060608's avatar
fxy060608 已提交
44
  }
fxy060608's avatar
fxy060608 已提交
45
}
fxy060608's avatar
fxy060608 已提交
46

fxy060608's avatar
fxy060608 已提交
47 48 49 50 51 52 53 54 55 56 57 58
export async function compileSwift(filename: string) {
  // 开发阶段不编译
  if (process.env.NODE_ENV !== 'production') {
    return
  }
  if (!process.env.UNI_HBUILDERX_PLUGINS) {
    return
  }
  const { bundle, UtsTarget } = getUtsCompiler()
  const inputDir = process.env.UNI_INPUT_DIR
  const outputDir = process.env.UNI_OUTPUT_DIR
  // let time = Date.now()
fxy060608's avatar
fxy060608 已提交
59
  await bundle(UtsTarget.SWIFT, {
fxy060608's avatar
fxy060608 已提交
60 61 62 63 64
    input: {
      root: inputDir,
      filename,
    },
    output: {
fxy060608's avatar
fxy060608 已提交
65
      isPlugin: true,
fxy060608's avatar
fxy060608 已提交
66
      outDir: outputDir,
fxy060608's avatar
fxy060608 已提交
67
      package: parseSwiftPackage(filename).namespace,
fxy060608's avatar
fxy060608 已提交
68
      sourceMap: resolveSourceMapPath(),
fxy060608's avatar
fxy060608 已提交
69
      extname: 'swift',
fxy060608's avatar
fxy060608 已提交
70
      imports: ['DCUTSPlugin'],
fxy060608's avatar
fxy060608 已提交
71 72 73 74 75 76 77 78 79 80 81 82
      logFilename: true,
      noColor: isInHBuilderX(),
    },
  })

  genUTSPlatformResource(filename, {
    inputDir,
    outputDir,
    platform: 'app-ios',
    extname: '.swift',
  })
}