/* * Copyright (c) 2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ const excel = require('exceljs'); const path = require('path'); const fs = require('fs'); const { StatusCode, StatusMessages } = require('./reporter'); let subsystemMap = new Map(); let fileNameMap = new Map(); function getSubsystemMap() { const subsystemFilePath = path.join(__dirname, '..', 'subsystem.json'); const fileContent = JSON.parse(fs.readFileSync(subsystemFilePath, 'utf-8')); fileContent.forEach(content => { subsystemMap.set(content.syscap, content.subsystem); fileNameMap.set(content.syscap, content.fileName); }); } exports.JSONReporter = { write: function (diffs, dest, oldVersion, newVersion) { const outputFile = path.resolve(dest, `diff(${oldVersion}_${newVersion}).json`); fs.writeFileSync(outputFile, JSON.stringify(diffs)); console.log(`report is in ${outputFile}`); }, }; exports.ChangelogReporter = { write: function (diffs, dest) { const outputFile = path.resolve(dest, 'changelog.json'); fs.writeFileSync(outputFile, JSON.stringify(diffs)); console.log(`report is in ${outputFile}`); }, }; exports.ExcelReporter = { write: async function (diffs, dest, oldVersion, newVersion) { getSubsystemMap(); const workbook = new excel.Workbook(); const sheet = workbook.addWorksheet('api差异', { viers: [{ xSplit: 1 }] }); sheet.getRow(1).values = ['操作标记', '差异项-旧版本', '差异项-新版本', 'd.ts文件', '归属子系统']; diffs.forEach((diffInfo, index) => { const messageObj = getDiffMessage(diffInfo); const syscap = diffInfo.syscap ? diffInfo.syscap : ''; const subsystem = diffInfo.packageName === 'ArkUI' ? 'ACE开发框架' : subsystemMap.get(syscap); const ADD_NUMBER = 2; sheet.getRow(index + ADD_NUMBER).values = [ diffInfo.status, messageObj.oldMessage, messageObj.newMessage, diffInfo.dtsName, subsystem ]; }); const buffer = await workbook.xlsx.writeBuffer(); const outputFile = path.resolve(dest, 'diff.xlsx'); fs.writeFileSync(outputFile, buffer); console.log(`report is in ${outputFile}`); }, }; exports.MarkDownReporter = { write: function (diffs, dest) { fileNameMap.forEach((fileName, syscap) => { let diffsInSameSystem = []; diffs.forEach(diffInfo => { if (diffInfo.syscap === syscap) { diffsInSameSystem.push(diffInfo); } }); if (diffsInSameSystem.length === 0) { return; } sortDiffInfoByStatus(diffsInSameSystem, fileName, dest); }); }, }; function sortDiffInfoByStatus(diffsInSameSystem, fileName, dest) { const sortDiffInfos = []; StatusMessages.forEach(status => { diffsInSameSystem.forEach(diffInfo => { if (diffInfo.status === status) { sortDiffInfos.push(diffInfo); } }); }); exportDiffMd(fileName, sortDiffInfos, dest); } function exportDiffMd(fileName, diffInfos, dest) { let finalContent = '| 操作 | 旧版本 | 新版本 | d.ts文件 |\n' + '| ---- | ------ | ------ | -------- |\n'; for (let i = 0; i < diffInfos.length; i++) { let apiData = diffInfos[i]; const messageObj = getDiffMessage(apiData); const oldData = messageObj.oldMessage.replace(/\r|\n/g, '
').replace(/\|/g, '\\|').replace(/\<(?!br>)/g, '\\<'); const newData = messageObj.newMessage.replace(/\r|\n/g, '
').replace(/\|/g, '\\|').replace(/\<(?!br>)/g, '\\<'); finalContent += `|${apiData.status}|${oldData}|${newData}|${apiData.dtsName}|\n`; } const mdFilesDir = `${dest}\\diff合集`; if (!fs.existsSync(mdFilesDir)) { fs.mkdirSync(mdFilesDir); } fs.writeFileSync(`${dest}\\diff合集\\js-apidiff-${fileName}.md`, finalContent); } function getDiffMessage(diffInfo) { let oldMessage = 'NA'; let newMessage = 'NA'; if (diffInfo.statusCode === StatusCode.DELETE) { oldMessage = `类名:${diffInfo.className};\n方法or属性:${diffInfo.rawText}`; } else if (diffInfo.statusCode === StatusCode.DELETE_CLASS) { oldMessage = `类名声明:${diffInfo.rawText}`; } else if (diffInfo.statusCode === StatusCode.NEW_API) { newMessage = `类名:${diffInfo.className};\n方法or属性:${diffInfo.rawText}`; } else if (diffInfo.statusCode === StatusCode.DELETE_DTS) { oldMessage = `文件名:${diffInfo.dtsName}`; } else if (diffInfo.statusCode === StatusCode.FUNCTION_CHANGES) { oldMessage = `类名:${diffInfo.className};\n方法or属性:${diffInfo.oldMessage}`; newMessage = `类名:${diffInfo.className};\n方法or属性:${diffInfo.newMessage}`; } else if (diffInfo.statusCode === StatusCode.DEPRECATED_CHNAGES) { const useinsteadInfo = diffInfo.hint.replace('useinstead:', ''); oldMessage = `类名:${diffInfo.className};\n方法or属性:${diffInfo.rawText}\n旧版本信息:${diffInfo.oldMessage}`; newMessage = `类名:${diffInfo.className};\n方法or属性:${diffInfo.rawText}\n新版本信息:${diffInfo.newMessage}\n代替接口:${useinsteadInfo}`; } else { oldMessage = `类名:${diffInfo.className};\n方法or属性:${diffInfo.rawText}\n旧版本信息:${diffInfo.oldMessage}`; newMessage = `类名:${diffInfo.className};\n方法or属性:${diffInfo.rawText}\n新版本信息:${diffInfo.newMessage}`; } return { oldMessage, newMessage }; }