UNPKG

2.49 kBPlain TextView Raw
1import * as path from 'path'
2import * as fs from 'fs-extra'
3import * as wxTransformer from '@tarojs/transformer-wx'
4import { processTypeEnum, REG_TYPESCRIPT, printLog, resolveScriptPath, chalk } from '@tarojs/helper'
5
6import { Compiler as RNCompiler } from '../rn'
7import { analyzeFiles, analyzeStyleFilesImport, copyFileToDist, RN_OUTPUT_NAME, parseEntryAst } from './common'
8import { IBuildData } from './ui.types'
9
10export async function buildForRN (uiIndex = 'index', buildData) {
11 const { appPath } = buildData
12 const compiler = new RNCompiler(appPath)
13 console.log()
14 console.log(chalk.green('开始编译 RN 端组件库!'))
15 await compiler.buildTemp() // complie to rn_temp
16 await buildRNLib(uiIndex, buildData)
17}
18
19export async function buildRNLib (uiIndex, buildData: IBuildData) {
20 try {
21 const { appPath, outputDirName, sourceDir, rnTempPath } = buildData
22 const outputDir = path.join(appPath, outputDirName, RN_OUTPUT_NAME)
23 const tempEntryFilePath = resolveScriptPath(path.join(sourceDir, uiIndex))
24 const baseEntryFilePath = resolveScriptPath(path.join(rnTempPath, uiIndex)) // base by rn_temp
25 const outputEntryFilePath = path.join(outputDir, path.basename(tempEntryFilePath))
26 const code = fs.readFileSync(tempEntryFilePath).toString()
27 const transformResult = wxTransformer({
28 code,
29 sourcePath: tempEntryFilePath,
30 outputPath: outputEntryFilePath,
31 isNormal: true,
32 isTyped: REG_TYPESCRIPT.test(tempEntryFilePath)
33 })
34 const { styleFiles, components, code: generateCode } = parseEntryAst(transformResult.ast, baseEntryFilePath)
35 const relativePath = path.relative(appPath, tempEntryFilePath)
36 tempEntryFilePath.replace(path.extname(tempEntryFilePath), '.js')
37 printLog(processTypeEnum.COPY, '发现文件', relativePath)
38 fs.ensureDirSync(path.dirname(outputEntryFilePath))
39 fs.writeFileSync(outputEntryFilePath, generateCode)
40 if (components.length) {
41 components.forEach(item => {
42 copyFileToDist(item.path as string, rnTempPath, outputDir, buildData)
43 })
44 analyzeFiles(components.map(item => item.path as string), rnTempPath, outputDir, buildData)
45 }
46 if (styleFiles.length) {
47 styleFiles.forEach(item => {
48 copyFileToDist(item, rnTempPath, path.join(appPath, outputDirName), buildData)
49 })
50 analyzeStyleFilesImport(styleFiles, rnTempPath, path.join(appPath, outputDirName), buildData)
51 }
52 } catch (err) {
53 console.log(err)
54 }
55}