1 | import * as path from 'path'
|
2 | import * as fs from 'fs-extra'
|
3 | import * as wxTransformer from '@tarojs/transformer-wx'
|
4 | import { processTypeEnum, REG_TYPESCRIPT, printLog, resolveScriptPath, chalk } from '@tarojs/helper'
|
5 |
|
6 | import { Compiler as RNCompiler } from '../rn'
|
7 | import { analyzeFiles, analyzeStyleFilesImport, copyFileToDist, RN_OUTPUT_NAME, parseEntryAst } from './common'
|
8 | import { IBuildData } from './ui.types'
|
9 |
|
10 | export 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()
|
16 | await buildRNLib(uiIndex, buildData)
|
17 | }
|
18 |
|
19 | export 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))
|
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 | }
|